1 /*
2     SPDX-FileCopyrightText: 2007 Paolo Capriotti <p.capriotti@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef BATTLEFIELDVIEW_H
8 #define BATTLEFIELDVIEW_H
9 
10 #include <QMultiHash>
11 #include <QTime>
12 #include <QWidget>
13 #include <QGraphicsView>
14 #include <QGraphicsLineItem>
15 
16 #include <KGameRenderedItem>
17 
18 #include "coord.h"
19 #include "spritefactory.h"
20 #include "grid.h"
21 #include "sea.h"
22 
23 class KBSRenderer;
24 class Sprite;
25 class Ship;
26 class WelcomeScreen;
27 class Delegate;
28 
29 class BattleFieldView : public QGraphicsView
30 {
31     static const qreal PREVIEW_OPACITY;
32 
33     KGameRenderedItem* m_background;
34     KGameRenderedItem* m_background_lower;
35 
36     QGraphicsLineItem *hlines[11];
37     QGraphicsLineItem *vlines[11];
38 
39     enum Planes {
40         BACKGROUND = 1,
41         FOREGROUND = 2
42     };
43 
44     WelcomeScreen* m_screen;
45     KBSRenderer* m_renderer;
46     SpriteFactory m_factory;
47     QString m_bgID;
48     int m_gridSize;
49     Sprite* m_impact;
50     Sprite* m_last_hit;
51     bool m_drawGrid;
52 
53     Delegate *m_delegate;
54     Sea::Player m_player;
55     Sea::Status m_status;
56 
57     struct Preview {
58         Coord pos;
59         Ship* ship;
60         Sprite* sprite;
61 
PreviewPreview62         Preview()
63         : pos(-1, -1)
64         , ship(nullptr)
65         , sprite(nullptr)
66         {
67         }
68     } m_preview;
69 
70     typedef QMultiHash<Coord, Sprite*> Sprites;
71     Sprites m_sprites;
72 
73 private:
74     void addSprite(const Coord& c, Sprite* ship);
75     void loadPreviewSprite(Ship * ship);
76 
77 public:
78     BattleFieldView(QWidget* parent, KBSRenderer* renderer, const QString& bgID, int gridSize);
79 
80     void toggleGrid(bool show);
81     void refresh();
82 
83     void setPreview(const QPoint &pos);
84     void cancelPreview();
85     void add(Ship* ship);
86     void hit(const Coord& c);
87     void miss(const Coord& c);
88     void removeImpact();
89     void sink(Ship* ship);
90     void clear();
91 
92     void setDelegate(Delegate *c);
93     void setPlayer(Sea::Player player);
94 
95     WelcomeScreen* screen() const;
setStatus(Sea::Status status)96     inline void setStatus(Sea::Status status) { m_status = status; };
97 protected:
98     void drawGrid();
99 
100     void mousePressEvent(QMouseEvent *) override;
101     void mouseReleaseEvent(QMouseEvent *) override;
102     void mouseMoveEvent(QMouseEvent *) override;
103     void leaveEvent(QEvent *) override;
104 };
105 
106 #endif // BATTLEFIELD_H
107 
108