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

0001 /*
0002     SPDX-FileCopyrightText: 2009, 2010 Stefan Majewsky <majewsky@gmx.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef PALAPELI_VIEW_H
0008 #define PALAPELI_VIEW_H
0009 
0010 #include <QGraphicsView>
0011 
0012 namespace Palapeli
0013 {
0014     class InteractorManager;
0015     class Scene;
0016     class Piece;
0017 
0018     class View : public QGraphicsView
0019     {
0020         Q_OBJECT
0021         friend class GamePlay;
0022             Q_PROPERTY(QRectF viewportRect READ viewportRect WRITE setViewportRect)
0023         public:
0024             View();
0025 
0026             void puzzleStarted();
0027             Palapeli::InteractorManager* interactorManager() const;
0028             Palapeli::Scene* scene() const;
0029 
0030             QRectF viewportRect() const;
0031             void setViewportRect(const QRectF& viewportRect);
0032             void teleportPieces(Piece* piece, const QPointF& scPos);
0033             void toggleCloseUp();
0034             void setCloseUp(bool onOff);
0035             void handleNewPieceSelection();
0036 
0037             static const int MinimumZoomLevel;
0038             static const int MaximumZoomLevel;
0039         public Q_SLOTS:
0040             void logSceneChange(const QRectF &r); // IDW test.
0041             void setScene(Palapeli::Scene* scene);
0042 
0043             void moveViewportBy(const QPointF& sceneDelta);
0044             void zoomSliderInput(int level);
0045             void zoomIn();
0046             void zoomOut();
0047             void zoomBy(int delta); //delta = 0 -> no change, delta < 0 -> zoom out, delta > 0 -> zoom in
0048             void zoomTo(int level); //level = 100 -> actual size
0049         protected:
0050             void keyPressEvent(QKeyEvent* event) override;
0051             void keyReleaseEvent(QKeyEvent* event) override;
0052             void mouseMoveEvent(QMouseEvent* event) override;
0053             void mousePressEvent(QMouseEvent* event) override;
0054             void mouseReleaseEvent(QMouseEvent* event) override;
0055             void wheelEvent(QWheelEvent* event) override;
0056         Q_SIGNALS:
0057             void zoomLevelChanged(int level);
0058             void zoomAdjustable(bool adjustable);
0059             void teleport(Piece* p, const QPointF& scPos, View* v);
0060             void newPieceSelectionSeen(View* v);
0061         protected:
0062             virtual int calculateZoomRange(qreal distantScale,
0063                             bool distantView);
0064             virtual qreal calculateCloseUpScale();
0065         private Q_SLOTS:
0066             void startVictoryAnimation();
0067             void adjustPointer();
0068         private:
0069             Palapeli::InteractorManager* m_interactorManager;
0070             Palapeli::Scene* m_scene;
0071             QPointF m_dragPrevPos;
0072             int m_zoomLevel;
0073             int m_closeUpLevel;
0074             int m_distantLevel;
0075             bool m_isCloseUp;
0076             qreal m_dZoom;
0077             qreal m_minScale;
0078             QPoint m_mousePos;
0079             QPointF m_scenePos;
0080             bool m_adjustPointer;
0081     };
0082 }
0083 
0084 #endif // PALAPELI_VIEW_H