diff --git a/distribution/changelog.txt b/distribution/changelog.txt index ee4e7974a4..23a23fdb71 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -5,6 +5,7 @@ - Change: [#23932] The land rights window now checks “Land Owned” by default. - Change: [#23936] The ‘guests prefer less/more intense rides’ settings have been turned into a dropdown. - Change: [#24067] [Plugin] Registered menu items are now listed alphabetically. +- Change: [#24070] Footpath selection menus now show object names on hover using a tooltip. - Fix: [#4225] Ride Construction window offers non-existent banked sloped to level curve (original bug). - Fix: [#5281] Missing supports on miniature railways built backwards. - Fix: [#10379] Banners outside the park can be renamed and modified (original bug). diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index 26914830af..5dba72b2da 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1237,65 +1237,6 @@ namespace OpenRCT2 } } - const std::map kColourToTip = { - { COLOUR_BLACK, STR_COLOUR_BLACK_TIP }, - { COLOUR_GREY, STR_COLOUR_GREY_TIP }, - { COLOUR_WHITE, STR_COLOUR_WHITE_TIP }, - { COLOUR_DARK_PURPLE, STR_COLOUR_DARK_PURPLE_TIP }, - { COLOUR_LIGHT_PURPLE, STR_COLOUR_LIGHT_PURPLE_TIP }, - { COLOUR_BRIGHT_PURPLE, STR_COLOUR_BRIGHT_PURPLE_TIP }, - { COLOUR_DARK_BLUE, STR_COLOUR_DARK_BLUE_TIP }, - { COLOUR_LIGHT_BLUE, STR_COLOUR_LIGHT_BLUE_TIP }, - { COLOUR_ICY_BLUE, STR_COLOUR_ICY_BLUE_TIP }, - { COLOUR_TEAL, STR_COLOUR_TEAL_TIP }, - { COLOUR_AQUAMARINE, STR_COLOUR_AQUAMARINE_TIP }, - { COLOUR_SATURATED_GREEN, STR_COLOUR_SATURATED_GREEN_TIP }, - { COLOUR_DARK_GREEN, STR_COLOUR_DARK_GREEN_TIP }, - { COLOUR_MOSS_GREEN, STR_COLOUR_MOSS_GREEN_TIP }, - { COLOUR_BRIGHT_GREEN, STR_COLOUR_BRIGHT_GREEN_TIP }, - { COLOUR_OLIVE_GREEN, STR_COLOUR_OLIVE_GREEN_TIP }, - { COLOUR_DARK_OLIVE_GREEN, STR_COLOUR_DARK_OLIVE_GREEN_TIP }, - { COLOUR_BRIGHT_YELLOW, STR_COLOUR_BRIGHT_YELLOW_TIP }, - { COLOUR_YELLOW, STR_COLOUR_YELLOW_TIP }, - { COLOUR_DARK_YELLOW, STR_COLOUR_DARK_YELLOW_TIP }, - { COLOUR_LIGHT_ORANGE, STR_COLOUR_LIGHT_ORANGE_TIP }, - { COLOUR_DARK_ORANGE, STR_COLOUR_DARK_ORANGE_TIP }, - { COLOUR_LIGHT_BROWN, STR_COLOUR_LIGHT_BROWN_TIP }, - { COLOUR_SATURATED_BROWN, STR_COLOUR_SATURATED_BROWN_TIP }, - { COLOUR_DARK_BROWN, STR_COLOUR_DARK_BROWN_TIP }, - { COLOUR_SALMON_PINK, STR_COLOUR_SALMON_PINK_TIP }, - { COLOUR_BORDEAUX_RED, STR_COLOUR_BORDEAUX_RED_TIP }, - { COLOUR_SATURATED_RED, STR_COLOUR_SATURATED_RED_TIP }, - { COLOUR_BRIGHT_RED, STR_COLOUR_BRIGHT_RED_TIP }, - { COLOUR_DARK_PINK, STR_COLOUR_DARK_PINK_TIP }, - { COLOUR_BRIGHT_PINK, STR_COLOUR_BRIGHT_PINK_TIP }, - { COLOUR_LIGHT_PINK, STR_COLOUR_LIGHT_PINK_TIP }, - { COLOUR_DARK_OLIVE_DARK, STR_COLOUR_DARK_OLIVE_DARK_TIP }, - { COLOUR_DARK_OLIVE_LIGHT, STR_COLOUR_DARK_OLIVE_LIGHT_TIP }, - { COLOUR_SATURATED_BROWN_LIGHT, STR_COLOUR_SATURATED_BROWN_LIGHT_TIP }, - { COLOUR_BORDEAUX_RED_DARK, STR_COLOUR_BORDEAUX_RED_DARK_TIP }, - { COLOUR_BORDEAUX_RED_LIGHT, STR_COLOUR_BORDEAUX_RED_LIGHT_TIP }, - { COLOUR_GRASS_GREEN_DARK, STR_COLOUR_GRASS_GREEN_DARK_TIP }, - { COLOUR_GRASS_GREEN_LIGHT, STR_COLOUR_GRASS_GREEN_LIGHT_TIP }, - { COLOUR_OLIVE_DARK, STR_COLOUR_OLIVE_DARK_TIP }, - { COLOUR_OLIVE_LIGHT, STR_COLOUR_OLIVE_LIGHT_TIP }, - { COLOUR_SATURATED_GREEN_LIGHT, STR_COLOUR_SATURATED_GREEN_LIGHT_TIP }, - { COLOUR_TAN_DARK, STR_COLOUR_TAN_DARK_TIP }, - { COLOUR_TAN_LIGHT, STR_COLOUR_TAN_LIGHT_TIP }, - { COLOUR_DULL_PURPLE_LIGHT, STR_COLOUR_DULL_PURPLE_LIGHT_TIP }, - { COLOUR_DULL_GREEN_DARK, STR_COLOUR_DULL_GREEN_DARK_TIP }, - { COLOUR_DULL_GREEN_LIGHT, STR_COLOUR_DULL_GREEN_LIGHT_TIP }, - { COLOUR_SATURATED_PURPLE_DARK, STR_COLOUR_SATURATED_PURPLE_DARK_TIP }, - { COLOUR_SATURATED_PURPLE_LIGHT, STR_COLOUR_SATURATED_PURPLE_LIGHT_TIP }, - { COLOUR_ORANGE_LIGHT, STR_COLOUR_ORANGE_LIGHT_TIP }, - { COLOUR_AQUA_DARK, STR_COLOUR_AQUA_DARK_TIP }, - { COLOUR_MAGENTA_LIGHT, STR_COLOUR_MAGENTA_LIGHT_TIP }, - { COLOUR_DULL_BROWN_DARK, STR_COLOUR_DULL_BROWN_DARK_TIP }, - { COLOUR_DULL_BROWN_LIGHT, STR_COLOUR_DULL_BROWN_LIGHT_TIP }, - { COLOUR_INVISIBLE, STR_COLOUR_INVISIBLE_TIP }, - { COLOUR_VOID, STR_COLOUR_VOID_TIP }, - }; - /** * * rct2: 0x006E8DA7 @@ -1505,7 +1446,7 @@ namespace OpenRCT2 } return; } - else if (gDropdownIsColour) + else if (gDropdownHasTooltips) { // This is ordinarily covered in InputWidgetOver but the dropdown with colours is a special case. InputUpdateTooltip(w, widgetIndex, screenCoords); @@ -1526,13 +1467,12 @@ namespace OpenRCT2 return; } - if (gDropdownIsColour && gDropdownLastColourHover != dropdown_index) + if (gDropdownHasTooltips && gDropdownLastTooltipHover != dropdown_index) { - gDropdownLastColourHover = dropdown_index; + gDropdownLastTooltipHover = dropdown_index; WindowTooltipClose(); - WindowTooltipShow( - OpenRCT2String{ kColourToTip.at(ColourDropDownIndexToColour(dropdown_index)), {} }, screenCoords); + WindowTooltipShow(OpenRCT2String{ gDropdownTooltips[dropdown_index], {} }, screenCoords); } if (dropdown_index < Dropdown::kItemsMaxSize && Dropdown::IsDisabled(dropdown_index)) @@ -1550,7 +1490,7 @@ namespace OpenRCT2 } else { - gDropdownLastColourHover = -1; + gDropdownLastTooltipHover = -1; WindowTooltipClose(); } } diff --git a/src/openrct2-ui/interface/Dropdown.h b/src/openrct2-ui/interface/Dropdown.h index ad494ecb5e..1ed45bf110 100644 --- a/src/openrct2-ui/interface/Dropdown.h +++ b/src/openrct2-ui/interface/Dropdown.h @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include @@ -28,9 +29,10 @@ namespace OpenRCT2::Dropdown namespace OpenRCT2::Ui::Windows { extern int32_t gDropdownNumItems; - extern Dropdown::Item gDropdownItems[Dropdown::kItemsMaxSize]; - extern bool gDropdownIsColour; - extern int32_t gDropdownLastColourHover; + extern std::array gDropdownItems; + extern std::array gDropdownTooltips; + extern bool gDropdownHasTooltips; + extern int32_t gDropdownLastTooltipHover; extern int32_t gDropdownHighlightedIndex; extern int32_t gDropdownDefaultIndex; diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index ecdc24dc01..40873f5b5d 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -46,11 +46,13 @@ namespace OpenRCT2::Ui::Windows MakeWidget({ 0, 0 }, { 1, 1 }, WindowWidgetType::ImgBtn, WindowColour::Primary), }; + std::array gDropdownItems; + std::array gDropdownTooltips; + static std::array _dropdownItemsImages; + int32_t gDropdownNumItems; - Dropdown::Item gDropdownItems[Dropdown::kItemsMaxSize]; - static ImageId _dropdownItemsImages[Dropdown::kItemsMaxSize]; - bool gDropdownIsColour; - int32_t gDropdownLastColourHover; + bool gDropdownHasTooltips; + int32_t gDropdownLastTooltipHover; int32_t gDropdownHighlightedIndex; int32_t gDropdownDefaultIndex; static bool _dropdownPrepareUseImages; @@ -80,7 +82,7 @@ namespace OpenRCT2::Ui::Windows // Input state gDropdownHighlightedIndex = -1; ResetDropdownFlags(); - gDropdownIsColour = false; + gDropdownHasTooltips = false; gDropdownDefaultIndex = -1; InputSetState(InputState::DropdownActive); } @@ -492,6 +494,71 @@ namespace OpenRCT2::Ui::Windows COLOUR_VOID, }; + constexpr std::array kColourTooltips = { + STR_COLOUR_BLACK_TIP, + STR_COLOUR_SATURATED_RED_TIP, + STR_COLOUR_DARK_ORANGE_TIP, + STR_COLOUR_DARK_YELLOW_TIP, + STR_COLOUR_GRASS_GREEN_DARK_TIP, + STR_COLOUR_SATURATED_GREEN_TIP, + STR_COLOUR_AQUA_DARK_TIP, + STR_COLOUR_DARK_BLUE_TIP, + STR_COLOUR_SATURATED_PURPLE_DARK_TIP, + + STR_COLOUR_GREY_TIP, + STR_COLOUR_BRIGHT_RED_TIP, + STR_COLOUR_LIGHT_ORANGE_TIP, + STR_COLOUR_YELLOW_TIP, + STR_COLOUR_MOSS_GREEN_TIP, + STR_COLOUR_BRIGHT_GREEN_TIP, + STR_COLOUR_TEAL_TIP, + STR_COLOUR_LIGHT_BLUE_TIP, + STR_COLOUR_BRIGHT_PURPLE_TIP, + + STR_COLOUR_WHITE_TIP, + STR_COLOUR_LIGHT_PINK_TIP, + STR_COLOUR_ORANGE_LIGHT_TIP, + STR_COLOUR_BRIGHT_YELLOW_TIP, + STR_COLOUR_GRASS_GREEN_LIGHT_TIP, + STR_COLOUR_SATURATED_GREEN_LIGHT_TIP, + STR_COLOUR_AQUAMARINE_TIP, + STR_COLOUR_ICY_BLUE_TIP, + STR_COLOUR_SATURATED_PURPLE_LIGHT_TIP, + + STR_COLOUR_DULL_BROWN_DARK_TIP, + STR_COLOUR_BORDEAUX_RED_DARK_TIP, + STR_COLOUR_TAN_DARK_TIP, + STR_COLOUR_SATURATED_BROWN_TIP, + STR_COLOUR_DARK_OLIVE_DARK_TIP, + STR_COLOUR_OLIVE_DARK_TIP, + STR_COLOUR_DULL_GREEN_DARK_TIP, + STR_COLOUR_DARK_PURPLE_TIP, + STR_COLOUR_DARK_PINK_TIP, + + STR_COLOUR_DARK_BROWN_TIP, + STR_COLOUR_BORDEAUX_RED_TIP, + STR_COLOUR_SALMON_PINK_TIP, + STR_COLOUR_LIGHT_BROWN_TIP, + STR_COLOUR_DARK_OLIVE_GREEN_TIP, + STR_COLOUR_OLIVE_GREEN_TIP, + STR_COLOUR_DARK_GREEN_TIP, + STR_COLOUR_LIGHT_PURPLE_TIP, + STR_COLOUR_BRIGHT_PINK_TIP, + + STR_COLOUR_DULL_BROWN_LIGHT_TIP, + STR_COLOUR_BORDEAUX_RED_LIGHT_TIP, + STR_COLOUR_TAN_LIGHT_TIP, + STR_COLOUR_SATURATED_BROWN_LIGHT_TIP, + STR_COLOUR_DARK_OLIVE_LIGHT_TIP, + STR_COLOUR_OLIVE_LIGHT_TIP, + STR_COLOUR_DULL_GREEN_LIGHT_TIP, + STR_COLOUR_DULL_PURPLE_LIGHT_TIP, + STR_COLOUR_MAGENTA_LIGHT_TIP, + + STR_COLOUR_INVISIBLE_TIP, + STR_COLOUR_VOID_TIP, + }; + colour_t ColourDropDownIndexToColour(uint8_t ddidx) { return kColoursDropdownOrder[ddidx]; @@ -529,8 +596,10 @@ namespace OpenRCT2::Ui::Windows Dropdown::Flag::StayOpen, numColours, squareSize, squareSize, DropdownGetAppropriateImageDropdownItemsPerRow(static_cast(numColours))); - gDropdownIsColour = true; - gDropdownLastColourHover = -1; + std::copy(kColourTooltips.begin(), kColourTooltips.end(), gDropdownTooltips.begin()); + + gDropdownHasTooltips = true; + gDropdownLastTooltipHover = -1; gDropdownDefaultIndex = defaultIndex; } diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index dbf4bb6ea2..90dc3e158e 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -705,6 +705,7 @@ namespace OpenRCT2::Ui::Windows } gDropdownItems[numPathTypes].Format = kStringIdNone; + gDropdownTooltips[numPathTypes] = pathType->NameStringId; Dropdown::SetImage(numPathTypes, ImageId(pathType->PreviewImageId)); _dropdownEntries.push_back({ ObjectType::footpathSurface, i }); numPathTypes++; @@ -730,6 +731,7 @@ namespace OpenRCT2::Ui::Windows } gDropdownItems[numPathTypes].Format = kStringIdNone; + gDropdownTooltips[numPathTypes] = pathEntry->string_idx; Dropdown::SetImage( numPathTypes, ImageId(showQueues ? pathEntry->GetQueuePreviewImage() : pathEntry->GetPreviewImage())); _dropdownEntries.push_back({ ObjectType::paths, i }); @@ -740,6 +742,9 @@ namespace OpenRCT2::Ui::Windows WindowDropdownShowImage( windowPos.x + widget->left, windowPos.y + widget->top, widget->height() + 1, colours[1], 0, numPathTypes, 47, 36, itemsPerRow); + + gDropdownHasTooltips = true; + if (defaultIndex) gDropdownDefaultIndex = static_cast(*defaultIndex); } @@ -764,6 +769,7 @@ namespace OpenRCT2::Ui::Windows } gDropdownItems[numRailingsTypes].Format = kStringIdNone; + gDropdownTooltips[numRailingsTypes] = railingsEntry->NameStringId; Dropdown::SetImage(numRailingsTypes, ImageId(railingsEntry->PreviewImageId)); _dropdownEntries.push_back({ ObjectType::footpathRailings, i }); numRailingsTypes++; @@ -773,6 +779,9 @@ namespace OpenRCT2::Ui::Windows WindowDropdownShowImage( windowPos.x + widget->left, windowPos.y + widget->top, widget->height() + 1, colours[1], 0, numRailingsTypes, 47, 36, itemsPerRow); + + gDropdownHasTooltips = true; + if (defaultIndex) gDropdownDefaultIndex = static_cast(*defaultIndex); }