From f2df096053befba5abbc4bc806cc689077c6d3b1 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 12 Jul 2020 19:01:18 +0200 Subject: [PATCH] Introduce new way of defining widgets Inspired by OpenLoco's widget routines. --- src/openrct2/interface/Widget.h | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/openrct2/interface/Widget.h b/src/openrct2/interface/Widget.h index 6e3dc6c98f..f83e5db4cb 100644 --- a/src/openrct2/interface/Widget.h +++ b/src/openrct2/interface/Widget.h @@ -10,6 +10,7 @@ #ifndef _WIDGET_H_ #define _WIDGET_H_ +#include "../localisation/StringIds.h" #include "Window.h" enum WINDOW_WIDGET_TYPES @@ -60,6 +61,57 @@ enum constexpr uint8_t SCROLLBAR_WIDTH = 10; +constexpr rct_widget MakeWidget( + ScreenCoordsXY origin, ScreenSize size, uint8_t type, uint8_t colour, uint32_t content = 0xFFFFFFFF, + rct_string_id tooltip = STR_NONE) +{ + rct_widget out = {}; + out.left = origin.x; + out.right = origin.x + size.width - 1; + out.top = origin.y; + out.bottom = origin.y + size.height - 1; + out.type = type; + out.colour = colour; + out.content = content; + out.tooltip = tooltip; + + return out; +} + +constexpr rct_widget MakeRemapWidget( + ScreenCoordsXY origin, ScreenSize size, uint8_t type, uint8_t colour, uint32_t content = 0xFFFFFFFF, + rct_string_id tooltip = STR_NONE) +{ + return MakeWidget(origin, size, type, colour, IMAGE_TYPE_REMAP | content, tooltip); +} + +#define MakeSpinnerWidgets(...) \ + MakeWidget(__VA_ARGS__), MakeSpinnerDecreaseWidget(__VA_ARGS__), MakeSpinnerIncreaseWidget(__VA_ARGS__) + +constexpr rct_widget MakeSpinnerDecreaseWidget( + ScreenCoordsXY origin, ScreenSize size, [[maybe_unused]] uint8_t type, uint8_t colour, + [[maybe_unused]] uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE) +{ + const int16_t xPos = origin.x + size.width - 25; + const int16_t yPos = origin.y + 1; + const uint16_t width = 12; + const uint16_t height = size.height - 2; + + return MakeWidget({ xPos, yPos }, { width, height }, WWT_BUTTON, colour, STR_NUMERIC_DOWN, tooltip); +} + +constexpr rct_widget MakeSpinnerIncreaseWidget( + ScreenCoordsXY origin, ScreenSize size, [[maybe_unused]] uint8_t type, uint8_t colour, + [[maybe_unused]] uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE) +{ + const int16_t xPos = origin.x + size.width - 13; + const int16_t yPos = origin.y + 1; + const uint16_t width = 12; + const uint16_t height = size.height - 2; + + return MakeWidget({ xPos, yPos }, { width, height }, WWT_BUTTON, colour, STR_NUMERIC_UP, tooltip); +} + void widget_scroll_update_thumbs(rct_window* w, rct_widgetindex widget_index); void widget_draw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);