OpenTTD Source: src/widget_type.h Source File

OpenTTD Source 15.0-beta1

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. */
22 static constexpr uint8_t MAT_COL_START = 0;
23 static constexpr uint8_t MAT_COL_BITS = 8;
24
25/* Number of row bits of the WWT_MATRIX widget data. */
26 static constexpr uint8_t MAT_ROW_START = 8;
27 static constexpr uint8_t MAT_ROW_BITS = 8;
28
30 enum ArrowWidgetValues {
31 AWV_DECREASE,
32 AWV_INCREASE,
33 AWV_LEFT,
34 AWV_RIGHT,
35};
36
38 enum ResizeWidgetValues {
39 RWV_SHOW_BEVEL,
40 RWV_HIDE_BEVEL,
41};
42
46 enum WidgetType {
47 /* Window widget types. */
48 WWT_EMPTY,
49
50 WWT_PANEL,
51 WWT_INSET,
52 WWT_IMGBTN,
53 WWT_IMGBTN_2,
54 WWT_ARROWBTN,
55 WWT_TEXTBTN,
56 WWT_TEXTBTN_2,
57 WWT_LABEL,
58 WWT_TEXT,
59 WWT_MATRIX,
60 WWT_FRAME,
61 WWT_CAPTION,
62
63 WWT_DEBUGBOX,
64 WWT_SHADEBOX,
65 WWT_DEFSIZEBOX,
66 WWT_STICKYBOX,
67
68 WWT_RESIZEBOX,
69 WWT_CLOSEBOX,
70 WWT_DROPDOWN,
71 WWT_EDITBOX,
72 WWT_LAST,
73
74 /* Nested widget types. */
75 NWID_HORIZONTAL,
76 NWID_HORIZONTAL_LTR,
77 NWID_VERTICAL,
78 NWID_MATRIX,
79 NWID_SPACER,
80 NWID_SELECTION,
81 NWID_LAYER,
82 NWID_VIEWPORT,
83 NWID_BUTTON_DROPDOWN,
84 NWID_HSCROLLBAR,
85 NWID_VSCROLLBAR,
86 NWID_CUSTOM,
87
88 /* Nested widget part types. */
89 WPT_ATTRIBUTE_BEGIN,
90 WPT_RESIZE,
91 WPT_MINSIZE,
92 WPT_MINTEXTLINES,
93 WPT_FILL,
94 WPT_DATATIP,
95 WPT_PADDING,
96 WPT_PIPSPACE,
97 WPT_PIPRATIO,
98 WPT_TEXTSTYLE,
99 WPT_ALIGNMENT,
100 WPT_SCROLLBAR,
101 WPT_ASPECT,
102 WPT_ATTRIBUTE_END,
103
104 WPT_FUNCTION,
105 WPT_ENDCONTAINER,
106
107 /* Pushable window widget types. */
108 WWT_MASK = 0x7F,
109
110 WWB_PUSHBUTTON = 1 << 7,
111
112 WWT_PUSHBTN = WWT_PANEL | WWB_PUSHBUTTON,
113 WWT_PUSHTXTBTN = WWT_TEXTBTN | WWB_PUSHBUTTON,
114 WWT_PUSHIMGBTN = WWT_IMGBTN | WWB_PUSHBUTTON,
115 WWT_PUSHARROWBTN = WWT_ARROWBTN | WWB_PUSHBUTTON,
116 NWID_PUSHBUTTON_DROPDOWN = NWID_BUTTON_DROPDOWN | WWB_PUSHBUTTON,
117};
118
120 enum SizingType {
121 ST_SMALLEST,
122 ST_RESIZE,
123};
124
125enum class AspectFlags : uint8_t {
126 ResizeX = 1U << 0,
127 ResizeY = 1U << 1,
128 ResizeXY = ResizeX | ResizeY,
129};
130 DECLARE_ENUM_AS_BIT_SET(AspectFlags)
131
132/* Forward declarations. */
133class NWidgetCore;
134class Scrollbar;
135
137 using WidgetLookup = std::map<WidgetID, class NWidgetBase *>;
138
145 class NWidgetBase : public ZeroedMemoryAllocator {
146public:
147 NWidgetBase(WidgetType tp);
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;
157 virtual NWidgetBase *GetWidgetOfType(WidgetType tp);
158
164 template <class NWID>
165 NWID *GetParentWidget()
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
233 WidgetType type;
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 */
241 uint smallest_x;
242 uint smallest_y;
243 /* Current widget size (that is, after resizing). */
244 uint current_x;
245 uint current_y;
246 float aspect_ratio = 0;
247 AspectFlags aspect_flags = AspectFlags::ResizeX;
248
249 int pos_x;
250 int pos_y;
251
252 RectPadding padding;
253 RectPadding uz_padding;
254
255 NWidgetBase *parent;
256
257protected:
258 inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height);
259};
260
265 inline uint NWidgetBase::GetHorizontalStepSize(SizingType sizing) const
266{
267 return (sizing == ST_RESIZE) ? this->resize_x : this->fill_x;
268}
269
274 inline uint NWidgetBase::GetVerticalStepSize(SizingType sizing) const
275{
276 return (sizing == ST_RESIZE) ? this->resize_y : this->fill_y;
277}
278
287 inline 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
304 class NWidgetResizeBase : public NWidgetBase {
305public:
306 NWidgetResizeBase(WidgetType tp, uint fill_x, uint fill_y);
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
330 uint8_t uz_text_lines;
331 uint8_t uz_text_spacing;
332 FontSize uz_text_size;
333};
334
336 enum NWidgetDisplay {
337 /* Generic. */
338 NDB_LOWERED = 0,
339 NDB_DISABLED = 1,
340 /* Viewport widget. */
341 NDB_NO_TRANSPARENCY = 2,
342 NDB_SHADE_GREY = 3,
343 NDB_SHADE_DIMMED = 4,
344 /* Button dropdown widget. */
345 NDB_DROPDOWN_ACTIVE = 5,
346 /* Scrollbar widget. */
347 NDB_SCROLLBAR_UP = 6,
348 NDB_SCROLLBAR_DOWN = 7,
349 /* Generic. */
350 NDB_HIGHLIGHT = 8,
351 NDB_DROPDOWN_CLOSED = 9,
352
353 ND_LOWERED = 1 << NDB_LOWERED,
354 ND_DISABLED = 1 << NDB_DISABLED,
355 ND_HIGHLIGHT = 1 << NDB_HIGHLIGHT,
356 ND_NO_TRANSPARENCY = 1 << NDB_NO_TRANSPARENCY,
357 ND_SHADE_GREY = 1 << NDB_SHADE_GREY,
358 ND_SHADE_DIMMED = 1 << NDB_SHADE_DIMMED,
359 ND_DROPDOWN_ACTIVE = 1 << NDB_DROPDOWN_ACTIVE,
360 ND_SCROLLBAR_UP = 1 << NDB_SCROLLBAR_UP,
361 ND_SCROLLBAR_DOWN = 1 << NDB_SCROLLBAR_DOWN,
362 ND_SCROLLBAR_BTN = ND_SCROLLBAR_UP | ND_SCROLLBAR_DOWN,
363 ND_DROPDOWN_CLOSED = 1 << NDB_DROPDOWN_CLOSED,
364};
365 DECLARE_ENUM_AS_BIT_SET(NWidgetDisplay)
366
367
371class NWidgetCore : public NWidgetResizeBase {
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
391 NWidgetDisplay disp_flags;
392 Colours colour;
393 const WidgetID index;
394 uint32_t widget_data;
395 StringID tool_tip;
396 WidgetID scrollbar_index;
397 TextColour highlight_colour;
398 TextColour text_colour;
399 FontSize text_size;
400 StringAlignment align;
401};
402
407 inline 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
414 inline bool NWidgetCore::IsHighlighted() const
415{
416 return HasBit(this->disp_flags, NDB_HIGHLIGHT);
417}
418
420 inline TextColour NWidgetCore::GetHighlightColour() const
421{
422 return this->highlight_colour;
423}
424
429 inline 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
435 inline bool NWidgetCore::IsLowered() const
436{
437 return HasBit(this->disp_flags, NDB_LOWERED);
438}
439
444 inline 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
450 inline bool NWidgetCore::IsDisabled() const
451{
452 return HasBit(this->disp_flags, NDB_DISABLED);
453}
454
455
460 class NWidgetContainer : public NWidgetBase {
461public:
462 NWidgetContainer(WidgetType tp) : NWidgetBase(tp) { }
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
474 NWidgetBase *GetWidgetOfType(WidgetType tp) override;
475
476protected:
477 std::vector<std::unique_ptr<NWidgetBase>> children;
478};
479
481 enum StackedZeroSizePlanes {
482 SZSP_VERTICAL = INT_MAX / 2,
483 SZSP_HORIZONTAL,
484 SZSP_NONE,
485
486 SZSP_BEGIN = SZSP_VERTICAL,
487};
488
499 class NWidgetStacked : public NWidgetContainer {
500public:
501 NWidgetStacked(WidgetID index);
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;
505 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
506
507 void Draw(const Window *w) override;
508 NWidgetCore *GetWidgetFromPos(int x, int y) override;
509
510 bool SetDisplayedPlane(int plane);
511
512 int shown_plane;
513 const WidgetID index;
514private:
515 WidgetLookup *widget_lookup;
516};
517
519 enum NWidContainerFlags {
520 NCB_EQUALSIZE = 0,
521 NCB_BIGFIRST = 1,
522
523 NC_NONE = 0,
524 NC_EQUALSIZE = 1 << NCB_EQUALSIZE,
525 NC_BIGFIRST = 1 << NCB_BIGFIRST,
526};
527 DECLARE_ENUM_AS_BIT_SET(NWidContainerFlags)
528
529
530class NWidgetPIPContainer : public NWidgetContainer {
531public:
532 NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags = NC_NONE);
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:
539 NWidContainerFlags flags;
540 uint8_t pip_pre;
541 uint8_t pip_inter;
542 uint8_t pip_post;
543 uint8_t pip_ratio_pre;
544 uint8_t pip_ratio_inter;
545 uint8_t pip_ratio_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
558 class NWidgetHorizontal : public NWidgetPIPContainer {
559public:
560 NWidgetHorizontal(NWidContainerFlags flags = NC_NONE);
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
570 class NWidgetHorizontalLTR : public NWidgetHorizontal {
571public:
572 NWidgetHorizontalLTR(NWidContainerFlags flags = NC_NONE);
573
574 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
575};
576
581 class NWidgetVertical : public NWidgetPIPContainer {
582public:
583 NWidgetVertical(NWidContainerFlags flags = NC_NONE);
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
597 class NWidgetMatrix : public NWidgetPIPContainer {
598public:
599 NWidgetMatrix(Colours colour, WidgetID index);
600
601 void SetClicked(int clicked);
602 void SetCount(int count);
603 void SetScrollbar(Scrollbar *sb);
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:
613 const WidgetID index;
614 Colours colour;
615 int clicked;
616 int count;
617 int current_element;
618 Scrollbar *sb;
619private:
620 int widget_w;
621 int widget_h;
622 int widgets_x;
623 int widgets_y;
624
625 void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y);
626};
627
628
633 class NWidgetSpacer : public NWidgetResizeBase {
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
649 class NWidgetBackground : public NWidgetCore {
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;
665 NWidgetBase *GetWidgetOfType(WidgetType tp) override;
666
667private:
668 std::unique_ptr<NWidgetPIPContainer> child;
669};
670
680 class NWidgetViewport : public NWidgetCore {
681public:
682 NWidgetViewport(WidgetID index);
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);
688 void UpdateViewportCoordinates(Window *w);
689};
690
694 class Scrollbar {
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:
708 enum ScrollbarStepping {
709 SS_RAW,
710 SS_SMALL,
711 SS_BIG,
712 };
713
714 Scrollbar(bool is_vertical) : is_vertical(is_vertical), stepsize(1)
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
896 class NWidgetScrollbar : public NWidgetCore, public Scrollbar {
897public:
898 NWidgetScrollbar(WidgetType tp, Colours colour, WidgetID index);
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:
908 static Dimension vertical_dimension;
909 static Dimension horizontal_dimension;
910};
911
916 class 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
927 static Dimension dropdown_dimension;
928 static Dimension resizebox_dimension;
929 static Dimension closebox_dimension;
930private:
931 static Dimension shadebox_dimension;
932 static Dimension debugbox_dimension;
933 static Dimension defsizebox_dimension;
934 static Dimension stickybox_dimension;
935};
936
944 inline 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
1004 struct NWidgetPartDataTip {
1005 uint32_t data;
1006 StringID tooltip;
1007};
1008
1013 struct NWidgetPartWidget {
1014 Colours colour;
1015 WidgetID index;
1016};
1017
1022 struct NWidgetPartPaddings : RectPadding {
1023};
1024
1029 struct NWidgetPartPIP {
1030 uint8_t pre, inter, post;
1031};
1032
1037 struct NWidgetPartTextLines {
1038 uint8_t lines;
1039 uint8_t spacing;
1040 FontSize size;
1041};
1042
1047 struct NWidgetPartTextStyle {
1048 TextColour colour;
1049 FontSize size;
1050};
1051
1056 struct NWidgetPartAlignment {
1057 StringAlignment align;
1058};
1059
1060 struct NWidgetPartAspect {
1061 float ratio;
1062 AspectFlags flags;
1063};
1064
1069 typedef std::unique_ptr<NWidgetBase> NWidgetFunctionType();
1070
1075 struct NWidgetPart {
1076 WidgetType type;
1077 union NWidgetPartUnion {
1078 Point xy;
1079 NWidgetPartDataTip data_tip;
1080 NWidgetPartWidget widget;
1081 NWidgetPartPaddings padding;
1082 NWidgetPartPIP pip;
1083 NWidgetPartTextLines text_lines;
1084 NWidgetPartTextStyle text_style;
1085 NWidgetPartAlignment align;
1086 NWidgetFunctionType *func_ptr;
1087 NWidContainerFlags cont_flags;
1088 NWidgetPartAspect aspect;
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
1126 constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
1127{
1128 return NWidgetPart{WPT_RESIZE, Point{dx, dy}};
1129}
1130
1137 constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
1138{
1139 return NWidgetPart{WPT_MINSIZE, Point{x, y}};
1140}
1141
1149 constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size = FS_NORMAL)
1150{
1151 return NWidgetPart{WPT_MINTEXTLINES, NWidgetPartTextLines{lines, spacing, size}};
1152}
1153
1160 constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size = FS_NORMAL)
1161{
1162 return NWidgetPart{WPT_TEXTSTYLE, NWidgetPartTextStyle{colour, size}};
1163}
1164
1170 constexpr NWidgetPart SetAlignment(StringAlignment align)
1171{
1172 return NWidgetPart{WPT_ALIGNMENT, NWidgetPartAlignment{align}};
1173}
1174
1181 constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
1182{
1183 return NWidgetPart{WPT_FILL, Point{fill_x, fill_y}};
1184}
1185
1191 constexpr NWidgetPart EndContainer()
1192{
1193 return NWidgetPart{WPT_ENDCONTAINER};
1194}
1195
1202 constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
1203{
1204 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{data, tip}};
1205}
1206
1214 constexpr 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
1228 constexpr 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
1239 constexpr NWidgetPart SetPadding(uint8_t horizontal, uint8_t vertical)
1240{
1241 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{horizontal, vertical, horizontal, vertical}};
1242}
1243
1249 constexpr NWidgetPart SetPadding(const RectPadding &padding)
1250{
1251 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{padding}};
1252}
1253
1259 constexpr NWidgetPart SetPadding(uint8_t padding)
1260{
1261 return SetPadding(padding, padding, padding, padding);
1262}
1263
1271 constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
1272{
1273 return NWidgetPart{WPT_PIPSPACE, NWidgetPartPIP{pre, inter, post}};
1274}
1275
1283 constexpr 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
1295 constexpr NWidgetPart SetScrollbar(WidgetID index)
1296{
1297 return NWidgetPart{WPT_SCROLLBAR, NWidgetPartWidget{INVALID_COLOUR, index}};
1298}
1299
1306 constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlags::ResizeX)
1307{
1308 return NWidgetPart{WPT_ASPECT, NWidgetPartAspect{ratio, flags}};
1309}
1310
1320 constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = -1)
1321{
1322 return NWidgetPart{tp, NWidgetPartWidget{col, idx}};
1323}
1324
1331 constexpr NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = NC_NONE)
1332{
1333 return NWidgetPart{tp, NWidContainerFlags{cont_flags}};
1334}
1335
1341 constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
1342{
1343 return NWidgetPart{WPT_FUNCTION, func_ptr};
1344}
1345
1346bool IsContainerWidgetType(WidgetType tp);
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
1352void SetupWidgetDimensions();
1353
1354#endif /* WIDGET_TYPE_H */
alloc_type.hpp
Helper types related to the allocation of memory.
bitmath_func.hpp
Functions related to bit mathematics.
HasBit
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
Definition bitmath_func.hpp:103
CLRBITS
#define CLRBITS(x, y)
Clears several bits in a variable.
Definition bitmath_func.hpp:166
SETBITS
#define SETBITS(x, y)
Sets several bits in a variable.
Definition bitmath_func.hpp:136
NWidgetBackground
Nested widget with a child.
Definition widget_type.h:649
NWidgetBackground::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2289
NWidgetBackground::GetWidgetOfType
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:2299
NWidgetBackground::AssignSizePosition
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
NWidgetBackground::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2167
NWidgetBackground::SetPIP
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
NWidgetBackground::child
std::unique_ptr< NWidgetPIPContainer > child
Child widget.
Definition widget_type.h:668
NWidgetBackground::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2250
NWidgetBackground::Add
void Add(std::unique_ptr< NWidgetBase > &&nwid)
Add a child to the parent.
Definition widget.cpp:2114
NWidgetBackground::FillWidgetLookup
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2244
NWidgetBackground::SetPIPRatio
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
NWidgetBase
Baseclass for nested widgets.
Definition widget_type.h:145
NWidgetBase::StoreSizePosition
void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
Store size and position.
Definition widget_type.h:287
NWidgetBase::aspect_ratio
float aspect_ratio
Desired aspect ratio of widget.
Definition widget_type.h:246
NWidgetBase::GetHorizontalStepSize
uint GetHorizontalStepSize(SizingType sizing) const
Get the horizontal sizing step.
Definition widget_type.h:265
NWidgetBase::SetupSmallestSize
virtual void SetupSmallestSize(Window *w)=0
Compute smallest size needed by the widget.
NWidgetBase::SetDirty
virtual void SetDirty(const Window *w) const
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:904
NWidgetBase::type
WidgetType type
Type of the widget / nested widget.
Definition widget_type.h:233
NWidgetBase::resize_x
uint resize_x
Horizontal resize step (0 means not resizable).
Definition widget_type.h:236
NWidgetBase::fill_x
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
Definition widget_type.h:234
NWidgetBase::GetParentWidget
NWID * GetParentWidget()
Get parent widget of type NWID.
Definition widget_type.h:165
NWidgetBase::parent
NWidgetBase * parent
Parent widget of this widget, automatically filled in when added to container.
Definition widget_type.h:255
NWidgetBase::FillWidgetLookup
virtual void FillWidgetLookup(WidgetLookup &widget_lookup)=0
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
NWidgetBase::uz_padding
RectPadding uz_padding
Unscaled padding, for resize calculation.
Definition widget_type.h:253
NWidgetBase::smallest_x
uint smallest_x
Smallest horizontal size of the widget in a filled window.
Definition widget_type.h:241
NWidgetBase::aspect_flags
AspectFlags aspect_flags
Which dimensions can be resized.
Definition widget_type.h:247
NWidgetBase::Draw
virtual void Draw(const Window *w)=0
Draw the widgets of the tree.
NWidgetBase::current_x
uint current_x
Current horizontal size (after resizing).
Definition widget_type.h:244
NWidgetBase::pos_y
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition widget_type.h:250
NWidgetBase::GetWidgetFromPos
virtual NWidgetCore * GetWidgetFromPos(int x, int y)=0
Retrieve a widget by its position.
NWidgetBase::pos_x
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition widget_type.h:249
NWidgetBase::SetPadding
void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Set additional space (padding) around the widget.
Definition widget_type.h:198
NWidgetBase::SetPadding
void SetPadding(const RectPadding &padding)
Set additional space (padding) around the widget.
Definition widget_type.h:211
NWidgetBase::smallest_y
uint smallest_y
Smallest vertical size of the widget in a filled window.
Definition widget_type.h:242
NWidgetBase::AssignSizePosition
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.
NWidgetBase::GetWidgetOfType
virtual NWidgetBase * GetWidgetOfType(WidgetType tp)
Retrieve a widget by its type.
Definition widget.cpp:924
NWidgetBase::fill_y
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
Definition widget_type.h:235
NWidgetBase::resize_y
uint resize_y
Vertical resize step (0 means not resizable).
Definition widget_type.h:237
NWidgetBase::padding
RectPadding padding
Padding added to the widget. Managed by parent container widget. (parent container may swap left and ...
Definition widget_type.h:252
NWidgetBase::current_y
uint current_y
Current vertical size (after resizing).
Definition widget_type.h:245
NWidgetBase::GetVerticalStepSize
uint GetVerticalStepSize(SizingType sizing) const
Get the vertical sizing step.
Definition widget_type.h:274
NWidgetBase::GetParentWidget
const NWID * GetParentWidget() const
Get parent widget of type NWID.
Definition widget_type.h:179
NWidgetContainer
Baseclass for container widgets.
Definition widget_type.h:460
NWidgetContainer::Add
void Add(std::unique_ptr< NWidgetBase > &&wid)
Append widget wid to container.
Definition widget.cpp:1198
NWidgetContainer::FillWidgetLookup
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1205
NWidgetContainer::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1212
NWidgetContainer::IsEmpty
bool IsEmpty()
Return whether the container is empty.
Definition widget_type.h:472
NWidgetContainer::children
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in contaier.
Definition widget_type.h:477
NWidgetContainer::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1221
NWidgetContainer::GetWidgetOfType
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:1176
NWidgetCore
Base class for a 'real' widget.
Definition widget_type.h:371
NWidgetCore::IsHighlighted
bool IsHighlighted() const override
Return whether the widget is highlighted.
Definition widget_type.h:414
NWidgetCore::IsDisabled
bool IsDisabled() const
Return whether the widget is disabled.
Definition widget_type.h:450
NWidgetCore::disp_flags
NWidgetDisplay disp_flags
Flags that affect display and interaction with the widget.
Definition widget_type.h:391
NWidgetCore::widget_data
uint32_t widget_data
Data of the widget.
Definition widget_type.h:394
NWidgetCore::highlight_colour
TextColour highlight_colour
Colour of highlight.
Definition widget_type.h:397
NWidgetCore::index
const WidgetID index
Index of the nested widget (-1 means 'not used').
Definition widget_type.h:393
NWidgetCore::align
StringAlignment align
Alignment of text/image within widget.
Definition widget_type.h:400
NWidgetCore::text_size
FontSize text_size
Size of text within widget.
Definition widget_type.h:399
NWidgetCore::SetHighlighted
void SetHighlighted(TextColour highlight_colour) override
Highlight the widget or not.
Definition widget_type.h:407
NWidgetCore::scrollbar_index
WidgetID scrollbar_index
Index of an attached scrollbar.
Definition widget_type.h:396
NWidgetCore::text_colour
TextColour text_colour
Colour of text within widget.
Definition widget_type.h:398
NWidgetCore::colour
Colours colour
Colour of this widget.
Definition widget_type.h:392
NWidgetCore::SetLowered
void SetLowered(bool lowered)
Lower or raise the widget.
Definition widget_type.h:429
NWidgetCore::GetHighlightColour
TextColour GetHighlightColour() const override
Return the colour of the highlight.
Definition widget_type.h:420
NWidgetCore::tool_tip
StringID tool_tip
Tooltip of the widget.
Definition widget_type.h:395
NWidgetCore::SetDisabled
void SetDisabled(bool disabled)
Disable (grey-out) or enable the widget.
Definition widget_type.h:444
NWidgetCore::IsLowered
bool IsLowered() const
Return whether the widget is lowered.
Definition widget_type.h:435
NWidgetHorizontalLTR
Horizontal container that doesn't change the direction of the widgets for RTL languages.
Definition widget_type.h:570
NWidgetHorizontalLTR::AssignSizePosition
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
NWidgetHorizontal
Horizontal container.
Definition widget_type.h:558
NWidgetHorizontal::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1462
NWidgetHorizontal::AssignSizePosition
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
NWidgetLeaf
Leaf widget.
Definition widget_type.h:916
NWidgetLeaf::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2892
NWidgetLeaf::InvalidateDimensionCache
static void InvalidateDimensionCache()
Reset the cached dimensions.
Definition widget.cpp:2594
NWidgetLeaf::resizebox_dimension
static Dimension resizebox_dimension
Cached size of a resizebox widget.
Definition widget_type.h:2609
NWidgetLeaf::shadebox_dimension
static Dimension shadebox_dimension
Cached size of a shadebox widget.
Definition widget_type.h:2605
NWidgetLeaf::closebox_dimension
static Dimension closebox_dimension
Cached size of a closebox widget.
Definition widget_type.h:2610
NWidgetLeaf::stickybox_dimension
static Dimension stickybox_dimension
Cached size of a stickybox widget.
Definition widget_type.h:2608
NWidgetLeaf::defsizebox_dimension
static Dimension defsizebox_dimension
Cached size of a defsizebox widget.
Definition widget_type.h:2607
NWidgetLeaf::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2721
NWidgetLeaf::dropdown_dimension
static Dimension dropdown_dimension
Cached size of a dropdown widget.
Definition widget_type.h:2611
NWidgetLeaf::debugbox_dimension
static Dimension debugbox_dimension
Cached size of a debugbox widget.
Definition widget_type.h:2606
NWidgetLeaf::ButtonHit
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
NWidgetMatrix
Matrix container with implicitly equal sized (virtual) sub-widgets.
Definition widget_type.h:597
NWidgetMatrix::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2013
NWidgetMatrix::count
int count
Amount of valid elements.
Definition widget_type.h:616
NWidgetMatrix::SetClicked
void SetClicked(int clicked)
Sets the clicked element in the matrix.
Definition widget.cpp:1876
NWidgetMatrix::GetCurrentElement
int GetCurrentElement() const
Get current element.
Definition widget.cpp:1926
NWidgetMatrix::index
const WidgetID index
If non-negative, index in the Window::widget_lookup.
Definition widget_type.h:613
NWidgetMatrix::sb
Scrollbar * sb
The scrollbar we're associated with.
Definition widget_type.h:618
NWidgetMatrix::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1931
NWidgetMatrix::widget_w
int widget_w
The width of the child widget including inter spacing.
Definition widget_type.h:620
NWidgetMatrix::SetScrollbar
void SetScrollbar(Scrollbar *sb)
Assign a scrollbar to this matrix.
Definition widget.cpp:1917
NWidgetMatrix::GetScrollOffsets
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
NWidgetMatrix::current_element
int current_element
The element currently being processed.
Definition widget_type.h:617
NWidgetMatrix::widgets_x
int widgets_x
The number of visible widgets in horizontal direction.
Definition widget_type.h:622
NWidgetMatrix::widget_h
int widget_h
The height of the child widget including inter spacing.
Definition widget_type.h:621
NWidgetMatrix::AssignSizePosition
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
NWidgetMatrix::FillWidgetLookup
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1977
NWidgetMatrix::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1983
NWidgetMatrix::clicked
int clicked
The currently clicked element.
Definition widget_type.h:615
NWidgetMatrix::SetCount
void SetCount(int count)
Set the number of elements in this matrix.
Definition widget.cpp:1893
NWidgetMatrix::widgets_y
int widgets_y
The number of visible widgets in vertical direction.
Definition widget_type.h:623
NWidgetMatrix::colour
Colours colour
Colour of this widget.
Definition widget_type.h:614
NWidgetPIPContainer
Container with pre/inter/post child space.
Definition widget_type.h:530
NWidgetPIPContainer::gaps
uint8_t gaps
Number of gaps between widgets.
Definition widget_type.h:551
NWidgetPIPContainer::flags
NWidContainerFlags flags
Flags of the container.
Definition widget_type.h:539
NWidgetPIPContainer::pip_pre
uint8_t pip_pre
Amount of space before first widget.
Definition widget_type.h:540
NWidgetPIPContainer::uz_pip_pre
uint8_t uz_pip_pre
Unscaled space before first widget.
Definition widget_type.h:547
NWidgetPIPContainer::uz_pip_inter
uint8_t uz_pip_inter
Unscaled space between widgets.
Definition widget_type.h:548
NWidgetPIPContainer::pip_ratio_pre
uint8_t pip_ratio_pre
Ratio of remaining space before first widget.
Definition widget_type.h:543
NWidgetPIPContainer::pip_post
uint8_t pip_post
Amount of space after last widget.
Definition widget_type.h:542
NWidgetPIPContainer::pip_ratio_inter
uint8_t pip_ratio_inter
Ratio of remaining space between widgets.
Definition widget_type.h:544
NWidgetPIPContainer::pip_ratio_post
uint8_t pip_ratio_post
Ratio of remaining space after last widget.
Definition widget_type.h:545
NWidgetPIPContainer::uz_pip_post
uint8_t uz_pip_post
Unscaled space after last widget.
Definition widget_type.h:549
NWidgetPIPContainer::pip_inter
uint8_t pip_inter
Amount of space between widgets.
Definition widget_type.h:541
NWidgetResizeBase
Base class for a resizable nested widget.
Definition widget_type.h:304
NWidgetResizeBase::uz_text_spacing
uint8_t uz_text_spacing
'Unscaled' text padding, stored for resize calculation.
Definition widget_type.h:331
NWidgetResizeBase::absolute
bool absolute
Set if minimum size is fixed and should not be resized.
Definition widget_type.h:326
NWidgetResizeBase::SetMinimalSize
void SetMinimalSize(uint min_x, uint min_y)
Set minimal size of the widget.
Definition widget.cpp:996
NWidgetResizeBase::UpdateSize
bool UpdateSize(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1079
NWidgetResizeBase::SetAspect
void SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Set desired aspect ratio of this widget.
Definition widget.cpp:965
NWidgetResizeBase::min_x
uint min_x
Minimal horizontal size of only this widget.
Definition widget_type.h:323
NWidgetResizeBase::uz_text_size
FontSize uz_text_size
'Unscaled' font size, stored for resize calculation.
Definition widget_type.h:332
NWidgetResizeBase::uz_min_x
uint uz_min_x
Unscaled Minimal horizontal size of only this widget.
Definition widget_type.h:327
NWidgetResizeBase::uz_text_lines
uint8_t uz_text_lines
'Unscaled' text lines, stored for resize calculation.
Definition widget_type.h:330
NWidgetResizeBase::SetFill
void SetFill(uint fill_x, uint fill_y)
Set the filling of the widget from initial size.
Definition widget.cpp:1035
NWidgetResizeBase::SetMinimalTextLines
void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size)
Set minimal text lines for the widget.
Definition widget.cpp:1022
NWidgetResizeBase::min_y
uint min_y
Minimal vertical size of only this widget.
Definition widget_type.h:324
NWidgetResizeBase::uz_min_y
uint uz_min_y
Unscaled Minimal vertical size of only this widget.
Definition widget_type.h:328
NWidgetResizeBase::UpdateMultilineWidgetSize
bool UpdateMultilineWidgetSize(const std::string &str, int max_lines)
Try to set optimum widget size for a multiline text widget.
Definition widget.cpp:1059
NWidgetResizeBase::AssignSizePosition
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
NWidgetResizeBase::UpdateVerticalSize
bool UpdateVerticalSize(uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1093
NWidgetResizeBase::SetResize
void SetResize(uint resize_x, uint resize_y)
Set resize step of the widget.
Definition widget.cpp:1046
NWidgetResizeBase::SetMinimalSizeAbsolute
void SetMinimalSizeAbsolute(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1009
NWidgetScrollbar
Nested widget to display and control a scrollbar in a window.
Definition widget_type.h:896
NWidgetScrollbar::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2538
NWidgetScrollbar::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2517
NWidgetScrollbar::horizontal_dimension
static Dimension horizontal_dimension
Cached size of horizontal scrollbar button.
Definition widget_type.h:2591
NWidgetScrollbar::vertical_dimension
static Dimension vertical_dimension
Cached size of vertical scrollbar button.
Definition widget_type.h:2590
NWidgetSpacer
Spacer widget.
Definition widget_type.h:633
NWidgetSpacer::FillWidgetLookup
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1841
NWidgetSpacer::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1862
NWidgetSpacer::SetDirty
void SetDirty(const Window *w) const override
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:1857
NWidgetSpacer::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1845
NWidgetSpacer::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1834
NWidgetStacked
Stacked widgets, widgets all occupying the same space in the window.
Definition widget_type.h:499
NWidgetStacked::shown_plane
int shown_plane
Plane being displayed (for NWID_SELECTION only).
Definition widget_type.h:512
NWidgetStacked::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1239
NWidgetStacked::index
const WidgetID index
If non-negative, index in the Window::widget_lookup.
Definition widget_type.h:513
NWidgetStacked::widget_lookup
WidgetLookup * widget_lookup
Window's widget lookup, updated in SetDisplayedPlane().
Definition widget_type.h:515
NWidgetStacked::AssignSizePosition
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
NWidgetStacked::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1311
NWidgetStacked::SetDisplayedPlane
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1335
NWidgetStacked::FillWidgetLookup
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1300
NWidgetStacked::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1320
NWidgetVertical
Vertical container.
Definition widget_type.h:581
NWidgetVertical::AssignSizePosition
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
NWidgetVertical::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1656
NWidgetViewport
Nested widget to display a viewport in a window.
Definition widget_type.h:680
NWidgetViewport::UpdateViewportCoordinates
void UpdateViewportCoordinates(Window *w)
Update the position and size of the viewport (after eg a resize).
Definition widget.cpp:2354
NWidgetViewport::Draw
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2318
NWidgetViewport::SetupSmallestSize
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2311
NWidgetViewport::InitializeViewport
void InitializeViewport(Window *w, std::variant< TileIndex, VehicleID > focus, ZoomLevel zoom)
Initialize the viewport of the window.
Definition widget.cpp:2345
Scrollbar
Scrollbar data structure.
Definition widget_type.h:694
Scrollbar::IsVisible
bool IsVisible(size_type item) const
Checks whether given current item is visible in the list.
Definition widget_type.h:750
Scrollbar::is_vertical
const bool is_vertical
Scrollbar has vertical orientation.
Definition widget_type.h:700
Scrollbar::GetCapacity
size_type GetCapacity() const
Gets the number of visible elements of the scrollbar.
Definition widget_type.h:731
Scrollbar::stepsize
size_type stepsize
Distance to scroll, when pressing the buttons or using the wheel.
Definition widget_type.h:704
Scrollbar::SetCount
void SetCount(size_t num)
Sets the number of elements in the list.
Definition widget_type.h:780
Scrollbar::IsVertical
bool IsVertical() const
Is the scrollbar vertical or not?
Definition widget_type.h:759
Scrollbar::GetScrolledItemFromWidget
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.
Definition widget_type.h:879
Scrollbar::UpdatePosition
bool UpdatePosition(int difference, ScrollbarStepping unit=SS_SMALL)
Updates the position of the first visible element by the given amount.
Definition widget_type.h:824
Scrollbar::SetCapacity
void SetCapacity(size_t capacity)
Set the capacity of visible elements.
Definition widget_type.h:794
Scrollbar::cap
size_type cap
Number of visible elements of the scroll bar.
Definition widget_type.h:702
Scrollbar::GetScrolledRowFromWidget
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
Scrollbar::count
size_type count
Number of elements in the list.
Definition widget_type.h:701
Scrollbar::ScrollbarStepping
ScrollbarStepping
Stepping sizes when scrolling.
Definition widget_type.h:708
Scrollbar::SS_BIG
@ SS_BIG
Step in cap units.
Definition widget_type.h:711
Scrollbar::SS_RAW
@ SS_RAW
Step in single units.
Definition widget_type.h:709
Scrollbar::SS_SMALL
@ SS_SMALL
Step in stepsize units.
Definition widget_type.h:710
Scrollbar::SetPosition
bool SetPosition(size_type position)
Sets the position of the first visible element.
Definition widget_type.h:810
Scrollbar::SetCapacityFromWidget
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
Scrollbar::GetCount
size_type GetCount() const
Gets the number of elements in the list.
Definition widget_type.h:722
Scrollbar::UpdateListPositionOnKeyPress
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
Scrollbar::ScrollTowards
void ScrollTowards(size_type position)
Scroll towards the given position; if the item is visible nothing happens, otherwise it will be shown...
Definition widget_type.h:841
Scrollbar::GetVisibleRangeIterators
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
Definition widget_type.h:860
Scrollbar::SetStepSize
void SetStepSize(size_t stepsize)
Set the distance to scroll when using the buttons or the wheel.
Definition widget_type.h:768
Scrollbar::pos
size_type pos
Index of first visible item of the list.
Definition widget_type.h:703
Scrollbar::GetPosition
size_type GetPosition() const
Gets the position of the first visible element in the list.
Definition widget_type.h:740
ZeroedMemoryAllocator
Base class that provides memory initialization on dynamically created objects.
Definition alloc_type.hpp:86
DECLARE_ENUM_AS_BIT_SET
#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
gfx_type.h
Types related to the graphics and/or input devices.
StringAlignment
StringAlignment
How to align the to-be drawn text.
Definition gfx_type.h:342
FontSize
FontSize
Available font sizes.
Definition gfx_type.h:208
FS_NORMAL
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
TextColour
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:260
NWidgetFunction
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
Definition widget_type.h:1341
SetFill
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition widget_type.h:1181
SetPIP
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
Definition widget_type.h:1271
SetScrollbar
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
Definition widget_type.h:1295
SetPadding
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.
Definition widget_type.h:1228
SetDataTip
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition widget_type.h:1202
SetTextStyle
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
Definition widget_type.h:1160
MakeWindowNWidgetTree
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
SetMinimalSize
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
Definition widget_type.h:1137
MakeNWidgets
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
NWidget
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition widget_type.h:1320
SetMatrixDataTip
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
Definition widget_type.h:1214
EndContainer
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition widget_type.h:1191
SetMinimalTextLines
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
Definition widget_type.h:1149
SetAlignment
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
Definition widget_type.h:1170
SetAspect
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Widget part function for setting the aspect ratio.
Definition widget_type.h:1306
SetResize
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Definition widget_type.h:1126
SetPIPRatio
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.
Definition widget_type.h:1283
math_func.hpp
Integer math functions.
IsInsideBS
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.
Definition math_func.hpp:252
Clamp
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
strings_type.h
Types related to strings.
StringID
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition strings_type.h:16
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition geometry_type.hpp:30
NWidgetPartAlignment
Widget part for setting text/image alignment within a widget.
Definition widget_type.h:1056
NWidgetPartAlignment::align
StringAlignment align
Alignment of text/image.
Definition widget_type.h:1057
NWidgetPartAspect
Definition widget_type.h:1060
NWidgetPartDataTip
Widget part for storing data and tooltip information.
Definition widget_type.h:1004
NWidgetPartDataTip::data
uint32_t data
Data value of the widget.
Definition widget_type.h:1005
NWidgetPartDataTip::tooltip
StringID tooltip
Tooltip of the widget.
Definition widget_type.h:1006
NWidgetPartPIP
Widget part for storing pre/inter/post spaces.
Definition widget_type.h:1029
NWidgetPartPIP::post
uint8_t post
Amount of space before/between/after child widgets.
Definition widget_type.h:1030
NWidgetPartPaddings
Widget part for storing padding.
Definition widget_type.h:1022
NWidgetPartTextLines
Widget part for storing minimal text line data.
Definition widget_type.h:1037
NWidgetPartTextLines::lines
uint8_t lines
Number of text lines.
Definition widget_type.h:1038
NWidgetPartTextLines::spacing
uint8_t spacing
Extra spacing around lines.
Definition widget_type.h:1039
NWidgetPartTextLines::size
FontSize size
Font size of text lines.
Definition widget_type.h:1040
NWidgetPartTextStyle
Widget part for storing text colour.
Definition widget_type.h:1047
NWidgetPartTextStyle::colour
TextColour colour
TextColour for DrawString.
Definition widget_type.h:1048
NWidgetPartTextStyle::size
FontSize size
Font size of text.
Definition widget_type.h:1049
NWidgetPartWidget
Widget part for storing basic widget information.
Definition widget_type.h:1013
NWidgetPartWidget::colour
Colours colour
Widget colour.
Definition widget_type.h:1014
NWidgetPartWidget::index
WidgetID index
Index of the widget.
Definition widget_type.h:1015
NWidgetPart
Partial widget specification to allow NWidgets to be written nested.
Definition widget_type.h:1075
NWidgetPart::type
WidgetType type
Type of the part.
Definition widget_type.h:1076
Point
Coordinates of a point in 2D.
Definition geometry_type.hpp:21
RectPadding
Padding dimensions to apply to each side of a Rect.
Definition geometry_type.hpp:51
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition geometry_type.hpp:75
Window
Data structure for an opened window.
Definition window_gui.h:273
NWidgetPart::NWidgetPartUnion
Definition widget_type.h:1077
NWidgetPart::NWidgetPartUnion::text_lines
NWidgetPartTextLines text_lines
Part with text line data.
Definition widget_type.h:1083
NWidgetPart::NWidgetPartUnion::pip
NWidgetPartPIP pip
Part with pre/inter/post spaces.
Definition widget_type.h:1082
NWidgetPart::NWidgetPartUnion::padding
NWidgetPartPaddings padding
Part with paddings.
Definition widget_type.h:1081
NWidgetPart::NWidgetPartUnion::func_ptr
NWidgetFunctionType * func_ptr
Part with a function call.
Definition widget_type.h:1086
NWidgetPart::NWidgetPartUnion::cont_flags
NWidContainerFlags cont_flags
Part with container flags.
Definition widget_type.h:1087
NWidgetPart::NWidgetPartUnion::data_tip
NWidgetPartDataTip data_tip
Part with a data/tooltip.
Definition widget_type.h:1079
NWidgetPart::NWidgetPartUnion::align
NWidgetPartAlignment align
Part with internal alignment.
Definition widget_type.h:1085
NWidgetPart::NWidgetPartUnion::aspect
NWidgetPartAspect aspect
Part to set aspect ratio.
Definition widget_type.h:1088
NWidgetPart::NWidgetPartUnion::text_style
NWidgetPartTextStyle text_style
Part with text style data.
Definition widget_type.h:1084
NWidgetPart::NWidgetPartUnion::xy
Point xy
Part with an x/y size.
Definition widget_type.h:1078
NWidgetPart::NWidgetPartUnion::widget
NWidgetPartWidget widget
Part with a start of a widget.
Definition widget_type.h:1080
GetWidgetFromPos
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
StackedZeroSizePlanes
Display planes with zero size for NWidgetStacked.
Definition widget_type.h:481
SZSP_HORIZONTAL
@ SZSP_HORIZONTAL
Display plane with zero size vertically, and filling and resizing horizontally.
Definition widget_type.h:483
SZSP_BEGIN
@ SZSP_BEGIN
First zero-size plane.
Definition widget_type.h:486
SZSP_VERTICAL
@ SZSP_VERTICAL
Display plane with zero size horizontally, and filling and resizing vertically.
Definition widget_type.h:482
SZSP_NONE
@ SZSP_NONE
Display plane with zero size in both directions (none filling and resizing).
Definition widget_type.h:484
NWidgetDisplay
NWidgetDisplay
Nested widget flags that affect display and interaction with 'real' widgets.
Definition widget_type.h:336
NDB_DISABLED
@ NDB_DISABLED
Widget is disabled (greyed out) bit.
Definition widget_type.h:339
ND_SHADE_GREY
@ ND_SHADE_GREY
Bit value of the 'shade to grey' flag.
Definition widget_type.h:357
ND_DROPDOWN_ACTIVE
@ ND_DROPDOWN_ACTIVE
Bit value of the 'dropdown active' flag.
Definition widget_type.h:359
NDB_SCROLLBAR_DOWN
@ NDB_SCROLLBAR_DOWN
Down-button is lowered bit.
Definition widget_type.h:348
ND_SHADE_DIMMED
@ ND_SHADE_DIMMED
Bit value of the 'dimmed colours' flag.
Definition widget_type.h:358
ND_DISABLED
@ ND_DISABLED
Bit value of the disabled flag.
Definition widget_type.h:354
NDB_DROPDOWN_ACTIVE
@ NDB_DROPDOWN_ACTIVE
Dropdown menu of the button dropdown widget is active.
Definition widget_type.h:345
NDB_SHADE_DIMMED
@ NDB_SHADE_DIMMED
Display dimmed colours in the viewport.
Definition widget_type.h:343
NDB_HIGHLIGHT
@ NDB_HIGHLIGHT
Highlight of widget is on.
Definition widget_type.h:350
NDB_SHADE_GREY
@ NDB_SHADE_GREY
Shade viewport to grey-scale.
Definition widget_type.h:342
ND_SCROLLBAR_UP
@ ND_SCROLLBAR_UP
Bit value of the 'scrollbar up' flag.
Definition widget_type.h:360
ND_NO_TRANSPARENCY
@ ND_NO_TRANSPARENCY
Bit value of the 'no transparency' flag.
Definition widget_type.h:356
NDB_SCROLLBAR_UP
@ NDB_SCROLLBAR_UP
Up-button is lowered bit.
Definition widget_type.h:347
ND_SCROLLBAR_BTN
@ ND_SCROLLBAR_BTN
Bit value of the 'scrollbar up' or 'scrollbar down' flag.
Definition widget_type.h:362
NDB_DROPDOWN_CLOSED
@ NDB_DROPDOWN_CLOSED
Dropdown menu of the dropdown widget has closed.
Definition widget_type.h:351
NDB_LOWERED
@ NDB_LOWERED
Widget is lowered (pressed down) bit.
Definition widget_type.h:338
ND_LOWERED
@ ND_LOWERED
Bit value of the lowered flag.
Definition widget_type.h:353
ND_HIGHLIGHT
@ ND_HIGHLIGHT
Bit value of the highlight flag.
Definition widget_type.h:355
NDB_NO_TRANSPARENCY
@ NDB_NO_TRANSPARENCY
Viewport is never transparent.
Definition widget_type.h:341
ND_SCROLLBAR_DOWN
@ ND_SCROLLBAR_DOWN
Bit value of the 'scrollbar down' flag.
Definition widget_type.h:361
ND_DROPDOWN_CLOSED
@ ND_DROPDOWN_CLOSED
Bit value of the 'dropdown closed' flag.
Definition widget_type.h:363
ComputeMaxSize
uint ComputeMaxSize(uint base, uint max_space, uint step)
Return the biggest possible size of a nested widget.
Definition widget_type.h:944
IsContainerWidgetType
bool IsContainerWidgetType(WidgetType tp)
Test if WidgetType is a container widget.
Definition widget.cpp:3240
ArrowWidgetValues
ArrowWidgetValues
Values for an arrow widget.
Definition widget_type.h:30
AWV_LEFT
@ AWV_LEFT
Force the arrow to the left.
Definition widget_type.h:33
AWV_RIGHT
@ AWV_RIGHT
Force the arrow to the right.
Definition widget_type.h:34
AWV_DECREASE
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:31
AWV_INCREASE
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:32
NWidContainerFlags
NWidContainerFlags
Nested widget container flags,.
Definition widget_type.h:519
NCB_BIGFIRST
@ NCB_BIGFIRST
Allocate space to biggest resize first.
Definition widget_type.h:521
NC_NONE
@ NC_NONE
All flags cleared.
Definition widget_type.h:523
NC_EQUALSIZE
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
Definition widget_type.h:524
NCB_EQUALSIZE
@ NCB_EQUALSIZE
Containers should keep all their (resizing) children equally large.
Definition widget_type.h:520
NC_BIGFIRST
@ NC_BIGFIRST
Value of the NCB_BIGFIRST flag.
Definition widget_type.h:525
MakeCompanyButtonRows
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
SetupWidgetDimensions
void SetupWidgetDimensions()
Set up pre-scaled versions of Widget Dimensions.
Definition widget.cpp:66
MAT_COL_BITS
static constexpr uint8_t MAT_COL_BITS
Number of bits for the number of columns in the matrix.
Definition widget_type.h:23
WidgetType
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:46
WWT_PUSHTXTBTN
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition widget_type.h:113
WWT_INSET
@ WWT_INSET
Pressed (inset) panel, most commonly used as combo box text area.
Definition widget_type.h:51
WPT_FILL
@ WPT_FILL
Widget part for specifying fill.
Definition widget_type.h:93
WPT_ALIGNMENT
@ WPT_ALIGNMENT
Widget part for specifying text/image alignment.
Definition widget_type.h:99
WWT_IMGBTN
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:52
WWT_PUSHBTN
@ WWT_PUSHBTN
Normal push-button (no toggle button) with custom drawing.
Definition widget_type.h:112
WWT_IMGBTN_2
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:53
NWID_CUSTOM
@ NWID_CUSTOM
General Custom widget.
Definition widget_type.h:86
WWT_PUSHIMGBTN
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
Definition widget_type.h:114
WPT_MINSIZE
@ WPT_MINSIZE
Widget part for specifying minimal size.
Definition widget_type.h:91
WWT_PUSHARROWBTN
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
Definition widget_type.h:115
WWT_LABEL
@ WWT_LABEL
Centered label.
Definition widget_type.h:57
NWID_BUTTON_DROPDOWN
@ NWID_BUTTON_DROPDOWN
Button with a drop-down.
Definition widget_type.h:83
NWID_SPACER
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:79
WWT_EDITBOX
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:71
WWT_ARROWBTN
@ WWT_ARROWBTN
(Toggle) Button with an arrow
Definition widget_type.h:54
NWID_HORIZONTAL
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
WWT_TEXTBTN
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:55
WPT_SCROLLBAR
@ WPT_SCROLLBAR
Widget part for attaching a scrollbar.
Definition widget_type.h:100
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
WPT_ASPECT
@ WPT_ASPECT
Widget part for sepcifying aspect ratio.
Definition widget_type.h:101
WWT_STICKYBOX
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:66
WPT_RESIZE
@ WPT_RESIZE
Widget part for specifying resizing.
Definition widget_type.h:90
WWT_MATRIX
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:59
WWT_SHADEBOX
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:64
WWT_CAPTION
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
NWID_VSCROLLBAR
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:85
WPT_TEXTSTYLE
@ WPT_TEXTSTYLE
Widget part for specifying text colour.
Definition widget_type.h:98
WPT_PADDING
@ WPT_PADDING
Widget part for specifying a padding.
Definition widget_type.h:95
NWID_VERTICAL
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
WWT_CLOSEBOX
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
WWT_TEXTBTN_2
@ WWT_TEXTBTN_2
(Toggle) Button with diff text when clicked
Definition widget_type.h:56
WWT_FRAME
@ WWT_FRAME
Frame.
Definition widget_type.h:60
WPT_MINTEXTLINES
@ WPT_MINTEXTLINES
Widget part for specifying minimal number of lines of text.
Definition widget_type.h:92
WWT_EMPTY
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:48
WWT_LAST
@ WWT_LAST
Last Item. use WIDGETS_END to fill up padding!!
Definition widget_type.h:72
WPT_ATTRIBUTE_END
@ WPT_ATTRIBUTE_END
End marker for attribute NWidgetPart types.
Definition widget_type.h:102
NWID_HSCROLLBAR
@ NWID_HSCROLLBAR
Horizontal scrollbar.
Definition widget_type.h:84
WPT_ENDCONTAINER
@ WPT_ENDCONTAINER
Widget part to denote end of a container.
Definition widget_type.h:105
WWT_RESIZEBOX
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:68
WPT_PIPRATIO
@ WPT_PIPRATIO
Widget part for specifying pre/inter/post ratio for containers.
Definition widget_type.h:97
WPT_DATATIP
@ WPT_DATATIP
Widget part for specifying data and tooltip.
Definition widget_type.h:94
WWT_DEFSIZEBOX
@ 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
@ WPT_ATTRIBUTE_BEGIN
Begin marker for attribute NWidgetPart types.
Definition widget_type.h:89
WPT_PIPSPACE
@ WPT_PIPSPACE
Widget part for specifying pre/inter/post space for containers.
Definition widget_type.h:96
NWID_MATRIX
@ NWID_MATRIX
Matrix container.
Definition widget_type.h:78
NWID_VIEWPORT
@ NWID_VIEWPORT
Nested widget containing a viewport.
Definition widget_type.h:82
WWT_DROPDOWN
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:70
WWT_TEXT
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:58
NWID_HORIZONTAL_LTR
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:76
WPT_FUNCTION
@ WPT_FUNCTION
Widget part for calling a user function.
Definition widget_type.h:104
WWT_DEBUGBOX
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:63
NWID_LAYER
@ NWID_LAYER
Layered widgets, all visible together.
Definition widget_type.h:81
NWID_SELECTION
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:80
MAT_ROW_BITS
static constexpr uint8_t MAT_ROW_BITS
Number of bits for the number of rows in the matrix.
Definition widget_type.h:27
WidgetLookup
std::map< WidgetID, class NWidgetBase * > WidgetLookup
Lookup between widget IDs and NWidget objects.
Definition widget_type.h:137
SizingType
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Definition widget_type.h:120
ST_RESIZE
@ ST_RESIZE
Resize the nested widget tree.
Definition widget_type.h:122
ST_SMALLEST
@ ST_SMALLEST
Initialize nested widget tree to smallest size. Also updates current_x and current_y.
Definition widget_type.h:121
MAT_ROW_START
static constexpr uint8_t MAT_ROW_START
Lowest bit of the number of rows.
Definition widget_type.h:26
MAT_COL_START
static constexpr uint8_t MAT_COL_START
Bits of the WWT_MATRIX widget data.
Definition widget_type.h:22
NWidgetFunctionType
std::unique_ptr< NWidgetBase > NWidgetFunctionType()
Pointer to function returning a nested widget.
Definition widget_type.h:1069
ResizeWidgetValues
ResizeWidgetValues
WidgetData values for a resize box widget.
Definition widget_type.h:38
RWV_SHOW_BEVEL
@ RWV_SHOW_BEVEL
Bevel of resize box is shown.
Definition widget_type.h:39
RWV_HIDE_BEVEL
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:40
window_type.h
Types related to windows.
WidgetID
int WidgetID
Widget ID.
Definition window_type.h:18
EventState
EventState
State of handling an event.
Definition window_type.h:743
ZoomLevel
ZoomLevel
All zoom levels we know.
Definition zoom_type.h:16