You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-20 14:45:44 +00:00
Merge pull request #110910 from YeldhamDev/texture_region_drag_cancel
Fix "Region Editor" stuck in drag state when closing
This commit is contained in:
@@ -295,6 +295,50 @@ void TextureRegionEditor::_set_grid_parameters_clamping(bool p_enabled) {
|
|||||||
sb_sep_y->set_allow_greater(!p_enabled);
|
sb_sep_y->set_allow_greater(!p_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextureRegionEditor::_commit_drag() {
|
||||||
|
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
||||||
|
if (edited_margin >= 0) {
|
||||||
|
undo_redo->create_action(TTR("Set Margin"));
|
||||||
|
static Side side[4] = { SIDE_TOP, SIDE_BOTTOM, SIDE_LEFT, SIDE_RIGHT };
|
||||||
|
if (node_ninepatch) {
|
||||||
|
undo_redo->add_do_method(node_ninepatch, "set_patch_margin", side[edited_margin], node_ninepatch->get_patch_margin(side[edited_margin]));
|
||||||
|
undo_redo->add_undo_method(node_ninepatch, "set_patch_margin", side[edited_margin], prev_margin);
|
||||||
|
} else if (res_stylebox.is_valid()) {
|
||||||
|
undo_redo->add_do_method(res_stylebox.ptr(), "set_texture_margin", side[edited_margin], res_stylebox->get_texture_margin(side[edited_margin]));
|
||||||
|
undo_redo->add_undo_method(res_stylebox.ptr(), "set_texture_margin", side[edited_margin], prev_margin);
|
||||||
|
res_stylebox->emit_changed();
|
||||||
|
}
|
||||||
|
edited_margin = -1;
|
||||||
|
} else {
|
||||||
|
undo_redo->create_action(TTR("Set Region Rect"));
|
||||||
|
if (node_sprite_2d) {
|
||||||
|
undo_redo->add_do_method(node_sprite_2d, "set_region_rect", node_sprite_2d->get_region_rect());
|
||||||
|
undo_redo->add_undo_method(node_sprite_2d, "set_region_rect", rect_prev);
|
||||||
|
} else if (node_sprite_3d) {
|
||||||
|
undo_redo->add_do_method(node_sprite_3d, "set_region_rect", node_sprite_3d->get_region_rect());
|
||||||
|
undo_redo->add_undo_method(node_sprite_3d, "set_region_rect", rect_prev);
|
||||||
|
} else if (node_ninepatch) {
|
||||||
|
undo_redo->add_do_method(node_ninepatch, "set_region_rect", node_ninepatch->get_region_rect());
|
||||||
|
undo_redo->add_undo_method(node_ninepatch, "set_region_rect", rect_prev);
|
||||||
|
} else if (res_stylebox.is_valid()) {
|
||||||
|
undo_redo->add_do_method(res_stylebox.ptr(), "set_region_rect", res_stylebox->get_region_rect());
|
||||||
|
undo_redo->add_undo_method(res_stylebox.ptr(), "set_region_rect", rect_prev);
|
||||||
|
} else if (res_atlas_texture.is_valid()) {
|
||||||
|
undo_redo->add_do_method(res_atlas_texture.ptr(), "set_region", res_atlas_texture->get_region());
|
||||||
|
undo_redo->add_undo_method(res_atlas_texture.ptr(), "set_region", rect_prev);
|
||||||
|
}
|
||||||
|
drag_index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
undo_redo->add_do_method(this, "_update_rect");
|
||||||
|
undo_redo->add_undo_method(this, "_update_rect");
|
||||||
|
undo_redo->add_do_method(texture_overlay, "queue_redraw");
|
||||||
|
undo_redo->add_undo_method(texture_overlay, "queue_redraw");
|
||||||
|
undo_redo->commit_action();
|
||||||
|
drag = false;
|
||||||
|
creating = false;
|
||||||
|
}
|
||||||
|
|
||||||
void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input) {
|
void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input) {
|
||||||
if (panner->gui_input(p_input, texture_overlay->get_global_rect())) {
|
if (panner->gui_input(p_input, texture_overlay->get_global_rect())) {
|
||||||
return;
|
return;
|
||||||
@@ -304,7 +348,8 @@ void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input)
|
|||||||
mtx.columns[2] = -draw_ofs * draw_zoom;
|
mtx.columns[2] = -draw_ofs * draw_zoom;
|
||||||
mtx.scale_basis(Vector2(draw_zoom, draw_zoom));
|
mtx.scale_basis(Vector2(draw_zoom, draw_zoom));
|
||||||
|
|
||||||
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
bool cancel_drag = false;
|
||||||
|
|
||||||
Ref<InputEventMouseButton> mb = p_input;
|
Ref<InputEventMouseButton> mb = p_input;
|
||||||
if (mb.is_valid()) {
|
if (mb.is_valid()) {
|
||||||
if (mb->get_button_index() == MouseButton::LEFT) {
|
if (mb->get_button_index() == MouseButton::LEFT) {
|
||||||
@@ -392,6 +437,7 @@ void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input)
|
|||||||
// We didn't hit anything, but we're in the autoslice mode. Handle it.
|
// We didn't hit anything, but we're in the autoslice mode. Handle it.
|
||||||
|
|
||||||
Vector2 point = mtx.affine_inverse().xform(mb->get_position());
|
Vector2 point = mtx.affine_inverse().xform(mb->get_position());
|
||||||
|
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
||||||
for (const Rect2 &E : autoslice_cache) {
|
for (const Rect2 &E : autoslice_cache) {
|
||||||
if (E.has_point(point)) {
|
if (E.has_point(point)) {
|
||||||
rect = E;
|
rect = E;
|
||||||
@@ -449,49 +495,18 @@ void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (!mb->is_pressed() && drag) {
|
} else if (!mb->is_pressed() && drag) {
|
||||||
if (edited_margin >= 0) {
|
_commit_drag();
|
||||||
undo_redo->create_action(TTR("Set Margin"));
|
|
||||||
static Side side[4] = { SIDE_TOP, SIDE_BOTTOM, SIDE_LEFT, SIDE_RIGHT };
|
|
||||||
if (node_ninepatch) {
|
|
||||||
undo_redo->add_do_method(node_ninepatch, "set_patch_margin", side[edited_margin], node_ninepatch->get_patch_margin(side[edited_margin]));
|
|
||||||
undo_redo->add_undo_method(node_ninepatch, "set_patch_margin", side[edited_margin], prev_margin);
|
|
||||||
} else if (res_stylebox.is_valid()) {
|
|
||||||
undo_redo->add_do_method(res_stylebox.ptr(), "set_texture_margin", side[edited_margin], res_stylebox->get_texture_margin(side[edited_margin]));
|
|
||||||
undo_redo->add_undo_method(res_stylebox.ptr(), "set_texture_margin", side[edited_margin], prev_margin);
|
|
||||||
res_stylebox->emit_changed();
|
|
||||||
}
|
}
|
||||||
edited_margin = -1;
|
} else if (drag && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) {
|
||||||
} else {
|
cancel_drag = true;
|
||||||
undo_redo->create_action(TTR("Set Region Rect"));
|
|
||||||
if (node_sprite_2d) {
|
|
||||||
undo_redo->add_do_method(node_sprite_2d, "set_region_rect", node_sprite_2d->get_region_rect());
|
|
||||||
undo_redo->add_undo_method(node_sprite_2d, "set_region_rect", rect_prev);
|
|
||||||
} else if (node_sprite_3d) {
|
|
||||||
undo_redo->add_do_method(node_sprite_3d, "set_region_rect", node_sprite_3d->get_region_rect());
|
|
||||||
undo_redo->add_undo_method(node_sprite_3d, "set_region_rect", rect_prev);
|
|
||||||
} else if (node_ninepatch) {
|
|
||||||
undo_redo->add_do_method(node_ninepatch, "set_region_rect", node_ninepatch->get_region_rect());
|
|
||||||
undo_redo->add_undo_method(node_ninepatch, "set_region_rect", rect_prev);
|
|
||||||
} else if (res_stylebox.is_valid()) {
|
|
||||||
undo_redo->add_do_method(res_stylebox.ptr(), "set_region_rect", res_stylebox->get_region_rect());
|
|
||||||
undo_redo->add_undo_method(res_stylebox.ptr(), "set_region_rect", rect_prev);
|
|
||||||
} else if (res_atlas_texture.is_valid()) {
|
|
||||||
undo_redo->add_do_method(res_atlas_texture.ptr(), "set_region", res_atlas_texture->get_region());
|
|
||||||
undo_redo->add_undo_method(res_atlas_texture.ptr(), "set_region", rect_prev);
|
|
||||||
}
|
}
|
||||||
drag_index = -1;
|
|
||||||
}
|
|
||||||
undo_redo->add_do_method(this, "_update_rect");
|
|
||||||
undo_redo->add_undo_method(this, "_update_rect");
|
|
||||||
undo_redo->add_do_method(texture_overlay, "queue_redraw");
|
|
||||||
undo_redo->add_undo_method(texture_overlay, "queue_redraw");
|
|
||||||
undo_redo->commit_action();
|
|
||||||
drag = false;
|
|
||||||
creating = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) {
|
if (drag && p_input.is_valid() && p_input->is_action_pressed(SNAME("ui_cancel"), false, true)) {
|
||||||
if (drag) {
|
cancel_drag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancel_drag) {
|
||||||
drag = false;
|
drag = false;
|
||||||
if (edited_margin >= 0) {
|
if (edited_margin >= 0) {
|
||||||
static Side side[4] = { SIDE_TOP, SIDE_BOTTOM, SIDE_LEFT, SIDE_RIGHT };
|
static Side side[4] = { SIDE_TOP, SIDE_BOTTOM, SIDE_LEFT, SIDE_RIGHT };
|
||||||
@@ -510,13 +525,11 @@ void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input)
|
|||||||
drag_index = -1;
|
drag_index = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ref<InputEventMouseMotion> mm = p_input;
|
Ref<InputEventMouseMotion> mm = p_input;
|
||||||
|
|
||||||
if (mm.is_valid()) {
|
if (drag && mm.is_valid()) {
|
||||||
if (drag) {
|
if (mm->get_button_mask().has_flag(MouseButtonMask::LEFT)) {
|
||||||
if (edited_margin >= 0) {
|
if (edited_margin >= 0) {
|
||||||
float new_margin = 0;
|
float new_margin = 0;
|
||||||
|
|
||||||
@@ -633,6 +646,8 @@ void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input)
|
|||||||
}
|
}
|
||||||
texture_preview->queue_redraw();
|
texture_preview->queue_redraw();
|
||||||
texture_overlay->queue_redraw();
|
texture_overlay->queue_redraw();
|
||||||
|
} else {
|
||||||
|
_commit_drag();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,6 +673,12 @@ void TextureRegionEditor::_zoom_callback(float p_zoom_factor, Vector2 p_origin,
|
|||||||
_zoom_on_position(draw_zoom * p_zoom_factor, p_origin);
|
_zoom_on_position(draw_zoom * p_zoom_factor, p_origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextureRegionEditor::_input_from_window(const Ref<InputEvent> &p_event) {
|
||||||
|
if (!drag && p_event.is_valid() && p_event->is_action_pressed(SNAME("ui_cancel"), false, true)) {
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TextureRegionEditor::_scroll_changed(float) {
|
void TextureRegionEditor::_scroll_changed(float) {
|
||||||
if (updating_scroll) {
|
if (updating_scroll) {
|
||||||
return;
|
return;
|
||||||
@@ -862,6 +883,12 @@ void TextureRegionEditor::_notification(int p_what) {
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case NOTIFICATION_WM_WINDOW_FOCUS_OUT: {
|
||||||
|
if (drag) {
|
||||||
|
_commit_drag();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
|
case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
|
||||||
// This happens when the user leaves the Editor and returns,
|
// This happens when the user leaves the Editor and returns,
|
||||||
// they could have changed the textures, so the cache is cleared.
|
// they could have changed the textures, so the cache is cleared.
|
||||||
@@ -1135,6 +1162,8 @@ TextureRegionEditor::TextureRegionEditor() {
|
|||||||
set_title(TTR("Region Editor"));
|
set_title(TTR("Region Editor"));
|
||||||
set_process_shortcut_input(true);
|
set_process_shortcut_input(true);
|
||||||
set_ok_button_text(TTR("Close"));
|
set_ok_button_text(TTR("Close"));
|
||||||
|
// Handled manually, to allow canceling dragging.
|
||||||
|
set_close_on_escape(false);
|
||||||
|
|
||||||
// A power-of-two value works better as a default grid size.
|
// A power-of-two value works better as a default grid size.
|
||||||
snap_offset = EditorSettings::get_singleton()->get_project_metadata("texture_region_editor", "snap_offset", Vector2());
|
snap_offset = EditorSettings::get_singleton()->get_project_metadata("texture_region_editor", "snap_offset", Vector2());
|
||||||
|
|||||||
@@ -138,6 +138,8 @@ class TextureRegionEditor : public AcceptDialog {
|
|||||||
|
|
||||||
void _set_grid_parameters_clamping(bool p_enabled);
|
void _set_grid_parameters_clamping(bool p_enabled);
|
||||||
|
|
||||||
|
void _commit_drag();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
virtual void shortcut_input(const Ref<InputEvent> &p_event) override;
|
virtual void shortcut_input(const Ref<InputEvent> &p_event) override;
|
||||||
@@ -147,6 +149,8 @@ protected:
|
|||||||
void _texture_overlay_draw();
|
void _texture_overlay_draw();
|
||||||
void _texture_overlay_input(const Ref<InputEvent> &p_input);
|
void _texture_overlay_input(const Ref<InputEvent> &p_input);
|
||||||
|
|
||||||
|
virtual void _input_from_window(const Ref<InputEvent> &p_event) override;
|
||||||
|
|
||||||
Vector2 snap_point(Vector2 p_target) const;
|
Vector2 snap_point(Vector2 p_target) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user