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