Skip to content

Commit 1410bca

Browse files
Allow Sprite2D being dragged to change their region_rect
1 parent 1b4ed4c commit 1410bca

File tree

4 files changed

+92
-10
lines changed

4 files changed

+92
-10
lines changed

editor/plugins/sprite_2d_editor_plugin.cpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,38 @@ Sprite2DEditor::Sprite2DEditor() {
665665
add_child(debug_uv_dialog);
666666
}
667667

668+
void Sprite2DEditorPlugin::_editor_theme_changed() {
669+
dragging_mode_hint->add_theme_color_override(SceneStringName(font_color), Color(0.6f, 0.6f, 0.6f, 1));
670+
dragging_mode_hint->add_theme_color_override("font_shadow_color", Color(0.2f, 0.2f, 0.2f, 1));
671+
dragging_mode_hint->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE);
672+
dragging_mode_hint->add_theme_constant_override("line_spacing", 0);
673+
}
674+
675+
void Sprite2DEditorPlugin::_update_dragging_mode_hint(bool p_region_enabled) {
676+
if (p_region_enabled) {
677+
dragging_mode_hint->show();
678+
} else {
679+
dragging_mode_hint->hide();
680+
}
681+
}
682+
668683
void Sprite2DEditorPlugin::edit(Object *p_object) {
669-
sprite_editor->edit(Object::cast_to<Sprite2D>(p_object));
684+
Callable update_text = callable_mp(this, &Sprite2DEditorPlugin::_update_dragging_mode_hint);
685+
StringName update_signal = SNAME("_editor_region_rect_enabled");
686+
687+
Sprite2D *spr = sprite_editor->node;
688+
if (spr != nullptr && spr->is_connected(update_signal, update_text)) {
689+
spr->disconnect(update_signal, update_text);
690+
}
691+
692+
spr = Object::cast_to<Sprite2D>(p_object);
693+
sprite_editor->edit(spr);
694+
if (spr != nullptr) {
695+
_update_dragging_mode_hint(spr->is_editor_region_rect_draggable());
696+
if (!spr->is_connected(update_signal, update_text)) {
697+
spr->connect(update_signal, update_text);
698+
}
699+
}
670700
}
671701

672702
bool Sprite2DEditorPlugin::handles(Object *p_object) const {
@@ -678,14 +708,20 @@ void Sprite2DEditorPlugin::make_visible(bool p_visible) {
678708
sprite_editor->options->show();
679709
} else {
680710
sprite_editor->options->hide();
711+
dragging_mode_hint->hide();
681712
sprite_editor->edit(nullptr);
682713
}
683714
}
684715

685716
Sprite2DEditorPlugin::Sprite2DEditorPlugin() {
686717
sprite_editor = memnew(Sprite2DEditor);
718+
sprite_editor->connect(SceneStringName(theme_changed), callable_mp(this, &Sprite2DEditorPlugin::_editor_theme_changed));
687719
EditorNode::get_singleton()->get_gui_base()->add_child(sprite_editor);
688-
make_visible(false);
689720

721+
dragging_mode_hint = memnew(Label);
722+
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."));
723+
CanvasItemEditor::get_singleton()->get_controls_container()->add_child(dragging_mode_hint);
724+
725+
make_visible(false);
690726
//sprite_editor->options->hide();
691727
}

