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