mirror of
https://github.com/godotengine/godot.git
synced 2024-11-24 13:12:42 +00:00
Merge pull request #17863 from covariantlabs/add-move-selected-tiles
Add functionality to move selected tiles in tile map editor
This commit is contained in:
commit
950d4922a5
@ -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 New Issue
Block a user