1 /*************************************************************************/
2 /*  canvas_item_editor_plugin.h                                          */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 
31 #ifndef CONTROL_EDITOR_PLUGIN_H
32 #define CONTROL_EDITOR_PLUGIN_H
33 
34 #include "editor/editor_node.h"
35 #include "editor/editor_plugin.h"
36 #include "scene/2d/canvas_item.h"
37 #include "scene/gui/box_container.h"
38 #include "scene/gui/check_box.h"
39 #include "scene/gui/label.h"
40 #include "scene/gui/panel_container.h"
41 #include "scene/gui/spin_box.h"
42 
43 class CanvasItemEditorViewport;
44 
45 class CanvasItemEditorSelectedItem : public Object {
46 
47 	GDCLASS(CanvasItemEditorSelectedItem, Object);
48 
49 public:
50 	Transform2D prev_xform;
51 	float prev_rot;
52 	Rect2 prev_rect;
53 	Vector2 prev_pivot;
54 	float prev_anchors[4];
55 
56 	Transform2D pre_drag_xform;
57 	Rect2 pre_drag_rect;
58 
59 	List<float> pre_drag_bones_length;
60 	List<Dictionary> pre_drag_bones_undo_state;
61 
62 	Dictionary undo_state;
63 
CanvasItemEditorSelectedItem()64 	CanvasItemEditorSelectedItem() :
65 			prev_anchors() {
66 		prev_rot = 0;
67 	}
68 };
69 
70 class CanvasItemEditor : public VBoxContainer {
71 
72 	GDCLASS(CanvasItemEditor, VBoxContainer);
73 
74 public:
75 	enum Tool {
76 		TOOL_SELECT,
77 		TOOL_LIST_SELECT,
78 		TOOL_MOVE,
79 		TOOL_SCALE,
80 		TOOL_ROTATE,
81 		TOOL_EDIT_PIVOT,
82 		TOOL_PAN,
83 		TOOL_RULER,
84 		TOOL_MAX
85 	};
86 
87 private:
88 	EditorNode *editor;
89 
90 	enum SnapTarget {
91 		SNAP_TARGET_NONE = 0,
92 		SNAP_TARGET_PARENT,
93 		SNAP_TARGET_SELF_ANCHORS,
94 		SNAP_TARGET_SELF,
95 		SNAP_TARGET_OTHER_NODE,
96 		SNAP_TARGET_GUIDE,
97 		SNAP_TARGET_GRID,
98 		SNAP_TARGET_PIXEL
99 	};
100 
101 	enum MenuOption {
102 		SNAP_USE,
103 		SNAP_USE_NODE_PARENT,
104 		SNAP_USE_NODE_ANCHORS,
105 		SNAP_USE_NODE_SIDES,
106 		SNAP_USE_NODE_CENTER,
107 		SNAP_USE_OTHER_NODES,
108 		SNAP_USE_GRID,
109 		SNAP_USE_GUIDES,
110 		SNAP_USE_ROTATION,
111 		SNAP_USE_SCALE,
112 		SNAP_RELATIVE,
113 		SNAP_CONFIGURE,
114 		SNAP_USE_PIXEL,
115 		SHOW_GRID,
116 		SHOW_HELPERS,
117 		SHOW_RULERS,
118 		SHOW_GUIDES,
119 		SHOW_ORIGIN,
120 		SHOW_VIEWPORT,
121 		SHOW_EDIT_LOCKS,
122 		LOCK_SELECTED,
123 		UNLOCK_SELECTED,
124 		GROUP_SELECTED,
125 		UNGROUP_SELECTED,
126 		ANCHORS_AND_MARGINS_PRESET_TOP_LEFT,
127 		ANCHORS_AND_MARGINS_PRESET_TOP_RIGHT,
128 		ANCHORS_AND_MARGINS_PRESET_BOTTOM_LEFT,
129 		ANCHORS_AND_MARGINS_PRESET_BOTTOM_RIGHT,
130 		ANCHORS_AND_MARGINS_PRESET_CENTER_LEFT,
131 		ANCHORS_AND_MARGINS_PRESET_CENTER_RIGHT,
132 		ANCHORS_AND_MARGINS_PRESET_CENTER_TOP,
133 		ANCHORS_AND_MARGINS_PRESET_CENTER_BOTTOM,
134 		ANCHORS_AND_MARGINS_PRESET_CENTER,
135 		ANCHORS_AND_MARGINS_PRESET_TOP_WIDE,
136 		ANCHORS_AND_MARGINS_PRESET_LEFT_WIDE,
137 		ANCHORS_AND_MARGINS_PRESET_RIGHT_WIDE,
138 		ANCHORS_AND_MARGINS_PRESET_BOTTOM_WIDE,
139 		ANCHORS_AND_MARGINS_PRESET_VCENTER_WIDE,
140 		ANCHORS_AND_MARGINS_PRESET_HCENTER_WIDE,
141 		ANCHORS_AND_MARGINS_PRESET_WIDE,
142 		ANCHORS_AND_MARGINS_PRESET_KEEP_RATIO,
143 		ANCHORS_PRESET_TOP_LEFT,
144 		ANCHORS_PRESET_TOP_RIGHT,
145 		ANCHORS_PRESET_BOTTOM_LEFT,
146 		ANCHORS_PRESET_BOTTOM_RIGHT,
147 		ANCHORS_PRESET_CENTER_LEFT,
148 		ANCHORS_PRESET_CENTER_RIGHT,
149 		ANCHORS_PRESET_CENTER_TOP,
150 		ANCHORS_PRESET_CENTER_BOTTOM,
151 		ANCHORS_PRESET_CENTER,
152 		ANCHORS_PRESET_TOP_WIDE,
153 		ANCHORS_PRESET_LEFT_WIDE,
154 		ANCHORS_PRESET_RIGHT_WIDE,
155 		ANCHORS_PRESET_BOTTOM_WIDE,
156 		ANCHORS_PRESET_VCENTER_WIDE,
157 		ANCHORS_PRESET_HCENTER_WIDE,
158 		ANCHORS_PRESET_WIDE,
159 		MARGINS_PRESET_TOP_LEFT,
160 		MARGINS_PRESET_TOP_RIGHT,
161 		MARGINS_PRESET_BOTTOM_LEFT,
162 		MARGINS_PRESET_BOTTOM_RIGHT,
163 		MARGINS_PRESET_CENTER_LEFT,
164 		MARGINS_PRESET_CENTER_RIGHT,
165 		MARGINS_PRESET_CENTER_TOP,
166 		MARGINS_PRESET_CENTER_BOTTOM,
167 		MARGINS_PRESET_CENTER,
168 		MARGINS_PRESET_TOP_WIDE,
169 		MARGINS_PRESET_LEFT_WIDE,
170 		MARGINS_PRESET_RIGHT_WIDE,
171 		MARGINS_PRESET_BOTTOM_WIDE,
172 		MARGINS_PRESET_VCENTER_WIDE,
173 		MARGINS_PRESET_HCENTER_WIDE,
174 		MARGINS_PRESET_WIDE,
175 		ANIM_INSERT_KEY,
176 		ANIM_INSERT_KEY_EXISTING,
177 		ANIM_INSERT_POS,
178 		ANIM_INSERT_ROT,
179 		ANIM_INSERT_SCALE,
180 		ANIM_COPY_POSE,
181 		ANIM_PASTE_POSE,
182 		ANIM_CLEAR_POSE,
183 		CLEAR_GUIDES,
184 		VIEW_CENTER_TO_SELECTION,
185 		VIEW_FRAME_TO_SELECTION,
186 		PREVIEW_CANVAS_SCALE,
187 		SKELETON_MAKE_BONES,
188 		SKELETON_CLEAR_BONES,
189 		SKELETON_SHOW_BONES,
190 		SKELETON_SET_IK_CHAIN,
191 		SKELETON_CLEAR_IK_CHAIN
192 
193 	};
194 
195 	enum DragType {
196 		DRAG_NONE,
197 		DRAG_BOX_SELECTION,
198 		DRAG_LEFT,
199 		DRAG_TOP_LEFT,
200 		DRAG_TOP,
201 		DRAG_TOP_RIGHT,
202 		DRAG_RIGHT,
203 		DRAG_BOTTOM_RIGHT,
204 		DRAG_BOTTOM,
205 		DRAG_BOTTOM_LEFT,
206 		DRAG_ANCHOR_TOP_LEFT,
207 		DRAG_ANCHOR_TOP_RIGHT,
208 		DRAG_ANCHOR_BOTTOM_RIGHT,
209 		DRAG_ANCHOR_BOTTOM_LEFT,
210 		DRAG_ANCHOR_ALL,
211 		DRAG_MOVE,
212 		DRAG_SCALE_X,
213 		DRAG_SCALE_Y,
214 		DRAG_SCALE_BOTH,
215 		DRAG_ROTATE,
216 		DRAG_PIVOT,
217 		DRAG_V_GUIDE,
218 		DRAG_H_GUIDE,
219 		DRAG_DOUBLE_GUIDE,
220 		DRAG_KEY_MOVE
221 	};
222 
223 	EditorSelection *editor_selection;
224 	bool selection_menu_additive_selection;
225 
226 	Tool tool;
227 	Control *viewport;
228 	Control *viewport_scrollable;
229 
230 	HScrollBar *h_scroll;
231 	VScrollBar *v_scroll;
232 	HBoxContainer *hb;
233 
234 	ToolButton *zoom_minus;
235 	ToolButton *zoom_reset;
236 	ToolButton *zoom_plus;
237 
238 	Map<Control *, Timer *> popup_temporarily_timers;
239 
240 	Label *warning_child_of_container;
241 	VBoxContainer *info_overlay;
242 
243 	Transform2D transform;
244 	bool show_grid;
245 	bool show_rulers;
246 	bool show_guides;
247 	bool show_origin;
248 	bool show_viewport;
249 	bool show_helpers;
250 	bool show_edit_locks;
251 	float zoom;
252 	Point2 view_offset;
253 	Point2 previous_update_view_offset;
254 
255 	bool selected_from_canvas;
256 	bool anchors_mode;
257 
258 	Point2 grid_offset;
259 	Point2 grid_step;
260 	int primary_grid_steps;
261 	int grid_step_multiplier;
262 
263 	float snap_rotation_step;
264 	float snap_rotation_offset;
265 	float snap_scale_step;
266 	bool smart_snap_active;
267 	bool grid_snap_active;
268 
269 	bool snap_node_parent;
270 	bool snap_node_anchors;
271 	bool snap_node_sides;
272 	bool snap_node_center;
273 	bool snap_other_nodes;
274 	bool snap_guides;
275 	bool snap_rotation;
276 	bool snap_scale;
277 	bool snap_relative;
278 	bool snap_pixel;
279 	bool skeleton_show_bones;
280 	bool key_pos;
281 	bool key_rot;
282 	bool key_scale;
283 	bool panning;
284 	bool pan_pressed;
285 
286 	bool ruler_tool_active;
287 	Point2 ruler_tool_origin;
288 
289 	MenuOption last_option;
290 
291 	struct _SelectResult {
292 
293 		CanvasItem *item;
294 		float z_index;
295 		bool has_z;
296 		_FORCE_INLINE_ bool operator<(const _SelectResult &p_rr) const {
297 			return has_z && p_rr.has_z ? p_rr.z_index < z_index : p_rr.has_z;
298 		}
299 	};
300 	Vector<_SelectResult> selection_results;
301 
302 	struct _HoverResult {
303 
304 		Point2 position;
305 		Ref<Texture> icon;
306 		String name;
307 	};
308 	Vector<_HoverResult> hovering_results;
309 
310 	struct BoneList {
311 
312 		Transform2D xform;
313 		float length;
314 		uint64_t last_pass;
315 
BoneListBoneList316 		BoneList() :
317 				length(0.f),
318 				last_pass(0) {}
319 	};
320 
321 	uint64_t bone_last_frame;
322 
323 	struct BoneKey {
324 		ObjectID from;
325 		ObjectID to;
326 		_FORCE_INLINE_ bool operator<(const BoneKey &p_key) const {
327 			if (from == p_key.from)
328 				return to < p_key.to;
329 			else
330 				return from < p_key.from;
331 		}
332 	};
333 
334 	Map<BoneKey, BoneList> bone_list;
335 
336 	struct PoseClipboard {
337 		Vector2 pos;
338 		Vector2 scale;
339 		float rot;
340 		ObjectID id;
341 	};
342 	List<PoseClipboard> pose_clipboard;
343 
344 	ToolButton *select_button;
345 
346 	ToolButton *move_button;
347 	ToolButton *scale_button;
348 	ToolButton *rotate_button;
349 
350 	ToolButton *list_select_button;
351 	ToolButton *pivot_button;
352 	ToolButton *pan_button;
353 
354 	ToolButton *ruler_button;
355 
356 	ToolButton *smart_snap_button;
357 	ToolButton *grid_snap_button;
358 	MenuButton *snap_config_menu;
359 	PopupMenu *smartsnap_config_popup;
360 
361 	ToolButton *lock_button;
362 	ToolButton *unlock_button;
363 
364 	ToolButton *group_button;
365 	ToolButton *ungroup_button;
366 
367 	MenuButton *skeleton_menu;
368 	ToolButton *override_camera_button;
369 	MenuButton *view_menu;
370 	HBoxContainer *animation_hb;
371 	MenuButton *animation_menu;
372 
373 	MenuButton *presets_menu;
374 	PopupMenu *anchors_and_margins_popup;
375 	PopupMenu *anchors_popup;
376 
377 	ToolButton *anchor_mode_button;
378 
379 	Button *key_loc_button;
380 	Button *key_rot_button;
381 	Button *key_scale_button;
382 	Button *key_insert_button;
383 	Button *key_auto_insert_button;
384 
385 	PopupMenu *selection_menu;
386 
387 	Control *top_ruler;
388 	Control *left_ruler;
389 
390 	DragType drag_type;
391 	Point2 drag_from;
392 	Point2 drag_to;
393 	Point2 drag_rotation_center;
394 	List<CanvasItem *> drag_selection;
395 	int dragged_guide_index;
396 	Point2 dragged_guide_pos;
397 	bool is_hovering_h_guide;
398 	bool is_hovering_v_guide;
399 
400 	bool updating_value_dialog;
401 
402 	Point2 box_selecting_to;
403 
404 	Ref<StyleBoxTexture> select_sb;
405 	Ref<Texture> select_handle;
406 	Ref<Texture> anchor_handle;
407 
408 	Ref<ShortCut> drag_pivot_shortcut;
409 	Ref<ShortCut> set_pivot_shortcut;
410 	Ref<ShortCut> multiply_grid_step_shortcut;
411 	Ref<ShortCut> divide_grid_step_shortcut;
412 	Ref<ShortCut> pan_view_shortcut;
413 
414 	bool _is_node_locked(const Node *p_node);
415 	bool _is_node_movable(const Node *p_node, bool p_popup_warning = false);
416 	void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<_SelectResult> &r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
417 	void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items);
418 	void _get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items);
419 
420 	void _find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
421 	bool _select_click_on_item(CanvasItem *item, Point2 p_click_pos, bool p_append);
422 
423 	ConfirmationDialog *snap_dialog;
424 
425 	CanvasItem *ref_item;
426 
427 	void _add_canvas_item(CanvasItem *p_canvas_item);
428 
429 	void _save_canvas_item_ik_chain(const CanvasItem *p_canvas_item, List<float> *p_bones_length, List<Dictionary> *p_bones_state);
430 	void _save_canvas_item_state(List<CanvasItem *> p_canvas_items, bool save_bones = false);
431 	void _restore_canvas_item_ik_chain(CanvasItem *p_canvas_item, const List<Dictionary> *p_bones_state);
432 	void _restore_canvas_item_state(List<CanvasItem *> p_canvas_items, bool restore_bones = false);
433 	void _commit_canvas_item_state(List<CanvasItem *> p_canvas_items, String action_name, bool commit_bones = false);
434 
435 	Vector2 _anchor_to_position(const Control *p_control, Vector2 anchor);
436 	Vector2 _position_to_anchor(const Control *p_control, Vector2 position);
437 
438 	void _popup_callback(int p_op);
439 	bool updating_scroll;
440 	void _update_scroll(float);
441 	void _update_scrollbars();
442 	void _append_canvas_item(CanvasItem *p_item);
443 	void _snap_changed();
444 	void _selection_result_pressed(int);
445 	void _selection_menu_hide();
446 
447 	UndoRedo *undo_redo;
448 	bool _build_bones_list(Node *p_node);
449 	bool _get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *outline_shape, Map<BoneKey, BoneList>::Element *bone);
450 
451 	List<CanvasItem *> _get_edited_canvas_items(bool retreive_locked = false, bool remove_canvas_item_if_parent_in_selection = true);
452 	Rect2 _get_encompassing_rect_from_list(List<CanvasItem *> p_list);
453 	void _expand_encompassing_rect_using_children(Rect2 &r_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D(), bool include_locked_nodes = true);
454 	Rect2 _get_encompassing_rect(const Node *p_node);
455 
456 	Object *_get_editor_data(Object *p_what);
457 
458 	void _insert_animation_keys(bool p_location, bool p_rotation, bool p_scale, bool p_on_existing);
459 
460 	void _keying_changed();
461 
462 	void _unhandled_key_input(const Ref<InputEvent> &p_ev);
463 
464 	void _draw_text_at_position(Point2 p_position, String p_string, Margin p_side);
465 	void _draw_margin_at_position(int p_value, Point2 p_position, Margin p_side);
466 	void _draw_percentage_at_position(float p_value, Point2 p_position, Margin p_side);
467 	void _draw_straight_line(Point2 p_from, Point2 p_to, Color p_color);
468 
469 	void _draw_smart_snapping();
470 	void _draw_rulers();
471 	void _draw_guides();
472 	void _draw_focus();
473 	void _draw_grid();
474 	void _draw_ruler_tool();
475 	void _draw_control_anchors(Control *control);
476 	void _draw_control_helpers(Control *control);
477 	void _draw_selection();
478 	void _draw_axis();
479 	void _draw_bones();
480 	void _draw_invisible_nodes_positions(Node *p_node, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
481 	void _draw_locks_and_groups(Node *p_node, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
482 	void _draw_hover();
483 
484 	void _draw_viewport();
485 
486 	bool _gui_input_anchors(const Ref<InputEvent> &p_event);
487 	bool _gui_input_move(const Ref<InputEvent> &p_event);
488 	bool _gui_input_open_scene_on_double_click(const Ref<InputEvent> &p_event);
489 	bool _gui_input_scale(const Ref<InputEvent> &p_event);
490 	bool _gui_input_pivot(const Ref<InputEvent> &p_event);
491 	bool _gui_input_resize(const Ref<InputEvent> &p_event);
492 	bool _gui_input_rotate(const Ref<InputEvent> &p_event);
493 	bool _gui_input_select(const Ref<InputEvent> &p_event);
494 	bool _gui_input_ruler_tool(const Ref<InputEvent> &p_event);
495 	bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted);
496 	bool _gui_input_rulers_and_guides(const Ref<InputEvent> &p_event);
497 	bool _gui_input_hover(const Ref<InputEvent> &p_event);
498 
499 	void _gui_input_viewport(const Ref<InputEvent> &p_event);
500 
501 	void _selection_changed();
502 
503 	void _focus_selection(int p_op);
504 
505 	void _solve_IK(Node2D *leaf_node, Point2 target_position);
506 
507 	SnapTarget snap_target[2];
508 	Transform2D snap_transform;
509 	void _snap_if_closer_float(
510 			float p_value,
511 			float &r_current_snap, SnapTarget &r_current_snap_target,
512 			float p_target_value, SnapTarget p_snap_target,
513 			float p_radius = 10.0);
514 	void _snap_if_closer_point(
515 			Point2 p_value,
516 			Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
517 			Point2 p_target_value, SnapTarget p_snap_target,
518 			real_t rotation = 0.0,
519 			float p_radius = 10.0);
520 	void _snap_other_nodes(
521 			const Point2 p_value,
522 			const Transform2D p_transform_to_snap,
523 			Point2 &r_current_snap, SnapTarget (&r_current_snap_target)[2],
524 			const SnapTarget p_snap_target, List<const CanvasItem *> p_exceptions,
525 			const Node *p_current);
526 
527 	void _set_anchors_preset(Control::LayoutPreset p_preset);
528 	void _set_margins_preset(Control::LayoutPreset p_preset);
529 	void _set_anchors_and_margins_preset(Control::LayoutPreset p_preset);
530 	void _set_anchors_and_margins_to_keep_ratio();
531 
532 	void _button_toggle_anchor_mode(bool p_status);
533 
534 	VBoxContainer *controls_vb;
535 	HBoxContainer *zoom_hb;
536 	float _get_next_zoom_value(int p_increment_count) const;
537 	void _zoom_on_position(float p_zoom, Point2 p_position = Point2());
538 	void _update_zoom_label();
539 	void _button_zoom_minus();
540 	void _button_zoom_reset();
541 	void _button_zoom_plus();
542 	void _button_toggle_smart_snap(bool p_status);
543 	void _button_toggle_grid_snap(bool p_status);
544 	void _button_override_camera(bool p_pressed);
545 	void _button_tool_select(int p_index);
546 
547 	void _update_override_camera_button(bool p_game_running);
548 
549 	HSplitContainer *palette_split;
550 	VSplitContainer *bottom_split;
551 
552 	bool bone_list_dirty;
553 	void _queue_update_bone_list();
554 	void _update_bone_list();
555 	void _tree_changed(Node *);
556 
557 	void _popup_warning_temporarily(Control *p_control, const float p_duration);
558 	void _popup_warning_depop(Control *p_control);
559 
560 	friend class CanvasItemEditorPlugin;
561 
562 protected:
563 	void _notification(int p_what);
564 
565 	static void _bind_methods();
566 	void end_drag();
567 	void box_selection_start(Point2 &click);
568 	bool box_selection_end();
569 
get_panel_hb()570 	HBoxContainer *get_panel_hb() { return hb; }
571 
572 	struct compare_items_x {
operatorcompare_items_x573 		bool operator()(const CanvasItem *a, const CanvasItem *b) const {
574 			return a->get_global_transform().elements[2].x < b->get_global_transform().elements[2].x;
575 		}
576 	};
577 
578 	struct compare_items_y {
operatorcompare_items_y579 		bool operator()(const CanvasItem *a, const CanvasItem *b) const {
580 			return a->get_global_transform().elements[2].y < b->get_global_transform().elements[2].y;
581 		}
582 	};
583 
584 	struct proj_vector2_x {
getproj_vector2_x585 		float get(const Vector2 &v) { return v.x; }
setproj_vector2_x586 		void set(Vector2 &v, float f) { v.x = f; }
587 	};
588 
589 	struct proj_vector2_y {
getproj_vector2_y590 		float get(const Vector2 &v) { return v.y; }
setproj_vector2_y591 		void set(Vector2 &v, float f) { v.y = f; }
592 	};
593 
594 	template <class P, class C>
595 	void space_selected_items();
596 
597 	static CanvasItemEditor *singleton;
598 
599 public:
600 	enum SnapMode {
601 		SNAP_GRID = 1 << 0,
602 		SNAP_GUIDES = 1 << 1,
603 		SNAP_PIXEL = 1 << 2,
604 		SNAP_NODE_PARENT = 1 << 3,
605 		SNAP_NODE_ANCHORS = 1 << 4,
606 		SNAP_NODE_SIDES = 1 << 5,
607 		SNAP_NODE_CENTER = 1 << 6,
608 		SNAP_OTHER_NODES = 1 << 7,
609 
610 		SNAP_DEFAULT = SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL,
611 	};
612 
613 	Point2 snap_point(Point2 p_target, unsigned int p_modes = SNAP_DEFAULT, unsigned int p_forced_modes = 0, const CanvasItem *p_self_canvas_item = NULL, List<CanvasItem *> p_other_nodes_exceptions = List<CanvasItem *>());
614 	float snap_angle(float p_target, float p_start = 0) const;
615 
get_canvas_transform()616 	Transform2D get_canvas_transform() const { return transform; }
617 
get_singleton()618 	static CanvasItemEditor *get_singleton() { return singleton; }
619 	Dictionary get_state() const;
620 	void set_state(const Dictionary &p_state);
621 
622 	void add_control_to_menu_panel(Control *p_control);
623 	void remove_control_from_menu_panel(Control *p_control);
624 
625 	void add_control_to_info_overlay(Control *p_control);
626 	void remove_control_from_info_overlay(Control *p_control);
627 
628 	HSplitContainer *get_palette_split();
629 	VSplitContainer *get_bottom_split();
630 
get_viewport_control()631 	Control *get_viewport_control() { return viewport; }
632 
get_controls_container()633 	Control *get_controls_container() { return controls_vb; }
634 
635 	void update_viewport();
636 
get_current_tool()637 	Tool get_current_tool() { return tool; }
638 	void set_current_tool(Tool p_tool);
639 
set_undo_redo(UndoRedo * p_undo_redo)640 	void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
641 	void edit(CanvasItem *p_canvas_item);
642 
643 	void focus_selection();
644 
is_anchors_mode_enabled()645 	bool is_anchors_mode_enabled() { return anchors_mode; };
646 
647 	CanvasItemEditor(EditorNode *p_editor);
648 };
649 
650 class CanvasItemEditorPlugin : public EditorPlugin {
651 
652 	GDCLASS(CanvasItemEditorPlugin, EditorPlugin);
653 
654 	CanvasItemEditor *canvas_item_editor;
655 	EditorNode *editor;
656 
657 public:
get_name()658 	virtual String get_name() const { return "2D"; }
has_main_screen()659 	bool has_main_screen() const { return true; }
660 	virtual void edit(Object *p_object);
661 	virtual bool handles(Object *p_object) const;
662 	virtual void make_visible(bool p_visible);
663 	virtual Dictionary get_state() const;
664 	virtual void set_state(const Dictionary &p_state);
665 
get_canvas_item_editor()666 	CanvasItemEditor *get_canvas_item_editor() { return canvas_item_editor; }
667 
668 	CanvasItemEditorPlugin(EditorNode *p_node);
669 	~CanvasItemEditorPlugin();
670 };
671 
672 class CanvasItemEditorViewport : public Control {
673 	GDCLASS(CanvasItemEditorViewport, Control);
674 
675 	String default_type;
676 	Vector<String> types;
677 
678 	Vector<String> selected_files;
679 	Node *target_node;
680 	Point2 drop_pos;
681 
682 	EditorNode *editor;
683 	EditorData *editor_data;
684 	CanvasItemEditor *canvas_item_editor;
685 	Node2D *preview_node;
686 	AcceptDialog *accept;
687 	WindowDialog *selector;
688 	Label *selector_label;
689 	Label *label;
690 	Label *label_desc;
691 	VBoxContainer *btn_group;
692 	Ref<ButtonGroup> button_group;
693 
694 	void _on_mouse_exit();
695 	void _on_select_type(Object *selected);
696 	void _on_change_type_confirmed();
697 	void _on_change_type_closed();
698 
699 	void _create_preview(const Vector<String> &files) const;
700 	void _remove_preview();
701 
702 	bool _cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node);
703 	bool _only_packed_scenes_selected() const;
704 	void _create_nodes(Node *parent, Node *child, String &path, const Point2 &p_point);
705 	bool _create_instance(Node *parent, String &path, const Point2 &p_point);
706 	void _perform_drop_data();
707 	void _show_resource_type_selector();
708 
709 	static void _bind_methods();
710 
711 protected:
712 	void _notification(int p_what);
713 
714 public:
715 	virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
716 	virtual void drop_data(const Point2 &p_point, const Variant &p_data);
717 
718 	CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor);
719 	~CanvasItemEditorViewport();
720 };
721 
722 #endif
723