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"