tilemap_editor: change move and duplicate tools
* Move now behaves like a Cut * Duplicate now behaves like a Copy * You can continue Pasting after Cut or Copy
This commit is contained in:
parent
34e58fd831
commit
3f1b977263
@ -79,9 +79,9 @@ void TileMapEditor::_notification(int p_what) {
|
||||
PopupMenu *p = options->get_popup();
|
||||
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_SELECT), get_icon("ActionCopy", "EditorIcons"));
|
||||
p->set_item_icon(p->get_item_index(OPTION_CUT), get_icon("ActionCut", "EditorIcons"));
|
||||
p->set_item_icon(p->get_item_index(OPTION_COPY), get_icon("Duplicate", "EditorIcons"));
|
||||
p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "EditorIcons"));
|
||||
|
||||
} break;
|
||||
@ -119,12 +119,12 @@ void TileMapEditor::_menu_option(int p_option) {
|
||||
|
||||
canvas_item_editor->update();
|
||||
} break;
|
||||
case OPTION_DUPLICATE: {
|
||||
case OPTION_COPY: {
|
||||
|
||||
_update_copydata();
|
||||
|
||||
if (selection_active) {
|
||||
tool = TOOL_DUPLICATING;
|
||||
tool = TOOL_PASTING;
|
||||
|
||||
canvas_item_editor->update();
|
||||
}
|
||||
@ -135,12 +135,7 @@ void TileMapEditor::_menu_option(int p_option) {
|
||||
return;
|
||||
|
||||
_start_undo(TTR("Erase Selection"));
|
||||
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), invalid_cell, false, false, false);
|
||||
}
|
||||
}
|
||||
_erase_selection();
|
||||
_finish_undo();
|
||||
|
||||
selection_active = false;
|
||||
@ -157,11 +152,19 @@ void TileMapEditor::_menu_option(int p_option) {
|
||||
undo_redo->commit_action();
|
||||
|
||||
} break;
|
||||
case OPTION_MOVE: {
|
||||
case OPTION_CUT: {
|
||||
|
||||
if (selection_active) {
|
||||
_update_copydata();
|
||||
tool = TOOL_MOVING;
|
||||
|
||||
_start_undo(TTR("Cut Selection"));
|
||||
_erase_selection();
|
||||
_finish_undo();
|
||||
|
||||
selection_active = false;
|
||||
|
||||
tool = TOOL_PASTING;
|
||||
|
||||
canvas_item_editor->update();
|
||||
}
|
||||
} break;
|
||||
@ -669,6 +672,18 @@ void TileMapEditor::_select(const Point2i &p_from, const Point2i &p_to) {
|
||||
canvas_item_editor->update();
|
||||
}
|
||||
|
||||
void TileMapEditor::_erase_selection() {
|
||||
if (!selection_active)
|
||||
return;
|
||||
|
||||
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), invalid_cell, false, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TileMapEditor::_draw_cell(int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform) {
|
||||
|
||||
Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell);
|
||||
@ -980,12 +995,12 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
canvas_item_editor->update();
|
||||
}
|
||||
} else if (tool == TOOL_DUPLICATING) {
|
||||
} else if (tool == TOOL_PASTING) {
|
||||
|
||||
Point2 ofs = over_tile - rectangle.position;
|
||||
Vector<int> ids;
|
||||
|
||||
_start_undo(TTR("Duplicate"));
|
||||
_start_undo(TTR("Paste"));
|
||||
ids.push_back(0);
|
||||
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
|
||||
|
||||
@ -994,34 +1009,9 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
}
|
||||
_finish_undo();
|
||||
|
||||
copydata.clear();
|
||||
|
||||
canvas_item_editor->update();
|
||||
} else if (tool == TOOL_MOVING) {
|
||||
|
||||
Point2 ofs = over_tile - rectangle.position;
|
||||
Vector<int> ids;
|
||||
|
||||
_start_undo(TTR("Move"));
|
||||
ids.push_back(TileMap::INVALID_CELL);
|
||||
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), ids, false, false, false);
|
||||
}
|
||||
}
|
||||
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
|
||||
|
||||
ids.write[0] = E->get().cell;
|
||||
_set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose);
|
||||
}
|
||||
_finish_undo();
|
||||
|
||||
copydata.clear();
|
||||
selection_active = false;
|
||||
|
||||
canvas_item_editor->update();
|
||||
|
||||
return true; // We want to keep the Pasting tool
|
||||
} else if (tool == TOOL_SELECTING) {
|
||||
|
||||
canvas_item_editor->update();
|
||||
@ -1068,17 +1058,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tool == TOOL_DUPLICATING) {
|
||||
|
||||
tool = TOOL_NONE;
|
||||
copydata.clear();
|
||||
|
||||
canvas_item_editor->update();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tool == TOOL_MOVING) {
|
||||
if (tool == TOOL_PASTING) {
|
||||
|
||||
tool = TOOL_NONE;
|
||||
copydata.clear();
|
||||
@ -1305,7 +1285,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
if (k->get_scancode() == KEY_ESCAPE) {
|
||||
|
||||
if (tool == TOOL_DUPLICATING || tool == TOOL_MOVING)
|
||||
if (tool == TOOL_PASTING)
|
||||
copydata.clear();
|
||||
else if (tool == TOOL_SELECTING || selection_active)
|
||||
selection_active = false;
|
||||
@ -1349,21 +1329,29 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
return true;
|
||||
}
|
||||
if (ED_IS_SHORTCUT("tile_map_editor/duplicate_selection", p_event)) {
|
||||
if (ED_IS_SHORTCUT("tile_map_editor/copy_selection", p_event)) {
|
||||
_update_copydata();
|
||||
|
||||
if (selection_active) {
|
||||
tool = TOOL_DUPLICATING;
|
||||
tool = TOOL_PASTING;
|
||||
|
||||
canvas_item_editor->update();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (ED_IS_SHORTCUT("tile_map_editor/move_selection", p_event)) {
|
||||
if (ED_IS_SHORTCUT("tile_map_editor/cut_selection", p_event)) {
|
||||
if (selection_active) {
|
||||
_update_copydata();
|
||||
tool = TOOL_MOVING;
|
||||
|
||||
_start_undo(TTR("Cut Selection"));
|
||||
_erase_selection();
|
||||
_finish_undo();
|
||||
|
||||
selection_active = false;
|
||||
|
||||
tool = TOOL_PASTING;
|
||||
|
||||
canvas_item_editor->update();
|
||||
return true;
|
||||
}
|
||||
@ -1564,7 +1552,7 @@ void TileMapEditor::forward_draw_over_viewport(Control *p_overlay) {
|
||||
_draw_cell(ids[0], Point2i(j, i), flip_h, flip_v, transpose, xform);
|
||||
}
|
||||
}
|
||||
} else if (tool == TOOL_DUPLICATING || tool == TOOL_MOVING) {
|
||||
} else if (tool == TOOL_PASTING) {
|
||||
|
||||
if (copydata.empty())
|
||||
return;
|
||||
@ -1844,8 +1832,8 @@ 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_SHORTCUT("tile_map_editor/cut_selection", TTR("Cut Selection"), KEY_MASK_CMD + KEY_X), OPTION_CUT);
|
||||
p->add_shortcut(ED_SHORTCUT("tile_map_editor/copy_selection", TTR("Copy Selection"), KEY_MASK_CMD + KEY_C), OPTION_COPY);
|
||||
p->add_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION);
|
||||
p->add_separator();
|
||||
p->add_item(TTR("Fix Invalid Tiles"), OPTION_FIX_INVALID);
|
||||
@ -1903,6 +1891,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
|
||||
|
||||
TileMapEditor::~TileMapEditor() {
|
||||
_clear_bucket_cache();
|
||||
copydata.clear();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
@ -61,8 +61,7 @@ class TileMapEditor : public VBoxContainer {
|
||||
TOOL_SELECTING,
|
||||
TOOL_BUCKET,
|
||||
TOOL_PICKING,
|
||||
TOOL_DUPLICATING,
|
||||
TOOL_MOVING
|
||||
TOOL_PASTING
|
||||
};
|
||||
|
||||
enum Options {
|
||||
@ -70,11 +69,11 @@ class TileMapEditor : public VBoxContainer {
|
||||
OPTION_BUCKET,
|
||||
OPTION_PICK_TILE,
|
||||
OPTION_SELECT,
|
||||
OPTION_DUPLICATE,
|
||||
OPTION_COPY,
|
||||
OPTION_ERASE_SELECTION,
|
||||
OPTION_PAINTING,
|
||||
OPTION_FIX_INVALID,
|
||||
OPTION_MOVE
|
||||
OPTION_CUT
|
||||
};
|
||||
|
||||
TileMap *node;
|
||||
@ -167,6 +166,7 @@ class TileMapEditor : public VBoxContainer {
|
||||
void _erase_points(const PoolVector<Vector2> p_points);
|
||||
|
||||
void _select(const Point2i &p_from, const Point2i &p_to);
|
||||
void _erase_selection();
|
||||
|
||||
void _draw_cell(int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform);
|
||||
void _draw_fill_preview(int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform);
|
||||
|
Loading…
Reference in New Issue
Block a user