From f28907a87da1ed543b9eae77b4154dc3614d1533 Mon Sep 17 00:00:00 2001 From: Duncan Date: Sat, 10 Oct 2020 14:49:56 +0100 Subject: [PATCH] Rework tooltip to be more logical (#13137) --- src/openrct2-ui/input/MouseInput.cpp | 3 +-- .../windows/EditorObjectSelection.cpp | 9 +++++--- src/openrct2-ui/windows/GameBottomToolbar.cpp | 8 ++++--- src/openrct2-ui/windows/Options.cpp | 9 +++++--- src/openrct2-ui/windows/Ride.cpp | 12 +++++----- src/openrct2-ui/windows/Scenery.cpp | 7 +++--- src/openrct2-ui/windows/Tooltip.cpp | 22 +++++++++---------- src/openrct2-ui/windows/Window.h | 2 +- src/openrct2/interface/Window.cpp | 12 ++++++---- src/openrct2/interface/Window.h | 5 +++-- 10 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index c5f5913b65..34b772ff48 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1398,8 +1398,7 @@ void input_state_widget_pressed( STR_COLOUR_BRIGHT_PINK_TIP, STR_COLOUR_LIGHT_PINK_TIP, }; - - window_tooltip_show(colourTooltips[dropdown_index], screenCoords); + window_tooltip_show(OpenRCT2String{ colourTooltips[dropdown_index], {} }, screenCoords); } if (dropdown_index < DROPDOWN_ITEMS_MAX_SIZE && dropdown_is_disabled(dropdown_index)) diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 97eb616454..7ea9d89e06 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -180,7 +180,7 @@ static void window_editor_object_selection_update(rct_window *w); static void window_editor_object_selection_scrollgetsize(rct_window *w, int32_t scrollIndex, int32_t *width, int32_t *height); static void window_editor_object_selection_scroll_mousedown(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords); static void window_editor_object_selection_scroll_mouseover(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords); -static void window_editor_object_selection_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId); +static OpenRCT2String window_editor_object_selection_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback); static void window_editor_object_selection_invalidate(rct_window *w); static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int32_t scrollIndex); @@ -766,13 +766,16 @@ static void window_editor_object_selection_scroll_mouseover( * * rct2: 0x006AB058 */ -static void window_editor_object_selection_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id* stringId) +static OpenRCT2String window_editor_object_selection_tooltip( + rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { if (widgetIndex >= WIDX_TAB_1 && static_cast(widgetIndex) < WIDX_TAB_1 + std::size(ObjectSelectionPages)) { - auto ft = Formatter::Common(); + auto ft = Formatter(); ft.Add(ObjectSelectionPages[(widgetIndex - WIDX_TAB_1)].Caption); + return { fallback, ft }; } + return { fallback, {} }; } /** diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index 53b767bc6b..5c264e83e0 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -68,7 +68,7 @@ static rct_widget window_game_bottom_toolbar_widgets[] = uint8_t gToolbarDirtyFlags; static void window_game_bottom_toolbar_mouseup(rct_window *w, rct_widgetindex widgetIndex); -static void window_game_bottom_toolbar_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId); +static OpenRCT2String window_game_bottom_toolbar_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback); static void window_game_bottom_toolbar_invalidate(rct_window *w); static void window_game_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_game_bottom_toolbar_update(rct_window* w); @@ -189,10 +189,11 @@ static void window_game_bottom_toolbar_mouseup(rct_window* w, rct_widgetindex wi } } -static void window_game_bottom_toolbar_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id* stringId) +static OpenRCT2String window_game_bottom_toolbar_tooltip( + rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { int32_t month, day; - auto ft = Formatter::Common(); + auto ft = Formatter(); switch (widgetIndex) { @@ -211,6 +212,7 @@ static void window_game_bottom_toolbar_tooltip(rct_window* w, rct_widgetindex wi ft.Add(DateGameMonthNames[month]); break; } + return { fallback, ft }; } /** diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 44b64553d4..ff41fa5da3 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -2107,21 +2107,24 @@ static void window_options_advanced_paint(rct_window* w, rct_drawpixelinfo* dpi) DrawTextEllipsised(dpi, screenCoords, 277, STR_STRING, ft, w->colours[1]); } -static void window_options_advanced_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id* stringid) +static OpenRCT2String window_options_advanced_tooltip( + rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { if (widgetIndex == WIDX_PATH_TO_RCT1_BUTTON) { if (str_is_null_or_empty(gConfigGeneral.rct1_path)) { // No tooltip if the path is empty - *stringid = STR_NONE; + return { STR_NONE, {} }; } else { - auto ft = Formatter::Common(); + auto ft = Formatter(); ft.Add(gConfigGeneral.rct1_path); + return { fallback, ft }; } } + return { fallback, {} }; } #pragma region Event lists diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 6af6715b94..94400c7329 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -592,7 +592,7 @@ static void window_ride_graphs_mousedown(rct_window *w, rct_widgetindex widgetIn static void window_ride_graphs_update(rct_window *w); static void window_ride_graphs_scrollgetheight(rct_window *w, int32_t scrollIndex, int32_t *width, int32_t *height); static void window_ride_graphs_15(rct_window *w, int32_t scrollIndex, int32_t scrollAreaType); -static void window_ride_graphs_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId); +static OpenRCT2String window_ride_graphs_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback); static void window_ride_graphs_invalidate(rct_window *w); static void window_ride_graphs_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int32_t scrollIndex); @@ -5837,7 +5837,7 @@ static void window_ride_graphs_15(rct_window* w, int32_t scrollIndex, int32_t sc * * rct2: 0x006AEA05 */ -static void window_ride_graphs_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id* stringId) +static OpenRCT2String window_ride_graphs_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { if (widgetIndex == WIDX_GRAPH) { @@ -5847,21 +5847,23 @@ static void window_ride_graphs_tooltip(rct_window* w, rct_widgetindex widgetInde auto [measurement, message] = ride->GetMeasurement(); if (measurement != nullptr && (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING)) { - auto ft = Formatter::Common(); + auto ft = Formatter(); ft.Increment(2); ft.Add(RideComponentNames[RideTypeDescriptors[ride->type].NameConvention.vehicle].number); ft.Add(measurement->vehicle_index + 1); + return { fallback, ft }; } else { - *stringId = message.str; + return message; } } } else { - *stringId = STR_NONE; + return { STR_NONE, {} }; } + return { fallback, {} }; } /** diff --git a/src/openrct2-ui/windows/Scenery.cpp b/src/openrct2-ui/windows/Scenery.cpp index 2e0e6c5ea1..51c1aa75e6 100644 --- a/src/openrct2-ui/windows/Scenery.cpp +++ b/src/openrct2-ui/windows/Scenery.cpp @@ -77,7 +77,7 @@ static void window_scenery_periodic_update(rct_window *w); static void window_scenery_scrollgetsize(rct_window *w, int32_t scrollIndex, int32_t *width, int32_t *height); static void window_scenery_scrollmousedown(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords); static void window_scenery_scrollmouseover(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords); -static void window_scenery_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId); +static OpenRCT2String window_scenery_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback); static void window_scenery_invalidate(rct_window *w); static void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int32_t scrollIndex); @@ -909,9 +909,9 @@ void window_scenery_scrollmouseover(rct_window* w, int32_t scrollIndex, const Sc * * rct2: 0x006E1C05 */ -void window_scenery_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id* stringId) +OpenRCT2String window_scenery_tooltip(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { - auto ft = Formatter::Common(); + auto ft = Formatter(); switch (widgetIndex) { @@ -940,6 +940,7 @@ void window_scenery_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_stri ft.Add(STR_MISCELLANEOUS); break; } + return { fallback, ft }; } /** diff --git a/src/openrct2-ui/windows/Tooltip.cpp b/src/openrct2-ui/windows/Tooltip.cpp index 35dd7e64b5..152460fa88 100644 --- a/src/openrct2-ui/windows/Tooltip.cpp +++ b/src/openrct2-ui/windows/Tooltip.cpp @@ -48,7 +48,7 @@ void window_tooltip_reset(const ScreenCoordsXY& screenCoords) input_set_flag(INPUT_FLAG_4, false); } -void window_tooltip_show(rct_string_id id, ScreenCoordsXY screenCoords) +void window_tooltip_show(const OpenRCT2String& message, ScreenCoordsXY screenCoords) { rct_window* w; int32_t width, height; @@ -59,7 +59,7 @@ void window_tooltip_show(rct_string_id id, ScreenCoordsXY screenCoords) char* buffer = gCommonStringFormatBuffer; - format_string(buffer, sizeof(gCommonStringFormatBuffer), id, gCommonFormatArgs); + format_string(buffer, sizeof(gCommonStringFormatBuffer), message.str, message.args.Data()); gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM; int32_t tooltip_text_width; @@ -116,12 +116,6 @@ void window_tooltip_open(rct_window* widgetWindow, rct_widgetindex widgetIndex, window_event_invalidate_call(widgetWindow); rct_string_id stringId = widget->tooltip; - if (widget->flags & WIDGET_FLAGS::TOOLTIP_IS_STRING) - { - stringId = STR_STRING_TOOLTIP; - auto ft = Formatter::Common(); - ft.Add(widget->sztooltip); - } if (stringId == STR_NONE) return; @@ -129,11 +123,17 @@ void window_tooltip_open(rct_window* widgetWindow, rct_widgetindex widgetIndex, gTooltipWidget.window_classification = widgetWindow->classification; gTooltipWidget.window_number = widgetWindow->number; gTooltipWidget.widget_index = widgetIndex; - - if (window_event_tooltip_call(widgetWindow, widgetIndex) == STR_NONE) + auto result = window_event_tooltip_call(widgetWindow, widgetIndex, stringId); + if (result.str == STR_NONE) return; - window_tooltip_show(stringId, screenCords); + if (widget->flags & WIDGET_FLAGS::TOOLTIP_IS_STRING) + { + result.str = STR_STRING_TOOLTIP; + result.args = Formatter(); + result.args.Add(widget->sztooltip); + } + window_tooltip_show(result, screenCords); } /** diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index bd39047822..061b16113c 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -193,7 +193,7 @@ void window_tile_inspector_clear_clipboard(); rct_window* window_editor_object_selection_open(); void window_tooltip_reset(const ScreenCoordsXY& screenCoords); -void window_tooltip_show(rct_string_id id, ScreenCoordsXY screenCoords); +void window_tooltip_show(const OpenRCT2String& message, ScreenCoordsXY screenCoords); void window_tooltip_open(rct_window* widgetWindow, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords); void window_tooltip_close(); diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index cef0ede1a4..fde1d1195b 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -1520,12 +1520,16 @@ void window_event_unknown_15_call(rct_window* w, int32_t scrollIndex, int32_t sc w->event_handlers->unknown_15(w, scrollIndex, scrollAreaType); } -rct_string_id window_event_tooltip_call(rct_window* w, rct_widgetindex widgetIndex) +OpenRCT2String window_event_tooltip_call(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback) { - rct_string_id result = 0; if (w->event_handlers->tooltip != nullptr) - w->event_handlers->tooltip(w, widgetIndex, &result); - return result; + { + return w->event_handlers->tooltip(w, widgetIndex, fallback); + } + else + { + return { fallback, {} }; + } } int32_t window_event_cursor_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index b4e3738bd1..9753e05206 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -11,6 +11,7 @@ #define _WINDOW_H_ #include "../common.h" +#include "../localisation/Formatter.h" #include "../ride/RideTypes.h" #include "../world/Location.hpp" #include "../world/ScenerySelection.h" @@ -237,7 +238,7 @@ struct rct_window_event_list void (*text_input)(struct rct_window*, rct_widgetindex, char*); void (*viewport_rotate)(struct rct_window*); void (*unknown_15)(struct rct_window*, int32_t, int32_t); - void (*tooltip)(struct rct_window*, rct_widgetindex, rct_string_id*); + OpenRCT2String (*tooltip)(struct rct_window*, const rct_widgetindex, const rct_string_id); void (*cursor)(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&, int32_t*); void (*moved)(struct rct_window*, const ScreenCoordsXY&); void (*invalidate)(struct rct_window*); @@ -796,7 +797,7 @@ void window_event_scroll_mouseover_call(rct_window* w, int32_t scrollIndex, cons void window_event_textinput_call(rct_window* w, rct_widgetindex widgetIndex, char* text); void window_event_viewport_rotate_call(rct_window* w); void window_event_unknown_15_call(rct_window* w, int32_t scrollIndex, int32_t scrollAreaType); -rct_string_id window_event_tooltip_call(rct_window* w, rct_widgetindex widgetIndex); +OpenRCT2String window_event_tooltip_call(rct_window* w, const rct_widgetindex widgetIndex, const rct_string_id fallback); int32_t window_event_cursor_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords); void window_event_moved_call(rct_window* w, const ScreenCoordsXY& screenCoords); void window_event_invalidate_call(rct_window* w);