1 /*
2     SPDX-FileCopyrightText: 2008-2010 Stefan Majewsky <majewsky@gmx.net>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef KDIAMOND_BOARD_H
8 #define KDIAMOND_BOARD_H
9 
10 class Diamond;
11 
12 class QAbstractAnimation;
13 #include <QGraphicsItem>
14 class KGameRenderer;
15 
16 namespace KDiamond
17 {
18 class Board : public QGraphicsObject
19 {
20     Q_OBJECT
21 public:
22     explicit Board(KGameRenderer *renderer);
23 
24     int gridSize() const;
25     Diamond *diamond(const QPoint &point) const;
26 
27     bool hasDiamond(const QPoint &point) const;
28     bool hasRunningAnimations() const;
29     QList<QPoint> selections() const;
30     bool hasSelection(const QPoint &point) const;
31     void setSelection(const QPoint &point, bool selected);
32     void clearSelection();
33 
34     void removeDiamond(const QPoint &point);
35     void swapDiamonds(const QPoint &point1, const QPoint &point2);
36     void fillGaps();
37 
38     KGameRenderer *renderer() const;
39 
40     QRectF boundingRect() const override;
41     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
42 public Q_SLOTS:
43     void setPaused(bool paused);
44 Q_SIGNALS:
45     void animationsFinished();
46     void clicked(const QPoint &point);
47     void dragged(const QPoint &point, const QPoint &direction);
48 private Q_SLOTS:
49     void slotAnimationFinished();
50     void slotClicked();
51     void slotDragged(const QPoint &direction);
52 private:
53     struct MoveAnimSpec {
54         Diamond *diamond;
55         QPointF from, to;
56     };
57     QPoint findDiamond(Diamond *diamond) const;
58     Diamond *&rDiamond(const QPoint &point);
59     Diamond *spawnDiamond(int color);
60     void spawnMoveAnimations(const QList<MoveAnimSpec> &specs);
61 
62     static const int MoveDuration;
63     static const int RemoveDuration;
64 
65     int m_difficultyIndex, m_size, m_colorCount;
66     QList<QPoint> m_selections;
67     bool m_paused;
68 
69     KGameRenderer *m_renderer;
70     QVector<Diamond *> m_diamonds;
71     QList<Diamond *> m_activeSelectors, m_inactiveSelectors;
72     QList<QAbstractAnimation *> m_runningAnimations;
73 };
74 }
75 
76 #endif // KDIAMOND_BOARD_H
77