From 4d012fe73c77d0ae305aa7890c741115472a47c8 Mon Sep 17 00:00:00 2001 From: Michael Alexsander Date: Thu, 26 Feb 2026 14:25:26 -0300 Subject: [PATCH] Fix problems with undoing selection and pasting in `GridMap` editor --- .../gridmap/editor/grid_map_editor_plugin.cpp | 40 ++++++++++++------- .../gridmap/editor/grid_map_editor_plugin.h | 1 + 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/modules/gridmap/editor/grid_map_editor_plugin.cpp b/modules/gridmap/editor/grid_map_editor_plugin.cpp index f7c2326529..191a12b84e 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.cpp +++ b/modules/gridmap/editor/grid_map_editor_plugin.cpp @@ -303,7 +303,7 @@ void GridMapEditor::_set_selection(bool p_active, const Vector3 &p_begin, const selection.click = p_begin; selection.current = p_end; - if (is_visible_in_tree()) { + if (is_inside_tree()) { _update_selection_transform(); } } @@ -550,15 +550,16 @@ void GridMapEditor::_delete_selection_with_undo() { undo_redo->commit_action(); } -void GridMapEditor::_setup_paste_mode() { - input_action = INPUT_PASTE; - paste_indicator.click = selection.click; - paste_indicator.current = cursor_gridpos; - paste_indicator.begin = selection.begin; - paste_indicator.end = selection.end; - paste_indicator.distance_from_cursor = cursor_gridpos - paste_indicator.begin; - paste_indicator.orientation = 0; - _update_paste_indicator(); +void GridMapEditor::_clear_selection_with_undo() { + if (!selection.active) { + return; + } + + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("GridMap Clear Selection")); + undo_redo->add_do_method(this, "_set_selection", false, Vector3(), Vector3()); + undo_redo->add_undo_method(this, "_set_selection", true, selection.begin, selection.end); + undo_redo->commit_action(); } void GridMapEditor::_fill_selection() { @@ -582,6 +583,17 @@ void GridMapEditor::_fill_selection() { undo_redo->commit_action(); } +void GridMapEditor::_setup_paste_mode() { + input_action = INPUT_PASTE; + paste_indicator.click = selection.click; + paste_indicator.current = cursor_gridpos; + paste_indicator.begin = selection.begin; + paste_indicator.end = selection.end; + paste_indicator.distance_from_cursor = cursor_gridpos - paste_indicator.begin; + paste_indicator.orientation = 0; + _update_paste_indicator(); +} + void GridMapEditor::_clear_clipboard_data() { for (const ClipboardItem &E : clipboard_items) { if (E.instance.is_null()) { @@ -783,7 +795,7 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D _cancel_pending_move(); return EditorPlugin::AFTER_GUI_INPUT_STOP; } else if (selection.active) { - _set_selection(false); + _clear_selection_with_undo(); return EditorPlugin::AFTER_GUI_INPUT_STOP; } else { input_action = INPUT_NONE; @@ -860,12 +872,10 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D } } else if (mb->get_button_index() == MouseButton::RIGHT) { if (input_action == INPUT_PASTE) { - _clear_clipboard_data(); - input_action = INPUT_NONE; - _update_paste_indicator(); + _cancel_pending_move(); return EditorPlugin::AFTER_GUI_INPUT_STOP; } else if (selection.active) { - _set_selection(false); + _clear_selection_with_undo(); if (input_action == INPUT_SELECT) { input_action = INPUT_NONE; } diff --git a/modules/gridmap/editor/grid_map_editor_plugin.h b/modules/gridmap/editor/grid_map_editor_plugin.h index 88cd669ad5..b6515cce58 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.h +++ b/modules/gridmap/editor/grid_map_editor_plugin.h @@ -255,6 +255,7 @@ class GridMapEditor : public EditorDock { void _delete_selection(); void _delete_selection_with_undo(); void _fill_selection(); + void _clear_selection_with_undo(); void _setup_paste_mode(); bool do_input_action(Camera3D *p_camera, const Point2 &p_point, bool p_click);