diff --git a/src/input.c b/src/input.c index beb03d2874..00aec73cd0 100644 --- a/src/input.c +++ b/src/input.c @@ -1208,7 +1208,12 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi window_event_mouse_down_call(w, widgetIndex); } - if (gInputFlags & INPUT_FLAG_WIDGET_PRESSED) return; + if (gInputFlags & INPUT_FLAG_WIDGET_PRESSED) { + if (gInputState == INPUT_STATE_DROPDOWN_ACTIVE) { + gDropdownHighlightedIndex = gDropdownDefaultIndex; + } + return; + } gInputFlags |= INPUT_FLAG_WIDGET_PRESSED; widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex); @@ -1257,6 +1262,12 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi gTooltipWidget.widget_index = cursor_widgetIndex; gTooltipWidget.window_classification = cursor_w_class; gTooltipWidget.window_number = cursor_w_number; + + if (dropdown_index == -1) { + if (!dropdown_is_disabled(gDropdownDefaultIndex)) { + dropdown_index = gDropdownDefaultIndex; + } + } window_event_dropdown_call(cursor_w, cursor_widgetIndex, dropdown_index); } dropdown_cleanup: @@ -1300,12 +1311,17 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi return; } - if (!w) return; + gDropdownHighlightedIndex = -1; + window_invalidate_by_class(WC_DROPDOWN); + if (w == NULL) { + return; + } if (w->classification == WC_DROPDOWN){ int dropdown_index = dropdown_index_from_point(x, y, w); - - if (dropdown_index == -1) return; + if (dropdown_index == -1) { + return; + } if (gDropdownIsColour && gDropdownLastColourHover != dropdown_index) { gDropdownLastColourHover = dropdown_index; diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 37bc26d370..e5cea90b6c 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -56,12 +56,18 @@ uint64 gDropdownItemsDisabled; bool gDropdownIsColour; int gDropdownLastColourHover; int gDropdownHighlightedIndex; +int gDropdownDefaultIndex; bool dropdown_is_checked(int index) { return gDropdownItemsChecked & (1ULL << index); } +bool dropdown_is_disabled(int index) +{ + return gDropdownItemsDisabled & (1ULL << index); +} + void dropdown_set_checked(int index, bool value) { if (value) { @@ -204,6 +210,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; gDropdownIsColour = false; + gDropdownDefaultIndex = -1; gInputState = INPUT_STATE_DROPDOWN_ACTIVE; } @@ -274,11 +281,9 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; - gInputState = INPUT_STATE_DROPDOWN_ACTIVE; - - // Copy the following properties until all use of it is decompiled - gDropdownHighlightedIndex = gDropdownHighlightedIndex; gDropdownIsColour = false; + gDropdownDefaultIndex = -1; + gInputState = INPUT_STATE_DROPDOWN_ACTIVE; } void window_dropdown_close() @@ -292,7 +297,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); - gDropdownHighlightedIndex = gDropdownHighlightedIndex; + int highlightedIndex = gDropdownHighlightedIndex; for (int i = 0; i < gDropdownNumItems; i++) { cell_x = i % _dropdown_num_columns; cell_y = i / _dropdown_num_columns; @@ -313,7 +318,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) } } else { // - if (i == gDropdownHighlightedIndex) { + if (i == highlightedIndex) { l = w->x + 2 + (cell_x * _dropdown_item_width); t = w->y + 2 + (cell_y * _dropdown_item_height); r = l + _dropdown_item_width - 1; @@ -325,7 +330,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) if (item == (uint16)-1 || item == (uint16)-2) { // Image item image = (uint32)gDropdownItemsArgs[i]; - if (item == (uint16)-2 && gDropdownHighlightedIndex == i) + if (item == (uint16)-2 && highlightedIndex == i) image++; gfx_draw_sprite( @@ -344,9 +349,9 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) // Calculate colour colour = w->colours[0] & 0x7F; - if (i == gDropdownHighlightedIndex) + if (i == highlightedIndex) colour = 2; - if (gDropdownItemsDisabled & (1ULL << i)) + if (dropdown_is_disabled(i)) if (i < 64) colour = (w->colours[0] & 0x7F) | 0x40; diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index 43dcc4cf0d..8262c8eeb4 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -40,7 +40,10 @@ extern uint64 gDropdownItemsDisabled; extern bool gDropdownIsColour; extern int gDropdownLastColourHover; extern int gDropdownHighlightedIndex; +extern int gDropdownDefaultIndex; +bool dropdown_is_checked(int index); +bool dropdown_is_disabled(int index); void dropdown_set_checked(int index, bool value); void dropdown_set_disabled(int index, bool value); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index f84008d496..aaa579afc5 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -120,6 +120,16 @@ enum { DDIDX_DISABLE_SUPPORT_LIMITS }; +enum { + DDIDX_SHOW_MAP, + DDIDX_OPEN_VIEWPORT, +}; + +enum { + DDIDX_ROTATE_CLOCKWISE, + DDIDX_ROTATE_ANTI_CLOCKWISE, +}; + #pragma region Toolbar_widget_ordering // from left to right @@ -446,7 +456,7 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg if (gCheatsDisableSupportLimits) { dropdown_set_checked(DDIDX_DISABLE_SUPPORT_LIMITS, true); } - RCT2_GLOBAL(0x009DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_CHEATS; break; case WIDX_VIEW_MENU: top_toolbar_init_view_menu(w, widget); @@ -469,7 +479,7 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg 0, numItems ); - RCT2_GLOBAL(0x009DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_SHOW_MAP; break; case WIDX_FASTFORWARD: top_toolbar_init_fastforward_menu(w, widget); @@ -549,7 +559,6 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop } break; case WIDX_CHEATS: - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x009DEBA2, uint16); switch (dropdownIndex) { case DDIDX_CHEATS: window_cheats_open(); @@ -569,9 +578,6 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop top_toolbar_view_menu_dropdown(dropdownIndex); break; case WIDX_MAP: - if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, uint16); - switch (dropdownIndex) { case 0: window_map_open(); @@ -2858,14 +2864,18 @@ void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { dropdown_set_checked(5, true); } - if (gConfigGeneral.debugging_tools) - RCT2_GLOBAL(0x9DEBA2, uint16) = (gGameSpeed == 8 ? 0 : gGameSpeed); - else - RCT2_GLOBAL(0x9DEBA2, uint16) = (gGameSpeed >= 4 ? 0 : gGameSpeed); + if (gConfigGeneral.debugging_tools) { + gDropdownDefaultIndex = (gGameSpeed == 8 ? 0 : gGameSpeed); + } else { + gDropdownDefaultIndex = (gGameSpeed >= 4 ? 0 : gGameSpeed); + } + if (gDropdownDefaultIndex == 4) { + gDropdownDefaultIndex = 5; + } } -void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) { - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); +void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) +{ rct_window* w = window_get_main(); if (w) { if (dropdownIndex >= 0 && dropdownIndex <= 5) { @@ -2877,7 +2887,8 @@ void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) { } } -void top_toolbar_init_rotate_menu(rct_window* w, rct_widget* widget) { +void top_toolbar_init_rotate_menu(rct_window* w, rct_widget* widget) +{ gDropdownItemsFormat[0] = STR_ROTATE_CLOCKWISE; gDropdownItemsFormat[1] = STR_ROTATE_ANTI_CLOCKWISE; @@ -2888,13 +2899,13 @@ void top_toolbar_init_rotate_menu(rct_window* w, rct_widget* widget) { w->colours[1] | 0x80, 0, 2 - ); + ); - RCT2_GLOBAL(0x9DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_ROTATE_CLOCKWISE; } -void top_toolbar_rotate_menu_dropdown(short dropdownIndex) { - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); +void top_toolbar_rotate_menu_dropdown(short dropdownIndex) +{ rct_window* w = window_get_main(); if (w) { if (dropdownIndex == 0) { @@ -2908,7 +2919,8 @@ void top_toolbar_rotate_menu_dropdown(short dropdownIndex) { } } -void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { +void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) +{ gDropdownItemsFormat[0] = STR_DEBUG_DROPDOWN_CONSOLE; gDropdownItemsFormat[1] = STR_DEBUG_DROPDOWN_TILE_INSPECTOR; gDropdownItemsFormat[2] = STR_DEBUG_DROPDOWN_OBJECT_SELECTION; @@ -2924,10 +2936,11 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { 5 ); - RCT2_GLOBAL(0x9DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_CONSOLE; } -void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) { +void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) +{ gDropdownItemsFormat[0] = STR_PLAYER_LIST; window_dropdown_show_text( @@ -2939,11 +2952,11 @@ void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) { 1 ); - RCT2_GLOBAL(0x9DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_PLAYER_LIST; } -void top_toolbar_debug_menu_dropdown(short dropdownIndex) { - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); +void top_toolbar_debug_menu_dropdown(short dropdownIndex) +{ rct_window* w = window_get_main(); if (w) { switch (dropdownIndex) { @@ -2967,8 +2980,8 @@ void top_toolbar_debug_menu_dropdown(short dropdownIndex) { } } -void top_toolbar_network_menu_dropdown(short dropdownIndex) { - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); +void top_toolbar_network_menu_dropdown(short dropdownIndex) +{ rct_window* w = window_get_main(); if (w) { switch (dropdownIndex) { @@ -3040,15 +3053,15 @@ void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget) { if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS) dropdown_set_checked(11, true); - RCT2_GLOBAL(0x9DEBA2, uint16) = 0; + gDropdownDefaultIndex = DDIDX_UNDERGROUND_INSIDE; } /** * * rct2: 0x0066CF8A */ -void top_toolbar_view_menu_dropdown(short dropdownIndex) { - if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); +void top_toolbar_view_menu_dropdown(short dropdownIndex) +{ rct_window* w = window_get_main(); if (w) { switch (dropdownIndex) {