Horizon
canvas_gl.hpp
1 #pragma once
2 #include "canvas.hpp"
3 #include "drag_selection.hpp"
4 #include "grid.hpp"
5 #include "marker.hpp"
6 #include "triangle.hpp"
7 #include "util/msd_animator.hpp"
8 #include <gtkmm.h>
9 #include <glm/glm.hpp>
10 #include "appearance.hpp"
11 
12 namespace horizon {
13 class CanvasGL : public Canvas, public Gtk::GLArea {
14  friend Grid;
15  friend DragSelection;
16  friend SelectablesRenderer;
17  friend TriangleRenderer;
18  friend MarkerRenderer;
19  friend Markers;
20 
21 public:
22  CanvasGL();
23 
24  enum class SelectionMode { HOVER, NORMAL };
25  SelectionMode selection_mode = SelectionMode::HOVER;
26 
27  enum class SelectionTool { BOX, LASSO, PAINT };
28  SelectionTool selection_tool = SelectionTool::BOX;
29 
30  enum class SelectionQualifier { INCLUDE_ORIGIN, INCLUDE_BOX, TOUCH_BOX, AUTO };
31  SelectionQualifier selection_qualifier = SelectionQualifier::INCLUDE_ORIGIN;
32 
33  enum class HighlightMode { HIGHLIGHT, DIM, SHADOW };
34  void set_highlight_mode(HighlightMode mode);
35  HighlightMode get_highlight_mode() const;
36  void set_highlight_enabled(bool x);
37 
38  std::set<SelectableRef> get_selection();
39  void set_selection(const std::set<SelectableRef> &sel, bool emit = true);
40  void set_cursor_pos(const Coordi &c);
41  void set_cursor_external(bool v);
42  Coordi get_cursor_pos();
43  Coordf get_cursor_pos_win();
44  Target get_current_target();
45  void set_selection_allowed(bool a);
46  std::pair<float, Coordf> get_scale_and_offset();
47  void set_scale_and_offset(float sc, Coordf ofs);
48  Coordi snap_to_grid(const Coordi &c);
49 
50  void set_flip_view(bool fl);
51  bool get_flip_view() const override;
52 
53  typedef sigc::signal<void> type_signal_selection_changed;
54  type_signal_selection_changed signal_selection_changed()
55  {
56  return s_signal_selection_changed;
57  }
58 
59  type_signal_selection_changed signal_hover_selection_changed()
60  {
61  return s_signal_hover_selection_changed;
62  }
63 
64  typedef sigc::signal<void, const Coordi &> type_signal_cursor_moved;
65  type_signal_cursor_moved signal_cursor_moved()
66  {
67  return s_signal_cursor_moved;
68  }
69 
70  typedef sigc::signal<void, unsigned int> type_signal_grid_mul_changed;
71  type_signal_grid_mul_changed signal_grid_mul_changed()
72  {
73  return s_signal_grid_mul_changed;
74  }
75  unsigned int get_grid_mul() const
76  {
77  return grid.mul;
78  }
79 
80  typedef sigc::signal<std::string, ObjectType, UUID> type_signal_request_display_name;
81  type_signal_request_display_name signal_request_display_name()
82  {
83  return s_signal_request_display_name;
84  }
85 
86  void center_and_zoom(const Coordi &center);
87  void zoom_to_bbox(const Coordi &a, const Coordi &b);
88 
89  Glib::PropertyProxy<int> property_work_layer()
90  {
91  return p_property_work_layer.get_proxy();
92  }
93  Glib::PropertyProxy<uint64_t> property_grid_spacing()
94  {
95  return p_property_grid_spacing.get_proxy();
96  }
97  Glib::PropertyProxy<float> property_layer_opacity()
98  {
99  return p_property_layer_opacity.get_proxy();
100  }
101  Markers markers;
102  void update_markers() override;
103 
104  std::set<SelectableRef> get_selection_at(const Coordi &c);
105  Coordf screen2canvas(const Coordf &p) const;
106  void update_cursor_pos(double x, double y);
107 
108  const Appearance &get_appearance() const;
109  void set_appearance(const Appearance &a);
110  const Color &get_color(ColorP colorp) const;
111 
112  bool smooth_zoom = true;
113 
114  void inhibit_drag_selection();
115 
116  int _animate_step(GdkFrameClock *frame_clock);
117 
118 protected:
119  void push() override;
120  void request_push() override;
121 
122 private:
123  static const int MAT3_XX = 0;
124  static const int MAT3_X0 = 2;
125  static const int MAT3_YY = 4;
126  static const int MAT3_Y0 = 5;
127 
128  float width, height;
129  glm::mat3 screenmat;
130  float scale = 1e-5;
131  Coord<float> offset;
132  glm::mat3 viewmat;
133  bool flip_view = false;
134  void update_viewmat();
135 
136  Coord<float> cursor_pos;
137  Coord<int64_t> cursor_pos_grid;
138  bool cursor_external = false;
139  bool warped = false;
140 
141  GLuint renderbuffer;
142  GLuint stencilrenderbuffer;
143  GLuint fbo;
144  bool needs_resize = false;
145  enum PushFilter {
146  PF_NONE = 0,
147  PF_TRIANGLES = (1 << 0),
148  PF_CURSOR = (1 << 1),
149  PF_SELECTABLES = (1 << 2),
150  PF_MARKER = (1 << 3),
151  PF_DRAG_SELECTION = (1 << 4),
152  PF_ALL = 0xff
153  };
154  PushFilter push_filter = PF_ALL;
155  void request_push(PushFilter filter);
156 
157  void resize_buffers();
158 
159  Grid grid;
160  DragSelection drag_selection;
161  SelectablesRenderer selectables_renderer;
162  TriangleRenderer triangle_renderer;
163 
164  MarkerRenderer marker_renderer;
165 
166  void pan_drag_begin(GdkEventButton *button_event);
167  void pan_drag_end(GdkEventButton *button_event);
168  void pan_drag_move(GdkEventMotion *motion_event);
169  void pan_drag_move(GdkEventScroll *scroll_event);
170  void pan_zoom(GdkEventScroll *scroll_event, bool to_cursor = true);
171  void cursor_move(GdkEvent *motion_event);
172  void hover_prelight_update(GdkEvent *motion_event);
173  bool pan_dragging = false;
174  Coord<float> pan_pointer_pos_orig;
175  Coord<float> pan_offset_orig;
176 
177  void set_scale(float x, float y, float new_scale);
178 
179  bool selection_allowed = true;
180  Glib::Property<int> p_property_work_layer;
181  Glib::Property<uint64_t> p_property_grid_spacing;
182  Glib::Property<float> p_property_layer_opacity;
183 
184  Gtk::Menu *clarify_menu;
185 
186  HighlightMode highlight_mode = HighlightMode::HIGHLIGHT;
187  bool highlight_enabled = false;
188  Appearance appearance;
189 
190  void update_palette_colors();
191  std::array<std::array<float, 4>, static_cast<size_t>(ColorP::N_COLORS)> palette_colors;
192 
193  bool drag_selection_inhibited = false;
194 
195  MSDAnimator zoom_animator;
196  float zoom_animation_scale_orig = 1;
197  Coordf zoom_animation_pos;
198 
199  Gdk::ModifierType grid_fine_modifier = Gdk::MOD1_MASK;
200 
201 protected:
202  void on_size_allocate(Gtk::Allocation &alloc) override;
203  void on_realize() override;
204  bool on_render(const Glib::RefPtr<Gdk::GLContext> &context) override;
205  bool on_button_press_event(GdkEventButton *button_event) override;
206  bool on_button_release_event(GdkEventButton *button_event) override;
207  bool on_motion_notify_event(GdkEventMotion *motion_event) override;
208  bool on_scroll_event(GdkEventScroll *scroll_event) override;
209  Glib::RefPtr<Gdk::GLContext> on_create_context() override;
210 
211  type_signal_selection_changed s_signal_selection_changed;
212  type_signal_selection_changed s_signal_hover_selection_changed;
213  type_signal_cursor_moved s_signal_cursor_moved;
214  type_signal_grid_mul_changed s_signal_grid_mul_changed;
215  type_signal_request_display_name s_signal_request_display_name;
216 };
217 } // namespace horizon
Definition: target.hpp:6
Definition: grid.hpp:6
Definition: appearance.hpp:7
Definition: selectables.hpp:87
Definition: msd_animator.hpp:5
Definition: canvas_gl.hpp:13
Definition: marker.hpp:35
Definition: canvas.hpp:20
Definition: drag_selection.hpp:8
Definition: marker.hpp:51
Definition: block.cpp:9
Definition: triangle.hpp:73
Definition: common.hpp:207