Ophidian
 All Classes Namespaces Functions
circuit_canvas.h
1 #ifndef SFMLCANVAS_H
2 #define SFMLCANVAS_H
3 
4 #include "qsfmlcanvas.h"
5 #include "canvas.h"
6 #include "spatial_index.h"
7 #include "fps.h"
8 #include "../geometry/geometry.h"
9 
10 #include <unordered_set>
11 
12 namespace ophidian {
13 namespace gui {
14 
15 class circuit_canvas;
16 namespace canvas_states {
17 class state {
18 protected:
19  circuit_canvas * m_canvas;
20 public:
21  state(circuit_canvas * canvas) : m_canvas(canvas){}
22  virtual ~state() {}
23  virtual void update() {}
24  virtual void wheelEvent(QWheelEvent * e);
25  virtual void keyPressEvent(QKeyEvent *e);
26  virtual void mousePressEvent(QMouseEvent * e) {}
27  virtual void mouseMoveEvent(QMouseEvent *e) {}
28  virtual void mouseReleaseEvent(QMouseEvent * e) {}
29 };
30 
31 class blocked : public state {
32 public:
34  virtual void update() {}
35  virtual void wheelEvent(QWheelEvent * e){};
36  virtual void keyPressEvent(QKeyEvent *e){};
37  virtual void mousePressEvent(QMouseEvent * e) {}
38  virtual void mouseMoveEvent(QMouseEvent *e) {}
39  virtual void mouseReleaseEvent(QMouseEvent * e) {}
40 };
41 
42 class idle : public state {
43 public:
45  void mousePressEvent(QMouseEvent * e);
46 };
47 
48 class selected : public state {
49  wire_quad m_wirequad;
50  quad m_quad;
51 public:
52  selected(circuit_canvas * canvas, quad the_quad);
53  virtual ~selected();
54  void mousePressEvent(QMouseEvent * e);
55  void keyPressEvent(QKeyEvent *e);
56 };
57 
58 class dragging : public state {
59  quad m_quad;
60  sf::Vector2f m_initial;
61  bool m_moved;
62 public:
63  dragging(circuit_canvas * canvas, const sf::Vector2f & pos);
64  void mouseMoveEvent(QMouseEvent *e);
65  void mouseReleaseEvent(QMouseEvent * e);
66 };
67 
68 
69 }
70 
72 {
73 protected:
74  canvas m_canvas;
75  spatial_index m_index;
76  canvas_states::state * m_state;
77  canvas_states::state * m_save_state;
78  sf::View m_camera;
79  fps m_fps;
80 
81  std::unordered_set< ophidian::gui::quad > m_non_movable_quads;
82  void render(sf::RenderTarget & target);
83 public:
84  circuit_canvas(QWidget *parent = 0);
85  virtual ~circuit_canvas();
86 
87  void state(canvas_states::state * state);
88  sf::Vector2f mapPixelToCamera(const sf::Vector2i & pixel) const;
89 
90 
91  bool hasAnimation() const;
92  void animate(batch_animation * animation);
93 
94  const drawable_batch<4>& quadsBatch();
95 
96 
97  virtual void select(quad the_quad);
98  virtual void unselect(quad the_quad);
99 
100  void indexQuad(quad the_quad);
101  void unindexQuad(quad the_quad);
102 
103  quad drawQuad(const geometry::point<double> & p1, const geometry::point<double> & p2, const geometry::point<double> & p3, const geometry::point<double> & p4);
104  quad quadAt(const sf::Vector2f & point) const;
105  bool hasQuad(const sf::Vector2f & point) const;
106  void setFixed(quad the_quad);
107  virtual void dropQuad(quad the_quad); // virtual, we may call some function when drop a quad, like place_cell()
108  virtual void eraseQuad(quad the_quad);
109  bool isFixed(quad the_quad) const;
110 
111  wire_quad drawRect(quad from_quad);
112  wire_quad drawRect(const geometry::point<double> & p1, const geometry::point<double> & p2, const geometry::point<double> & p3, const geometry::point<double> & p4);
113  line drawLine(const geometry::point<double> & p1, const geometry::point<double> & p2);
114 
115 
116 
117 
118  // camera
119  void cameraCenter(const sf::Vector2f & position);
120  void moveCamera(const sf::Vector2f & delta);
121  sf::Vector2f cameraSize() const;
122  void cameraSize(const sf::Vector2f & new_size);
123  void zoom(double value);
124 
125  void reset();
126 
127  void save_to_file(const std::string & filename);
128 
129  void OnUpdate();
130  void wheelEvent(QWheelEvent * e);
131  void resizeEvent(QResizeEvent *e);
132  void keyPressEvent(QKeyEvent *e);
133  void mousePressEvent(QMouseEvent * e);
134  void mouseMoveEvent(QMouseEvent *e);
135  void mouseReleaseEvent(QMouseEvent * e);
136 
137  template <class T>
138  void paint(T element, const sf::Color & color) {
139  m_canvas.paint(element, color);
140  }
141 
142  template <class T>
143  void transform(T element, const sf::Transform & transformation) {
144  m_canvas.transform(element, transformation);
145  }
146 
147  template <class T>
148  void erase(T element) {
149  m_canvas.destroy(element);
150  }
151 
152 
153  void clear();
154  void clear(const sf::Color & color);
155 
156 
157 };
158 
159 
160 
161 
162 }
163 }
164 
165 #endif // SFMLCANVAS_H
Definition: circuit_canvas.h:58
Definition: spatial_index.h:26
Definition: circuit_canvas.h:42
Definition: qsfmlcanvas.h:11
Definition: drawable_batch.h:12
Definition: canvas.h:35
Definition: circuit_canvas.h:17
Definition: circuit_canvas.h:31
Definition: canvas.h:42
Definition: circuit_canvas.h:71
Definition: circuit_canvas.h:48
Definition: fps.h:10
Definition: canvas.h:31
Definition: canvas.h:72