Browse Source

Merge pull request #17863 from covariantlabs/add-move-selected-tiles

Add functionality to move selected tiles in tile map editor
Rémi Verschelde 7 years ago
parent
commit
950d4922a5
2 changed files with 55 additions and 2 deletions
  1. 53 2
      editor/plugins/tile_map_editor_plugin.cpp
  2. 2 0
      editor/plugins/tile_map_editor_plugin.h

+ 53 - 2
editor/plugins/tile_map_editor_plugin.cpp

@@ -78,6 +78,7 @@ void TileMapEditor::_notification(int p_what) {
 			p->set_item_icon(p->get_item_index(OPTION_PAINTING), get_icon("Edit", "EditorIcons"));
 			p->set_item_icon(p->get_item_index(OPTION_PICK_TILE), get_icon("ColorPick", "EditorIcons"));
 			p->set_item_icon(p->get_item_index(OPTION_SELECT), get_icon("ToolSelect", "EditorIcons"));
+			p->set_item_icon(p->get_item_index(OPTION_MOVE), get_icon("ToolMove", "EditorIcons"));
 			p->set_item_icon(p->get_item_index(OPTION_DUPLICATE), get_icon("Duplicate", "EditorIcons"));
 			p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "EditorIcons"));
 
@@ -156,6 +157,14 @@ void TileMapEditor::_menu_option(int p_option) {
 			undo_redo->commit_action();
 
 		} break;
+		case OPTION_MOVE: {
+
+			if (selection_active) {
+				_update_copydata();
+				tool = TOOL_MOVING;
+				canvas_item_editor->update();
+			}
+		} break;
 	}
 }
 
@@ -828,6 +837,29 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 						copydata.clear();
 
+						canvas_item_editor->update();
+					} else if (tool == TOOL_MOVING) {
+
+						Point2 ofs = over_tile - rectangle.position;
+
+						undo_redo->create_action(TTR("Move"));
+						undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data"));
+						for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
+							for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
+
+								_set_cell(Point2i(j, i), TileMap::INVALID_CELL, false, false, false);
+							}
+						}
+						for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
+
+							_set_cell(E->get().pos + ofs, E->get().cell, E->get().flip_h, E->get().flip_v, E->get().transpose);
+						}
+						undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data"));
+						undo_redo->commit_action();
+
+						copydata.clear();
+						selection_active = false;
+
 						canvas_item_editor->update();
 
 					} else if (tool == TOOL_SELECTING) {
@@ -888,6 +920,16 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 					return true;
 				}
 
+				if (tool == TOOL_MOVING) {
+
+					tool = TOOL_NONE;
+					copydata.clear();
+
+					canvas_item_editor->update();
+
+					return true;
+				}
+
 				if (tool == TOOL_NONE) {
 
 					paint_undo.clear();
@@ -1095,7 +1137,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 		if (k->get_scancode() == KEY_ESCAPE) {
 
-			if (tool == TOOL_DUPLICATING)
+			if (tool == TOOL_DUPLICATING || tool == TOOL_MOVING)
 				copydata.clear();
 			else if (tool == TOOL_SELECTING || selection_active)
 				selection_active = false;
@@ -1150,6 +1192,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 				return true;
 			}
 		}
+		if (ED_IS_SHORTCUT("tile_map_editor/move_selection", p_event)) {
+			if (selection_active) {
+				_update_copydata();
+				tool = TOOL_MOVING;
+				canvas_item_editor->update();
+				return true;
+			}
+		}
 		if (ED_IS_SHORTCUT("tile_map_editor/find_tile", p_event)) {
 			search_box->select_all();
 			search_box->grab_focus();
@@ -1343,7 +1393,7 @@ void TileMapEditor::forward_draw_over_viewport(Control *p_overlay) {
 					_draw_cell(id, Point2i(j, i), flip_h, flip_v, transpose, xform);
 				}
 			}
-		} else if (tool == TOOL_DUPLICATING) {
+		} else if (tool == TOOL_DUPLICATING || tool == TOOL_MOVING) {
 
 			if (copydata.empty())
 				return;
@@ -1590,6 +1640,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
 	p->add_item(TTR("Pick Tile"), OPTION_PICK_TILE, KEY_CONTROL);
 	p->add_separator();
 	p->add_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_MASK_CMD + KEY_B), OPTION_SELECT);
+	p->add_shortcut(ED_SHORTCUT("tile_map_editor/move_selection", TTR("Move Selection"), KEY_MASK_CMD + KEY_M), OPTION_MOVE);
 	p->add_shortcut(ED_SHORTCUT("tile_map_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_CMD + KEY_D), OPTION_DUPLICATE);
 	p->add_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION);
 	p->add_separator();

+ 2 - 0
editor/plugins/tile_map_editor_plugin.h

@@ -61,6 +61,7 @@ class TileMapEditor : public VBoxContainer {
 		TOOL_BUCKET,
 		TOOL_PICKING,
 		TOOL_DUPLICATING,
+		TOOL_MOVING
 	};
 
 	enum Options {
@@ -72,6 +73,7 @@ class TileMapEditor : public VBoxContainer {
 		OPTION_ERASE_SELECTION,
 		OPTION_PAINTING,
 		OPTION_FIX_INVALID,
+		OPTION_MOVE
 	};
 
 	TileMap *node;