diff --git a/modules/tile_map/tile_map_editor_plugin.cpp b/modules/tile_map/tile_map_editor_plugin.cpp index 0d0ed5ed3..c80239fdc 100644 --- a/modules/tile_map/tile_map_editor_plugin.cpp +++ b/modules/tile_map/tile_map_editor_plugin.cpp @@ -146,6 +146,13 @@ void TileMapEditor::_update_button_tool() { } void TileMapEditor::_button_tool_select(int p_tool) { + if (_mouse_buttons_pressed) { + // Disallow changing tool when drawing, + // to prevent undo actions getting messed up + // and out of sync. + return; + } + tool = (Tool)p_tool; _update_button_tool(); switch (tool) { @@ -1018,6 +1025,14 @@ bool TileMapEditor::forward_gui_input(const Ref &p_event) { Ref mb = p_event; if (mb.is_valid()) { + // Keep track internally of which mouse buttons are pressed + // so we can disallow changing tool. + if (mb->is_pressed()) { + _mouse_buttons_pressed |= mb->get_button_index(); + } else { + _mouse_buttons_pressed &= ~mb->get_button_index(); + } + if (mb->get_button_index() == BUTTON_LEFT) { if (mb->is_pressed()) { if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) { diff --git a/modules/tile_map/tile_map_editor_plugin.h b/modules/tile_map/tile_map_editor_plugin.h index b33c92731..29203c13b 100644 --- a/modules/tile_map/tile_map_editor_plugin.h +++ b/modules/tile_map/tile_map_editor_plugin.h @@ -111,6 +111,7 @@ class TileMapEditor : public VBoxContainer { Tool tool; Tool last_tool; + uint32_t _mouse_buttons_pressed = 0; bool selection_active; bool mouse_over;