@ -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 ( ) ;