Add functionality to move selected tiles in tile map editor
This change adds a new entry "Move Selection" to the "Tile Map" menu in the tile map editor. It allows the user to easily move as set of selected tiles.
This commit is contained in:
parent
b61021d34f
commit
d538fcd92d
2 changed files with 55 additions and 2 deletions
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue