OpenTTD Source 20250523-master-g321f7e8683
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/bitmath_func.hpp"
14#include "core/math_func.hpp"
15#include "strings_type.h"
16#include "gfx_type.h"
17#include "window_type.h"
18
26
32
111
113enum SizingType : uint8_t {
116};
117
118enum class AspectFlag : uint8_t {
119 ResizeX,
120 ResizeY,
121};
123
124/* Forward declarations. */
125class NWidgetCore;
126class Scrollbar;
127
129using WidgetLookup = std::map<WidgetID, class NWidgetBase *>;
130
138public:
139 NWidgetBase(WidgetType tp) : type(tp) {}
140 virtual ~NWidgetBase() = default;
141
142 void ApplyAspectRatio();
143 virtual void AdjustPaddingForZoom();
144 virtual void SetupSmallestSize(Window *w) = 0;
145 virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) = 0;
146
147 virtual void FillWidgetLookup(WidgetLookup &widget_lookup) = 0;
148
149 virtual NWidgetCore *GetWidgetFromPos(int x, int y) = 0;
151
157 template <class NWID>
159 {
160 for (NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
161 if (NWID *nwid = dynamic_cast<NWID *>(nwid_parent); nwid != nullptr) return nwid;
162 }
163 return nullptr;
164 }
165
171 template <class NWID>
172 const NWID *GetParentWidget() const
173 {
174 for (const NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
175 if (const NWID *nwid = dynamic_cast<const NWID *>(nwid_parent); nwid != nullptr) return nwid;
176 }
177 return nullptr;
178 }
179
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:
251 inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height);
252};
253
259{
260 return (sizing == ST_RESIZE) ? this->resize_x : this->fill_x;
261}
262
268{
269 return (sizing == ST_RESIZE) ? this->resize_y : this->fill_y;
270}
271
280inline void NWidgetBase::StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
281{
282 this->pos_x = x;
283 this->pos_y = y;
284 if (sizing == ST_SMALLEST) {
285 this->smallest_x = given_width;
286 this->smallest_y = given_height;
287 }
288 this->current_x = given_width;
289 this->current_y = given_height;
290}
291
292
298public:
300
301 void AdjustPaddingForZoom() override;
302 void SetMinimalSize(uint min_x, uint min_y);
303 void SetMinimalSizeAbsolute(uint min_x, uint min_y);
304 void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size);
305 void SetFill(uint fill_x, uint fill_y);
306 void SetResize(uint resize_x, uint resize_y);
307 void SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX);
308 void SetAspect(int x_ratio, int y_ratio, AspectFlags flags = AspectFlag::ResizeX);
309
310 bool UpdateMultilineWidgetSize(const std::string &str, int max_lines);
311 bool UpdateSize(uint min_x, uint min_y);
312 bool UpdateVerticalSize(uint min_y);
313
314 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
315
316 uint min_x = 0;
317 uint min_y = 0;
318
319 bool absolute = false;
320 uint uz_min_x = 0;
321 uint uz_min_y = 0;
322
323 uint8_t uz_text_lines = 0;
324 uint8_t uz_text_spacing = 0;
326};
327
329enum NWidgetDisplayFlag : uint8_t {
330 /* Generic. */
333
334 /* Viewport widget. */
338
339 /* Button dropdown widget. */
341
342 /* Scrollbar widget. */
345
346 /* Generic. */
349};
351
354 StringID string{};
355 SpriteID sprite{};
356 ArrowWidgetValues arrow_widget_type{};
357 ResizeWidgetValues resize_widget_type{};
358 Colours alternate_colour = INVALID_COLOUR;
359 Dimension matrix{};
360};
361
367public:
369
370 void SetString(StringID string);
372 void SetSprite(SpriteID sprite);
374 void SetMatrixDimension(uint32_t columns, uint32_t rows);
377 StringID GetToolTip() const;
380
381 StringID GetString() const;
382 WidgetID GetIndex() const;
384
385 inline void SetLowered(bool lowered);
386 inline bool IsLowered() const;
387 inline void SetDisabled(bool disabled);
388 inline bool IsDisabled() const;
389
390 inline TextColour GetTextColour() const { return this->text_colour; }
391 inline FontSize GetFontSize() const { return this->text_size; }
392
393 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
394 NWidgetCore *GetWidgetFromPos(int x, int y) override;
395 bool IsHighlighted() const override;
396 TextColour GetHighlightColour() const override;
398
400 Colours colour;
401protected:
402 const WidgetID index = -1;
410
411 /* This function constructs the widgets, so it should be able to write the variables. */
412 friend void ApplyNWidgetPartAttribute(const struct NWidgetPart &nwid, NWidgetBase *dest);
413};
414
419inline void NWidgetCore::SetHighlighted(TextColour highlight_colour)
420{
422 this->highlight_colour = highlight_colour;
423}
424
426inline bool NWidgetCore::IsHighlighted() const
427{
429}
430
433{
434 return this->highlight_colour;
435}
436
441inline void NWidgetCore::SetLowered(bool lowered)
442{
444}
445
447inline bool NWidgetCore::IsLowered() const
448{
450}
451
456inline void NWidgetCore::SetDisabled(bool disabled)
457{
459}
460
462inline bool NWidgetCore::IsDisabled() const
463{
465}
466
467
473public:
475
476 void AdjustPaddingForZoom() override;
477 void Add(std::unique_ptr<NWidgetBase> &&wid);
478 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
479
480 void Draw(const Window *w) override;
481 NWidgetCore *GetWidgetFromPos(int x, int y) override;
482
484 inline bool IsEmpty() { return this->children.empty(); }
485
487
488protected:
489 std::vector<std::unique_ptr<NWidgetBase>> children{};
490};
491
500
512public:
514
515 void SetupSmallestSize(Window *w) override;
516 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
518
519 void Draw(const Window *w) override;
520 NWidgetCore *GetWidgetFromPos(int x, int y) override;
521
522 bool SetDisplayedPlane(int plane);
523
524 int shown_plane = 0;
525 const WidgetID index = -1;
526private:
528};
529
536
539public:
541
542 void AdjustPaddingForZoom() override;
543 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
544 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_rato_post);
545
546protected:
548 uint8_t pip_pre = 0;
549 uint8_t pip_inter = 0;
550 uint8_t pip_post = 0;
551 uint8_t pip_ratio_pre = 0;
552 uint8_t pip_ratio_inter = 0;
553 uint8_t pip_ratio_post = 0;
554
555 uint8_t uz_pip_pre = 0;
556 uint8_t uz_pip_inter = 0;
557 uint8_t uz_pip_post = 0;
558
559 uint8_t gaps = 0;
560};
561
567public:
569
570 void SetupSmallestSize(Window *w) override;
571 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
572};
573
579public:
581
582 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
583};
584
590public:
592
593 void SetupSmallestSize(Window *w) override;
594 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
595};
596
606public:
608
609 void SetClicked(int clicked);
610 void SetCount(int count);
612 int GetCurrentElement() const;
613
614 void SetupSmallestSize(Window *w) override;
615 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
616 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
617
618 NWidgetCore *GetWidgetFromPos(int x, int y) override;
619 void Draw(const Window *w) override;
620protected:
621 const WidgetID index = -1;
622 Colours colour{};
623 int clicked = -1;
624 int count = -1;
626 Scrollbar *sb = nullptr;
627private:
628 int widget_w = 0;
629 int widget_h = 0;
630 int widgets_x = 0;
631 int widgets_y = 0;
632
633 void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y);
634};
635
636
642public:
643 NWidgetSpacer(int width, int height);
644
645 void SetupSmallestSize(Window *w) override;
646 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
647
648 void Draw(const Window *w) override;
649 void SetDirty(const Window *w) const override;
650 NWidgetCore *GetWidgetFromPos(int x, int y) override;
651};
652
658public:
659 NWidgetBackground(WidgetType tp, Colours colour, WidgetID index, std::unique_ptr<NWidgetPIPContainer> &&child = nullptr);
660
661 void Add(std::unique_ptr<NWidgetBase> &&nwid);
662 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
663 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
664
665 void AdjustPaddingForZoom() override;
666 void SetupSmallestSize(Window *w) override;
667 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
668
669 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
670
671 void Draw(const Window *w) override;
672 NWidgetCore *GetWidgetFromPos(int x, int y) override;
674
675private:
676 std::unique_ptr<NWidgetPIPContainer> child{};
677};
678
689public:
691
692 void SetupSmallestSize(Window *w) override;
693 void Draw(const Window *w) override;
694
695 void InitializeViewport(Window *w, std::variant<TileIndex, VehicleID> focus, ZoomLevel zoom);
697};
698
703public:
704 using size_type = int32_t;
705 static constexpr size_type max_size_type = std::numeric_limits<size_type>::max();
706 static constexpr size_type npos = max_size_type;
707private:
708 const bool is_vertical = false;
709 size_type count = 0;
710 size_type cap = 0;
711 size_type pos = 0;
712 size_type stepsize = 1;
713
714public:
721
723
728 inline size_type GetCount() const
729 {
730 return this->count;
731 }
732
737 inline size_type GetCapacity() const
738 {
739 return this->cap;
740 }
741
746 inline size_type GetPosition() const
747 {
748 return this->pos;
749 }
750
756 inline bool IsVisible(size_type item) const
757 {
758 return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
759 }
760
765 inline bool IsVertical() const
766 {
767 return this->is_vertical;
768 }
769
774 void SetStepSize(size_t stepsize)
775 {
776 assert(stepsize > 0);
777
778 this->stepsize = ClampTo<size_type>(stepsize);
779 }
780
786 void SetCount(size_t num)
787 {
788 assert(num < Scrollbar::max_size_type);
789
790 this->count = ClampTo<size_type>(num);
791 /* Ensure position is within bounds */
792 this->SetPosition(this->pos);
793 }
794
800 void SetCapacity(size_t capacity)
801 {
802 assert(capacity < Scrollbar::max_size_type);
803
804 this->cap = ClampTo<size_type>(capacity);
805 /* Ensure position is within bounds */
806 this->SetPosition(this->pos);
807 }
808
809 void SetCapacityFromWidget(Window *w, WidgetID widget, int padding = 0);
810
816 bool SetPosition(size_type position)
817 {
818 size_type old_pos = this->pos;
819 this->pos = Clamp(position, 0, std::max(this->count - this->cap, 0));
820 return this->pos != old_pos;
821 }
822
830 bool UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
831 {
832 if (difference == 0) return false;
833 switch (unit) {
834 case SS_SMALL: difference *= this->stepsize; break;
835 case SS_BIG: difference *= this->cap; break;
836 default: break;
837 }
838 return this->SetPosition(this->pos + difference);
839 }
840
847 void ScrollTowards(size_type position)
848 {
849 if (position < this->GetPosition()) {
850 /* scroll up to the item */
851 this->SetPosition(position);
852 } else if (position >= this->GetPosition() + this->GetCapacity()) {
853 /* scroll down so that the item is at the bottom */
854 this->SetPosition(position - this->GetCapacity() + 1);
855 }
856 }
857
858 size_type GetScrolledRowFromWidget(int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const;
859
865 template <typename Tcontainer>
866 auto GetVisibleRangeIterators(Tcontainer &container) const
867 {
868 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
869 auto first = std::next(std::begin(container), this->GetPosition());
870 auto last = std::next(first, std::min<size_t>(this->GetCapacity(), this->GetCount() - this->GetPosition()));
871 return std::make_pair(first, last);
872 }
873
884 template <typename Tcontainer>
885 auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const
886 {
887 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
888 size_type row = this->GetScrolledRowFromWidget(clickpos, w, widget, padding, line_height);
889 if (row == Scrollbar::npos) return std::end(container);
890
891 return std::next(std::begin(container), row);
892 }
893
894 EventState UpdateListPositionOnKeyPress(int &list_position, uint16_t keycode) const;
895};
896
902class NWidgetScrollbar : public NWidgetCore, public Scrollbar {
903public:
905
906 void SetupSmallestSize(Window *w) override;
907 void Draw(const Window *w) override;
908
909 static void InvalidateDimensionCache();
910 static Dimension GetVerticalDimension();
911 static Dimension GetHorizontalDimension();
912
913private:
916};
917
922class NWidgetLeaf : public NWidgetCore {
923public:
924 NWidgetLeaf(WidgetType tp, Colours colour, WidgetID index, const WidgetData &data, StringID tip);
925
926 void SetupSmallestSize(Window *w) override;
927 void Draw(const Window *w) override;
928
929 bool ButtonHit(const Point &pt);
930
931 static void InvalidateDimensionCache();
932
936private:
941};
942
950inline uint ComputeMaxSize(uint base, uint max_space, uint step)
951{
952 if (base >= max_space || step == 0) return base;
953 if (step == 1) return max_space;
954 uint increment = max_space - base;
955 increment -= increment % step;
956 return base + increment;
957}
958
1016
1025
1032
1038 uint8_t pre, inter, post;
1039};
1040
1050
1059
1067
1069 float ratio;
1070 AspectFlags flags;
1071};
1072
1077typedef std::unique_ptr<NWidgetBase> NWidgetFunctionType();
1078
1097
1098 /* Constructors for each NWidgetPartUnion data type. */
1099 constexpr NWidgetPartUnion() : xy() {}
1100 constexpr NWidgetPartUnion(Point xy) : xy(xy) {}
1101 constexpr NWidgetPartUnion(NWidgetPartDataTip data_tip) : data_tip(data_tip) {}
1102 constexpr NWidgetPartUnion(NWidgetPartWidget widget) : widget(widget) {}
1103 constexpr NWidgetPartUnion(NWidgetPartPaddings padding) : padding(padding) {}
1104 constexpr NWidgetPartUnion(NWidgetPartPIP pip) : pip(pip) {}
1105 constexpr NWidgetPartUnion(NWidgetPartTextLines text_lines) : text_lines(text_lines) {}
1106 constexpr NWidgetPartUnion(NWidgetPartTextStyle text_style) : text_style(text_style) {}
1107 constexpr NWidgetPartUnion(NWidgetPartAlignment align) : align(align) {}
1108 constexpr NWidgetPartUnion(NWidgetFunctionType *func_ptr) : func_ptr(func_ptr) {}
1109 constexpr NWidgetPartUnion(NWidContainerFlags cont_flags) : cont_flags(cont_flags) {}
1110 constexpr NWidgetPartUnion(NWidgetPartAspect aspect) : aspect(aspect) {}
1111 } u;
1112
1113 /* Constructors for each NWidgetPart data type. */
1114 explicit constexpr NWidgetPart(WidgetType type) : type(type), u() {}
1115 constexpr NWidgetPart(WidgetType type, Point xy) : type(type), u(xy) {}
1116 constexpr NWidgetPart(WidgetType type, NWidgetPartDataTip data_tip) : type(type), u(data_tip) {}
1117 constexpr NWidgetPart(WidgetType type, NWidgetPartWidget widget) : type(type), u(widget) {}
1118 constexpr NWidgetPart(WidgetType type, NWidgetPartPaddings padding) : type(type), u(padding) {}
1119 constexpr NWidgetPart(WidgetType type, NWidgetPartPIP pip) : type(type), u(pip) {}
1120 constexpr NWidgetPart(WidgetType type, NWidgetPartTextLines text_lines) : type(type), u(text_lines) {}
1121 constexpr NWidgetPart(WidgetType type, NWidgetPartTextStyle text_style) : type(type), u(text_style) {}
1122 constexpr NWidgetPart(WidgetType type, NWidgetPartAlignment align) : type(type), u(align) {}
1123 constexpr NWidgetPart(WidgetType type, NWidgetFunctionType *func_ptr) : type(type), u(func_ptr) {}
1124 constexpr NWidgetPart(WidgetType type, NWidContainerFlags cont_flags) : type(type), u(cont_flags) {}
1125 constexpr NWidgetPart(WidgetType type, NWidgetPartAspect aspect) : type(type), u(aspect) {}
1126};
1127
1134constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
1135{
1136 return NWidgetPart{WPT_RESIZE, Point{dx, dy}};
1137}
1138
1145constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
1146{
1147 return NWidgetPart{WPT_MINSIZE, Point{x, y}};
1148}
1149
1157constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size = FS_NORMAL)
1158{
1159 return NWidgetPart{WPT_MINTEXTLINES, NWidgetPartTextLines{lines, spacing, size}};
1160}
1161
1169{
1170 return NWidgetPart{WPT_TEXTSTYLE, NWidgetPartTextStyle{colour, size}};
1171}
1172
1182
1189constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
1190{
1191 return NWidgetPart{WPT_FILL, Point{fill_x, fill_y}};
1192}
1193
1200{
1202}
1203
1210constexpr NWidgetPart SetStringTip(StringID string, StringID tip = {})
1211{
1212 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string}, tip}};
1213}
1214
1221constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip = {})
1222{
1223 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.sprite = sprite}, tip}};
1224}
1225
1233constexpr NWidgetPart SetSpriteStringTip(SpriteID sprite, StringID string, StringID tip = {})
1234{
1235 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string, .sprite = sprite}, tip}};
1236}
1237
1245{
1246 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.arrow_widget_type = widget_type}, tip}};
1247}
1248
1256{
1257 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.resize_widget_type = widget_type}, tip}};
1258}
1259
1266constexpr NWidgetPart SetAlternateColourTip(Colours colour, StringID tip)
1267{
1268 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.alternate_colour = colour}, tip}};
1269}
1270
1278constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip = {})
1279{
1280 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.matrix{ cols, rows }}, tip}};
1281}
1282
1289{
1290 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{}, tip}};
1291}
1292
1302constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
1303{
1304 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{left, top, right, bottom}};
1305}
1306
1313constexpr NWidgetPart SetPadding(uint8_t horizontal, uint8_t vertical)
1314{
1315 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{horizontal, vertical, horizontal, vertical}};
1316}
1317
1323constexpr NWidgetPart SetPadding(const RectPadding &padding)
1324{
1326}
1327
1333constexpr NWidgetPart SetPadding(uint8_t padding)
1334{
1335 return SetPadding(padding, padding, padding, padding);
1336}
1337
1345constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
1346{
1347 return NWidgetPart{WPT_PIPSPACE, NWidgetPartPIP{pre, inter, post}};
1348}
1349
1357constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
1358{
1359 return NWidgetPart{WPT_PIPRATIO, NWidgetPartPIP{ratio_pre, ratio_inter, ratio_post}};
1360}
1361
1370{
1371 return NWidgetPart{WPT_SCROLLBAR, NWidgetPartWidget{INVALID_COLOUR, index}};
1372}
1373
1380constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX)
1381{
1382 return NWidgetPart{WPT_ASPECT, NWidgetPartAspect{ratio, flags}};
1383}
1384
1394constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = -1)
1395{
1396 return NWidgetPart{tp, NWidgetPartWidget{col, idx}};
1397}
1398
1405constexpr NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = {})
1406{
1407 return NWidgetPart{tp, NWidContainerFlags{cont_flags}};
1408}
1409
1416{
1417 return NWidgetPart{WPT_FUNCTION, func_ptr};
1418}
1419
1421std::unique_ptr<NWidgetBase> MakeNWidgets(std::span<const NWidgetPart> nwid_parts, std::unique_ptr<NWidgetBase> &&container);
1422std::unique_ptr<NWidgetBase> MakeWindowNWidgetTree(std::span<const NWidgetPart> nwid_parts, NWidgetStacked **shade_select);
1423
1424std::unique_ptr<NWidgetBase> MakeCompanyButtonRows(WidgetID widget_first, WidgetID widget_last, Colours button_colour, int max_length, StringID button_tooltip, bool resizable = true);
1425
1427
1428#endif /* WIDGET_TYPE_H */
Functions related to bit mathematics.
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:2393
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:2403
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:2339
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2272
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:2238
std::unique_ptr< NWidgetPIPContainer > child
Child widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2357
void Add(std::unique_ptr< NWidgetBase > &&nwid)
Add a child to the parent.
Definition widget.cpp:2219
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2351
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:2257
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:937
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
NWID * GetParentWidget()
Get parent widget of type NWID.
NWidgetBase * parent
Parent widget of this widget, automatically filled in when added to container.
virtual void FillWidgetLookup(WidgetLookup &widget_lookup)=0
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
RectPadding uz_padding
Unscaled padding, for resize calculation.
uint smallest_x
Smallest horizontal size of the widget in a filled window.
AspectFlags aspect_flags
Which dimensions can be resized.
virtual void Draw(const Window *w)=0
Draw the widgets of the tree.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
virtual NWidgetCore * GetWidgetFromPos(int x, int y)=0
Retrieve a widget by its position.
int pos_x
Horizontal position of top-left corner of the widget in the window.
void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Set additional space (padding) around the widget.
void SetPadding(const RectPadding &padding)
Set additional space (padding) around the widget.
uint smallest_y
Smallest vertical size of the widget in a filled window.
virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl)=0
Assign size and position to the widget.
virtual NWidgetBase * GetWidgetOfType(WidgetType tp)
Retrieve a widget by its type.
Definition widget.cpp:957
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
RectPadding padding
Padding added to the widget. Managed by parent container widget. (parent container may swap left and ...
uint current_y
Current vertical size (after resizing).
uint GetVerticalStepSize(SizingType sizing) const
Get the vertical sizing step.
const NWID * GetParentWidget() const
Get parent widget of type NWID.
Baseclass for container widgets.
void Add(std::unique_ptr< NWidgetBase > &&wid)
Append widget wid to container.
Definition widget.cpp:1312
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1319
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1326
bool IsEmpty()
Return whether the container is empty.
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1335
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:1290
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:1230
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:1180
WidgetID GetIndex() const
Get the WidgetID of this nested widget.
Definition widget.cpp:1266
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:1220
WidgetID GetScrollbarIndex() const
Get the WidgetID of this nested widget's scrollbar.
Definition widget.cpp:1275
TextColour highlight_colour
Colour of highlight.
void SetAlignment(StringAlignment align)
Set the text/image alignment of the nested widget.
Definition widget.cpp:1248
void SetResizeWidgetType(ResizeWidgetValues type)
Set the resize widget type of the nested widget.
Definition widget.cpp:1210
void SetSpriteTip(SpriteID sprite, StringID tool_tip)
Set sprite and tool tip of the nested widget.
Definition widget.cpp:1190
const WidgetID index
Index of the nested widget (-1 means 'not used').
StringAlignment align
Alignment of text/image within widget.
FontSize text_size
Size of text within widget.
void SetHighlighted(TextColour highlight_colour) override
Highlight the widget or not.
StringID GetString() const
Get the string that has been set for this nested widget.
Definition widget.cpp:1257
WidgetID scrollbar_index
Index of an attached scrollbar.
StringID GetToolTip() const
Get the tool tip of the nested widget.
Definition widget.cpp:1239
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1285
void SetString(StringID string)
Set string of the nested widget.
Definition widget.cpp:1160
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:1201
void SetLowered(bool lowered)
Lower or raise the widget.
TextColour GetHighlightColour() const override
Return the colour of the highlight.
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1280
void SetStringTip(StringID string, StringID tool_tip)
Set string and tool tip of the nested widget.
Definition widget.cpp:1170
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:1751
Horizontal container.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1567
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:1636
Leaf widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:3021
static void InvalidateDimensionCache()
Reset the cached dimensions.
Definition widget.cpp:2698
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:2834
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:3165
Matrix container with implicitly equal sized (virtual) sub-widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2118
int count
Amount of valid elements.
void SetClicked(int clicked)
Sets the clicked element in the matrix.
Definition widget.cpp:1981
int GetCurrentElement() const
Get current element.
Definition widget.cpp:2031
const WidgetID index
If non-negative, index in the Window::widget_lookup.
Scrollbar * sb
The scrollbar we're associated with.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2036
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:2022
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:2173
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:2058
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2082
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2088
int clicked
The currently clicked element.
void SetCount(int count)
Set the number of elements in this matrix.
Definition widget.cpp:1998
int widgets_y
The number of visible widgets in vertical direction.
Colours colour
Colour of this widget.
Container with pre/inter/post child space.
uint8_t gaps
Number of gaps between widgets.
NWidContainerFlags flags
Flags of the container.
uint8_t pip_pre
Amount of space before first widget.
uint8_t uz_pip_pre
Unscaled space before first widget.
uint8_t uz_pip_inter
Unscaled space between widgets.
uint8_t pip_ratio_pre
Ratio of remaining space before first widget.
void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_rato_post)
Set additional pre/inter/post space for the container.
Definition widget.cpp:1555
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:1535
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:1029
bool UpdateSize(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1112
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:1068
void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size)
Set minimal text lines for the widget.
Definition widget.cpp:1055
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:1092
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:1133
bool UpdateVerticalSize(uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1126
void SetResize(uint resize_x, uint resize_y)
Set resize step of the widget.
Definition widget.cpp:1079
void SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Set desired aspect ratio of this widget.
Definition widget.cpp:998
void SetMinimalSizeAbsolute(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1042
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:2642
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2621
static Dimension horizontal_dimension
Cached size of horizontal scrollbar button.
static Dimension vertical_dimension
Cached size of vertical scrollbar button.
Spacer widget.
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1946
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1967
void SetDirty(const Window *w) const override
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:1962
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1950
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1939
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:1346
const WidgetID index
If non-negative, index in the Window::widget_lookup.
WidgetLookup * widget_lookup
Window's widget lookup, updated in SetDisplayedPlane().
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
Definition widget.cpp:1387
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1418
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1442
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1407
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1427
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:1830
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1761
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:2458
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2422
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2415
void InitializeViewport(Window *w, std::variant< TileIndex, VehicleID > focus, ZoomLevel zoom)
Initialize the viewport of the window.
Definition widget.cpp:2449
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:2481
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:2555
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:2502
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:250
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:251
StringAlignment
How to align the to-be drawn text.
Definition gfx_type.h:382
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:393
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:302
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 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:3449
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:3430
constexpr NWidgetPart SetSpriteStringTip(SpriteID sprite, StringID string, StringID tip={})
Widget part function for setting the sprite, string and tooltip.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
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 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.
Coordinates of a point in 2D.
Padding dimensions to apply to each side of a Rect.
Specification of a rectangle with absolute coordinates of all edges.
Container with the data associated to a single widget.
Data structure for an opened window.
Definition window_gui.h:273
NWidgetPartTextLines text_lines
Part with text line data.
NWidgetPartPIP pip
Part with pre/inter/post spaces.
NWidgetPartPaddings padding
Part with paddings.
NWidgetFunctionType * func_ptr
Part with a function call.
NWidContainerFlags cont_flags
Part with container flags.
NWidgetPartDataTip data_tip
Part with a data/tooltip.
NWidgetPartAlignment align
Part with internal alignment.
NWidgetPartAspect aspect
Part to set aspect ratio.
NWidgetPartTextStyle text_style
Part with text style data.
Point xy
Part with an x/y size.
NWidgetPartWidget widget
Part with a start of a widget.
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:36
@ 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:41
@ WPT_FILL
Widget part for specifying fill.
Definition widget_type.h:85
@ 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:91
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:42
@ 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:43
@ NWID_CUSTOM
General Custom widget.
Definition widget_type.h:78
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ WPT_MINSIZE
Widget part for specifying minimal size.
Definition widget_type.h:83
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
@ WWT_LABEL
Centered label.
Definition widget_type.h:49
@ NWID_BUTTON_DROPDOWN
Button with a drop-down.
Definition widget_type.h:75
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:71
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:63
@ WWT_ARROWBTN
(Toggle) Button with an arrow
Definition widget_type.h:44
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:67
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:45
@ WPT_SCROLLBAR
Widget part for attaching a scrollbar.
Definition widget_type.h:92
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WPT_ASPECT
Widget part for specifying aspect ratio.
Definition widget_type.h:93
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:58
@ WPT_RESIZE
Widget part for specifying resizing.
Definition widget_type.h:82
@ WWT_IMGTEXTBTN
(Toggle) Button with image and text
Definition widget_type.h:48
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:51
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:56
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:53
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:77
@ WPT_TEXTSTYLE
Widget part for specifying text colour.
Definition widget_type.h:90
@ WPT_PADDING
Widget part for specifying a padding.
Definition widget_type.h:87
@ WWT_BOOLBTN
Standard boolean toggle button.
Definition widget_type.h:47
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:69
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:61
@ WWT_TEXTBTN_2
(Toggle) Button with diff text when clicked
Definition widget_type.h:46
@ WWT_FRAME
Frame.
Definition widget_type.h:52
@ WPT_MINTEXTLINES
Widget part for specifying minimal number of lines of text.
Definition widget_type.h:84
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:38
@ WWT_LAST
Last Item. use WIDGETS_END to fill up padding!!
Definition widget_type.h:64
@ WPT_ATTRIBUTE_END
End marker for attribute NWidgetPart types.
Definition widget_type.h:94
@ NWID_HSCROLLBAR
Horizontal scrollbar.
Definition widget_type.h:76
@ WPT_ENDCONTAINER
Widget part to denote end of a container.
Definition widget_type.h:97
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:60
@ WPT_PIPRATIO
Widget part for specifying pre/inter/post ratio for containers.
Definition widget_type.h:89
@ WPT_DATATIP
Widget part for specifying data and tooltip.
Definition widget_type.h:86
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:57
@ WPT_ATTRIBUTE_BEGIN
Begin marker for attribute NWidgetPart types.
Definition widget_type.h:81
@ WPT_PIPSPACE
Widget part for specifying pre/inter/post space for containers.
Definition widget_type.h:88
@ NWID_MATRIX
Matrix container.
Definition widget_type.h:70
@ NWID_VIEWPORT
Nested widget containing a viewport.
Definition widget_type.h:74
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:62
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:50
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:68
@ WPT_FUNCTION
Widget part for calling a user function.
Definition widget_type.h:96
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:55
@ NWID_LAYER
Layered widgets, all visible together.
Definition widget_type.h:73
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:72
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:3373
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 > 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:3491
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:20
@ AWV_LEFT
Force the arrow to the left.
Definition widget_type.h:23
@ AWV_RIGHT
Force the arrow to the right.
Definition widget_type.h:24
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:21
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:22
std::map< WidgetID, class NWidgetBase * > WidgetLookup
Lookup between widget IDs and NWidget objects.
std::unique_ptr< NWidgetBase > NWidgetFunctionType()
Pointer to function returning a nested widget.
ResizeWidgetValues
WidgetData values for a resize box widget.
Definition widget_type.h:28
@ RWV_SHOW_BEVEL
Bevel of resize box is shown.
Definition widget_type.h:29
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:30
Types related to windows.
int WidgetID
Widget ID.
Definition window_type.h:20
EventState
State of handling an event.
ZoomLevel
All zoom levels we know.
Definition zoom_type.h:16