diff --git a/src/openrct2-ui/interface/Dropdown.h b/src/openrct2-ui/interface/Dropdown.h index 0feb6b0e45..ccc6de666f 100644 --- a/src/openrct2-ui/interface/Dropdown.h +++ b/src/openrct2-ui/interface/Dropdown.h @@ -59,15 +59,32 @@ uint32_t DropdownGetAppropriateImageDropdownItemsPerRow(uint32_t numItems); namespace Dropdown { + enum class ItemFlag : uint8_t + { + IsDisabled = (1 << 0), + IsChecked = (1 << 1), + }; + struct Item { rct_string_id Format; int64_t Args; + uint8_t Flags; constexpr bool IsSeparator() const { return Format == SeparatorString; } + + constexpr bool IsDisabled() const + { + return (Flags & EnumValue(ItemFlag::IsDisabled)); + } + + constexpr bool IsChecked() const + { + return (Flags & EnumValue(ItemFlag::IsChecked)); + } }; struct ItemExt diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index 9593db1d2c..3f305dbf74 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -50,8 +50,6 @@ static bool _dropdown_list_vertically; int32_t gDropdownNumItems; Dropdown::Item gDropdownItems[Dropdown::ItemsMaxSize]; static ImageId _dropdownItemsImages[Dropdown::ItemsMaxSize]; -static BitSet _dropdownItemsChecked = {}; -static BitSet _dropdownItemsDisabled = {}; bool gDropdownIsColour; int32_t gDropdownLastColourHover; int32_t gDropdownHighlightedIndex; @@ -59,40 +57,54 @@ int32_t gDropdownDefaultIndex; static bool _dropdownPrepareUseImages; static bool _dropdownUseImages; +static void ResetDropdownFlags() +{ + for (size_t i = 0; i < std::size(gDropdownItems); i++) + { + gDropdownItems[i].Flags = 0; + } +} + bool Dropdown::IsChecked(int32_t index) { - if (index < 0 || index >= static_cast(std::size(_dropdownItemsDisabled))) + if (index < 0 || index >= static_cast(std::size(gDropdownItems))) { return false; } - return _dropdownItemsChecked[index]; + return gDropdownItems[index].IsChecked(); } bool Dropdown::IsDisabled(int32_t index) { - if (index < 0 || index >= static_cast(std::size(_dropdownItemsDisabled))) + if (index < 0 || index >= static_cast(std::size(gDropdownItems))) { return true; } - return _dropdownItemsDisabled[index]; + return gDropdownItems[index].IsDisabled(); } void Dropdown::SetChecked(int32_t index, bool value) { - if (index < 0 || index >= static_cast(std::size(_dropdownItemsDisabled))) + if (index < 0 || index >= static_cast(std::size(gDropdownItems))) { return; } - _dropdownItemsChecked[index] = value; + if (value) + gDropdownItems[index].Flags |= EnumValue(Dropdown::ItemFlag::IsChecked); + else + gDropdownItems[index].Flags &= ~EnumValue(Dropdown::ItemFlag::IsChecked); } void Dropdown::SetDisabled(int32_t index, bool value) { - if (index < 0 || index >= static_cast(std::size(_dropdownItemsDisabled))) + if (index < 0 || index >= static_cast(std::size(gDropdownItems))) { return; } - _dropdownItemsDisabled[index] = value; + if (value) + gDropdownItems[index].Flags |= EnumValue(Dropdown::ItemFlag::IsDisabled); + else + gDropdownItems[index].Flags &= ~EnumValue(Dropdown::ItemFlag::IsDisabled); } void Dropdown::SetImage(int32_t index, ImageId image) @@ -209,8 +221,7 @@ void WindowDropdownShowTextCustomWidth( // Input state gDropdownHighlightedIndex = -1; - _dropdownItemsDisabled.reset(); - _dropdownItemsChecked.reset(); + ResetDropdownFlags(); gDropdownIsColour = false; gDropdownDefaultIndex = -1; input_set_state(InputState::DropdownActive); @@ -299,8 +310,7 @@ void WindowDropdownShowImage( // Input state gDropdownHighlightedIndex = -1; - _dropdownItemsDisabled.reset(); - _dropdownItemsChecked.reset(); + ResetDropdownFlags(); gDropdownIsColour = false; gDropdownDefaultIndex = -1; input_set_state(InputState::DropdownActive);