OpenTTD Source 20251213-master-g1091fa6071
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#ifndef WIDGET_TYPE_H
11#define WIDGET_TYPE_H
12
13#include "core/math_func.hpp"
14#include "strings_type.h"
15#include "gfx_type.h"
16#include "window_type.h"
17
25
31
110
112enum SizingType : uint8_t {
115};
116
117enum class AspectFlag : uint8_t {
118 ResizeX,
119 ResizeY,
120};
122
123/* Forward declarations. */
124class NWidgetCore;
125class Scrollbar;
126
128using WidgetLookup = std::map<WidgetID, class NWidgetBase *>;
129
137public:
139 virtual ~NWidgetBase() = default;
140
141 void ApplyAspectRatio();
142 virtual void AdjustPaddingForZoom();
143 virtual void SetupSmallestSize(Window *w) = 0;
144 virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) = 0;
145
146 virtual void FillWidgetLookup(WidgetLookup &widget_lookup);
147
148 virtual NWidgetCore *GetWidgetFromPos(int x, int y) = 0;
150
156 template <class NWID>
158 {
159 for (NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
160 if (NWID *nwid = dynamic_cast<NWID *>(nwid_parent); nwid != nullptr) return nwid;
161 }
162 return nullptr;
163 }
164
170 template <class NWID>
171 const NWID *GetParentWidget() const
172 {
173 for (const NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
174 if (const NWID *nwid = dynamic_cast<const NWID *>(nwid_parent); nwid != nullptr) return nwid;
175 }
176 return nullptr;
177 }
178
179 inline WidgetID GetIndex() const { return this->index; }
180 virtual bool IsHighlighted() const { return false; }
181 virtual TextColour GetHighlightColour() const { return TC_INVALID; }
182 virtual void SetHighlighted([[maybe_unused]] TextColour highlight_colour) {}
183
191 inline void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
192 {
193 this->uz_padding.top = top;
194 this->uz_padding.right = right;
195 this->uz_padding.bottom = bottom;
196 this->uz_padding.left = left;
197 this->AdjustPaddingForZoom();
198 }
199
204 inline void SetPadding(const RectPadding &padding)
205 {
206 this->uz_padding = padding;
207 this->AdjustPaddingForZoom();
208 }
209
210 inline uint GetHorizontalStepSize(SizingType sizing) const;
211 inline uint GetVerticalStepSize(SizingType sizing) const;
212
213 virtual void Draw(const Window *w) = 0;
214 virtual void SetDirty(const Window *w) const;
215
216 Rect GetCurrentRect() const
217 {
218 Rect r;
219 r.left = this->pos_x;
220 r.top = this->pos_y;
221 r.right = this->pos_x + this->current_x - 1;
222 r.bottom = this->pos_y + this->current_y - 1;
223 return r;
224 }
225
227 uint fill_x = 0;
228 uint fill_y = 0;
229 uint resize_x = 0;
230 uint resize_y = 0;
231 /* Size of the widget in the smallest window possible.
232 * Computed by #SetupSmallestSize() followed by #AssignSizePosition().
233 */
234 uint smallest_x = 0;
235 uint smallest_y = 0;
236 /* Current widget size (that is, after resizing). */
237 uint current_x = 0;
238 uint current_y = 0;
239 float aspect_ratio = 0;
240 AspectFlags aspect_flags = AspectFlag::ResizeX;
241
242 int pos_x = 0;
243 int pos_y = 0;
244
247
248 NWidgetBase *parent = nullptr;
249
250protected:
252
253 inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height);
254};
255
261{
262 return (sizing == ST_RESIZE) ? this->resize_x : this->fill_x;
263}
264
270{
271 return (sizing == ST_RESIZE) ? this->resize_y : this->fill_y;
272}
273
282inline void NWidgetBase::StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
283{
284 this->pos_x = x;
285 this->pos_y = y;
286 if (sizing == ST_SMALLEST) {
287 this->smallest_x = given_width;
288 this->smallest_y = given_height;
289 }
290 this->current_x = given_width;
291 this->current_y = given_height;
292}
293
294
300public:
302
303 void AdjustPaddingForZoom() override;
304 void SetMinimalSize(uint min_x, uint min_y);
305 void SetMinimalSizeAbsolute(uint min_x, uint min_y);
306 void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size);
307 void SetFill(uint fill_x, uint fill_y);
308 void SetResize(uint resize_x, uint resize_y);
309 void SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX);
310 void SetAspect(int x_ratio, int y_ratio, AspectFlags flags = AspectFlag::ResizeX);
311
312 bool UpdateMultilineWidgetSize(const std::string &str, int max_lines);
313 bool UpdateSize(uint min_x, uint min_y);
314 bool UpdateVerticalSize(uint min_y);
315
316 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
317
318 uint min_x = 0;
319 uint min_y = 0;
320
321 bool absolute = false;
322 uint uz_min_x = 0;
323 uint uz_min_y = 0;
324
325 uint8_t uz_text_lines = 0;
326 uint8_t uz_text_spacing = 0;
328};
329
331enum NWidgetDisplayFlag : uint8_t {
332 /* Generic. */
335
336 /* Viewport widget. */
340
341 /* Button dropdown widget. */
343
344 /* Scrollbar widget. */
347
348 /* Generic. */
351};
353
356 StringID string{};
357 SpriteID sprite{};
358 ArrowWidgetValues arrow_widget_type{};
359 ResizeWidgetValues resize_widget_type{};
360 Colours alternate_colour = INVALID_COLOUR;
361 Dimension matrix{};
362};
363
369public:
371
372 void SetString(StringID string);
374 void SetSprite(SpriteID sprite);
376 void SetMatrixDimension(uint32_t columns, uint32_t rows);
379 StringID GetToolTip() const;
382
383 StringID GetString() const;
385
386 inline void SetLowered(bool lowered);
387 inline bool IsLowered() const;
388 inline void SetDisabled(bool disabled);
389 inline bool IsDisabled() const;
390
391 inline TextColour GetTextColour() const { return this->text_colour; }
392 inline FontSize GetFontSize() const { return this->text_size; }
393
394 NWidgetCore *GetWidgetFromPos(int x, int y) override;
395 bool IsHighlighted() const override;
396 TextColour GetHighlightColour() const override;
398
400 Colours colour;
401protected:
409
410 /* This function constructs the widgets, so it should be able to write the variables. */
411 friend void ApplyNWidgetPartAttribute(const struct NWidgetPart &nwid, NWidgetBase *dest);
412};
413
418inline void NWidgetCore::SetHighlighted(TextColour highlight_colour)
419{
421 this->highlight_colour = highlight_colour;
422}
423
425inline bool NWidgetCore::IsHighlighted() const
426{
428}
429
432{
433 return this->highlight_colour;
434}
435
440inline void NWidgetCore::SetLowered(bool lowered)
441{
443}
444
446inline bool NWidgetCore::IsLowered() const
447{
449}
450
455inline void NWidgetCore::SetDisabled(bool disabled)
456{
458}
459
461inline bool NWidgetCore::IsDisabled() const
462{
464}
465
466
472public:
474
475 void AdjustPaddingForZoom() override;
476 void Add(std::unique_ptr<NWidgetBase> &&wid);
477 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
478
479 void Draw(const Window *w) override;
480 NWidgetCore *GetWidgetFromPos(int x, int y) override;
481
483 inline bool IsEmpty() { return this->children.empty(); }
484
486 void UnfocusWidgets(Window *parent_window);
487
492 inline void Clear(Window *parent_window)
493 {
494 this->UnfocusWidgets(parent_window);
495 this->children.clear();
496 }
497
498protected:
499 std::vector<std::unique_ptr<NWidgetBase>> children{};
500};
501
510
522public:
524
525 void SetupSmallestSize(Window *w) override;
526 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
528
529 void Draw(const Window *w) override;
530 NWidgetCore *GetWidgetFromPos(int x, int y) override;
531
532 bool SetDisplayedPlane(int plane);
533
534 int shown_plane = 0;
535private:
537};
538
545
548public:
550
551 void AdjustPaddingForZoom() override;
552 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
553 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
554
555protected:
557 uint8_t pip_pre = 0;
558 uint8_t pip_inter = 0;
559 uint8_t pip_post = 0;
560 uint8_t pip_ratio_pre = 0;
561 uint8_t pip_ratio_inter = 0;
562 uint8_t pip_ratio_post = 0;
563
564 uint8_t uz_pip_pre = 0;
565 uint8_t uz_pip_inter = 0;
566 uint8_t uz_pip_post = 0;
567
568 uint8_t gaps = 0;
569};
570
576public:
578
579 void SetupSmallestSize(Window *w) override;
580 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
581};
582
588public:
590
591 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
592};
593
599public:
601
602 void SetupSmallestSize(Window *w) override;
603 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
604};
605
615public:
617
618 void SetClicked(int clicked);
619 void SetCount(int count);
621 int GetCurrentElement() const;
622
623 void SetupSmallestSize(Window *w) override;
624 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
625
626 NWidgetCore *GetWidgetFromPos(int x, int y) override;
627 void Draw(const Window *w) override;
628protected:
629 Colours colour{};
630 int clicked = -1;
631 int count = 0;
633 Scrollbar *sb = nullptr;
634private:
635 int widget_w = 0;
636 int widget_h = 0;
637 int widgets_x = 0;
638 int widgets_y = 0;
639
640 void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y);
641};
642
643
649public:
650 NWidgetSpacer(int width, int height);
651
652 void SetupSmallestSize(Window *w) override;
653
654 void Draw(const Window *w) override;
655 void SetDirty(const Window *w) const override;
656 NWidgetCore *GetWidgetFromPos(int x, int y) override;
657};
658
664public:
665 NWidgetBackground(WidgetType tp, Colours colour, WidgetID index, std::unique_ptr<NWidgetPIPContainer> &&child = nullptr);
666
667 void Add(std::unique_ptr<NWidgetBase> &&nwid);
668 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
669 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
670
671 void AdjustPaddingForZoom() override;
672 void SetupSmallestSize(Window *w) override;
673 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
674
675 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
676
677 void Draw(const Window *w) override;
678 NWidgetCore *GetWidgetFromPos(int x, int y) override;
680
681private:
682 std::unique_ptr<NWidgetPIPContainer> child{};
683};
684
695public:
697
698 void SetupSmallestSize(Window *w) override;
699 void Draw(const Window *w) override;
700
701 void InitializeViewport(Window *w, std::variant<TileIndex, VehicleID> focus, ZoomLevel zoom);
703};
704
709public:
710 using size_type = int32_t;
711 static constexpr size_type max_size_type = std::numeric_limits<size_type>::max();
712 static constexpr size_type npos = max_size_type;
713private:
714 const bool is_vertical = false;
715 size_type count = 0;
716 size_type cap = 0;
717 size_type pos = 0;
718 size_type stepsize = 1;
719
720public:
727
729
734 inline size_type GetCount() const
735 {
736 return this->count;
737 }
738
743 inline size_type GetCapacity() const
744 {
745 return this->cap;
746 }
747
752 inline size_type GetPosition() const
753 {
754 return this->pos;
755 }
756
762 inline bool IsVisible(size_type item) const
763 {
764 return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
765 }
766
771 inline bool IsVertical() const
772 {
773 return this->is_vertical;
774 }
775
780 void SetStepSize(size_t stepsize)
781 {
782 assert(stepsize > 0);
783
784 this->stepsize = ClampTo<size_type>(stepsize);
785 }
786
792 void SetCount(size_t num)
793 {
794 assert(num < Scrollbar::max_size_type);
795
796 this->count = ClampTo<size_type>(num);
797 /* Ensure position is within bounds */
798 this->SetPosition(this->pos);
799 }
800
806 void SetCapacity(size_t capacity)
807 {
808 assert(capacity < Scrollbar::max_size_type);
809
810 this->cap = ClampTo<size_type>(capacity);
811 /* Ensure position is within bounds */
812 this->SetPosition(this->pos);
813 }
814
815 void SetCapacityFromWidget(Window *w, WidgetID widget, int padding = 0);
816
822 bool SetPosition(size_type position)
823 {
824 size_type old_pos = this->pos;
825 this->pos = Clamp(position, 0, std::max(this->count - this->cap, 0));
826 return this->pos != old_pos;
827 }
828
836 bool UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
837 {
838 if (difference == 0) return false;
839 switch (unit) {
840 case SS_SMALL: difference *= this->stepsize; break;
841 case SS_BIG: difference *= this->cap; break;
842 default: break;
843 }
844 return this->SetPosition(this->pos + difference);
845 }
846
853 void ScrollTowards(size_type position)
854 {
855 if (position < this->GetPosition()) {
856 /* scroll up to the item */
857 this->SetPosition(position);
858 } else if (position >= this->GetPosition() + this->GetCapacity()) {
859 /* scroll down so that the item is at the bottom */
860 this->SetPosition(position - this->GetCapacity() + 1);
861 }
862 }
863
864 size_type GetScrolledRowFromWidget(int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const;
865
871 template <typename Tcontainer>
872 auto GetVisibleRangeIterators(Tcontainer &container) const
873 {
874 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
875 auto first = std::next(std::begin(container), this->GetPosition());
876 auto last = std::next(first, std::min<size_t>(this->GetCapacity(), this->GetCount() - this->GetPosition()));
877 return std::make_pair(first, last);
878 }
879
890 template <typename Tcontainer>
891 auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const
892 {
893 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
894 size_type row = this->GetScrolledRowFromWidget(clickpos, w, widget, padding, line_height);
895 if (row == Scrollbar::npos) return std::end(container);
896
897 return std::next(std::begin(container), row);
898 }
899
900 EventState UpdateListPositionOnKeyPress(int &list_position, uint16_t keycode) const;
901};
902
908class NWidgetScrollbar : public NWidgetCore, public Scrollbar {
909public:
911
912 void SetupSmallestSize(Window *w) override;
913 void Draw(const Window *w) override;
914
915 static void InvalidateDimensionCache();
916 static Dimension GetVerticalDimension();
917 static Dimension GetHorizontalDimension();
918
919private:
922};
923
928class NWidgetLeaf : public NWidgetCore {
929public:
930 NWidgetLeaf(WidgetType tp, Colours colour, WidgetID index, const WidgetData &data, StringID tip);
931
932 void SetupSmallestSize(Window *w) override;
933 void Draw(const Window *w) override;
934
935 bool ButtonHit(const Point &pt);
936
937 static void InvalidateDimensionCache();
938
942private:
947};
948
956inline uint ComputeMaxSize(uint base, uint max_space, uint step)
957{
958 if (base >= max_space || step == 0) return base;
959 if (step == 1) return max_space;
960 uint increment = max_space - base;
961 increment -= increment % step;
962 return base + increment;
963}
964
1022
1031
1033 NWidContainerFlags flags;
1034 WidgetID index;
1035};
1036
1043
1049 uint8_t pre, inter, post;
1050};
1051
1061
1070
1078
1080 float ratio;
1081 AspectFlags flags;
1082};
1083
1088using NWidgetFunctionType = std::unique_ptr<NWidgetBase>();
1089
1108
1109 /* Constructors for each NWidgetPartUnion data type. */
1110 constexpr NWidgetPartUnion() : xy() {}
1111 constexpr NWidgetPartUnion(Point xy) : xy(xy) {}
1112 constexpr NWidgetPartUnion(NWidgetPartDataTip data_tip) : data_tip(data_tip) {}
1113 constexpr NWidgetPartUnion(NWidgetPartWidget widget) : widget(widget) {}
1114 constexpr NWidgetPartUnion(NWidgetPartPaddings padding) : padding(padding) {}
1115 constexpr NWidgetPartUnion(NWidgetPartPIP pip) : pip(pip) {}
1116 constexpr NWidgetPartUnion(NWidgetPartTextLines text_lines) : text_lines(text_lines) {}
1117 constexpr NWidgetPartUnion(NWidgetPartTextStyle text_style) : text_style(text_style) {}
1118 constexpr NWidgetPartUnion(NWidgetPartAlignment align) : align(align) {}
1119 constexpr NWidgetPartUnion(NWidgetFunctionType *func_ptr) : func_ptr(func_ptr) {}
1120 constexpr NWidgetPartUnion(NWidgetPartContainer container) : container(container) {}
1121 constexpr NWidgetPartUnion(NWidgetPartAspect aspect) : aspect(aspect) {}
1122 } u;
1123
1124 /* Constructors for each NWidgetPart data type. */
1125 explicit constexpr NWidgetPart(WidgetType type) : type(type), u() {}
1126 constexpr NWidgetPart(WidgetType type, Point xy) : type(type), u(xy) {}
1127 constexpr NWidgetPart(WidgetType type, NWidgetPartDataTip data_tip) : type(type), u(data_tip) {}
1128 constexpr NWidgetPart(WidgetType type, NWidgetPartWidget widget) : type(type), u(widget) {}
1129 constexpr NWidgetPart(WidgetType type, NWidgetPartPaddings padding) : type(type), u(padding) {}
1130 constexpr NWidgetPart(WidgetType type, NWidgetPartPIP pip) : type(type), u(pip) {}
1131 constexpr NWidgetPart(WidgetType type, NWidgetPartTextLines text_lines) : type(type), u(text_lines) {}
1132 constexpr NWidgetPart(WidgetType type, NWidgetPartTextStyle text_style) : type(type), u(text_style) {}
1133 constexpr NWidgetPart(WidgetType type, NWidgetPartAlignment align) : type(type), u(align) {}
1134 constexpr NWidgetPart(WidgetType type, NWidgetFunctionType *func_ptr) : type(type), u(func_ptr) {}
1135 constexpr NWidgetPart(WidgetType type, NWidgetPartContainer container) : type(type), u(container) {}
1136 constexpr NWidgetPart(WidgetType type, NWidgetPartAspect aspect) : type(type), u(aspect) {}
1137};
1138
1145constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
1146{
1147 return NWidgetPart{WPT_RESIZE, Point{dx, dy}};
1148}
1149
1156constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
1157{
1158 return NWidgetPart{WPT_MINSIZE, Point{x, y}};
1159}
1160
1166{
1167 return NWidgetPart{WPT_MINSIZE, Point{4, 0}};
1168}
1169
1176{
1177 return NWidgetPart{WPT_MINSIZE, Point{20 * width + 2, 22}};
1178}
1179
1187constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size = FS_NORMAL)
1188{
1189 return NWidgetPart{WPT_MINTEXTLINES, NWidgetPartTextLines{lines, spacing, size}};
1190}
1191
1199{
1200 return NWidgetPart{WPT_TEXTSTYLE, NWidgetPartTextStyle{colour, size}};
1201}
1202
1212
1219constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
1220{
1221 return NWidgetPart{WPT_FILL, Point{fill_x, fill_y}};
1222}
1223
1230{
1232}
1233
1240constexpr NWidgetPart SetStringTip(StringID string, StringID tip = {})
1241{
1242 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string}, tip}};
1243}
1244
1251constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip = {})
1252{
1253 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.sprite = sprite}, tip}};
1254}
1255
1263constexpr NWidgetPart SetSpriteStringTip(SpriteID sprite, StringID string, StringID tip = {})
1264{
1265 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string, .sprite = sprite}, tip}};
1266}
1267
1275{
1276 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.arrow_widget_type = widget_type}, tip}};
1277}
1278
1286{
1287 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.resize_widget_type = widget_type}, tip}};
1288}
1289
1296constexpr NWidgetPart SetAlternateColourTip(Colours colour, StringID tip)
1297{
1298 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.alternate_colour = colour}, tip}};
1299}
1300
1308constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip = {})
1309{
1310 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.matrix{ cols, rows }}, tip}};
1311}
1312
1319{
1320 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{}, tip}};
1321}
1322
1332constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
1333{
1334 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{left, top, right, bottom}};
1335}
1336
1343constexpr NWidgetPart SetPadding(uint8_t horizontal, uint8_t vertical)
1344{
1345 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{horizontal, vertical, horizontal, vertical}};
1346}
1347
1353constexpr NWidgetPart SetPadding(const RectPadding &padding)
1354{
1356}
1357
1363constexpr NWidgetPart SetPadding(uint8_t padding)
1364{
1365 return SetPadding(padding, padding, padding, padding);
1366}
1367
1375constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
1376{
1377 return NWidgetPart{WPT_PIPSPACE, NWidgetPartPIP{pre, inter, post}};
1378}
1379
1387constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
1388{
1389 return NWidgetPart{WPT_PIPRATIO, NWidgetPartPIP{ratio_pre, ratio_inter, ratio_post}};
1390}
1391
1400{
1401 return NWidgetPart{WPT_SCROLLBAR, NWidgetPartWidget{INVALID_COLOUR, index}};
1402}
1403
1410constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX)
1411{
1412 return NWidgetPart{WPT_ASPECT, NWidgetPartAspect{ratio, flags}};
1413}
1414
1424constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = INVALID_WIDGET)
1425{
1426 return NWidgetPart{tp, NWidgetPartWidget{col, idx}};
1427}
1428
1436{
1437 return NWidgetPart{tp, NWidgetPartContainer{cont_flags, idx}};
1438}
1439
1446{
1447 return NWidgetPart{WPT_FUNCTION, func_ptr};
1448}
1449
1451std::unique_ptr<NWidgetBase> MakeNWidgets(std::span<const NWidgetPart> nwid_parts, std::unique_ptr<NWidgetBase> &&container);
1452std::unique_ptr<NWidgetBase> MakeWindowNWidgetTree(std::span<const NWidgetPart> nwid_parts, NWidgetStacked **shade_select);
1453
1454std::unique_ptr<NWidgetBase> MakeCompanyButtonRows(WidgetID widget_first, WidgetID widget_last, Colours button_colour, int max_length, StringID button_tooltip, bool resizable = true);
1455
1457
1458#endif /* WIDGET_TYPE_H */
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Set()
Set all bits.
Nested widget with a child.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2337
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:2347
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:2283
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2214
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:2180
std::unique_ptr< NWidgetPIPContainer > child
Child widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2301
void Add(std::unique_ptr< NWidgetBase > &&nwid)
Add a child to the parent.
Definition widget.cpp:2161
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2295
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:2199
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:931
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.
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.
const WidgetID index
Index of the nested widget (INVALID_WIDGET means 'not used').
virtual NWidgetBase * GetWidgetOfType(WidgetType tp)
Retrieve a widget by its type.
Definition widget.cpp:951
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).
virtual void FillWidgetLookup(WidgetLookup &widget_lookup)
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:915
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:1292
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1299
void UnfocusWidgets(Window *parent_window)
Unfocuses the focused widget of the window, if the focused widget is contained inside the container.
Definition widget.cpp:3485
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1307
bool IsEmpty()
Return whether the container is empty.
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
void Clear(Window *parent_window)
Clears the container, deleting all widgets that were contained.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1316
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:1270
Base class for a 'real' widget.
WidgetData widget_data
Data of the widget.
void SetToolTip(StringID tool_tip)
Set the tool tip of the nested widget.
Definition widget.cpp:1224
bool IsHighlighted() const override
Return whether the widget is highlighted.
bool IsDisabled() const
Return whether the widget is disabled.
void SetSprite(SpriteID sprite)
Set sprite of the nested widget.
Definition widget.cpp:1174
NWidgetDisplayFlags disp_flags
Flags that affect display and interaction with the widget.
void SetTextStyle(TextColour colour, FontSize size)
Set the text style of the nested widget.
Definition widget.cpp:1214
WidgetID GetScrollbarIndex() const
Get the WidgetID of this nested widget's scrollbar.
Definition widget.cpp:1260
TextColour highlight_colour
Colour of highlight.
void SetAlignment(StringAlignment align)
Set the text/image alignment of the nested widget.
Definition widget.cpp:1242
void SetResizeWidgetType(ResizeWidgetValues type)
Set the resize widget type of the nested widget.
Definition widget.cpp:1204
void SetSpriteTip(SpriteID sprite, StringID tool_tip)
Set sprite and tool tip of the nested widget.
Definition widget.cpp:1184
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.
StringID GetString() const
Get the string that has been set for this nested widget.
Definition widget.cpp:1251
WidgetID scrollbar_index
Index of an attached scrollbar.
StringID GetToolTip() const
Get the tool tip of the nested widget.
Definition widget.cpp:1233
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1265
void SetString(StringID string)
Set string of the nested widget.
Definition widget.cpp:1154
TextColour text_colour
Colour of text within widget.
Colours colour
Colour of this widget.
void SetMatrixDimension(uint32_t columns, uint32_t rows)
Set the matrix dimension.
Definition widget.cpp:1195
void SetLowered(bool lowered)
Lower or raise the widget.
TextColour GetHighlightColour() const override
Return the colour of the highlight.
void SetStringTip(StringID string, StringID tool_tip)
Set string and tool tip of the nested widget.
Definition widget.cpp:1164
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:1713
Horizontal container.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1535
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:1604
Leaf widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2965
static void InvalidateDimensionCache()
Reset the cached dimensions.
Definition widget.cpp:2642
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:2778
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:3109
Matrix container with implicitly equal sized (virtual) sub-widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2060
int count
Amount of valid elements.
void SetClicked(int clicked)
Sets the clicked element in the matrix.
Definition widget.cpp:1929
int GetCurrentElement() const
Get current element.
Definition widget.cpp:1979
Scrollbar * sb
The scrollbar we're associated with.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1984
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:1970
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:2115
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:2006
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2030
int clicked
The currently clicked element.
void SetCount(int count)
Set the number of elements in this matrix.
Definition widget.cpp:1946
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.
void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post)
Set additional pre/inter/post space for the container.
Definition widget.cpp:1528
uint8_t uz_pip_inter
Unscaled space between widgets.
uint8_t pip_ratio_pre
Ratio of remaining space before first widget.
void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post)
Set additional pre/inter/post space for the container.
Definition widget.cpp:1508
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:1023
bool UpdateSize(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1106
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:1062
void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size)
Set minimal text lines for the widget.
Definition widget.cpp:1049
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:1086
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:1127
bool UpdateVerticalSize(uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1120
void SetResize(uint resize_x, uint resize_y)
Set resize step of the widget.
Definition widget.cpp:1073
void SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Set desired aspect ratio of this widget.
Definition widget.cpp:992
void SetMinimalSizeAbsolute(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1036
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:2586
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2565
static Dimension horizontal_dimension
Cached size of horizontal scrollbar button.
static Dimension vertical_dimension
Cached size of vertical scrollbar button.
Spacer widget.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1920
void SetDirty(const Window *w) const override
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:1915
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1903
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1896
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:1327
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:1368
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1398
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1422
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1388
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1407
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:1787
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1718
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:2402
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2366
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2359
void InitializeViewport(Window *w, std::variant< TileIndex, VehicleID > focus, ZoomLevel zoom)
Initialize the viewport of the window.
Definition widget.cpp:2393
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:2425
size_type count
Number of elements in the list.
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:2499
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:2446
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.
ScrollbarStepping
Stepping sizes when scrolling.
@ SS_BIG
Step in cap units.
@ SS_RAW
Step in single units.
@ SS_SMALL
Step in stepsize units.
Types related to the graphics and/or input devices.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
FontSize
Available font sizes.
Definition gfx_type.h:248
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
StringAlignment
How to align the to-be drawn text.
Definition gfx_type.h:387
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:398
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:307
constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip={})
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
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 SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetToolbarMinimalSize(int width)
Widget part function to setting the minimal size for a toolbar button.
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 SetAlternateColourTip(Colours colour, StringID tip)
Widget part function for setting the alternate colour and tooltip.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Widget part function for setting the aspect ratio.
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:3393
constexpr NWidgetPart SetToolbarSpacerMinimalSize()
Widget part function to setting the minimal size for a toolbar spacer.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart SetResizeWidgetTypeTip(ResizeWidgetValues widget_type, StringID tip)
Widget part function for setting the resize widget type and tooltip.
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:3374
constexpr NWidgetPart SetSpriteStringTip(SpriteID sprite, StringID string, StringID tip={})
Widget part function for setting the sprite, string and tooltip.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetArrowWidgetTypeTip(ArrowWidgetValues widget_type, StringID tip={})
Widget part function for setting the arrow widget type and tooltip.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
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 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.
WidgetData 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.
Padding dimensions to apply to each side of a Rect.
Specification of a rectangle with absolute coordinates of all edges.
Container with the data associated to a single widget.
Data structure for an opened window.
Definition window_gui.h:274
NWidgetPartContainer container
Part with container flags.
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.
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.
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:35
@ 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:40
@ WPT_FILL
Widget part for specifying fill.
Definition widget_type.h:84
@ WWT_PUSHIMGTEXTBTN
Normal push-button (no toggle button) with image and text caption.
@ WPT_ALIGNMENT
Widget part for specifying text/image alignment.
Definition widget_type.h:90
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ 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:42
@ NWID_CUSTOM
General Custom widget.
Definition widget_type.h:77
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ WPT_MINSIZE
Widget part for specifying minimal size.
Definition widget_type.h:82
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
@ WWT_LABEL
Centered label.
Definition widget_type.h:48
@ NWID_BUTTON_DROPDOWN
Button with a drop-down.
Definition widget_type.h:74
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:62
@ WWT_ARROWBTN
(Toggle) Button with an arrow
Definition widget_type.h:43
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:44
@ WPT_SCROLLBAR
Widget part for attaching a scrollbar.
Definition widget_type.h:91
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WPT_ASPECT
Widget part for specifying aspect ratio.
Definition widget_type.h:92
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:57
@ WPT_RESIZE
Widget part for specifying resizing.
Definition widget_type.h:81
@ WWT_IMGTEXTBTN
(Toggle) Button with image and text
Definition widget_type.h:47
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:50
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:55
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:52
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:76
@ WPT_TEXTSTYLE
Widget part for specifying text colour.
Definition widget_type.h:89
@ WPT_PADDING
Widget part for specifying a padding.
Definition widget_type.h:86
@ WWT_BOOLBTN
Standard boolean toggle button.
Definition widget_type.h:46
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
@ WWT_TEXTBTN_2
(Toggle) Button with diff text when clicked
Definition widget_type.h:45
@ WWT_FRAME
Frame.
Definition widget_type.h:51
@ WPT_MINTEXTLINES
Widget part for specifying minimal number of lines of text.
Definition widget_type.h:83
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:37
@ WWT_LAST
Last Item. use WIDGETS_END to fill up padding!!
Definition widget_type.h:63
@ WPT_ATTRIBUTE_END
End marker for attribute NWidgetPart types.
Definition widget_type.h:93
@ NWID_HSCROLLBAR
Horizontal scrollbar.
Definition widget_type.h:75
@ WPT_ENDCONTAINER
Widget part to denote end of a container.
Definition widget_type.h:96
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:59
@ WPT_PIPRATIO
Widget part for specifying pre/inter/post ratio for containers.
Definition widget_type.h:88
@ WPT_DATATIP
Widget part for specifying data and tooltip.
Definition widget_type.h:85
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:56
@ WPT_ATTRIBUTE_BEGIN
Begin marker for attribute NWidgetPart types.
Definition widget_type.h:80
@ WPT_PIPSPACE
Widget part for specifying pre/inter/post space for containers.
Definition widget_type.h:87
@ NWID_MATRIX
Matrix container.
Definition widget_type.h:69
@ NWID_VIEWPORT
Nested widget containing a viewport.
Definition widget_type.h:73
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:61
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:67
@ WPT_FUNCTION
Widget part for calling a user function.
Definition widget_type.h:95
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:54
@ NWID_LAYER
Layered widgets, all visible together.
Definition widget_type.h:72
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:71
NWidgetDisplayFlag
Nested widget flags that affect display and interaction with 'real' widgets.
@ DropdownClosed
Dropdown menu of the dropdown widget has closed.
@ ScrollbarDown
Down-button is lowered bit.
@ Lowered
Widget is lowered (pressed down) bit.
@ ShadeDimmed
Display dimmed colours in the viewport.
@ ShadeGrey
Shade viewport to grey-scale.
@ ScrollbarUp
Up-button is lowered bit.
@ DropdownActive
Dropdown menu of the button dropdown widget is active.
@ Highlight
Highlight of widget is on.
@ NoTransparency
Viewport is never transparent.
@ Disabled
Widget is disabled (greyed out) bit.
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:3317
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).
NWidContainerFlag
Nested widget container flags,.
@ EqualSize
Containers should keep all their (resizing) children equally large.
@ BigFirst
Allocate space to biggest resize first.
std::unique_ptr< NWidgetBase >() NWidgetFunctionType
Pointer to function returning a nested widget.
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:3435
void SetupWidgetDimensions()
Set up pre-scaled versions of Widget Dimensions.
Definition widget.cpp:80
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.
ArrowWidgetValues
Values for an arrow widget.
Definition widget_type.h:19
@ AWV_LEFT
Force the arrow to the left.
Definition widget_type.h:22
@ AWV_RIGHT
Force the arrow to the right.
Definition widget_type.h:23
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:20
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:21
std::map< WidgetID, class NWidgetBase * > WidgetLookup
Lookup between widget IDs and NWidget objects.
ResizeWidgetValues
WidgetData values for a resize box widget.
Definition widget_type.h:27
@ RWV_SHOW_BEVEL
Bevel of resize box is shown.
Definition widget_type.h:28
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:29
Types related to windows.
int WidgetID
Widget ID.
Definition window_type.h:20
EventState
State of handling an event.
static constexpr WidgetID INVALID_WIDGET
An invalid widget index.
Definition window_type.h:23
ZoomLevel
All zoom levels we know.
Definition zoom_type.h:20