diff --git a/src/openrct2-ui/interface/Widget.cpp b/src/openrct2-ui/interface/Widget.cpp index 9aad6326a6..454217cc79 100644 --- a/src/openrct2-ui/interface/Widget.cpp +++ b/src/openrct2-ui/interface/Widget.cpp @@ -363,7 +363,7 @@ namespace OpenRCT2::Ui auto stringId = widget.text; auto ft = Formatter::Common(); - if (widget.flags & WIDGET_FLAGS::TEXT_IS_STRING) + if (widget.flags.has(WidgetFlag::textIsString)) { stringId = STR_STRING; ft.Add(widget.string); @@ -411,7 +411,7 @@ namespace OpenRCT2::Ui auto stringId = widget.text; auto ft = Formatter::Common(); - if (widget.flags & WIDGET_FLAGS::TEXT_IS_STRING) + if (widget.flags.has(WidgetFlag::textIsString)) { stringId = STR_STRING; ft.Add(widget.string); @@ -464,7 +464,7 @@ namespace OpenRCT2::Ui // Text auto stringId = widget.text; auto rawFt = Formatter::Common(); - if (widget.flags & WIDGET_FLAGS::TEXT_IS_STRING) + if (widget.flags.has(WidgetFlag::textIsString)) { if (widget.string != nullptr && widget.string[0] != '\0') { @@ -650,7 +650,7 @@ namespace OpenRCT2::Ui auto stringId = widget.text; auto ft = Formatter::Common(); - if (widget.flags & WIDGET_FLAGS::TEXT_IS_STRING) + if (widget.flags.has(WidgetFlag::textIsString)) { stringId = STR_STRING; ft.Add(widget.string); @@ -863,14 +863,14 @@ namespace OpenRCT2::Ui bool WidgetIsDisabled(const WindowBase& w, WidgetIndex widgetIndex) { if (w.classification == WindowClass::Custom) - return w.widgets[widgetIndex].flags & WIDGET_FLAGS::IS_DISABLED; + return w.widgets[widgetIndex].flags.has(WidgetFlag::isDisabled); return (w.disabled_widgets & (1LL << widgetIndex)) != 0; } bool WidgetIsHoldable(const WindowBase& w, WidgetIndex widgetIndex) { if (w.classification == WindowClass::Custom) - return w.widgets[widgetIndex].flags & WIDGET_FLAGS::IS_HOLDABLE; + return w.widgets[widgetIndex].flags.has(WidgetFlag::isHoldable); return (w.hold_down_widgets & (1LL << widgetIndex)) != 0; } @@ -883,7 +883,7 @@ namespace OpenRCT2::Ui { if (w.classification == WindowClass::Custom) { - if (w.widgets[widgetIndex].flags & WIDGET_FLAGS::IS_PRESSED) + if (w.widgets[widgetIndex].flags.has(WidgetFlag::isPressed)) { return true; } @@ -1052,7 +1052,7 @@ namespace OpenRCT2::Ui return &w.widgets[widgetIndex]; } - static void SafeSetWidgetFlag(WindowBase& w, WidgetIndex widgetIndex, WidgetFlags mask, bool value) + static void SafeSetWidgetFlag(WindowBase& w, WidgetIndex widgetIndex, WidgetFlag flag, bool value) { Widget* widget = GetWidgetByIndex(w, widgetIndex); if (widget == nullptr) @@ -1060,10 +1060,7 @@ namespace OpenRCT2::Ui return; } - if (value) - widget->flags |= mask; - else - widget->flags &= ~mask; + widget->flags.set(flag, value); } void WidgetSetEnabled(WindowBase& w, WidgetIndex widgetIndex, bool enabled) @@ -1073,7 +1070,7 @@ namespace OpenRCT2::Ui void WidgetSetDisabled(WindowBase& w, WidgetIndex widgetIndex, bool value) { - SafeSetWidgetFlag(w, widgetIndex, WIDGET_FLAGS::IS_DISABLED, value); + SafeSetWidgetFlag(w, widgetIndex, WidgetFlag::isDisabled, value); if (value) { w.disabled_widgets |= (1uLL << widgetIndex); @@ -1086,7 +1083,7 @@ namespace OpenRCT2::Ui void WidgetSetHoldable(WindowBase& w, WidgetIndex widgetIndex, bool value) { - SafeSetWidgetFlag(w, widgetIndex, WIDGET_FLAGS::IS_HOLDABLE, value); + SafeSetWidgetFlag(w, widgetIndex, WidgetFlag::isHoldable, value); if (value) { w.hold_down_widgets |= (1uLL << widgetIndex); @@ -1099,12 +1096,12 @@ namespace OpenRCT2::Ui void WidgetSetVisible(WindowBase& w, WidgetIndex widgetIndex, bool value) { - SafeSetWidgetFlag(w, widgetIndex, WIDGET_FLAGS::IS_HIDDEN, !value); + SafeSetWidgetFlag(w, widgetIndex, WidgetFlag::isHidden, !value); } void WidgetSetPressed(WindowBase& w, WidgetIndex widgetIndex, bool value) { - SafeSetWidgetFlag(w, widgetIndex, WIDGET_FLAGS::IS_PRESSED, value); + SafeSetWidgetFlag(w, widgetIndex, WidgetFlag::isPressed, value); if (value) w.pressed_widgets |= (1uLL << widgetIndex); else diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 9c720fccc5..31f106c1db 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -500,11 +500,11 @@ namespace OpenRCT2::Ui::Windows auto numTabs = _info.Desc.Tabs.size(); if (canBeResized() || numTabs != 0) { - widgets[WIDX_CONTENT_PANEL].flags &= ~WIDGET_FLAGS::IS_HIDDEN; + widgets[WIDX_CONTENT_PANEL].flags.unset(WidgetFlag::isHidden); } else { - widgets[WIDX_CONTENT_PANEL].flags |= WIDGET_FLAGS::IS_HIDDEN; + widgets[WIDX_CONTENT_PANEL].flags.set(WidgetFlag::isHidden); } SetPressedTab(); @@ -607,8 +607,8 @@ namespace OpenRCT2::Ui::Windows else if (widgetDesc->Type == "checkbox") { auto& widget = widgets[widgetIndex]; - widget.flags ^= WIDGET_FLAGS::IS_PRESSED; - bool isChecked = widget.flags & WIDGET_FLAGS::IS_PRESSED; + widget.flags.flip(WidgetFlag::isPressed); + bool isChecked = widget.flags.has(WidgetFlag::isPressed); WidgetSetCheckboxValue(*this, widgetIndex, isChecked); @@ -969,11 +969,11 @@ namespace OpenRCT2::Ui::Windows widget.content = std::numeric_limits::max(); widget.tooltip = kStringIdNone; widget.sztooltip = const_cast(desc.Tooltip.c_str()); - widget.flags |= WIDGET_FLAGS::TOOLTIP_IS_STRING; + widget.flags.set(WidgetFlag::tooltipIsString); if (desc.IsDisabled) - widget.flags |= WIDGET_FLAGS::IS_DISABLED; + widget.flags.set(WidgetFlag::isDisabled); if (!desc.IsVisible) - widget.flags |= WIDGET_FLAGS::IS_HIDDEN; + widget.flags.set(WidgetFlag::isHidden); if (desc.Type == "button") { @@ -986,11 +986,11 @@ namespace OpenRCT2::Ui::Windows { widget.type = WidgetType::button; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); } if (desc.IsPressed) { - widget.flags |= WIDGET_FLAGS::IS_PRESSED; + widget.flags.set(WidgetFlag::isPressed); } widgetList.push_back(widget); } @@ -998,10 +998,10 @@ namespace OpenRCT2::Ui::Windows { widget.type = WidgetType::checkbox; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); if (desc.IsChecked) { - widget.flags |= WIDGET_FLAGS::IS_PRESSED; + widget.flags.set(WidgetFlag::isPressed); } widgetList.push_back(widget); } @@ -1027,7 +1027,7 @@ namespace OpenRCT2::Ui::Windows { widget.string = const_cast(""); } - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); widgetList.push_back(widget); // Add the dropdown button @@ -1041,21 +1041,21 @@ namespace OpenRCT2::Ui::Windows widget.text = STR_DROPDOWN_GLYPH; widget.tooltip = kStringIdNone; if (desc.IsDisabled) - widget.flags |= WIDGET_FLAGS::IS_DISABLED; + widget.flags.set(WidgetFlag::isDisabled); widgetList.push_back(widget); } else if (desc.Type == "groupbox") { widget.type = WidgetType::groupbox; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); widgetList.push_back(widget); } else if (desc.Type == "label") { widget.type = WidgetType::label; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); if (desc.TextAlign == TextAlignment::CENTRE) { widget.type = WidgetType::labelCentred; @@ -1078,7 +1078,7 @@ namespace OpenRCT2::Ui::Windows { widget.type = WidgetType::spinner; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); widgetList.push_back(widget); // Add the increment button @@ -1092,8 +1092,8 @@ namespace OpenRCT2::Ui::Windows widget.text = STR_NUMERIC_UP; widget.tooltip = kStringIdNone; if (desc.IsDisabled) - widget.flags |= WIDGET_FLAGS::IS_DISABLED; - widget.flags |= WIDGET_FLAGS::IS_HOLDABLE; + widget.flags.set(WidgetFlag::isDisabled); + widget.flags.set(WidgetFlag::isHoldable); widgetList.push_back(widget); // Add the decrement button @@ -1106,7 +1106,7 @@ namespace OpenRCT2::Ui::Windows { widget.type = WidgetType::textBox; widget.string = const_cast(desc.Text.c_str()); - widget.flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widget.flags.set(WidgetFlag::textIsString); widgetList.push_back(widget); } else if (desc.Type == "viewport") diff --git a/src/openrct2-ui/scripting/ScWidget.hpp b/src/openrct2-ui/scripting/ScWidget.hpp index 704201a2d4..732f1cf022 100644 --- a/src/openrct2-ui/scripting/ScWidget.hpp +++ b/src/openrct2-ui/scripting/ScWidget.hpp @@ -370,7 +370,7 @@ namespace OpenRCT2::Scripting if (IsCustomWindow()) { auto widget = GetWidget(); - if (widget != nullptr && (widget->flags & WIDGET_FLAGS::TEXT_IS_STRING) && widget->string != nullptr) + if (widget != nullptr && (widget->flags.has(WidgetFlag::textIsString)) && widget->string != nullptr) { return widget->string; } diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index 87283101f3..d6f9eb9fc8 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -845,12 +845,12 @@ namespace OpenRCT2::Ui::Windows auto index = std::distance(_availableCostumes.begin(), pos); auto name = _availableCostumes[index].friendlyName.c_str(); widgets[WIDX_COSTUME_BOX].string = const_cast(name); - widgets[WIDX_COSTUME_BOX].flags |= WIDGET_FLAGS::TEXT_IS_STRING; + widgets[WIDX_COSTUME_BOX].flags.set(WidgetFlag::textIsString); } else { widgets[WIDX_COSTUME_BOX].text = kStringIdEmpty; - widgets[WIDX_COSTUME_BOX].flags &= ~WIDGET_FLAGS::TEXT_IS_STRING; + widgets[WIDX_COSTUME_BOX].flags.unset(WidgetFlag::textIsString); } break; diff --git a/src/openrct2-ui/windows/Tooltip.cpp b/src/openrct2-ui/windows/Tooltip.cpp index 8eab8f3989..90a7be3cb1 100644 --- a/src/openrct2-ui/windows/Tooltip.cpp +++ b/src/openrct2-ui/windows/Tooltip.cpp @@ -180,7 +180,7 @@ namespace OpenRCT2::Ui::Windows widgetWindow->OnPrepareDraw(); OpenRCT2String result; - if (widget->flags & WIDGET_FLAGS::TOOLTIP_IS_STRING) + if (widget->flags.has(WidgetFlag::tooltipIsString)) { auto tooltipString = widget->sztooltip; if (*tooltipString == 0) diff --git a/src/openrct2/interface/Widget.h b/src/openrct2/interface/Widget.h index 26e0ff8384..698b257d64 100644 --- a/src/openrct2/interface/Widget.h +++ b/src/openrct2/interface/Widget.h @@ -9,6 +9,7 @@ #pragma once +#include "../core/FlagHolder.hpp" #include "../core/StringTypes.h" #include "../drawing/ImageId.hpp" #include "../localisation/StringIdType.h" @@ -50,16 +51,16 @@ namespace OpenRCT2 horizontalSeparator = 30, }; - using WidgetFlags = uint32_t; - namespace WIDGET_FLAGS + enum class WidgetFlag : uint8_t { - const WidgetFlags TEXT_IS_STRING = 1 << 0; - const WidgetFlags IS_PRESSED = 1 << 2; - const WidgetFlags IS_DISABLED = 1 << 3; - const WidgetFlags TOOLTIP_IS_STRING = 1 << 4; - const WidgetFlags IS_HIDDEN = 1 << 5; - const WidgetFlags IS_HOLDABLE = 1 << 6; - } // namespace WIDGET_FLAGS + textIsString = 0, + isPressed = 2, + isDisabled = 3, + tooltipIsString = 4, + isHidden = 5, + isHoldable = 6, + }; + using WidgetFlags = FlagHolder; enum { @@ -152,7 +153,7 @@ namespace OpenRCT2 bool IsVisible() const { - return !(flags & OpenRCT2::WIDGET_FLAGS::IS_HIDDEN); + return !(flags.has(OpenRCT2::WidgetFlag::isHidden)); } };