1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-27 08:45:00 +01:00
Files
OpenRCT2/src/openrct2/interface/Widget.h
2025-06-10 19:55:37 +02:00

176 lines
4.3 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../core/FlagHolder.hpp"
#include "../core/StringTypes.h"
#include "../drawing/ImageId.hpp"
#include "../localisation/StringIdType.h"
#include "../world/Location.hpp"
#include <cstdint>
namespace OpenRCT2
{
using WidgetIndex = uint16_t;
constexpr WidgetIndex kWidgetIndexNull = 0xFFFF;
enum class WidgetType : uint8_t
{
empty = 0,
frame = 1,
resize = 2,
imgBtn = 3,
colourBtn = 6,
trnBtn = 7,
tab = 8,
flatBtn = 9,
button = 10,
labelCentred = 12, // Centred text
tableHeader = 13, // Left-aligned textual button
label = 14, // Left-aligned text
spinner = 15,
dropdownMenu = 16,
viewport = 17,
groupbox = 19,
caption = 20,
closeBox = 21,
scroll = 22,
checkbox = 23,
placeholder = 25,
progressBar = 29,
custom = 28,
textBox = 27,
horizontalSeparator = 30,
};
enum class WidgetFlag : uint8_t
{
textIsString = 0,
isPressed = 2,
isDisabled = 3,
tooltipIsString = 4,
isHidden = 5,
isHoldable = 6,
};
using WidgetFlags = FlagHolder<uint8_t, WidgetFlag>;
enum
{
SCROLL_HORIZONTAL = (1 << 0),
SCROLL_VERTICAL = (1 << 1),
SCROLL_BOTH = SCROLL_HORIZONTAL | SCROLL_VERTICAL
};
constexpr const char* kCloseBoxStringBlackNormal = u8"{BLACK}❌";
constexpr const char* kCloseBoxStringBlackLarge = u8"{BLACK}X";
constexpr const char* kCloseBoxStringWhiteNormal = u8"{WHITE}❌";
constexpr const char* kCloseBoxStringWhiteLarge = u8"{WHITE}X";
struct Widget
{
WidgetType type{};
uint8_t colour{};
int16_t left{};
int16_t right{};
int16_t top{};
int16_t bottom{};
union
{
uint32_t content;
ImageId image{};
StringId text;
const utf8* string;
};
StringId tooltip{ kStringIdNone };
// New properties
WidgetFlags flags{};
utf8* sztooltip{};
int16_t width() const
{
return right - left;
}
int16_t height() const
{
return bottom - top;
}
int16_t midX() const
{
return (left + right) / 2;
}
int16_t midY() const
{
return (top + bottom) / 2;
}
int16_t textTop() const
{
if (height() >= 10)
return std::max<int32_t>(top, top + (height() / 2) - 5);
return top - 1;
}
void moveRight(int32_t amount)
{
left += amount;
right += amount;
}
void moveDown(int32_t amount)
{
top += amount;
bottom += amount;
}
void moveTo(ScreenCoordsXY coords)
{
moveRight(coords.x - left);
moveDown(coords.y - top);
}
void moveToX(int16_t x)
{
moveRight(x - left);
}
void moveToY(int16_t y)
{
moveDown(y - top);
}
bool IsVisible() const
{
return !(flags.has(OpenRCT2::WidgetFlag::isHidden));
}
};
constexpr uint8_t kTitleHeightNormal = 13;
constexpr uint8_t kTitleHeightLarge = 24;
constexpr uint8_t kCloseButtonSize = 10;
constexpr uint8_t kCloseButtonSizeTouch = 20;
constexpr int32_t kScrollableRowHeight = 12;
constexpr uint8_t kListRowHeight = 12;
constexpr uint8_t kTableCellHeight = 12;
constexpr uint8_t kButtonFaceHeight = 12;
constexpr uint8_t kSpinnerHeight = 12;
constexpr uint8_t kDropdownHeight = 12;
constexpr uint16_t kTextInputSize = 1024;
constexpr uint16_t kTopToolbarHeight = 27;
} // namespace OpenRCT2