mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-10 09:32:29 +01:00
Refactor WidgetFlags to FlagHolder
This commit is contained in:
@@ -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<utf8*>(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<utf8*>(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<utf8*>(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
|
||||
|
||||
@@ -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<uint32_t>::max();
|
||||
widget.tooltip = kStringIdNone;
|
||||
widget.sztooltip = const_cast<utf8*>(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<utf8*>(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<utf8*>(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<utf8*>("");
|
||||
}
|
||||
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<utf8*>(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<utf8*>(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<utf8*>(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<utf8*>(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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<utf8*>(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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<uint8_t, WidgetFlag>;
|
||||
|
||||
enum
|
||||
{
|
||||
@@ -152,7 +153,7 @@ namespace OpenRCT2
|
||||
|
||||
bool IsVisible() const
|
||||
{
|
||||
return !(flags & OpenRCT2::WIDGET_FLAGS::IS_HIDDEN);
|
||||
return !(flags.has(OpenRCT2::WidgetFlag::isHidden));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user