20class CanvasGL :
public Canvas,
public Gtk::GLArea {
23 friend SelectablesRenderer;
24 friend TriangleRenderer;
25 friend MarkerRenderer;
27 friend CanvasAnnotation;
28 friend PictureRenderer;
33 enum class SelectionMode { HOVER, NORMAL };
34 void set_selection_mode(SelectionMode mode);
35 SelectionMode get_selection_mode()
const;
36 typedef sigc::signal<void, SelectionMode> type_signal_selection_mode_changed;
37 type_signal_selection_mode_changed signal_selection_mode_changed()
39 return s_signal_selection_mode_changed;
42 enum class SelectionTool { BOX, LASSO, PAINT };
43 SelectionTool selection_tool = SelectionTool::BOX;
45 enum class SelectionQualifier { INCLUDE_ORIGIN, INCLUDE_BOX, TOUCH_BOX, AUTO };
46 SelectionQualifier selection_qualifier = SelectionQualifier::INCLUDE_ORIGIN;
48 enum class SelectionModifierAction { TOGGLE, ADD, REMOVE };
49 SelectionModifierAction selection_modifier_action = SelectionModifierAction::TOGGLE;
51 bool selection_sticky =
false;
53 enum class HighlightMode { HIGHLIGHT, DIM, SHADOW };
54 void set_highlight_mode(HighlightMode mode);
55 HighlightMode get_highlight_mode()
const;
56 void set_highlight_enabled(
bool x);
57 void set_highlight_on_top(
bool on_top);
59 enum class LayerMode { AS_IS, WORK_ONLY, SHADOW_OTHER };
60 void set_layer_mode(LayerMode mode);
62 std::set<SelectableRef> get_selection()
const;
63 void set_selection(
const std::set<SelectableRef> &sel,
bool emit =
true);
65 void set_cursor_pos(
const Coordi &c);
66 void set_cursor_external(
bool v);
67 Coordi get_cursor_pos()
const;
68 Coordf get_cursor_pos_win()
const;
69 Target get_current_target()
const;
70 void set_selection_allowed(
bool a);
71 std::pair<float, Coordf> get_scale_and_offset()
const;
72 void set_scale_and_offset(
float sc, Coordf ofs);
73 Coordi snap_to_grid(
const Coordi &c,
unsigned int div = 1)
const;
75 void set_flip_view(
bool fl);
76 bool get_flip_view()
const override;
78 void set_view_angle(
float a);
79 float get_view_angle()
const override;
81 void set_cursor_size(
float size);
82 void set_cursor_size(Appearance::CursorSize);
84 void clear()
override;
86 typedef sigc::signal<void> type_signal_selection_changed;
87 type_signal_selection_changed signal_selection_changed()
89 return s_signal_selection_changed;
92 type_signal_selection_changed signal_hover_selection_changed()
94 return s_signal_hover_selection_changed;
97 typedef sigc::signal<void, const Coordi &> type_signal_cursor_moved;
98 type_signal_cursor_moved signal_cursor_moved()
100 return s_signal_cursor_moved;
103 typedef sigc::signal<void, unsigned int> type_signal_grid_mul_changed;
104 type_signal_grid_mul_changed signal_grid_mul_changed()
106 return s_signal_grid_mul_changed;
108 unsigned int get_grid_mul()
const
113 typedef sigc::signal<std::string, const SelectableRef &> type_signal_request_display_name;
114 type_signal_request_display_name signal_request_display_name()
116 return s_signal_request_display_name;
119 typedef sigc::signal<void, bool &> type_signal_can_steal_focus;
120 type_signal_can_steal_focus signal_can_steal_focus()
122 return s_signal_can_steal_focus;
125 typedef sigc::signal<void> type_signal_scale_changed;
126 type_signal_scale_changed signal_scale_changed()
128 return s_signal_scale_changed;
131 void center_and_zoom(
const Coordf ¢er,
float scale = -1);
132 void zoom_to_bbox(
const Coordf &a,
const Coordf &b);
133 void zoom_to_bbox(
const std::pair<Coordf, Coordf> &bb);
134 void ensure_min_size(
float w,
float h);
135 void zoom_to(
const Coordf &c,
float inc);
137 Glib::PropertyProxy<int> property_work_layer()
139 return p_property_work_layer.get_proxy();
141 Glib::PropertyProxy<float> property_layer_opacity()
143 return p_property_layer_opacity.get_proxy();
145 Glib::PropertyProxy_ReadOnly<float> property_layer_opacity()
const
147 return Glib::PropertyProxy_ReadOnly<float>(
this,
"layer-opacity");
150 void update_markers()
override;
152 std::set<SelectableRef> get_selection_at(
const Coordi &c)
const;
153 Coordf screen2canvas(
const Coordf &p)
const;
154 void update_cursor_pos(
double x,
double y);
158 const Color &get_color(ColorP colorp)
const;
160 bool touchpad_pan =
false;
162 bool smooth_zoom =
true;
163 bool snap_to_targets =
true;
165 float zoom_base = 1.5;
167 void inhibit_drag_selection();
169 int _animate_step(GdkFrameClock *frame_clock);
171 float get_width()
const
175 float get_height()
const
180 CanvasAnnotation *create_annotation();
181 void remove_annotation(CanvasAnnotation *a);
182 bool layer_is_annotation(
int l)
const;
184 std::set<SnapFilter> snap_filter;
186 void set_grid_spacing(uint64_t x, uint64_t y);
187 void set_grid_spacing(uint64_t s);
188 Coordi get_grid_spacing()
const;
189 void set_grid_origin(
const Coordi &c);
191 SelectionFilter selection_filter;
193 bool layer_is_visible(
int layer)
const;
194 bool layer_is_visible(
LayerRange layer)
const;
196 void set_colors2(
const std::vector<ColorI> &c);
198 int get_last_grid_div()
const;
200 void append_target(
const Target &target);
204 bool show_pictures =
true;
209 void push()
override;
210 void request_push()
override;
213 static const int MAT3_XX = 0;
214 static const int MAT3_X0 = 2;
215 static const int MAT3_YY = 4;
216 static const int MAT3_Y0 = 5;
218 float m_width, m_height;
223 glm::mat3 viewmat_noflip;
224 bool flip_view =
false;
225 float view_angle = 0;
226 void update_viewmat();
227 Coordf canvas2screen(
const Coordf &p)
const;
231 bool cursor_external =
false;
234 GLuint stencilrenderbuffer;
236 bool needs_resize =
false;
239 PF_TRIANGLES = (1 << 0),
240 PF_CURSOR = (1 << 1),
241 PF_SELECTABLES = (1 << 2),
242 PF_MARKER = (1 << 3),
243 PF_DRAG_SELECTION = (1 << 4),
246 PushFilter push_filter = PF_ALL;
247 void request_push(PushFilter filter);
249 void resize_buffers();
252 DragSelection drag_selection;
253 SelectablesRenderer selectables_renderer;
254 TriangleRenderer triangle_renderer;
256 MarkerRenderer marker_renderer;
258 PictureRenderer picture_renderer;
260 enum class ZoomTo { CURSOR, CENTER };
262 void pan_drag_begin(GdkEventButton *button_event);
263 void pan_drag_end(GdkEventButton *button_event);
264 void pan_drag_move(GdkEventMotion *motion_event);
265 void pan_drag_move(GdkEventScroll *scroll_event, ScrollDirection scroll_direction);
266 void pan_zoom(GdkEventScroll *scroll_event, ZoomTo zoom_to, ScrollDirection scroll_direction);
267 void start_smooth_zoom(
const Coordf &c,
float inc);
268 void cursor_move(GdkEvent *motion_event);
269 void hover_prelight_update(GdkEvent *motion_event);
270 bool pan_dragging =
false;
274 void set_scale(
float x,
float y,
float new_scale);
276 bool selection_allowed =
true;
277 Glib::Property<int> p_property_work_layer;
278 Glib::Property<float> p_property_layer_opacity;
280 Gtk::Menu *clarify_menu;
282 HighlightMode highlight_mode = HighlightMode::HIGHLIGHT;
283 bool highlight_enabled =
false;
284 bool highlight_on_top =
false;
287 LayerMode layer_mode = LayerMode::AS_IS;
289 bool drag_selection_inhibited =
false;
292 float zoom_animation_scale_orig = 1;
293 Coordf zoom_animation_pos;
295 Gdk::ModifierType grid_fine_modifier = Gdk::MOD1_MASK;
296 float cursor_size = 20;
298 static const int first_annotation_layer = 20000;
299 int annotation_layer_current = first_annotation_layer;
300 std::map<int, CanvasAnnotation> annotations;
302 void draw_bitmap_text(
const Coordf &p,
float scale,
const std::string &rtext,
int angle, ColorP color,
304 std::pair<Coordf, Coordf> measure_bitmap_text(
const std::string &text)
const override;
305 void draw_bitmap_text_box(
const Placement &q,
float width,
float height,
const std::string &s, ColorP color,
306 int layer, TextBoxMode mode)
override;
308 SelectionMode selection_mode = SelectionMode::HOVER;
310 Glib::RefPtr<Gtk::GestureZoom> gesture_zoom;
311 void zoom_gesture_begin_cb(GdkEventSequence *seq);
312 void zoom_gesture_update_cb(GdkEventSequence *seq);
315 float gesture_zoom_scale_orig = 1;
317 Glib::RefPtr<Gtk::GestureDrag> gesture_drag;
320 void drag_gesture_begin_cb(GdkEventSequence *seq);
321 void drag_gesture_update_cb(GdkEventSequence *seq);
323 bool can_snap_to_target(
const Target &t)
const;
325 std::vector<ColorI> colors2;
327 bool can_set_scale()
const;
329 int last_grid_div = 1;
332 void on_size_allocate(Gtk::Allocation &alloc)
override;
333 void on_realize()
override;
334 bool on_render(
const Glib::RefPtr<Gdk::GLContext> &context)
override;
335 bool on_button_press_event(GdkEventButton *button_event)
override;
336 bool on_button_release_event(GdkEventButton *button_event)
override;
337 bool on_motion_notify_event(GdkEventMotion *motion_event)
override;
338 bool on_scroll_event(GdkEventScroll *scroll_event)
override;
339 Glib::RefPtr<Gdk::GLContext> on_create_context()
override;
341 type_signal_selection_changed s_signal_selection_changed;
342 type_signal_selection_changed s_signal_hover_selection_changed;
343 type_signal_selection_mode_changed s_signal_selection_mode_changed;
344 type_signal_cursor_moved s_signal_cursor_moved;
345 type_signal_grid_mul_changed s_signal_grid_mul_changed;
346 type_signal_request_display_name s_signal_request_display_name;
347 type_signal_can_steal_focus s_signal_can_steal_focus;
348 type_signal_scale_changed s_signal_scale_changed;