From 8c54b1208b14ff4ce9f658012fb6d0efa0e936b2 Mon Sep 17 00:00:00 2001 From: Broxzier Date: Sun, 23 Oct 2016 20:40:23 +0200 Subject: [PATCH] Add copy/paste functionality to tile inspector --- resources/g2/78.png | Bin 0 -> 170 bytes resources/g2/79.png | Bin 0 -> 307 bytes src/sprites.h | 2 ++ src/windows/tile_inspector.c | 68 +++++++++++++++++++++++++++++------ 4 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 resources/g2/78.png create mode 100644 resources/g2/79.png diff --git a/resources/g2/78.png b/resources/g2/78.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0f3d7906cfe9d534d1bf1b3c17376f2c485b2c GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wloB=)|uK)l4S7u;%|Nj3G++>;x58w>=TFM1!2F=t}krxbi~Ny9vk3NN8%0fjp@ zwKwgUtvavzr)}&_I(|jtpsRd%erROO(YVGPUM%xlYo;r<@YbswxM$7KnXj4q|IdvN QK%*HvUHx3vIVCg!03dWb9RL6T literal 0 HcmV?d00001 diff --git a/resources/g2/79.png b/resources/g2/79.png new file mode 100644 index 0000000000000000000000000000000000000000..40207ca8ad3904a8f964aa5dfc900222aaba9c02 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6;Q>A&uIk$1?>~S3|NsB{_y5b? zwaw+(w;w(XB=eh_f!z7)*8>$?zI_{{X0iYO?b*%Kr~mIZ-akG3|LOMghgaJN2miml zcyqJ!_U-rk>$9Vai~m19{QvX)>7iw-fmX1U1o;I6X&}g3#y$~9wR*ZZhE&8Yz2M1r z$Uwj)@OI<3H$G?at=gaEfIscvrJuch-qQ0$I xckz;?Q|?D_Y<%u1e|`V*@9WNlncsAN#(HXwi1y?F?=FzTJYD@<);T3K0RVI{i+}(C literal 0 HcmV?d00001 diff --git a/src/sprites.h b/src/sprites.h index f3bfab5013..fd90623303 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -744,6 +744,8 @@ enum { SPR_G2_MENU_MULTIPLAYER = SPR_G2_BEGIN + 60, SPR_G2_SORT = SPR_G2_BEGIN + 77, + SPR_G2_COPY = SPR_G2_BEGIN + 78, + SPR_G2_PASTE = SPR_G2_BEGIN + 79, }; #endif diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index d109e76b03..a02fd33ee9 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -103,6 +103,8 @@ enum WINDOW_TILE_INSPECTOR_WIDGET_IDX { WIDX_BUTTON_MOVE_UP, WIDX_BUTTON_ROTATE, WIDX_BUTTON_SORT, + WIDX_BUTTON_COPY, + WIDX_BUTTON_PASTE, WIDX_COLUMN_TYPE, WIDX_COLUMN_BASEHEIGHT, WIDX_COLUMN_CLEARANCEHEIGHT, @@ -259,6 +261,8 @@ enum WINDOW_TILE_INSPECTOR_WIDGET_IDX { { WWT_CLOSEBOX, 1, BX - BS * 2, BW - BS * 2, BH - 11, BH, STR_DOWN, STR_MOVE_SELECTED_ELEMENT_DOWN_TIP }, /* Move up */ \ { WWT_FLATBTN, 1, BX - BS * 3, BW - BS * 3, BY, BH, SPR_ROTATE_ARROW, STR_ROTATE_SELECTED_ELEMENT_TIP }, /* Rotate button */ \ { WWT_FLATBTN, 1, BX - BS * 4, BW - BS * 4, BY, BH, SPR_G2_SORT, STR_TILE_INSPECTOR_SORT_TIP }, /* Sort button */ \ + { WWT_FLATBTN, 1, BX - BS * 5, BW - BS * 5, BY, BH, SPR_G2_COPY, STR_TILE_INSPECTOR_SORT_TIP }, /* Copy button */ \ + { WWT_FLATBTN, 1, BX - BS * 6, BW - BS * 6, BY, BH, SPR_G2_PASTE, STR_TILE_INSPECTOR_SORT_TIP }, /* Paste button */ \ /* Column headers */ \ { WWT_13, 1, COL_X_TYPE, COL_X_BH - 1, 42, 42 + 13, STR_NONE, STR_NONE }, /* Type */ \ { WWT_13, 1, COL_X_BH, COL_X_CH - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_BASE_HEIGHT }, /* Base height */ \ @@ -453,6 +457,8 @@ static unsigned int windowTileInspectorTileY; static bool windowTileInspectorTileSelected = false; static int windowTileInspectorElementCount = 0; static bool windowTileInspectorApplyToAll = false; +static bool windowTileInspectorElementCopied = false; +static rct_map_element tileInspectorCopiedElement; static rct_map_element* window_tile_inspector_get_selected_element(rct_window *w); static void window_tile_inspector_load_tile(rct_window* w); @@ -461,6 +467,8 @@ static void window_tile_inspector_swap_elements(sint16 first, sint16 second); static void window_tile_inspector_remove_element(int index); static void window_tile_inspector_rotate_element(int index); static void window_tile_inspector_sort_elements(rct_window *w); +static void window_tile_inspector_copy_element(rct_window *w); +static void window_tile_inspector_paste_element(rct_window *w); static void window_tile_inspector_surface_toggle_corner(rct_map_element *mapElement, int cornerIndex); static void window_tile_inspector_track_block_height_offset(rct_map_element *mapElement, uint8 offset); static void window_tile_inspector_track_block_set_lift(rct_map_element *mapElement, bool chain); @@ -515,19 +523,19 @@ static rct_window_event_list windowTileInspectorEvents = { static uint64 windowTileInspectorEnabledWidgets[] = { (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SURFACE_BUTTON_REMOVE_FENCES) | (1ULL << WIDX_SURFACE_BUTTON_RESTORE_FENCES) | (1ULL << WIDX_SURFACE_CHECK_CORNER_N) | (1ULL << WIDX_SURFACE_CHECK_CORNER_E) | (1ULL << WIDX_SURFACE_CHECK_CORNER_S) | (1ULL << WIDX_SURFACE_CHECK_CORNER_W) | (1ULL << WIDX_SURFACE_CHECK_DIAGONAL), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_PATH_CHECK_EDGE_N) | (1ULL << WIDX_PATH_CHECK_EDGE_NE) | (1ULL << WIDX_PATH_CHECK_EDGE_E) | (1ULL << WIDX_PATH_CHECK_EDGE_SE) | (1ULL << WIDX_PATH_CHECK_EDGE_S) | (1ULL << WIDX_PATH_CHECK_EDGE_SW) | (1ULL << WIDX_PATH_CHECK_EDGE_W) | (1ULL << WIDX_PATH_CHECK_EDGE_NW), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_TRACK_CHECK_APPLY_TO_ALL) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_TRACK_CHECK_CHAIN_LIFT), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_N) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_E) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_S) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_W) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_N) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_E) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_S) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_W), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_FENCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_FENCE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_FENCE_DROPDOWN_SLOPE) | (1ULL << WIDX_FENCE_DROPDOWN_SLOPE_BUTTON), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SW) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NW), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_CORRUPT_BUTTON_CLAMP), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SURFACE_BUTTON_REMOVE_FENCES) | (1ULL << WIDX_SURFACE_BUTTON_RESTORE_FENCES) | (1ULL << WIDX_SURFACE_CHECK_CORNER_N) | (1ULL << WIDX_SURFACE_CHECK_CORNER_E) | (1ULL << WIDX_SURFACE_CHECK_CORNER_S) | (1ULL << WIDX_SURFACE_CHECK_CORNER_W) | (1ULL << WIDX_SURFACE_CHECK_DIAGONAL), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_PATH_CHECK_EDGE_N) | (1ULL << WIDX_PATH_CHECK_EDGE_NE) | (1ULL << WIDX_PATH_CHECK_EDGE_E) | (1ULL << WIDX_PATH_CHECK_EDGE_SE) | (1ULL << WIDX_PATH_CHECK_EDGE_S) | (1ULL << WIDX_PATH_CHECK_EDGE_SW) | (1ULL << WIDX_PATH_CHECK_EDGE_W) | (1ULL << WIDX_PATH_CHECK_EDGE_NW), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_TRACK_CHECK_APPLY_TO_ALL) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_TRACK_CHECK_CHAIN_LIFT), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_N) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_E) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_S) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_W) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_N) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_E) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_S) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_W), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_FENCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_FENCE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_FENCE_DROPDOWN_SLOPE) | (1ULL << WIDX_FENCE_DROPDOWN_SLOPE_BUTTON), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SW) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NW), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_CORRUPT_BUTTON_CLAMP), }; static uint64 windowTileInspectorDisabledWidgets[] = { - (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_MOVE_UP) | (1ULL << WIDX_BUTTON_MOVE_DOWN) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE), + (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_MOVE_UP) | (1ULL << WIDX_BUTTON_MOVE_DOWN) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY), 0, 0, 0, @@ -709,6 +717,26 @@ static void window_tile_inspector_sort_elements(rct_window *w) { } } +static void window_tile_inspector_copy_element(rct_window *w) { + // Copy value, in case the element gets moved + tileInspectorCopiedElement = *window_tile_inspector_get_selected_element(w); + windowTileInspectorElementCopied = true; +} + +static void window_tile_inspector_paste_element(rct_window *w) { + rct_map_element *const pastedElement = map_element_insert(windowTileInspectorTileX, windowTileInspectorTileY, tileInspectorCopiedElement.base_height, 0); + bool lastForTile = map_element_is_last_for_tile(pastedElement); + *pastedElement = tileInspectorCopiedElement; + pastedElement->flags &= ~MAP_ELEMENT_FLAG_LAST_TILE; + if (lastForTile) { + pastedElement->flags |= MAP_ELEMENT_FLAG_LAST_TILE; + } + + // Make pasted element selected + const rct_map_element *mapElement = map_get_first_element_at(windowTileInspectorTileX, windowTileInspectorTileY); + w->selected_list_item = (sint16)(pastedElement - mapElement); +} + static void window_tile_inspector_surface_toggle_corner(rct_map_element *mapElement, int cornerIndex) { const uint8 originalSlope = mapElement->properties.surface.slope; const bool diagonal = (originalSlope & 0x10) >> 4; @@ -1009,6 +1037,17 @@ static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) { w->selected_list_item = -1; window_invalidate(w); break; + case WIDX_BUTTON_COPY: + window_tile_inspector_copy_element(w); + map_invalidate_tile_full(windowTileInspectorTileX << 5, windowTileInspectorTileY << 5); + widget_invalidate(w, WIDX_BUTTON_PASTE); + break; + case WIDX_BUTTON_PASTE: + window_tile_inspector_paste_element(w); + map_invalidate_tile_full(windowTileInspectorTileX << 5, windowTileInspectorTileY << 5); + windowTileInspectorElementCount++; + widget_invalidate(w, WIDX_LIST); + break; case WIDX_BUTTON_MOVE_DOWN: window_tile_inspector_swap_elements(w->selected_list_item, w->selected_list_item + 1); w->selected_list_item++; @@ -1445,6 +1484,14 @@ static void window_tile_inspector_auto_set_buttons(rct_window *w) { widget_set_enabled(w, WIDX_BUTTON_MOVE_DOWN, (w->selected_list_item != -1 && w->selected_list_item < windowTileInspectorElementCount - 1)); widget_invalidate(w, WIDX_BUTTON_MOVE_DOWN); + // Copy button + widget_set_enabled(w, WIDX_BUTTON_COPY, w->selected_list_item >= 0); + widget_invalidate(w, WIDX_BUTTON_COPY); + + // Paste button + widget_set_enabled(w, WIDX_BUTTON_PASTE, windowTileInspectorTileSelected && windowTileInspectorElementCopied); + widget_invalidate(w, WIDX_BUTTON_PASTE); + // Page widgets switch (w->page) { case PAGE_FENCE: { @@ -1452,6 +1499,7 @@ static void window_tile_inspector_auto_set_buttons(rct_window *w) { const uint8 fenceType = mapElement->properties.fence.type; const rct_wall_scenery_entry wallEntry = get_wall_entry(fenceType)->wall; const bool canBeSloped = !(wallEntry.flags & WALL_SCENERY_CANT_BUILD_ON_SLOPE); + // Fence slope dropdown widget_set_enabled(w, WIDX_FENCE_DROPDOWN_SLOPE, canBeSloped); widget_invalidate(w, WIDX_FENCE_DROPDOWN_SLOPE); widget_set_enabled(w, WIDX_FENCE_DROPDOWN_SLOPE_BUTTON, canBeSloped);