Browse Source

Merge pull request #42489 from auderer/tilemapeditor-refocus

Reset TileMapEditor painting state on application refocus
Rémi Verschelde 4 years ago
parent
commit
1aa8f356e1
2 changed files with 26 additions and 0 deletions
  1. 25 0
      editor/plugins/tile_map_editor_plugin.cpp
  2. 1 0
      editor/plugins/tile_map_editor_plugin.h

+ 25 - 0
editor/plugins/tile_map_editor_plugin.cpp

@@ -89,6 +89,25 @@ void TileMapEditor::_notification(int p_what) {
 		case NOTIFICATION_EXIT_TREE: {
 			get_tree()->disconnect("node_removed", callable_mp(this, &TileMapEditor::_node_removed));
 		} break;
+
+		case NOTIFICATION_APPLICATION_FOCUS_OUT: {
+			if (tool == TOOL_PAINTING) {
+				Vector<int> ids = get_selected_tiles();
+
+				if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
+					_set_cell(over_tile, ids, flip_h, flip_v, transpose);
+					_finish_undo();
+
+					paint_undo.clear();
+				}
+
+				tool = TOOL_NONE;
+				_update_button_tool();
+			}
+
+			// set flag to ignore over_tile on refocus
+			refocus_over_tile = true;
+		} break;
 	}
 }
 
@@ -1299,6 +1318,12 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 			CanvasItemEditor::get_singleton()->update_viewport();
 		}
 
+		if (refocus_over_tile) {
+			// editor lost focus; forget last tile position
+			old_over_tile = new_over_tile;
+			refocus_over_tile = false;
+		}
+
 		int tile_under = node->get_cell(over_tile.x, over_tile.y);
 		String tile_name = "none";
 

+ 1 - 0
editor/plugins/tile_map_editor_plugin.h

@@ -119,6 +119,7 @@ class TileMapEditor : public VBoxContainer {
 	Rect2i rectangle;
 
 	Point2i over_tile;
+	bool refocus_over_tile = false;
 
 	bool *bucket_cache_visited;
 	Rect2i bucket_cache_rect;