OpenTTD Source 20241224-master-gf74b0cf984
widget_type.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#ifndef WIDGET_TYPE_H
11#define WIDGET_TYPE_H
12
13#include "core/alloc_type.hpp"
14#include "core/bitmath_func.hpp"
15#include "core/math_func.hpp"
16#include "strings_type.h"
17#include "gfx_type.h"
18#include "window_type.h"
19
21/* Number of column bits of the WWT_MATRIX widget data. */
22static constexpr uint8_t MAT_COL_START = 0;
23static constexpr uint8_t MAT_COL_BITS = 8;
24
25/* Number of row bits of the WWT_MATRIX widget data. */
26static constexpr uint8_t MAT_ROW_START = 8;
27static constexpr uint8_t MAT_ROW_BITS = 8;
28
36
42
118
124
125enum class AspectFlags : uint8_t {
126 ResizeX = 1U << 0,
127 ResizeY = 1U << 1,
128 ResizeXY = ResizeX | ResizeY,
129};
130DECLARE_ENUM_AS_BIT_SET(AspectFlags)
131
132/* Forward declarations. */
133class NWidgetCore;
134class Scrollbar;
135
137using WidgetLookup = std::map<WidgetID, class NWidgetBase *>;
138
146public:
148
149 void ApplyAspectRatio();
150 virtual void AdjustPaddingForZoom();
151 virtual void SetupSmallestSize(Window *w) = 0;
152 virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) = 0;
153
154 virtual void FillWidgetLookup(WidgetLookup &widget_lookup) = 0;
155
156 virtual NWidgetCore *GetWidgetFromPos(int x, int y) = 0;
158
164 template <class NWID>
166 {
167 for (NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
168 if (NWID *nwid = dynamic_cast<NWID *>(nwid_parent); nwid != nullptr) return nwid;
169 }
170 return nullptr;
171 }
172
178 template <class NWID>
179 const NWID *GetParentWidget() const
180 {
181 for (const NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
182 if (const NWID *nwid = dynamic_cast<const NWID *>(nwid_parent); nwid != nullptr) return nwid;
183 }
184 return nullptr;
185 }
186
187 virtual bool IsHighlighted() const { return false; }
188 virtual TextColour GetHighlightColour() const { return TC_INVALID; }
189 virtual void SetHighlighted([[maybe_unused]] TextColour highlight_colour) {}
190
198 inline void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
199 {
200 this->uz_padding.top = top;
201 this->uz_padding.right = right;
202 this->uz_padding.bottom = bottom;
203 this->uz_padding.left = left;
204 this->AdjustPaddingForZoom();
205 }
206
211 inline void SetPadding(const RectPadding &padding)
212 {
213 this->uz_padding = padding;
214 this->AdjustPaddingForZoom();
215 }
216
217 inline uint GetHorizontalStepSize(SizingType sizing) const;
218 inline uint GetVerticalStepSize(SizingType sizing) const;
219
220 virtual void Draw(const Window *w) = 0;
221 virtual void SetDirty(const Window *w) const;
222
223 Rect GetCurrentRect() const
224 {
225 Rect r;
226 r.left = this->pos_x;
227 r.top = this->pos_y;
228 r.right = this->pos_x + this->current_x - 1;
229 r.bottom = this->pos_y + this->current_y - 1;
230 return r;
231 }
232
234 uint fill_x;
235 uint fill_y;
236 uint resize_x;
237 uint resize_y;
238 /* Size of the widget in the smallest window possible.
239 * Computed by #SetupSmallestSize() followed by #AssignSizePosition().
240 */
243 /* Current widget size (that is, after resizing). */
246 float aspect_ratio = 0;
247 AspectFlags aspect_flags = AspectFlags::ResizeX;
248
249 int pos_x;
250 int pos_y;
251
254
256
257protected:
258 inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height);
259};
260
266{
267 return (sizing == ST_RESIZE) ? this->resize_x : this->fill_x;
268}
269
275{
276 return (sizing == ST_RESIZE) ? this->resize_y : this->fill_y;
277}
278
287inline void NWidgetBase::StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
288{
289 this->pos_x = x;
290 this->pos_y = y;
291 if (sizing == ST_SMALLEST) {
292 this->smallest_x = given_width;
293 this->smallest_y = given_height;
294 }
295 this->current_x = given_width;
296 this->current_y = given_height;
297}
298
299
305public:
307
308 void AdjustPaddingForZoom() override;
309 void SetMinimalSize(uint min_x, uint min_y);
310 void SetMinimalSizeAbsolute(uint min_x, uint min_y);
311 void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size);
312 void SetFill(uint fill_x, uint fill_y);
313 void SetResize(uint resize_x, uint resize_y);
314 void SetAspect(float ratio, AspectFlags flags = AspectFlags::ResizeX);
315 void SetAspect(int x_ratio, int y_ratio, AspectFlags flags = AspectFlags::ResizeX);
316
317 bool UpdateMultilineWidgetSize(const std::string &str, int max_lines);
318 bool UpdateSize(uint min_x, uint min_y);
319 bool UpdateVerticalSize(uint min_y);
320
321 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
322
323 uint min_x;
324 uint min_y;
325
326 bool absolute;
327 uint uz_min_x;
328 uint uz_min_y;
329
333};
334
366
367
372public:
373 NWidgetCore(WidgetType tp, Colours colour, WidgetID index, uint fill_x, uint fill_y, uint32_t widget_data, StringID tool_tip);
374
375 void SetDataTip(uint32_t widget_data, StringID tool_tip);
376 void SetToolTip(StringID tool_tip);
377 void SetTextStyle(TextColour colour, FontSize size);
378 void SetAlignment(StringAlignment align);
379
380 inline void SetLowered(bool lowered);
381 inline bool IsLowered() const;
382 inline void SetDisabled(bool disabled);
383 inline bool IsDisabled() const;
384
385 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
386 NWidgetCore *GetWidgetFromPos(int x, int y) override;
387 bool IsHighlighted() const override;
388 TextColour GetHighlightColour() const override;
389 void SetHighlighted(TextColour highlight_colour) override;
390
392 Colours colour;
394 uint32_t widget_data;
401};
402
407inline void NWidgetCore::SetHighlighted(TextColour highlight_colour)
408{
409 this->disp_flags = highlight_colour != TC_INVALID ? SETBITS(this->disp_flags, ND_HIGHLIGHT) : CLRBITS(this->disp_flags, ND_HIGHLIGHT);
410 this->highlight_colour = highlight_colour;
411}
412
414inline bool NWidgetCore::IsHighlighted() const
415{
416 return HasBit(this->disp_flags, NDB_HIGHLIGHT);
417}
418
421{
422 return this->highlight_colour;
423}
424
429inline void NWidgetCore::SetLowered(bool lowered)
430{
431 this->disp_flags = lowered ? SETBITS(this->disp_flags, ND_LOWERED) : CLRBITS(this->disp_flags, ND_LOWERED);
432}
433
435inline bool NWidgetCore::IsLowered() const
436{
437 return HasBit(this->disp_flags, NDB_LOWERED);
438}
439
444inline void NWidgetCore::SetDisabled(bool disabled)
445{
446 this->disp_flags = disabled ? SETBITS(this->disp_flags, ND_DISABLED) : CLRBITS(this->disp_flags, ND_DISABLED);
447}
448
450inline bool NWidgetCore::IsDisabled() const
451{
452 return HasBit(this->disp_flags, NDB_DISABLED);
453}
454
455
461public:
463
464 void AdjustPaddingForZoom() override;
465 void Add(std::unique_ptr<NWidgetBase> &&wid);
466 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
467
468 void Draw(const Window *w) override;
469 NWidgetCore *GetWidgetFromPos(int x, int y) override;
470
472 inline bool IsEmpty() { return this->children.empty(); }
473
475
476protected:
477 std::vector<std::unique_ptr<NWidgetBase>> children;
478};
479
488
500public:
502
503 void SetupSmallestSize(Window *w) override;
504 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
506
507 void Draw(const Window *w) override;
508 NWidgetCore *GetWidgetFromPos(int x, int y) override;
509
510 bool SetDisplayedPlane(int plane);
511
514private:
516};
517
528
529
531public:
533
534 void AdjustPaddingForZoom() override;
535 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
536 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_rato_post);
537
538protected:
540 uint8_t pip_pre;
541 uint8_t pip_inter;
542 uint8_t pip_post;
546
547 uint8_t uz_pip_pre;
548 uint8_t uz_pip_inter;
549 uint8_t uz_pip_post;
550
551 uint8_t gaps;
552};
553
559public:
561
562 void SetupSmallestSize(Window *w) override;
563 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
564};
565
571public:
573
574 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
575};
576
582public:
584
585 void SetupSmallestSize(Window *w) override;
586 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
587};
588
598public:
600
601 void SetClicked(int clicked);
602 void SetCount(int count);
604 int GetCurrentElement() const;
605
606 void SetupSmallestSize(Window *w) override;
607 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
608 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
609
610 NWidgetCore *GetWidgetFromPos(int x, int y) override;
611 void Draw(const Window *w) override;
612protected:
614 Colours colour;
616 int count;
619private:
624
625 void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y);
626};
627
628
634public:
635 NWidgetSpacer(int width, int height);
636
637 void SetupSmallestSize(Window *w) override;
638 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
639
640 void Draw(const Window *w) override;
641 void SetDirty(const Window *w) const override;
642 NWidgetCore *GetWidgetFromPos(int x, int y) override;
643};
644
650public:
651 NWidgetBackground(WidgetType tp, Colours colour, WidgetID index, std::unique_ptr<NWidgetPIPContainer> &&child = nullptr);
652
653 void Add(std::unique_ptr<NWidgetBase> &&nwid);
654 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
655 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
656
657 void AdjustPaddingForZoom() override;
658 void SetupSmallestSize(Window *w) override;
659 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
660
661 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
662
663 void Draw(const Window *w) override;
664 NWidgetCore *GetWidgetFromPos(int x, int y) override;
666
667private:
668 std::unique_ptr<NWidgetPIPContainer> child;
669};
670
681public:
683
684 void SetupSmallestSize(Window *w) override;
685 void Draw(const Window *w) override;
686
687 void InitializeViewport(Window *w, std::variant<TileIndex, VehicleID> focus, ZoomLevel zoom);
689};
690
695public:
696 using size_type = int32_t;
697 static constexpr size_type max_size_type = std::numeric_limits<size_type>::max();
698 static constexpr size_type npos = max_size_type;
699private:
700 const bool is_vertical;
701 size_type count;
702 size_type cap;
703 size_type pos;
704 size_type stepsize;
705
706public:
713
715 {
716 }
717
722 inline size_type GetCount() const
723 {
724 return this->count;
725 }
726
731 inline size_type GetCapacity() const
732 {
733 return this->cap;
734 }
735
740 inline size_type GetPosition() const
741 {
742 return this->pos;
743 }
744
750 inline bool IsVisible(size_type item) const
751 {
752 return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
753 }
754
759 inline bool IsVertical() const
760 {
761 return this->is_vertical;
762 }
763
768 void SetStepSize(size_t stepsize)
769 {
770 assert(stepsize > 0);
771
772 this->stepsize = ClampTo<size_type>(stepsize);
773 }
774
780 void SetCount(size_t num)
781 {
782 assert(num < Scrollbar::max_size_type);
783
784 this->count = ClampTo<size_type>(num);
785 /* Ensure position is within bounds */
786 this->SetPosition(this->pos);
787 }
788
794 void SetCapacity(size_t capacity)
795 {
796 assert(capacity < Scrollbar::max_size_type);
797
798 this->cap = ClampTo<size_type>(capacity);
799 /* Ensure position is within bounds */
800 this->SetPosition(this->pos);
801 }
802
803 void SetCapacityFromWidget(Window *w, WidgetID widget, int padding = 0);
804
810 bool SetPosition(size_type position)
811 {
812 size_type old_pos = this->pos;
813 this->pos = Clamp(position, 0, std::max(this->count - this->cap, 0));
814 return this->pos != old_pos;
815 }
816
824 bool UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
825 {
826 if (difference == 0) return false;
827 switch (unit) {
828 case SS_SMALL: difference *= this->stepsize; break;
829 case SS_BIG: difference *= this->cap; break;
830 default: break;
831 }
832 return this->SetPosition(this->pos + difference);
833 }
834
841 void ScrollTowards(size_type position)
842 {
843 if (position < this->GetPosition()) {
844 /* scroll up to the item */
845 this->SetPosition(position);
846 } else if (position >= this->GetPosition() + this->GetCapacity()) {
847 /* scroll down so that the item is at the bottom */
848 this->SetPosition(position - this->GetCapacity() + 1);
849 }
850 }
851
852 size_type GetScrolledRowFromWidget(int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const;
853
859 template <typename Tcontainer>
860 auto GetVisibleRangeIterators(Tcontainer &container) const
861 {
862 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
863 auto first = std::next(std::begin(container), this->GetPosition());
864 auto last = std::next(first, std::min<size_t>(this->GetCapacity(), this->GetCount() - this->GetPosition()));
865 return std::make_pair(first, last);
866 }
867
878 template <typename Tcontainer>
879 auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const
880 {
881 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
882 size_type row = this->GetScrolledRowFromWidget(clickpos, w, widget, padding, line_height);
883 if (row == Scrollbar::npos) return std::end(container);
884
885 return std::next(std::begin(container), row);
886 }
887
888 EventState UpdateListPositionOnKeyPress(int &list_position, uint16_t keycode) const;
889};
890
896class NWidgetScrollbar : public NWidgetCore, public Scrollbar {
897public:
899
900 void SetupSmallestSize(Window *w) override;
901 void Draw(const Window *w) override;
902
903 static void InvalidateDimensionCache();
904 static Dimension GetVerticalDimension();
905 static Dimension GetHorizontalDimension();
906
907private:
910};
911
916class NWidgetLeaf : public NWidgetCore {
917public:
918 NWidgetLeaf(WidgetType tp, Colours colour, WidgetID index, uint32_t data, StringID tip);
919
920 void SetupSmallestSize(Window *w) override;
921 void Draw(const Window *w) override;
922
923 bool ButtonHit(const Point &pt);
924
925 static void InvalidateDimensionCache();
926
930private:
935};
936
944inline uint ComputeMaxSize(uint base, uint max_space, uint step)
945{
946 if (base >= max_space || step == 0) return base;
947 if (step == 1) return max_space;
948 uint increment = max_space - base;
949 increment -= increment % step;
950 return base + increment;
951}
952
1008
1017
1024
1030 uint8_t pre, inter, post;
1031};
1032
1042
1051
1059
1061 float ratio;
1062 AspectFlags flags;
1063};
1064
1069typedef std::unique_ptr<NWidgetBase> NWidgetFunctionType();
1070
1089
1090 /* Constructors for each NWidgetPartUnion data type. */
1091 constexpr NWidgetPartUnion() : xy() {}
1092 constexpr NWidgetPartUnion(Point xy) : xy(xy) {}
1093 constexpr NWidgetPartUnion(NWidgetPartDataTip data_tip) : data_tip(data_tip) {}
1094 constexpr NWidgetPartUnion(NWidgetPartWidget widget) : widget(widget) {}
1095 constexpr NWidgetPartUnion(NWidgetPartPaddings padding) : padding(padding) {}
1096 constexpr NWidgetPartUnion(NWidgetPartPIP pip) : pip(pip) {}
1097 constexpr NWidgetPartUnion(NWidgetPartTextLines text_lines) : text_lines(text_lines) {}
1098 constexpr NWidgetPartUnion(NWidgetPartTextStyle text_style) : text_style(text_style) {}
1099 constexpr NWidgetPartUnion(NWidgetPartAlignment align) : align(align) {}
1100 constexpr NWidgetPartUnion(NWidgetFunctionType *func_ptr) : func_ptr(func_ptr) {}
1101 constexpr NWidgetPartUnion(NWidContainerFlags cont_flags) : cont_flags(cont_flags) {}
1102 constexpr NWidgetPartUnion(NWidgetPartAspect aspect) : aspect(aspect) {}
1103 } u;
1104
1105 /* Constructors for each NWidgetPart data type. */
1106 explicit constexpr NWidgetPart(WidgetType type) : type(type), u() {}
1107 constexpr NWidgetPart(WidgetType type, Point xy) : type(type), u(xy) {}
1108 constexpr NWidgetPart(WidgetType type, NWidgetPartDataTip data_tip) : type(type), u(data_tip) {}
1109 constexpr NWidgetPart(WidgetType type, NWidgetPartWidget widget) : type(type), u(widget) {}
1110 constexpr NWidgetPart(WidgetType type, NWidgetPartPaddings padding) : type(type), u(padding) {}
1111 constexpr NWidgetPart(WidgetType type, NWidgetPartPIP pip) : type(type), u(pip) {}
1112 constexpr NWidgetPart(WidgetType type, NWidgetPartTextLines text_lines) : type(type), u(text_lines) {}
1113 constexpr NWidgetPart(WidgetType type, NWidgetPartTextStyle text_style) : type(type), u(text_style) {}
1114 constexpr NWidgetPart(WidgetType type, NWidgetPartAlignment align) : type(type), u(align) {}
1115 constexpr NWidgetPart(WidgetType type, NWidgetFunctionType *func_ptr) : type(type), u(func_ptr) {}
1116 constexpr NWidgetPart(WidgetType type, NWidContainerFlags cont_flags) : type(type), u(cont_flags) {}
1117 constexpr NWidgetPart(WidgetType type, NWidgetPartAspect aspect) : type(type), u(aspect) {}
1118};
1119
1126constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
1127{
1128 return NWidgetPart{WPT_RESIZE, Point{dx, dy}};
1129}
1130
1137constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
1138{
1139 return NWidgetPart{WPT_MINSIZE, Point{x, y}};
1140}
1141
1149constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size = FS_NORMAL)
1150{
1151 return NWidgetPart{WPT_MINTEXTLINES, NWidgetPartTextLines{lines, spacing, size}};
1152}
1153
1161{
1162 return NWidgetPart{WPT_TEXTSTYLE, NWidgetPartTextStyle{colour, size}};
1163}
1164
1174
1181constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
1182{
1183 return NWidgetPart{WPT_FILL, Point{fill_x, fill_y}};
1184}
1185
1192{
1194}
1195
1202constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
1203{
1204 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{data, tip}};
1205}
1206
1214constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
1215{
1216 return SetDataTip((rows << MAT_ROW_START) | (cols << MAT_COL_START), tip);
1217}
1218
1228constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
1229{
1230 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{left, top, right, bottom}};
1231}
1232
1239constexpr NWidgetPart SetPadding(uint8_t horizontal, uint8_t vertical)
1240{
1241 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{horizontal, vertical, horizontal, vertical}};
1242}
1243
1249constexpr NWidgetPart SetPadding(const RectPadding &padding)
1250{
1252}
1253
1259constexpr NWidgetPart SetPadding(uint8_t padding)
1260{
1261 return SetPadding(padding, padding, padding, padding);
1262}
1263
1271constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
1272{
1273 return NWidgetPart{WPT_PIPSPACE, NWidgetPartPIP{pre, inter, post}};
1274}
1275
1283constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
1284{
1285 return NWidgetPart{WPT_PIPRATIO, NWidgetPartPIP{ratio_pre, ratio_inter, ratio_post}};
1286}
1287
1296{
1297 return NWidgetPart{WPT_SCROLLBAR, NWidgetPartWidget{INVALID_COLOUR, index}};
1298}
1299
1306constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlags::ResizeX)
1307{
1308 return NWidgetPart{WPT_ASPECT, NWidgetPartAspect{ratio, flags}};
1309}
1310
1320constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = -1)
1321{
1322 return NWidgetPart{tp, NWidgetPartWidget{col, idx}};
1323}
1324
1332{
1333 return NWidgetPart{tp, NWidContainerFlags{cont_flags}};
1334}
1335
1342{
1343 return NWidgetPart{WPT_FUNCTION, func_ptr};
1344}
1345
1347std::unique_ptr<NWidgetBase> MakeNWidgets(std::span<const NWidgetPart> nwid_parts, std::unique_ptr<NWidgetBase> &&container);
1348std::unique_ptr<NWidgetBase> MakeWindowNWidgetTree(std::span<const NWidgetPart> nwid_parts, NWidgetStacked **shade_select);
1349
1350std::unique_ptr<NWidgetBase> MakeCompanyButtonRows(WidgetID widget_first, WidgetID widget_last, Colours button_colour, int max_length, StringID button_tooltip, bool resizable = true);
1351
1353
1354#endif /* WIDGET_TYPE_H */
Helper types related to the allocation of memory.
Functions related to bit mathematics.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
#define CLRBITS(x, y)
Clears several bits in a variable.
#define SETBITS(x, y)
Sets several bits in a variable.
Nested widget with a child.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2289
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:2299
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:2232
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2167
void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post)
Set additional pre/inter/post space for the background widget.
Definition widget.cpp:2133
std::unique_ptr< NWidgetPIPContainer > child
Child widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2250
void Add(std::unique_ptr< NWidgetBase > &&nwid)
Add a child to the parent.
Definition widget.cpp:2114
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2244
void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post)
Set additional pre/inter/post space ratios for the background widget.
Definition widget.cpp:2152
Baseclass for nested widgets.
void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
Store size and position.
float aspect_ratio
Desired aspect ratio of widget.
uint GetHorizontalStepSize(SizingType sizing) const
Get the horizontal sizing step.
virtual void SetupSmallestSize(Window *w)=0
Compute smallest size needed by the widget.
virtual void SetDirty(const Window *w) const
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:904
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
NWID * GetParentWidget()
Get parent widget of type NWID.
NWidgetBase * parent
Parent widget of this widget, automatically filled in when added to container.
virtual void FillWidgetLookup(WidgetLookup &widget_lookup)=0
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
RectPadding uz_padding
Unscaled padding, for resize calculation.
uint smallest_x
Smallest horizontal size of the widget in a filled window.
AspectFlags aspect_flags
Which dimensions can be resized.
virtual void Draw(const Window *w)=0
Draw the widgets of the tree.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
virtual NWidgetCore * GetWidgetFromPos(int x, int y)=0
Retrieve a widget by its position.
int pos_x
Horizontal position of top-left corner of the widget in the window.
void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Set additional space (padding) around the widget.
void SetPadding(const RectPadding &padding)
Set additional space (padding) around the widget.
uint smallest_y
Smallest vertical size of the widget in a filled window.
virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl)=0
Assign size and position to the widget.
virtual NWidgetBase * GetWidgetOfType(WidgetType tp)
Retrieve a widget by its type.
Definition widget.cpp:924
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
RectPadding padding
Padding added to the widget. Managed by parent container widget. (parent container may swap left and ...
uint current_y
Current vertical size (after resizing).
uint GetVerticalStepSize(SizingType sizing) const
Get the vertical sizing step.
const NWID * GetParentWidget() const
Get parent widget of type NWID.
Baseclass for container widgets.
void Add(std::unique_ptr< NWidgetBase > &&wid)
Append widget wid to container.
Definition widget.cpp:1198
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1205
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1212
bool IsEmpty()
Return whether the container is empty.
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in contaier.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1221
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:1176
Base class for a 'real' widget.
bool IsHighlighted() const override
Return whether the widget is highlighted.
bool IsDisabled() const
Return whether the widget is disabled.
NWidgetDisplay disp_flags
Flags that affect display and interaction with the widget.
uint32_t widget_data
Data of the widget.
TextColour highlight_colour
Colour of highlight.
const WidgetID index
Index of the nested widget (-1 means 'not used').
StringAlignment align
Alignment of text/image within widget.
FontSize text_size
Size of text within widget.
void SetHighlighted(TextColour highlight_colour) override
Highlight the widget or not.
WidgetID scrollbar_index
Index of an attached scrollbar.
TextColour text_colour
Colour of text within widget.
Colours colour
Colour of this widget.
void SetLowered(bool lowered)
Lower or raise the widget.
TextColour GetHighlightColour() const override
Return the colour of the highlight.
StringID tool_tip
Tooltip of the widget.
void SetDisabled(bool disabled)
Disable (grey-out) or enable the widget.
bool IsLowered() const
Return whether the widget is lowered.
Horizontal container that doesn't change the direction of the widgets for RTL languages.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1646
Horizontal container.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1462
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1531
Leaf widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2892
static void InvalidateDimensionCache()
Reset the cached dimensions.
Definition widget.cpp:2594
static Dimension resizebox_dimension
Cached size of a resizebox widget.
static Dimension shadebox_dimension
Cached size of a shadebox widget.
static Dimension closebox_dimension
Cached size of a closebox widget.
static Dimension stickybox_dimension
Cached size of a stickybox widget.
static Dimension defsizebox_dimension
Cached size of a defsizebox widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2721
static Dimension dropdown_dimension
Cached size of a dropdown widget.
static Dimension debugbox_dimension
Cached size of a debugbox widget.
bool ButtonHit(const Point &pt)
For a NWID_BUTTON_DROPDOWN, test whether pt refers to the button or to the drop-down.
Definition widget.cpp:3032
Matrix container with implicitly equal sized (virtual) sub-widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2013
int count
Amount of valid elements.
void SetClicked(int clicked)
Sets the clicked element in the matrix.
Definition widget.cpp:1876
int GetCurrentElement() const
Get current element.
Definition widget.cpp:1926
const WidgetID index
If non-negative, index in the Window::widget_lookup.
Scrollbar * sb
The scrollbar we're associated with.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1931
int widget_w
The width of the child widget including inter spacing.
void SetScrollbar(Scrollbar *sb)
Assign a scrollbar to this matrix.
Definition widget.cpp:1917
void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y)
Get the different offsets that are influenced by scrolling.
Definition widget.cpp:2068
int current_element
The element currently being processed.
int widgets_x
The number of visible widgets in horizontal direction.
int widget_h
The height of the child widget including inter spacing.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1953
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1977
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1983
int clicked
The currently clicked element.
void SetCount(int count)
Set the number of elements in this matrix.
Definition widget.cpp:1893
int widgets_y
The number of visible widgets in vertical direction.
Colours colour
Colour of this widget.
Container with pre/inter/post child space.
uint8_t gaps
Number of gaps between widgets.
NWidContainerFlags flags
Flags of the container.
uint8_t pip_pre
Amount of space before first widget.
uint8_t uz_pip_pre
Unscaled space before first widget.
uint8_t uz_pip_inter
Unscaled space between widgets.
uint8_t pip_ratio_pre
Ratio of remaining space before first widget.
uint8_t pip_post
Amount of space after last widget.
uint8_t pip_ratio_inter
Ratio of remaining space between widgets.
uint8_t pip_ratio_post
Ratio of remaining space after last widget.
uint8_t uz_pip_post
Unscaled space after last widget.
uint8_t pip_inter
Amount of space between widgets.
Base class for a resizable nested widget.
uint8_t uz_text_spacing
'Unscaled' text padding, stored for resize calculation.
bool absolute
Set if minimum size is fixed and should not be resized.
void SetMinimalSize(uint min_x, uint min_y)
Set minimal size of the widget.
Definition widget.cpp:996
bool UpdateSize(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1079
void SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Set desired aspect ratio of this widget.
Definition widget.cpp:965
uint min_x
Minimal horizontal size of only this widget.
FontSize uz_text_size
'Unscaled' font size, stored for resize calculation.
uint uz_min_x
Unscaled Minimal horizontal size of only this widget.
uint8_t uz_text_lines
'Unscaled' text lines, stored for resize calculation.
void SetFill(uint fill_x, uint fill_y)
Set the filling of the widget from initial size.
Definition widget.cpp:1035
void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size)
Set minimal text lines for the widget.
Definition widget.cpp:1022
uint min_y
Minimal vertical size of only this widget.
uint uz_min_y
Unscaled Minimal vertical size of only this widget.
bool UpdateMultilineWidgetSize(const std::string &str, int max_lines)
Try to set optimum widget size for a multiline text widget.
Definition widget.cpp:1059
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1100
bool UpdateVerticalSize(uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1093
void SetResize(uint resize_x, uint resize_y)
Set resize step of the widget.
Definition widget.cpp:1046
void SetMinimalSizeAbsolute(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1009
Nested widget to display and control a scrollbar in a window.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2538
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2517
static Dimension horizontal_dimension
Cached size of horizontal scrollbar button.
static Dimension vertical_dimension
Cached size of vertical scrollbar button.
Spacer widget.
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1841
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1862
void SetDirty(const Window *w) const override
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:1857
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1845
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1834
Stacked widgets, widgets all occupying the same space in the window.
int shown_plane
Plane being displayed (for NWID_SELECTION only).
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1239
const WidgetID index
If non-negative, index in the Window::widget_lookup.
WidgetLookup * widget_lookup
Window's widget lookup, updated in SetDisplayedPlane().
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1280
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1311
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1335
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1300
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1320
Vertical container.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1725
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1656
Nested widget to display a viewport in a window.
void UpdateViewportCoordinates(Window *w)
Update the position and size of the viewport (after eg a resize).
Definition widget.cpp:2354
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2318
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2311
void InitializeViewport(Window *w, std::variant< TileIndex, VehicleID > focus, ZoomLevel zoom)
Initialize the viewport of the window.
Definition widget.cpp:2345
Scrollbar data structure.
bool IsVisible(size_type item) const
Checks whether given current item is visible in the list.
const bool is_vertical
Scrollbar has vertical orientation.
size_type GetCapacity() const
Gets the number of visible elements of the scrollbar.
size_type stepsize
Distance to scroll, when pressing the buttons or using the wheel.
void SetCount(size_t num)
Sets the number of elements in the list.
bool IsVertical() const
Is the scrollbar vertical or not?
auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Return an iterator pointing to the element of a scrolled widget that a user clicked in.
bool UpdatePosition(int difference, ScrollbarStepping unit=SS_SMALL)
Updates the position of the first visible element by the given amount.
void SetCapacity(size_t capacity)
Set the capacity of visible elements.
size_type cap
Number of visible elements of the scroll bar.
size_type GetScrolledRowFromWidget(int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Compute the row of a scrolled widget that a user clicked in.
Definition widget.cpp:2377
size_type count
Number of elements in the list.
ScrollbarStepping
Stepping sizes when scrolling.
@ SS_BIG
Step in cap units.
@ SS_RAW
Step in single units.
@ SS_SMALL
Step in stepsize units.
bool SetPosition(size_type position)
Sets the position of the first visible element.
void SetCapacityFromWidget(Window *w, WidgetID widget, int padding=0)
Set capacity of visible elements from the size and resize properties of a widget.
Definition widget.cpp:2451
size_type GetCount() const
Gets the number of elements in the list.
EventState UpdateListPositionOnKeyPress(int &list_position, uint16_t keycode) const
Update the given list position as if it were on this scroll bar when the given keycode was pressed.
Definition widget.cpp:2398
void ScrollTowards(size_type position)
Scroll towards the given position; if the item is visible nothing happens, otherwise it will be shown...
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
void SetStepSize(size_t stepsize)
Set the distance to scroll when using the buttons or the wheel.
size_type pos
Index of first visible item of the list.
size_type GetPosition() const
Gets the position of the first visible element in the list.
Base class that provides memory initialization on dynamically created objects.
#define DECLARE_ENUM_AS_BIT_SET(enum_type)
Operators to allow to work with enum as with type safe bit set in C++.
Definition enum_type.hpp:35
Types related to the graphics and/or input devices.
StringAlignment
How to align the to-be drawn text.
Definition gfx_type.h:342
FontSize
Available font sizes.
Definition gfx_type.h:208
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:260
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
std::unique_ptr< NWidgetBase > MakeWindowNWidgetTree(std::span< const NWidgetPart > nwid_parts, NWidgetStacked **shade_select)
Make a nested widget tree for a window from a parts array.
Definition widget.cpp:3316
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
std::unique_ptr< NWidgetBase > MakeNWidgets(std::span< const NWidgetPart > nwid_parts, std::unique_ptr< NWidgetBase > &&container)
Construct a nested widget tree from an array of parts.
Definition widget.cpp:3297
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Widget part function for setting the aspect ratio.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
Widget part function for setting a pre/inter/post ratio.
Integer math functions.
constexpr bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Types related to strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Dimensions (a width and height) of a rectangle in 2D.
Widget part for setting text/image alignment within a widget.
StringAlignment align
Alignment of text/image.
Widget part for storing data and tooltip information.
uint32_t data
Data value of the widget.
StringID tooltip
Tooltip of the widget.
Widget part for storing pre/inter/post spaces.
uint8_t post
Amount of space before/between/after child widgets.
Widget part for storing padding.
Widget part for storing minimal text line data.
uint8_t lines
Number of text lines.
uint8_t spacing
Extra spacing around lines.
FontSize size
Font size of text lines.
Widget part for storing text colour.
TextColour colour
TextColour for DrawString.
FontSize size
Font size of text.
Widget part for storing basic widget information.
Colours colour
Widget colour.
WidgetID index
Index of the widget.
Partial widget specification to allow NWidgets to be written nested.
WidgetType type
Type of the part.
Coordinates of a point in 2D.
Padding dimensions to apply to each side of a Rect.
Specification of a rectangle with absolute coordinates of all edges.
Data structure for an opened window.
Definition window_gui.h:273
NWidgetPartTextLines text_lines
Part with text line data.
NWidgetPartPIP pip
Part with pre/inter/post spaces.
NWidgetPartPaddings padding
Part with paddings.
NWidgetFunctionType * func_ptr
Part with a function call.
NWidContainerFlags cont_flags
Part with container flags.
NWidgetPartDataTip data_tip
Part with a data/tooltip.
NWidgetPartAlignment align
Part with internal alignment.
NWidgetPartAspect aspect
Part to set aspect ratio.
NWidgetPartTextStyle text_style
Part with text style data.
Point xy
Part with an x/y size.
NWidgetPartWidget widget
Part with a start of a widget.
WidgetID GetWidgetFromPos(const Window *w, int x, int y)
Returns the index for the widget located at the given position relative to the window.
Definition widget.cpp:268
StackedZeroSizePlanes
Display planes with zero size for NWidgetStacked.
@ SZSP_HORIZONTAL
Display plane with zero size vertically, and filling and resizing horizontally.
@ SZSP_BEGIN
First zero-size plane.
@ SZSP_VERTICAL
Display plane with zero size horizontally, and filling and resizing vertically.
@ SZSP_NONE
Display plane with zero size in both directions (none filling and resizing).
NWidgetDisplay
Nested widget flags that affect display and interaction with 'real' widgets.
@ NDB_DISABLED
Widget is disabled (greyed out) bit.
@ ND_SHADE_GREY
Bit value of the 'shade to grey' flag.
@ ND_DROPDOWN_ACTIVE
Bit value of the 'dropdown active' flag.
@ NDB_SCROLLBAR_DOWN
Down-button is lowered bit.
@ ND_SHADE_DIMMED
Bit value of the 'dimmed colours' flag.
@ ND_DISABLED
Bit value of the disabled flag.
@ NDB_DROPDOWN_ACTIVE
Dropdown menu of the button dropdown widget is active.
@ NDB_SHADE_DIMMED
Display dimmed colours in the viewport.
@ NDB_HIGHLIGHT
Highlight of widget is on.
@ NDB_SHADE_GREY
Shade viewport to grey-scale.
@ ND_SCROLLBAR_UP
Bit value of the 'scrollbar up' flag.
@ ND_NO_TRANSPARENCY
Bit value of the 'no transparency' flag.
@ NDB_SCROLLBAR_UP
Up-button is lowered bit.
@ ND_SCROLLBAR_BTN
Bit value of the 'scrollbar up' or 'scrollbar down' flag.
@ NDB_DROPDOWN_CLOSED
Dropdown menu of the dropdown widget has closed.
@ NDB_LOWERED
Widget is lowered (pressed down) bit.
@ ND_LOWERED
Bit value of the lowered flag.
@ ND_HIGHLIGHT
Bit value of the highlight flag.
@ NDB_NO_TRANSPARENCY
Viewport is never transparent.
@ ND_SCROLLBAR_DOWN
Bit value of the 'scrollbar down' flag.
@ ND_DROPDOWN_CLOSED
Bit value of the 'dropdown closed' flag.
uint ComputeMaxSize(uint base, uint max_space, uint step)
Return the biggest possible size of a nested widget.
bool IsContainerWidgetType(WidgetType tp)
Test if WidgetType is a container widget.
Definition widget.cpp:3240
ArrowWidgetValues
Values for an arrow widget.
Definition widget_type.h:30
@ AWV_LEFT
Force the arrow to the left.
Definition widget_type.h:33
@ AWV_RIGHT
Force the arrow to the right.
Definition widget_type.h:34
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:31
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:32
NWidContainerFlags
Nested widget container flags,.
@ NCB_BIGFIRST
Allocate space to biggest resize first.
@ NC_NONE
All flags cleared.
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
@ NCB_EQUALSIZE
Containers should keep all their (resizing) children equally large.
@ NC_BIGFIRST
Value of the NCB_BIGFIRST flag.
std::unique_ptr< NWidgetBase > MakeCompanyButtonRows(WidgetID widget_first, WidgetID widget_last, Colours button_colour, int max_length, StringID button_tooltip, bool resizable=true)
Make a number of rows with button-like graphics, for enabling/disabling each company.
Definition widget.cpp:3358
void SetupWidgetDimensions()
Set up pre-scaled versions of Widget Dimensions.
Definition widget.cpp:66
static constexpr uint8_t MAT_COL_BITS
Number of bits for the number of columns in the matrix.
Definition widget_type.h:23
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:46
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_INSET
Pressed (inset) panel, most commonly used as combo box text area.
Definition widget_type.h:51
@ WPT_FILL
Widget part for specifying fill.
Definition widget_type.h:93
@ WPT_ALIGNMENT
Widget part for specifying text/image alignment.
Definition widget_type.h:99
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:52
@ WWT_PUSHBTN
Normal push-button (no toggle button) with custom drawing.
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:53
@ NWID_CUSTOM
General Custom widget.
Definition widget_type.h:86
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ WPT_MINSIZE
Widget part for specifying minimal size.
Definition widget_type.h:91
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
@ WWT_LABEL
Centered label.
Definition widget_type.h:57
@ NWID_BUTTON_DROPDOWN
Button with a drop-down.
Definition widget_type.h:83
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:79
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:71
@ WWT_ARROWBTN
(Toggle) Button with an arrow
Definition widget_type.h:54
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:55
@ WPT_SCROLLBAR
Widget part for attaching a scrollbar.
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
@ WPT_ASPECT
Widget part for sepcifying aspect ratio.
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:66
@ WPT_RESIZE
Widget part for specifying resizing.
Definition widget_type.h:90
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:59
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:64
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:85
@ WPT_TEXTSTYLE
Widget part for specifying text colour.
Definition widget_type.h:98
@ WPT_PADDING
Widget part for specifying a padding.
Definition widget_type.h:95
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
@ WWT_TEXTBTN_2
(Toggle) Button with diff text when clicked
Definition widget_type.h:56
@ WWT_FRAME
Frame.
Definition widget_type.h:60
@ WPT_MINTEXTLINES
Widget part for specifying minimal number of lines of text.
Definition widget_type.h:92
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:48
@ WWT_LAST
Last Item. use WIDGETS_END to fill up padding!!
Definition widget_type.h:72
@ WPT_ATTRIBUTE_END
End marker for attribute NWidgetPart types.
@ NWID_HSCROLLBAR
Horizontal scrollbar.
Definition widget_type.h:84
@ WPT_ENDCONTAINER
Widget part to denote end of a container.
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:68
@ WPT_PIPRATIO
Widget part for specifying pre/inter/post ratio for containers.
Definition widget_type.h:97
@ WPT_DATATIP
Widget part for specifying data and tooltip.
Definition widget_type.h:94
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:65
@ WPT_ATTRIBUTE_BEGIN
Begin marker for attribute NWidgetPart types.
Definition widget_type.h:89
@ WPT_PIPSPACE
Widget part for specifying pre/inter/post space for containers.
Definition widget_type.h:96
@ NWID_MATRIX
Matrix container.
Definition widget_type.h:78
@ NWID_VIEWPORT
Nested widget containing a viewport.
Definition widget_type.h:82
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:70
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:58
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:76
@ WPT_FUNCTION
Widget part for calling a user function.
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:63
@ NWID_LAYER
Layered widgets, all visible together.
Definition widget_type.h:81
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:80
static constexpr uint8_t MAT_ROW_BITS
Number of bits for the number of rows in the matrix.
Definition widget_type.h:27
std::map< WidgetID, class NWidgetBase * > WidgetLookup
Lookup between widget IDs and NWidget objects.
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
@ ST_RESIZE
Resize the nested widget tree.
@ ST_SMALLEST
Initialize nested widget tree to smallest size. Also updates current_x and current_y.
static constexpr uint8_t MAT_ROW_START
Lowest bit of the number of rows.
Definition widget_type.h:26
static constexpr uint8_t MAT_COL_START
Bits of the WWT_MATRIX widget data.
Definition widget_type.h:22
std::unique_ptr< NWidgetBase > NWidgetFunctionType()
Pointer to function returning a nested widget.
ResizeWidgetValues
WidgetData values for a resize box widget.
Definition widget_type.h:38
@ RWV_SHOW_BEVEL
Bevel of resize box is shown.
Definition widget_type.h:39
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:40
Types related to windows.
int WidgetID
Widget ID.
Definition window_type.h:18
EventState
State of handling an event.
ZoomLevel
All zoom levels we know.
Definition zoom_type.h:16