From 874ccb4c6cc03d071b35a3c7aec8e39e262b92c1 Mon Sep 17 00:00:00 2001 From: Hielke Morsink <123mannetje@gmail.com> Date: Sat, 11 Jun 2016 19:39:51 +0200 Subject: [PATCH] Added sort button, cleaned up page switching. --- data/language/en-GB.txt | 1 + resources/g2/77.png | Bin 0 -> 195 bytes src/localisation/string_ids.h | 1 + src/sprites.h | 2 + src/windows/tile_inspector.c | 132 ++++++++++++++++++++-------------- 5 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 resources/g2/77.png diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 2a8b640c48..74cc0ee281 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4258,6 +4258,7 @@ STR_5946 :{WINDOW_COLOUR_2}Chain lift STR_5947 :{WINDOW_COLOUR_2}Apply changes to entire track piece STR_5948 :{WINDOW_COLOUR_2}Track piece ID: {BLACK}{COMMA16} STR_5949 :{WINDOW_COLOUR_2}Sequence number: {BLACK}{COMMA16} +STR_5950 :{SMALLFONT}{BLACK}Sort the map elements on the current tile based on their base height. #TODO: Fix rebase STR_5920 :Render weather effects diff --git a/resources/g2/77.png b/resources/g2/77.png new file mode 100644 index 0000000000000000000000000000000000000000..eaef740ba803bf7d6ceda1c7a222248e33a84395 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzsi2$Dv*Z=?jiz_QTw?FQ`{CWQR z_3NMizI^-k`}hARtSmJIs$nb%@(X5gcy=QV$cglHaSW-5>pgQ?u)%page = PAGE_DEFAULT; - window->widgets = window_tile_inspector_widgets; - window->enabled_widgets = window_tile_inspector_page_enabled_widgets[window->page]; - window->disabled_widgets = window_tile_inspector_page_disabled_widgets[window->page]; + window_tile_inspector_set_page(window, PAGE_DEFAULT); window_init_scroll_widgets(window); window->min_width = MIN_WW; @@ -469,18 +469,11 @@ static void window_tile_inspector_load_tile(rct_window* w) window_tile_inspector_item_count = numItems; // Set default page - w->page = PAGE_DEFAULT; - w->widgets = tile_inspector_widgets[w->page]; - w->enabled_widgets = window_tile_inspector_page_enabled_widgets[w->page]; - w->disabled_widgets = window_tile_inspector_page_disabled_widgets[w->page]; + window_tile_inspector_set_page(w, PAGE_DEFAULT); - // Enable 'insert corrupt element' button - w->enabled_widgets |= (1 << WIDX_CORRUPT); - w->disabled_widgets &= ~(1ULL << WIDX_CORRUPT); // undo selection and buttons affecting it w->selected_list_item = -1; - w->disabled_widgets |= (1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE); - w->enabled_widgets &= ~((1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE)); + window_tile_inspector_auto_set_buttons(w); w->scrolls[0].v_top = 0; window_invalidate(w); @@ -580,6 +573,27 @@ static void swap_elements(sint16 first, sint16 second) map_invalidate_tile_full(window_tile_inspector_tile_x << 5, window_tile_inspector_tile_y << 5); } +static void sort_elements(rct_window *w) +{ + const rct_map_element *const firstElement = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y); + + // Bubble sort + for (int loop_start = 1; loop_start < window_tile_inspector_item_count; loop_start++) + { + int current_id = loop_start; + const rct_map_element *currentElement = firstElement + current_id; + const rct_map_element *otherElement = currentElement - 1; + + while (current_id > 0 && otherElement->base_height > currentElement->base_height) + { + swap_elements(current_id - 1, current_id); + current_id--; + currentElement--; + otherElement--; + } + } +} + static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { @@ -607,30 +621,38 @@ static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) window_tile_inspector_load_tile(w); window_tile_inspector_auto_set_buttons(w); break; - case WIDX_CORRUPT: + case WIDX_BUTTON_CORRUPT: corrupt_element(); + window_tile_inspector_set_page(w, PAGE_CORRUPT); w->scrolls[0].v_top = 0; w->selected_list_item = window_tile_inspector_item_count++; window_tile_inspector_auto_set_buttons(w); widget_invalidate(w, WIDX_LIST); break; - case WIDX_REMOVE: + case WIDX_BUTTON_REMOVE: remove_element(w->selected_list_item); + window_tile_inspector_set_page(w, PAGE_DEFAULT); w->selected_list_item = -1; + window_tile_inspector_set_page(w, PAGE_DEFAULT); window_tile_inspector_auto_set_buttons(w); - widget_invalidate(w, WIDX_LIST); + window_invalidate(w); break; - case WIDX_ROTATE: + case WIDX_BUTTON_ROTATE: rotate_element(w->selected_list_item); window_invalidate(w); break; - case WIDX_MOVE_DOWN: + case WIDX_BUTTON_SORT: + w->selected_list_item = -1; + sort_elements(w); + window_invalidate(w); + break; + case WIDX_BUTTON_MOVE_DOWN: swap_elements(w->selected_list_item, w->selected_list_item + 1); w->selected_list_item++; window_tile_inspector_auto_set_buttons(w); widget_invalidate(w, WIDX_LIST); break; - case WIDX_MOVE_UP: + case WIDX_BUTTON_MOVE_UP: swap_elements(w->selected_list_item - 1, w->selected_list_item); w->selected_list_item--; window_tile_inspector_auto_set_buttons(w); @@ -807,6 +829,14 @@ static void window_tile_inspector_scrollgetsize(rct_window *w, int scrollIndex, *height = window_tile_inspector_item_count * LIST_ITEM_HEIGHT; } +static void window_tile_inspector_set_page(rct_window *w, const page) +{ + w->page = page; + w->widgets = tile_inspector_widgets[page]; + w->enabled_widgets = window_tile_inspector_page_enabled_widgets[page]; + w->disabled_widgets = window_tile_inspector_page_disabled_widgets[page]; +} + static void window_tile_inspector_auto_set_buttons(rct_window *w) { // X and Y spinners @@ -816,39 +846,37 @@ static void window_tile_inspector_auto_set_buttons(rct_window *w) widget_set_enabled(w, WIDX_SPINNER_Y_INCREASE, (tile_is_selected && (window_tile_inspector_tile_y < 255))); widget_set_enabled(w, WIDX_SPINNER_Y_DECREASE, (tile_is_selected && (window_tile_inspector_tile_y > 0))); - // Remove button - widget_set_enabled(w, WIDX_REMOVE, (w->selected_list_item != -1)); - widget_invalidate(w, WIDX_REMOVE); + // Sort buttons + widget_set_enabled(w, WIDX_BUTTON_SORT, (tile_is_selected && window_tile_inspector_item_count > 1)); // Move Up button - widget_set_enabled(w, WIDX_MOVE_UP, (w->selected_list_item > 0)); - widget_invalidate(w, WIDX_MOVE_UP); + widget_set_enabled(w, WIDX_BUTTON_MOVE_UP, (w->selected_list_item > 0)); + widget_invalidate(w, WIDX_BUTTON_MOVE_UP); // Move Down button - widget_set_enabled(w, WIDX_MOVE_DOWN, (w->selected_list_item != -1 && w->selected_list_item != window_tile_inspector_item_count)); - widget_invalidate(w, WIDX_MOVE_DOWN); + widget_set_enabled(w, WIDX_BUTTON_MOVE_DOWN, (w->selected_list_item != -1 && w->selected_list_item < window_tile_inspector_item_count - 1)); + widget_invalidate(w, WIDX_BUTTON_MOVE_DOWN); } static void window_tile_inspector_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - // Because the list items are displayed in reverse order, subtract the number from the amount of elements - sint16 index = window_tile_inspector_item_count - (y - 1) / LIST_ITEM_HEIGHT - 1; + // Because the list items are displayed in reverse order, subtract the calculated index from the amount of elements + const sint16 index = window_tile_inspector_item_count - (y - 1) / LIST_ITEM_HEIGHT - 1; + int page; if (index < 0 || index >= window_tile_inspector_item_count) { w->selected_list_item = -1; - w->page = 0; + page = 0; } else { w->selected_list_item = index; - // Pick widget layout + // Get type of selected map element to select the correct page rct_map_element *mapElement = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y); mapElement += index; - w->page = (min(map_element_get_type(mapElement), MAP_ELEMENT_TYPE_CORRUPT) >> 2) + 1; + page = (min(map_element_get_type(mapElement), MAP_ELEMENT_TYPE_CORRUPT) >> 2) + 1; } - w->widgets = tile_inspector_widgets[w->page]; - w->enabled_widgets = window_tile_inspector_page_enabled_widgets[w->page]; - w->disabled_widgets = window_tile_inspector_page_disabled_widgets[w->page]; + window_tile_inspector_set_page(w, page); // Enable/disable buttons window_tile_inspector_auto_set_buttons(w);