Browse Source

Merge pull request #88871 from lawnjelly/fix_tilemap_undo2

[3.x] Tilemap editor - prevent changing tool when mouse buttons pressed
Rémi Verschelde 1 year ago
parent
commit
49e533a765
2 changed files with 16 additions and 0 deletions
  1. 15 0
      editor/plugins/tile_map_editor_plugin.cpp
  2. 1 0
      editor/plugins/tile_map_editor_plugin.h

+ 15 - 0
editor/plugins/tile_map_editor_plugin.cpp

@@ -150,6 +150,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) {
@@ -1160,6 +1167,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 	Ref<InputEventMouseButton> 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)) {

+ 1 - 0
editor/plugins/tile_map_editor_plugin.h

@@ -105,6 +105,7 @@ class TileMapEditor : public VBoxContainer {
 
 	Tool tool;
 	Tool last_tool;
+	uint32_t _mouse_buttons_pressed = 0;
 
 	bool selection_active;
 	bool mouse_over;