diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index edfc74f00d3..3a3dbffeeff 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/editor/plugins/sprite_2d_editor_plugin.cpp @@ -57,10 +57,6 @@ void Sprite2DEditor::_node_removed(Node *p_node) { } } -void Sprite2DEditor::edit(Sprite2D *p_sprite) { - node = p_sprite; -} - Vector expand(const Vector &points, const Rect2i &rect, float epsilon = 2.0) { int size = points.size(); ERR_FAIL_COND_V(size < 2, Vector()); @@ -449,6 +445,21 @@ void Sprite2DEditor::_add_as_sibling_or_child(Node *p_own_node, Node *p_new_node p_new_node->set_owner(get_tree()->get_edited_scene_root()); } +void Sprite2DEditor::_sync_sprite_resize_mode() { + if (node != nullptr) { + node->_editor_set_dragging_to_resize_rect(resize_region_rect->is_pressed()); + } +} + +void Sprite2DEditor::_update_sprite_resize_mode_button() { + if (node == nullptr) { + return; + } + resize_region_rect->set_disabled(!node->is_region_enabled()); + resize_region_rect->set_pressed(node->_editor_is_dragging_to_resiz_rect()); + resize_region_rect->set_tooltip_text(node->is_region_enabled() ? "" : TTRC("Sprite's region needs to be enabled in the inspector.")); +} + void Sprite2DEditor::_debug_uv_input(const Ref &p_input) { if (panner->gui_input(p_input, debug_uv->get_global_rect())) { accept_event(); @@ -572,6 +583,8 @@ void Sprite2DEditor::_notification(int p_what) { options->get_popup()->set_item_icon(MENU_OPTION_CONVERT_TO_POLYGON_2D, get_editor_theme_icon(SNAME("Polygon2D"))); options->get_popup()->set_item_icon(MENU_OPTION_CREATE_COLLISION_POLY_2D, get_editor_theme_icon(SNAME("CollisionPolygon2D"))); options->get_popup()->set_item_icon(MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D, get_editor_theme_icon(SNAME("LightOccluder2D"))); + + resize_region_rect->set_button_icon(get_editor_theme_icon(SNAME("KeepAspect"))); } break; } } @@ -580,10 +593,33 @@ void Sprite2DEditor::_bind_methods() { ClassDB::bind_method("_add_as_sibling_or_child", &Sprite2DEditor::_add_as_sibling_or_child); } +void Sprite2DEditor::edit(Sprite2D *p_sprite) { + Callable callback_update_button = callable_mp(this, &Sprite2DEditor::_update_sprite_resize_mode_button); + StringName signal_name = SNAME("_editor_region_rect_enabled"); + + if (node != nullptr && node->is_connected(signal_name, callback_update_button)) { + node->disconnect(signal_name, callback_update_button); + } + + node = p_sprite; + + if (node != nullptr && !node->is_connected(signal_name, callback_update_button)) { + node->connect(signal_name, callback_update_button); + } + + _update_sprite_resize_mode_button(); +} + Sprite2DEditor::Sprite2DEditor() { + // Top HBoxContainer definition + top_hb = memnew(HBoxContainer); + + CanvasItemEditor::get_singleton()->add_control_to_menu_panel(top_hb); + + // Options definition options = memnew(MenuButton); - CanvasItemEditor::get_singleton()->add_control_to_menu_panel(options); + top_hb->add_child(options); options->set_text(TTR("Sprite2D")); options->set_flat(false); @@ -597,6 +633,18 @@ Sprite2DEditor::Sprite2DEditor() { options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &Sprite2DEditor::_menu_option)); + // Resize region rect definition + resize_region_rect = memnew(Button); + + resize_region_rect->set_theme_type_variation("FlatMenuButton"); + resize_region_rect->set_toggle_mode(true); + resize_region_rect->set_shortcut(ED_SHORTCUT("canvas_item_editor/resize_region_rect", TTRC("Drag to Resize Region Rect"), KeyModifierMask::CMD_OR_CTRL | Key::R)); + + resize_region_rect->connect(SceneStringName(pressed), callable_mp(this, &Sprite2DEditor::_sync_sprite_resize_mode)); + + top_hb->add_child(resize_region_rect); + + // Other elements definition err_dialog = memnew(AcceptDialog); add_child(err_dialog); @@ -665,38 +713,8 @@ Sprite2DEditor::Sprite2DEditor() { add_child(debug_uv_dialog); } -void Sprite2DEditorPlugin::_editor_theme_changed() { - dragging_mode_hint->add_theme_color_override(SceneStringName(font_color), Color(0.6f, 0.6f, 0.6f, 1)); - dragging_mode_hint->add_theme_color_override("font_shadow_color", Color(0.2f, 0.2f, 0.2f, 1)); - dragging_mode_hint->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE); - dragging_mode_hint->add_theme_constant_override("line_spacing", 0); -} - -void Sprite2DEditorPlugin::_update_dragging_mode_hint(bool p_region_enabled) { - if (p_region_enabled) { - dragging_mode_hint->show(); - } else { - dragging_mode_hint->hide(); - } -} - void Sprite2DEditorPlugin::edit(Object *p_object) { - Callable update_text = callable_mp(this, &Sprite2DEditorPlugin::_update_dragging_mode_hint); - StringName update_signal = SNAME("_editor_region_rect_enabled"); - - Sprite2D *spr = sprite_editor->node; - if (spr != nullptr && spr->is_connected(update_signal, update_text)) { - spr->disconnect(update_signal, update_text); - } - - spr = Object::cast_to(p_object); - sprite_editor->edit(spr); - if (spr != nullptr) { - _update_dragging_mode_hint(spr->is_editor_region_rect_draggable()); - if (!spr->is_connected(update_signal, update_text)) { - spr->connect(update_signal, update_text); - } - } + sprite_editor->edit(Object::cast_to(p_object)); } bool Sprite2DEditorPlugin::handles(Object *p_object) const { @@ -705,23 +723,17 @@ bool Sprite2DEditorPlugin::handles(Object *p_object) const { void Sprite2DEditorPlugin::make_visible(bool p_visible) { if (p_visible) { - sprite_editor->options->show(); + sprite_editor->top_hb->show(); } else { - sprite_editor->options->hide(); - dragging_mode_hint->hide(); + sprite_editor->top_hb->hide(); sprite_editor->edit(nullptr); } } Sprite2DEditorPlugin::Sprite2DEditorPlugin() { sprite_editor = memnew(Sprite2DEditor); - sprite_editor->connect(SceneStringName(theme_changed), callable_mp(this, &Sprite2DEditorPlugin::_editor_theme_changed)); EditorNode::get_singleton()->get_gui_base()->add_child(sprite_editor); - dragging_mode_hint = memnew(Label); - dragging_mode_hint->set_text(TTRC("When dragging:\nHold Ctrl + left mouse button to change the region_rect and position.\nHold left mouse button to modify the scale of the sprite.")); - CanvasItemEditor::get_singleton()->get_controls_container()->add_child(dragging_mode_hint); - make_visible(false); //sprite_editor->options->hide(); } diff --git a/editor/plugins/sprite_2d_editor_plugin.h b/editor/plugins/sprite_2d_editor_plugin.h index b863c676bfb..decc223fb9f 100644 --- a/editor/plugins/sprite_2d_editor_plugin.h +++ b/editor/plugins/sprite_2d_editor_plugin.h @@ -35,8 +35,10 @@ #include "scene/gui/spin_box.h" class AcceptDialog; +class Button; class ConfirmationDialog; class EditorZoomWidget; +class HBoxContainer; class MenuButton; class Panel; class ViewPanner; @@ -51,11 +53,14 @@ class Sprite2DEditor : public Control { MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D }; + HBoxContainer *top_hb = nullptr; + Menu selected_menu_item; Sprite2D *node = nullptr; MenuButton *options = nullptr; + Button *resize_region_rect = nullptr; ConfirmationDialog *outline_dialog = nullptr; @@ -104,6 +109,9 @@ class Sprite2DEditor : public Control { void _add_as_sibling_or_child(Node *p_own_node, Node *p_new_node); + void _sync_sprite_resize_mode(); + void _update_sprite_resize_mode_button(); + protected: void _node_removed(Node *p_node); void _notification(int p_what); @@ -121,9 +129,6 @@ class Sprite2DEditorPlugin : public EditorPlugin { Label *dragging_mode_hint = nullptr; - void _editor_theme_changed(); - void _update_dragging_mode_hint(bool p_region_enabled); - public: virtual String get_plugin_name() const override { return "Sprite2D"; } bool has_main_screen() const override { return false; } diff --git a/scene/2d/sprite_2d.cpp b/scene/2d/sprite_2d.cpp index 6f334e50959..50321757135 100644 --- a/scene/2d/sprite_2d.cpp +++ b/scene/2d/sprite_2d.cpp @@ -64,7 +64,7 @@ void Sprite2D::_edit_set_rect(const Rect2 &p_rect) { if (texture.is_null()) { return; } - if (!(region_enabled && hframes <= 1 && vframes <= 1 && Input::get_singleton()->is_key_label_pressed(Key::CTRL))) { + if (!region_enabled || hframes > 1 || vframes > 1 || !dragging_to_resize_rect) { Node2D::_edit_set_rect(p_rect); return; } @@ -427,6 +427,15 @@ bool Sprite2D::is_editor_region_rect_draggable() const { return hframes <= 1 && vframes <= 1 && region_enabled; } +#ifdef TOOLS_ENABLED +void Sprite2D::_editor_set_dragging_to_resize_rect(bool p_dragging_to_resize_rect) { + dragging_to_resize_rect = p_dragging_to_resize_rect; +} +bool Sprite2D::_editor_is_dragging_to_resiz_rect() const { + return dragging_to_resize_rect; +} +#endif + Rect2 Sprite2D::get_rect() const { if (texture.is_null()) { return Rect2(0, 0, 1, 1); @@ -472,7 +481,7 @@ void Sprite2D::_texture_changed() { } void Sprite2D::_emit_region_rect_enabled() { - emit_signal("_editor_region_rect_enabled", is_editor_region_rect_draggable()); + emit_signal("_editor_region_rect_enabled"); } void Sprite2D::_bind_methods() { @@ -539,9 +548,6 @@ void Sprite2D::_bind_methods() { Sprite2D::Sprite2D() { #ifdef TOOLS_ENABLED - add_user_signal(MethodInfo("_editor_region_rect_enabled", PropertyInfo(Variant::BOOL, "enabled"))); // Sprite2DEditorPlugin listens to this. + add_user_signal(MethodInfo("_editor_region_rect_enabled")); #endif } - -Sprite2D::~Sprite2D() { -} diff --git a/scene/2d/sprite_2d.h b/scene/2d/sprite_2d.h index 260104ca21f..0ff12e937a0 100644 --- a/scene/2d/sprite_2d.h +++ b/scene/2d/sprite_2d.h @@ -40,6 +40,10 @@ class Sprite2D : public Node2D { Color specular_color; real_t shininess = 0.0; +#ifdef TOOLS_ENABLED + bool dragging_to_resize_rect = false; +#endif // TOOLS_ENABLED + bool centered = true; Point2 offset; @@ -86,6 +90,11 @@ public: virtual bool _edit_use_rect() const override; #endif // DEBUG_ENABLED +#ifdef TOOLS_ENABLED + void _editor_set_dragging_to_resize_rect(bool p_dragging_to_resize_rect); + bool _editor_is_dragging_to_resiz_rect() const; +#endif + bool is_pixel_opaque(const Point2 &p_point) const; bool is_editor_region_rect_draggable() const; @@ -129,5 +138,4 @@ public: virtual Rect2 get_anchorable_rect() const override; Sprite2D(); - ~Sprite2D(); };