1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-17 03:53:07 +01:00

Create dropdown item flags

This commit is contained in:
Gymnasiast
2022-02-13 00:08:06 +01:00
parent 723867e0a0
commit 4abbfcb32b
2 changed files with 41 additions and 14 deletions

View File

@@ -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

View File

@@ -50,8 +50,6 @@ static bool _dropdown_list_vertically;
int32_t gDropdownNumItems;
Dropdown::Item gDropdownItems[Dropdown::ItemsMaxSize];
static ImageId _dropdownItemsImages[Dropdown::ItemsMaxSize];
static BitSet<Dropdown::ItemsMaxSize> _dropdownItemsChecked = {};
static BitSet<Dropdown::ItemsMaxSize> _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<int32_t>(std::size(_dropdownItemsDisabled)))
if (index < 0 || index >= static_cast<int32_t>(std::size(gDropdownItems)))
{
return false;
}
return _dropdownItemsChecked[index];
return gDropdownItems[index].IsChecked();
}
bool Dropdown::IsDisabled(int32_t index)
{
if (index < 0 || index >= static_cast<int32_t>(std::size(_dropdownItemsDisabled)))
if (index < 0 || index >= static_cast<int32_t>(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<int32_t>(std::size(_dropdownItemsDisabled)))
if (index < 0 || index >= static_cast<int32_t>(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<int32_t>(std::size(_dropdownItemsDisabled)))
if (index < 0 || index >= static_cast<int32_t>(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);