Quellcode durchsuchen

Merge pull request #106553 from Lazy-Rabbit-2001/sprite-dragging-improved

Reintroduce the dragging method of Sprite2D's region_rect
Thaddeus Crews vor 2 Monaten
Ursprung
Commit
b144bbb510

+ 56 - 44
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<Vector2> expand(const Vector<Vector2> &points, const Rect2i &rect, float epsilon = 2.0) {
 	int size = points.size();
 	ERR_FAIL_COND_V(size < 2, Vector<Vector2>());
@@ -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<InputEvent> &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<Sprite2D>(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<Sprite2D>(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();
 }

+ 8 - 3
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; }

+ 12 - 6
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() {
-}

+ 9 - 1
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();
 };