|
@@ -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_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_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_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_DUPLICATE), get_icon("Duplicate", "EditorIcons"));
|
|
p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "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();
|
|
undo_redo->commit_action();
|
|
|
|
|
|
} break;
|
|
} 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();
|
|
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();
|
|
canvas_item_editor->update();
|
|
|
|
|
|
} else if (tool == TOOL_SELECTING) {
|
|
} else if (tool == TOOL_SELECTING) {
|
|
@@ -888,6 +920,16 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (tool == TOOL_MOVING) {
|
|
|
|
+
|
|
|
|
+ tool = TOOL_NONE;
|
|
|
|
+ copydata.clear();
|
|
|
|
+
|
|
|
|
+ canvas_item_editor->update();
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (tool == TOOL_NONE) {
|
|
if (tool == TOOL_NONE) {
|
|
|
|
|
|
paint_undo.clear();
|
|
paint_undo.clear();
|
|
@@ -1095,7 +1137,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
|
|
|
|
|
if (k->get_scancode() == KEY_ESCAPE) {
|
|
if (k->get_scancode() == KEY_ESCAPE) {
|
|
|
|
|
|
- if (tool == TOOL_DUPLICATING)
|
|
|
|
|
|
+ if (tool == TOOL_DUPLICATING || tool == TOOL_MOVING)
|
|
copydata.clear();
|
|
copydata.clear();
|
|
else if (tool == TOOL_SELECTING || selection_active)
|
|
else if (tool == TOOL_SELECTING || selection_active)
|
|
selection_active = false;
|
|
selection_active = false;
|
|
@@ -1150,6 +1192,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
|
return true;
|
|
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)) {
|
|
if (ED_IS_SHORTCUT("tile_map_editor/find_tile", p_event)) {
|
|
search_box->select_all();
|
|
search_box->select_all();
|
|
search_box->grab_focus();
|
|
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);
|
|
_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())
|
|
if (copydata.empty())
|
|
return;
|
|
return;
|
|
@@ -1590,6 +1640,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
|
|
p->add_item(TTR("Pick Tile"), OPTION_PICK_TILE, KEY_CONTROL);
|
|
p->add_item(TTR("Pick Tile"), OPTION_PICK_TILE, KEY_CONTROL);
|
|
p->add_separator();
|
|
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/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_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_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION);
|
|
p->add_separator();
|
|
p->add_separator();
|