File indexing completed on 2024-05-19 04:07:53

0001 /*
0002     SPDX-FileCopyrightText: 2014 Ian Wadham <iandw.au@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "pieceholder.h"
0008 #include "../engine/scene.h"
0009 #include "../engine/piece.h"
0010 #include "settings.h"
0011 
0012 #include <QCloseEvent>
0013 #include "palapeli_debug.h"
0014 
0015 const qreal minGrid = 2.0;  // 2x2 pieces in close-up of minimum holder.
0016 const qreal maxGrid = 6.0;  // 6x6 pieces in distant view of min holder.
0017 
0018 Palapeli::PieceHolder::PieceHolder(QWidget* parent, const QSizeF& pieceArea,
0019                     const QString& title)
0020     : m_scene(scene())
0021 {
0022     qCDebug(PALAPELI_LOG) << "CONSTRUCTING Palapeli::PieceHolder" << title;
0023     setParent(parent);
0024     setWindowFlags(Qt::Window | Qt::Tool | Qt::WindowTitleHint);
0025     // Allow space for (2 * 2) pieces in minimum view initially.
0026     m_scene->setPieceAreaSize(pieceArea);
0027     m_scene->initializeGrid(QPointF(0.0, 0.0));
0028     m_scene->setMinGrid(minGrid);
0029     // Add margin for constraint_handles+spacer and setSceneRect().
0030     QRectF rect = m_scene->piecesBoundingRect();
0031     qreal handleWidth = qMin(rect.width(), rect.height())/25.0;
0032     m_scene->addMargin(handleWidth, 0.5*handleWidth);
0033     setWindowTitle(title);
0034     qreal s = calculateCloseUpScale();
0035     QRectF r = m_scene->sceneRect();
0036     setMinimumSize(s*r.width()+1.0, s*r.height()+1.0);
0037     resize(minimumSize());
0038     qCDebug(PALAPELI_LOG) << "Close-up scale" << s << "pieceArea" << pieceArea
0039          << "size" << size();
0040     QTransform t;
0041     t.scale(s, s);
0042     setTransform(t);
0043     centerOn(r.center());
0044     setSelected(true);
0045     show();
0046 }
0047 
0048 void Palapeli::PieceHolder::initializeZooming()
0049 {
0050     // Allow space for a distant view of at most (maxGrid * maxGrid) pieces
0051     // in a piece holder when the view is at minimum size. More that number
0052     // of pieces can be teleported in, but the holder window will have to be
0053     // resized or scrolled for the user to see them, even in distant view.
0054 
0055     qCDebug(PALAPELI_LOG) << "ENTERED PieceHolder::initializeZooming() for" << name();
0056     qreal scale = qMin(transform().m11(), transform().m22());
0057     scale = scale * (minGrid / maxGrid);
0058     // Calculate the zooming range and return the close-up scale's level.
0059     int level = calculateZoomRange(scale, false);
0060     zoomTo(level);
0061     centerOn(sceneRect().center());
0062 }
0063 
0064 void Palapeli::PieceHolder::focusInEvent(QFocusEvent* e)
0065 {
0066     // The user selected this piece holder.
0067     Q_UNUSED(e)
0068     qCDebug(PALAPELI_LOG) << "PieceHolder::focusInEvent()" << windowTitle();
0069     setSelected(true);
0070     Q_EMIT selected(this);  // De-select the previously selected holder.
0071 }
0072 
0073 void Palapeli::PieceHolder::setSelected(bool onOff)
0074 {
0075     qCDebug(PALAPELI_LOG) << "PieceHolder::setSelected()" << windowTitle() << onOff;
0076     setStyleSheet(QStringLiteral("QFrame { border: 3px solid %1; }").arg
0077                 (onOff ? QLatin1String("blue") : QLatin1String("lightGray")));
0078 }
0079 
0080 void Palapeli::PieceHolder::closeEvent(QCloseEvent* event)
0081 {
0082     // Triggered by the piece-holder window's Close button.
0083     if(m_scene->pieces().isEmpty()) {
0084         event->accept();    // The window can be closed.
0085     }
0086     else {
0087         event->ignore();    // The window cannot be closed.
0088     }
0089     Q_EMIT closing(this);       // GamePlay handles the details.
0090 }
0091 
0092 #include "moc_pieceholder.cpp"