editor/plugins/sprite_2d_editor_plugin.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ class Sprite2DEditorPlugin : public EditorPlugin {
119119

120120
Sprite2DEditor *sprite_editor = nullptr;
121121

122+
Label *dragging_mode_hint = nullptr;
123+
124+
void _editor_theme_changed();
125+
void _update_dragging_mode_hint(bool p_region_enabled);
126+
122127
public:
123128
virtual String get_plugin_name() const override { return "Sprite2D"; }
124129
bool has_main_screen() const override { return false; }

scene/2d/sprite_2d.cpp

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,21 @@
3030

3131
#include "sprite_2d.h"
3232

33+
#include "core/input/input.h"
3334
#include "scene/main/viewport.h"
3435

3536
#ifdef TOOLS_ENABLED
3637
Dictionary Sprite2D::_edit_get_state() const {
3738
Dictionary state = Node2D::_edit_get_state();
3839
state["offset"] = offset;
40+
state["region_rect"] = region_rect;
3941
return state;
4042
}
4143

4244
void Sprite2D::_edit_set_state(const Dictionary &p_state) {
4345
Node2D::_edit_set_state(p_state);
4446
set_offset(p_state["offset"]);
47+
set_region_rect(p_state["region_rect"]);
4548
}
4649

4750
void Sprite2D::_edit_set_pivot(const Point2 &p_pivot) {
@@ -56,6 +59,19 @@ Point2 Sprite2D::_edit_get_pivot() const {
5659
bool Sprite2D::_edit_use_pivot() const {
5760
return true;
5861
}
62+
63+
void Sprite2D::_edit_set_rect(const Rect2 &p_rect) {
64+
if (texture.is_null()) {
65+
return;
66+
}
67+
if (!(region_enabled && hframes <= 1 && vframes <= 1 && Input::get_singleton()->is_key_label_pressed(Key::CTRL))) {
68+
Node2D::_edit_set_rect(p_rect);
69+
return;
70+
}
71+
Point2 delta = p_rect.position - (centered ? _get_rect_offset(p_rect.size) : Vector2());
72+
set_region_rect(Rect2(region_rect.position, p_rect.size));
73+
set_position(get_position() + get_transform().basis_xform(delta));
74+
}
5975
#endif // TOOLS_ENABLED
6076

6177
#ifdef DEBUG_ENABLED
@@ -113,6 +129,19 @@ void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_c
113129
}
114130
}
115131

132+
Point2 Sprite2D::_get_rect_offset(const Size2i &p_size) const {
133+
Point2 ofs = offset;
134+
if (centered) {
135+
ofs -= Size2(p_size) / 2;
136+
}
137+
138+
if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
139+
ofs = (ofs + Point2(0.5, 0.5)).floor();
140+
}
141+
142+
return ofs;
143+
}
144+
116145
void Sprite2D::_notification(int p_what) {
117146
switch (p_what) {
118147
case NOTIFICATION_ACCESSIBILITY_UPDATE: {
@@ -226,6 +255,7 @@ void Sprite2D::set_region_enabled(bool p_region_enabled) {
226255
}
227256

228257
region_enabled = p_region_enabled;
258+
_emit_region_rect_enabled();
229259
queue_redraw();
230260
notify_property_list_changed();
231261
}
@@ -301,6 +331,7 @@ void Sprite2D::set_vframes(int p_amount) {
301331
if (frame >= vframes * hframes) {
302332
frame = 0;
303333
}
334+
_emit_region_rect_enabled();
304335
queue_redraw();
305336
item_rect_changed();
306337
notify_property_list_changed();
@@ -332,6 +363,7 @@ void Sprite2D::set_hframes(int p_amount) {
332363
if (frame >= vframes * hframes) {
333364
frame = 0;
334365
}
366+
_emit_region_rect_enabled();
335367
queue_redraw();
336368
item_rect_changed();
337369
notify_property_list_changed();
@@ -392,6 +424,10 @@ bool Sprite2D::is_pixel_opaque(const Point2 &p_point) const {
392424
return texture->is_pixel_opaque((int)q.x, (int)q.y);
393425
}
394426

427+
bool Sprite2D::is_editor_region_rect_draggable() const {
428+
return hframes <= 1 && vframes <= 1 && region_enabled;
429+
}
430+
395431
Rect2 Sprite2D::get_rect() const {
396432
if (texture.is_null()) {
397433
return Rect2(0, 0, 1, 1);
@@ -407,14 +443,7 @@ Rect2 Sprite2D::get_rect() const {
407443

408444
s = s / Point2(hframes, vframes);
409445

410-
Point2 ofs = offset;
411-
if (centered) {
412-
ofs -= Size2(s) / 2;
413-
}
414-
415-
if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
416-
ofs = (ofs + Point2(0.5, 0.5)).floor();
417-
}
446+
Point2 ofs = _get_rect_offset(s);
418447

419448
if (s == Size2(0, 0)) {
420449
s = Size2(1, 1);
@@ -447,6 +476,10 @@ void Sprite2D::_texture_changed() {
447476
}
448477
}
449478

479+
void Sprite2D::_emit_region_rect_enabled() {
480+
emit_signal("_editor_region_rect_enabled", is_editor_region_rect_draggable());
481+
}
482+
450483
void Sprite2D::_bind_methods() {
451484
ClassDB::bind_method(D_METHOD("set_texture", "texture"), &Sprite2D::set_texture);
452485
ClassDB::bind_method(D_METHOD("get_texture"), &Sprite2D::get_texture);
@@ -510,6 +543,9 @@ void Sprite2D::_bind_methods() {
510543
}
511544

512545
Sprite2D::Sprite2D() {
546+
#ifdef TOOLS_ENABLED
547+
add_user_signal(MethodInfo("_editor_region_rect_enabled", PropertyInfo(Variant::BOOL, "enabled"))); // Sprite2DEditorPlugin listens to this.
548+
#endif
513549
}
514550

515551
Sprite2D::~Sprite2D() {

scene/2d/sprite_2d.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ class Sprite2D : public Node2D {
5555
int hframes = 1;
5656

5757
void _get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_clip_enabled) const;
58+
Point2 _get_rect_offset(const Size2i &p_size) const;
5859

5960
void _texture_changed();
61+
void _emit_region_rect_enabled();
6062

6163
protected:
6264
void _notification(int p_what);
@@ -73,6 +75,8 @@ class Sprite2D : public Node2D {
7375
virtual void _edit_set_pivot(const Point2 &p_pivot) override;
7476
virtual Point2 _edit_get_pivot() const override;
7577
virtual bool _edit_use_pivot() const override;
78+
79+
virtual void _edit_set_rect(const Rect2 &p_rect) override;
7680
#endif // TOOLS_ENABLED
7781

7882
#ifdef DEBUG_ENABLED
@@ -83,6 +87,7 @@ class Sprite2D : public Node2D {
8387
#endif // DEBUG_ENABLED
8488

8589
bool is_pixel_opaque(const Point2 &p_point) const;
90+
bool is_editor_region_rect_draggable() const;
8691

8792
void set_texture(const Ref<Texture2D> &p_texture);
8893
Ref<Texture2D> get_texture() const;

0 commit comments

Comments
 (0)