1 /*****************************************************************************
2  * Copyright (c) 2014-2020 OpenRCT2 developers
3  *
4  * For a complete list of all authors, please refer to contributors.md
5  * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
6  *
7  * OpenRCT2 is licensed under the GNU General Public License version 3.
8  *****************************************************************************/
9 
10 #pragma once
11 
12 #include "../localisation/StringIds.h"
13 #include "Window.h"
14 
15 enum class WindowWidgetType : uint8_t
16 {
17     Empty = 0,
18     Frame = 1,
19     Resize = 2,
20     ImgBtn = 3,
21     ColourBtn = 6,
22     TrnBtn = 7,
23     Tab = 8,
24     FlatBtn = 9,
25     Button = 10,
26     LabelCentred = 12, // Centred text
27     TableHeader = 13,  // Left-aligned textual button
28     Label = 14,        // Left-aligned text
29     Spinner = 15,
30     DropdownMenu = 16,
31     Viewport = 17,
32     Groupbox = 19,
33     Caption = 20,
34     CloseBox = 21,
35     Scroll = 22,
36     Checkbox = 23,
37     Placeholder = 25,
38     Custom = 28,
39     TextBox = 27,
40     Last = 26,
41 };
42 
43 constexpr const auto WIDGETS_END = rct_widget{ WindowWidgetType::Last, 0, 0, 0, 0, 0, 0, 0 };
44 #define BAR_BLINK (1u << 31)
45 
46 enum
47 {
48     SCROLL_HORIZONTAL = (1 << 0),
49     SCROLL_VERTICAL = (1 << 1),
50     SCROLL_BOTH = SCROLL_HORIZONTAL | SCROLL_VERTICAL
51 };
52 
53 enum class WindowColour : uint8_t
54 {
55     Primary,
56     Secondary,
57     Tertiary,
58     Quaternary,
59 };
60 
61 constexpr uint8_t SCROLLBAR_WIDTH = 10;
62 
63 constexpr const ScreenSize TAB_SIZE = { 31, 27 };
64 
65 constexpr rct_widget MakeWidget(
66     const ScreenCoordsXY& origin, const ScreenSize& size, WindowWidgetType type, WindowColour colour,
67     uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE)
68 {
69     rct_widget out = {};
70     out.left = origin.x;
71     out.right = origin.x + size.width - 1;
72     out.top = origin.y;
73     out.bottom = origin.y + size.height - 1;
74     out.type = type;
75     out.colour = static_cast<uint8_t>(colour);
76     out.content = content;
77     out.tooltip = tooltip;
78 
79     return out;
80 }
81 
82 constexpr rct_widget MakeRemapWidget(
83     const ScreenCoordsXY& origin, const ScreenSize& size, WindowWidgetType type, WindowColour colour,
84     uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE)
85 {
86     return MakeWidget(origin, size, type, colour, IMAGE_TYPE_REMAP | content, tooltip);
87 }
88 
89 constexpr rct_widget MakeTab(const ScreenCoordsXY& origin, rct_string_id tooltip = STR_NONE)
90 {
91     const ScreenSize size = TAB_SIZE;
92     const WindowWidgetType type = WindowWidgetType::Tab;
93     const WindowColour colour = WindowColour::Secondary;
94     const uint32_t content = 0xFFFFFFFF;
95 
96     return MakeWidget(origin, size, type, colour, content, tooltip);
97 }
98 
99 #define MakeSpinnerWidgets(...)                                                                                                \
100     MakeWidget(__VA_ARGS__), MakeSpinnerIncreaseWidget(__VA_ARGS__), MakeSpinnerDecreaseWidget(__VA_ARGS__)
101 
102 constexpr rct_widget MakeSpinnerDecreaseWidget(
103     const ScreenCoordsXY& origin, const ScreenSize& size, [[maybe_unused]] WindowWidgetType type, WindowColour colour,
104     [[maybe_unused]] uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE)
105 {
106     const int16_t xPos = origin.x + size.width - 26;
107     const int16_t yPos = origin.y + 1;
108     const uint16_t width = 13;
109     const uint16_t height = size.height - 2;
110 
111     return MakeWidget({ xPos, yPos }, { width, height }, WindowWidgetType::Button, colour, STR_NUMERIC_DOWN, tooltip);
112 }
113 
114 constexpr rct_widget MakeSpinnerIncreaseWidget(
115     const ScreenCoordsXY& origin, const ScreenSize& size, [[maybe_unused]] WindowWidgetType type, WindowColour colour,
116     [[maybe_unused]] uint32_t content = 0xFFFFFFFF, rct_string_id tooltip = STR_NONE)
117 {
118     const int16_t xPos = origin.x + size.width - 13;
119     const int16_t yPos = origin.y + 1;
120     const uint16_t width = 12;
121     const uint16_t height = size.height - 2;
122 
123     return MakeWidget({ xPos, yPos }, { width, height }, WindowWidgetType::Button, colour, STR_NUMERIC_UP, tooltip);
124 }
125 
126 void WidgetScrollUpdateThumbs(rct_window* w, rct_widgetindex widget_index);
127 void WidgetDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
128 
129 bool WidgetIsEnabled(rct_window* w, rct_widgetindex widgetIndex);
130 bool WidgetIsDisabled(rct_window* w, rct_widgetindex widgetIndex);
131 bool WidgetIsHoldable(rct_window* w, rct_widgetindex widgetIndex);
132 bool WidgetIsVisible(rct_window* w, rct_widgetindex widgetIndex);
133 bool WidgetIsPressed(rct_window* w, rct_widgetindex widgetIndex);
134 bool WidgetIsHighlighted(rct_window* w, rct_widgetindex widgetIndex);
135 bool WidgetIsActiveTool(rct_window* w, rct_widgetindex widgetIndex);
136 void WidgetScrollGetPart(
137     rct_window* w, const rct_widget* widget, const ScreenCoordsXY& screenCoords, ScreenCoordsXY& retScreenCoords,
138     int32_t* output_scroll_area, int32_t* scroll_id);
139 
140 void WidgetSetEnabled(rct_window* w, rct_widgetindex widgetIndex, bool enabled);
141 void WidgetSetDisabled(rct_window* w, rct_widgetindex widgetIndex, bool value);
142 void WidgetSetHoldable(rct_window* w, rct_widgetindex widgetIndex, bool value);
143 void WidgetSetVisible(rct_window* w, rct_widgetindex widgetIndex, bool value);
144 void WidgetSetCheckboxValue(rct_window* w, rct_widgetindex widgetIndex, int32_t value);
145