OpenTTD Source 20260206-master-g4d4e37dbf1
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
9
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};
121using AspectFlags = EnumBitSet<AspectFlag, uint8_t>;
122
123/* Forward declarations. */
124class NWidgetCore;
125class Scrollbar;
126
128using WidgetLookup = std::map<WidgetID, class NWidgetBase *>;
129
136class NWidgetBase {
137public:
138 NWidgetBase(WidgetType tp, WidgetID index = INVALID_WIDGET) : type(tp), index(index) {}
139 virtual ~NWidgetBase() = default;
140
141 void ApplyAspectRatio();
142
146 virtual void AdjustPaddingForZoom();
147 virtual void SetupSmallestSize(Window *w) = 0;
148 virtual void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) = 0;
149
150 virtual void FillWidgetLookup(WidgetLookup &widget_lookup);
151
152 virtual NWidgetCore *GetWidgetFromPos(int x, int y) = 0;
153 virtual NWidgetBase *GetWidgetOfType(WidgetType tp);
154
160 template <class NWID>
162 {
163 for (NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
164 if (NWID *nwid = dynamic_cast<NWID *>(nwid_parent); nwid != nullptr) return nwid;
165 }
166 return nullptr;
167 }
168
174 template <class NWID>
175 const NWID *GetParentWidget() const
176 {
177 for (const NWidgetBase *nwid_parent = this->parent; nwid_parent != nullptr; nwid_parent = nwid_parent->parent) {
178 if (const NWID *nwid = dynamic_cast<const NWID *>(nwid_parent); nwid != nullptr) return nwid;
179 }
180 return nullptr;
181 }
182
183 inline WidgetID GetIndex() const { return this->index; }
184
189 virtual bool IsHighlighted() const { return false; }
190
195 virtual TextColour GetHighlightColour() const { return TC_INVALID; }
196
201 virtual void SetHighlighted([[maybe_unused]] TextColour highlight_colour) {}
202
210 inline void SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
211 {
212 this->uz_padding.top = top;
213 this->uz_padding.right = right;
214 this->uz_padding.bottom = bottom;
215 this->uz_padding.left = left;
216 this->AdjustPaddingForZoom();
217 }
218
223 inline void SetPadding(const RectPadding &padding)
224 {
225 this->uz_padding = padding;
226 this->AdjustPaddingForZoom();
227 }
228
229 inline uint GetHorizontalStepSize(SizingType sizing) const;
230 inline uint GetVerticalStepSize(SizingType sizing) const;
231
232 virtual void Draw(const Window *w) = 0;
233 virtual void SetDirty(const Window *w) const;
234
235 Rect GetCurrentRect() const
236 {
237 Rect r;
238 r.left = this->pos_x;
239 r.top = this->pos_y;
240 r.right = this->pos_x + this->current_x - 1;
241 r.bottom = this->pos_y + this->current_y - 1;
242 return r;
243 }
244
246 uint fill_x = 0;
247 uint fill_y = 0;
248 uint resize_x = 0;
249 uint resize_y = 0;
250 /* Size of the widget in the smallest window possible.
251 * Computed by #SetupSmallestSize() followed by #AssignSizePosition().
252 */
253 uint smallest_x = 0;
254 uint smallest_y = 0;
255 /* Current widget size (that is, after resizing). */
256 uint current_x = 0;
257 uint current_y = 0;
258 float aspect_ratio = 0;
259 AspectFlags aspect_flags = AspectFlag::ResizeX;
260
261 int pos_x = 0;
262 int pos_y = 0;
263
266
267 NWidgetBase *parent = nullptr;
268
269protected:
271
272 inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height);
273};
274
280{
281 return (sizing == ST_RESIZE) ? this->resize_x : this->fill_x;
282}
283
289{
290 return (sizing == ST_RESIZE) ? this->resize_y : this->fill_y;
291}
292
301inline void NWidgetBase::StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
302{
303 this->pos_x = x;
304 this->pos_y = y;
305 if (sizing == ST_SMALLEST) {
306 this->smallest_x = given_width;
307 this->smallest_y = given_height;
308 }
309 this->current_x = given_width;
310 this->current_y = given_height;
311}
312
313
318class NWidgetResizeBase : public NWidgetBase {
319public:
321
322 void AdjustPaddingForZoom() override;
323 void SetMinimalSize(uint min_x, uint min_y);
324 void SetMinimalSizeAbsolute(uint min_x, uint min_y);
325 void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size);
326 void SetFill(uint fill_x, uint fill_y);
327 void SetResize(uint resize_x, uint resize_y);
328 void SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX);
329 void SetAspect(int x_ratio, int y_ratio, AspectFlags flags = AspectFlag::ResizeX);
330
331 bool UpdateMultilineWidgetSize(const std::string &str, int max_lines);
332 bool UpdateSize(uint min_x, uint min_y);
333 bool UpdateVerticalSize(uint min_y);
334
335 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
336
337 uint min_x = 0;
338 uint min_y = 0;
339
340 bool absolute = false;
341 uint uz_min_x = 0;
342 uint uz_min_y = 0;
343
344 uint8_t uz_text_lines = 0;
345 uint8_t uz_text_spacing = 0;
347};
348
350enum NWidgetDisplayFlag : uint8_t {
351 /* Generic. */
354
355 /* Viewport widget. */
359
360 /* Button dropdown widget. */
362
363 /* Scrollbar widget. */
366
367 /* Generic. */
370};
371using NWidgetDisplayFlags = EnumBitSet<NWidgetDisplayFlag, uint16_t>;
372
375 StringID string{};
376 SpriteID sprite{};
377 ArrowWidgetValues arrow_widget_type{};
378 ResizeWidgetValues resize_widget_type{};
379 Colours alternate_colour = INVALID_COLOUR;
380 Dimension matrix{};
381};
382
388public:
390
391 void SetString(StringID string);
393 void SetSprite(SpriteID sprite);
395 void SetMatrixDimension(uint32_t columns, uint32_t rows);
398 StringID GetToolTip() const;
401
402 StringID GetString() const;
404
405 inline void SetLowered(bool lowered);
406 inline bool IsLowered() const;
407 inline void SetDisabled(bool disabled);
408 inline bool IsDisabled() const;
409
410 inline TextColour GetTextColour() const { return this->text_colour; }
411 inline FontSize GetFontSize() const { return this->text_size; }
412
413 NWidgetCore *GetWidgetFromPos(int x, int y) override;
414 bool IsHighlighted() const override;
415 TextColour GetHighlightColour() const override;
417
418 NWidgetDisplayFlags disp_flags;
419 Colours colour;
420protected:
428
429 /* This function constructs the widgets, so it should be able to write the variables. */
430 friend void ApplyNWidgetPartAttribute(const struct NWidgetPart &nwid, NWidgetBase *dest);
431};
432
438
439inline bool NWidgetCore::IsHighlighted() const
440{
441 return this->disp_flags.Test(NWidgetDisplayFlag::Highlight);
442}
443
445{
446 return this->highlight_colour;
447}
448
453inline void NWidgetCore::SetLowered(bool lowered)
454{
456}
457
459inline bool NWidgetCore::IsLowered() const
460{
461 return this->disp_flags.Test(NWidgetDisplayFlag::Lowered);
462}
463
468inline void NWidgetCore::SetDisabled(bool disabled)
469{
471}
472
474inline bool NWidgetCore::IsDisabled() const
475{
476 return this->disp_flags.Test(NWidgetDisplayFlag::Disabled);
477}
478
479
484class NWidgetContainer : public NWidgetBase {
485public:
486 NWidgetContainer(WidgetType tp, WidgetID index = INVALID_WIDGET) : NWidgetBase(tp, index) {}
487
488 void AdjustPaddingForZoom() override;
489 void Add(std::unique_ptr<NWidgetBase> &&wid);
490 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
491
492 void Draw(const Window *w) override;
493 NWidgetCore *GetWidgetFromPos(int x, int y) override;
494
496 inline bool IsEmpty() { return this->children.empty(); }
497
499 void UnfocusWidgets(Window *parent_window);
500
505 inline void Clear(Window *parent_window)
506 {
507 this->UnfocusWidgets(parent_window);
508 this->children.clear();
509 }
510
511protected:
512 std::vector<std::unique_ptr<NWidgetBase>> children{};
513};
514
523
534class NWidgetStacked : public NWidgetContainer {
535public:
536 NWidgetStacked(WidgetID index) : NWidgetContainer(NWID_SELECTION, index) {}
537
538 void SetupSmallestSize(Window *w) override;
539 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
541
542 void Draw(const Window *w) override;
543 NWidgetCore *GetWidgetFromPos(int x, int y) override;
544
545 bool SetDisplayedPlane(int plane);
546
547 int shown_plane = 0;
548private:
550};
551
557using NWidContainerFlags = EnumBitSet<NWidContainerFlag, uint8_t>;
558
560class NWidgetPIPContainer : public NWidgetContainer {
561public:
562 NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetContainer(tp, index), flags(flags) {}
563
564 void AdjustPaddingForZoom() override;
565 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
566 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
567
568protected:
569 NWidContainerFlags flags{};
570 uint8_t pip_pre = 0;
571 uint8_t pip_inter = 0;
572 uint8_t pip_post = 0;
573 uint8_t pip_ratio_pre = 0;
574 uint8_t pip_ratio_inter = 0;
575 uint8_t pip_ratio_post = 0;
576
577 uint8_t uz_pip_pre = 0;
578 uint8_t uz_pip_inter = 0;
579 uint8_t uz_pip_post = 0;
580
581 uint8_t gaps = 0;
582};
583
588class NWidgetHorizontal : public NWidgetPIPContainer {
589public:
590 NWidgetHorizontal(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET, WidgetType type = NWID_HORIZONTAL) : NWidgetPIPContainer(type, flags, index) {}
591
592 void SetupSmallestSize(Window *w) override;
593 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
594};
595
600class NWidgetHorizontalLTR : public NWidgetHorizontal {
601public:
602 NWidgetHorizontalLTR(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetHorizontal(flags, index, NWID_HORIZONTAL_LTR) {}
603
604 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
605};
606
611class NWidgetVertical : public NWidgetPIPContainer {
612public:
613 NWidgetVertical(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetPIPContainer(NWID_VERTICAL, flags, index) {}
614
615 void SetupSmallestSize(Window *w) override;
616 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
617};
618
627class NWidgetMatrix : public NWidgetPIPContainer {
628public:
629 NWidgetMatrix(Colours colour, WidgetID index) : NWidgetPIPContainer(NWID_MATRIX, NWidContainerFlag::EqualSize, index), colour(colour) {}
630
631 void SetClicked(int clicked);
632 void SetCount(int count);
634 int GetCurrentElement() const;
635
636 void SetupSmallestSize(Window *w) override;
637 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
638
639 NWidgetCore *GetWidgetFromPos(int x, int y) override;
640 void Draw(const Window *w) override;
641protected:
642 Colours colour{};
643 int clicked = -1;
644 int count = 0;
646 Scrollbar *sb = nullptr;
647private:
648 int widget_w = 0;
649 int widget_h = 0;
650 int widgets_x = 0;
651 int widgets_y = 0;
652
653 void GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y);
654};
655
656
662public:
663 NWidgetSpacer(int width, int height);
664
665 void SetupSmallestSize(Window *w) override;
666
667 void Draw(const Window *w) override;
668 void SetDirty(const Window *w) const override;
669 NWidgetCore *GetWidgetFromPos(int x, int y) override;
670};
671
677public:
678 NWidgetBackground(WidgetType tp, Colours colour, WidgetID index, std::unique_ptr<NWidgetPIPContainer> &&child = nullptr);
679
680 void Add(std::unique_ptr<NWidgetBase> &&nwid);
681 void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post);
682 void SetPIPRatio(uint8_t pip_ratio_pre, uint8_t pip_ratio_inter, uint8_t pip_ratio_post);
683
684 void AdjustPaddingForZoom() override;
685 void SetupSmallestSize(Window *w) override;
686 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override;
687
688 void FillWidgetLookup(WidgetLookup &widget_lookup) override;
689
690 void Draw(const Window *w) override;
691 NWidgetCore *GetWidgetFromPos(int x, int y) override;
693
694private:
695 std::unique_ptr<NWidgetPIPContainer> child{};
696};
697
707class NWidgetViewport : public NWidgetCore {
708public:
709 NWidgetViewport(WidgetID index);
710
711 void SetupSmallestSize(Window *w) override;
712 void Draw(const Window *w) override;
713
714 void InitializeViewport(Window *w, std::variant<TileIndex, VehicleID> focus, ZoomLevel zoom);
716};
717
721class Scrollbar {
722public:
723 using size_type = int32_t;
724 static constexpr size_type max_size_type = std::numeric_limits<size_type>::max();
725 static constexpr size_type npos = max_size_type;
726private:
727 const bool is_vertical = false;
728 size_type count = 0;
729 size_type cap = 0;
730 size_type pos = 0;
731 size_type stepsize = 1;
732
733public:
740
742
747 inline size_type GetCount() const
748 {
749 return this->count;
750 }
751
756 inline size_type GetCapacity() const
757 {
758 return this->cap;
759 }
760
765 inline size_type GetPosition() const
766 {
767 return this->pos;
768 }
769
775 inline bool IsVisible(size_type item) const
776 {
777 return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
778 }
779
784 inline bool IsVertical() const
785 {
786 return this->is_vertical;
787 }
788
794 {
795 assert(stepsize > 0);
796
797 this->stepsize = ClampTo<size_type>(stepsize);
798 }
799
805 void SetCount(size_t num)
806 {
807 assert(num < Scrollbar::max_size_type);
808
809 this->count = ClampTo<size_type>(num);
810 /* Ensure position is within bounds */
811 this->SetPosition(this->pos);
812 }
813
819 void SetCapacity(size_t capacity)
820 {
821 assert(capacity < Scrollbar::max_size_type);
822
823 this->cap = ClampTo<size_type>(capacity);
824 /* Ensure position is within bounds */
825 this->SetPosition(this->pos);
826 }
827
828 void SetCapacityFromWidget(Window *w, WidgetID widget, int padding = 0);
829
835 bool SetPosition(size_type position)
836 {
837 size_type old_pos = this->pos;
838 this->pos = Clamp(position, 0, std::max(this->count - this->cap, 0));
839 return this->pos != old_pos;
840 }
841
849 bool UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
850 {
851 if (difference == 0) return false;
852 switch (unit) {
853 case SS_SMALL: difference *= this->stepsize; break;
854 case SS_BIG: difference *= this->cap; break;
855 default: break;
856 }
857 return this->SetPosition(this->pos + difference);
858 }
859
866 void ScrollTowards(size_type position)
867 {
868 if (position < this->GetPosition()) {
869 /* scroll up to the item */
870 this->SetPosition(position);
871 } else if (position >= this->GetPosition() + this->GetCapacity()) {
872 /* scroll down so that the item is at the bottom */
873 this->SetPosition(position - this->GetCapacity() + 1);
874 }
875 }
876
877 size_type GetScrolledRowFromWidget(int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const;
878
884 template <typename Tcontainer>
885 auto GetVisibleRangeIterators(Tcontainer &container) const
886 {
887 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
888 auto first = std::next(std::begin(container), this->GetPosition());
889 auto last = std::next(first, std::min<size_t>(this->GetCapacity(), this->GetCount() - this->GetPosition()));
890 return std::make_pair(first, last);
891 }
892
903 template <typename Tcontainer>
904 auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window * const w, WidgetID widget, int padding = 0, int line_height = -1) const
905 {
906 assert(static_cast<size_t>(this->GetCount()) == container.size()); // Scrollbar and container size must match.
907 size_type row = this->GetScrolledRowFromWidget(clickpos, w, widget, padding, line_height);
908 if (row == Scrollbar::npos) return std::end(container);
909
910 return std::next(std::begin(container), row);
911 }
912
913 EventState UpdateListPositionOnKeyPress(int &list_position, uint16_t keycode) const;
914};
915
921class NWidgetScrollbar : public NWidgetCore, public Scrollbar {
922public:
924
925 void SetupSmallestSize(Window *w) override;
926 void Draw(const Window *w) override;
927
928 static void InvalidateDimensionCache();
929 static Dimension GetVerticalDimension();
930 static Dimension GetHorizontalDimension();
931
932private:
935};
936
941class NWidgetLeaf : public NWidgetCore {
942public:
943 NWidgetLeaf(WidgetType tp, Colours colour, WidgetID index, const WidgetData &data, StringID tip);
944
945 void SetupSmallestSize(Window *w) override;
946 void Draw(const Window *w) override;
947
948 bool ButtonHit(const Point &pt);
949
950 static void InvalidateDimensionCache();
951
955private:
960};
961
969inline uint ComputeMaxSize(uint base, uint max_space, uint step)
970{
971 if (base >= max_space || step == 0) return base;
972 if (step == 1) return max_space;
973 uint increment = max_space - base;
974 increment -= increment % step;
975 return base + increment;
976}
977
1026
1035
1044
1046 NWidContainerFlags flags;
1047 WidgetID index;
1048};
1049
1056
1062 uint8_t pre, inter, post;
1063};
1064
1074
1083
1091
1093 float ratio;
1094 AspectFlags flags;
1095};
1096
1101using NWidgetFunctionType = std::unique_ptr<NWidgetBase>();
1102
1107struct NWidgetPart {
1109 union NWidgetPartUnion {
1121
1122 /* Constructors for each NWidgetPartUnion data type. */
1123 constexpr NWidgetPartUnion() : xy() {}
1124 constexpr NWidgetPartUnion(Point xy) : xy(xy) {}
1125 constexpr NWidgetPartUnion(NWidgetPartDataTip data_tip) : data_tip(data_tip) {}
1126 constexpr NWidgetPartUnion(NWidgetPartWidget widget) : widget(widget) {}
1127 constexpr NWidgetPartUnion(NWidgetPartPaddings padding) : padding(padding) {}
1128 constexpr NWidgetPartUnion(NWidgetPartPIP pip) : pip(pip) {}
1129 constexpr NWidgetPartUnion(NWidgetPartTextLines text_lines) : text_lines(text_lines) {}
1130 constexpr NWidgetPartUnion(NWidgetPartTextStyle text_style) : text_style(text_style) {}
1131 constexpr NWidgetPartUnion(NWidgetPartAlignment align) : align(align) {}
1132 constexpr NWidgetPartUnion(NWidgetFunctionType *func_ptr) : func_ptr(func_ptr) {}
1133 constexpr NWidgetPartUnion(NWidgetPartContainer container) : container(container) {}
1134 constexpr NWidgetPartUnion(NWidgetPartAspect aspect) : aspect(aspect) {}
1135 } u;
1136
1137 /* Constructors for each NWidgetPart data type. */
1138 explicit constexpr NWidgetPart(WidgetType type) : type(type), u() {}
1139 constexpr NWidgetPart(WidgetType type, Point xy) : type(type), u(xy) {}
1140 constexpr NWidgetPart(WidgetType type, NWidgetPartDataTip data_tip) : type(type), u(data_tip) {}
1141 constexpr NWidgetPart(WidgetType type, NWidgetPartWidget widget) : type(type), u(widget) {}
1142 constexpr NWidgetPart(WidgetType type, NWidgetPartPaddings padding) : type(type), u(padding) {}
1143 constexpr NWidgetPart(WidgetType type, NWidgetPartPIP pip) : type(type), u(pip) {}
1144 constexpr NWidgetPart(WidgetType type, NWidgetPartTextLines text_lines) : type(type), u(text_lines) {}
1145 constexpr NWidgetPart(WidgetType type, NWidgetPartTextStyle text_style) : type(type), u(text_style) {}
1146 constexpr NWidgetPart(WidgetType type, NWidgetPartAlignment align) : type(type), u(align) {}
1147 constexpr NWidgetPart(WidgetType type, NWidgetFunctionType *func_ptr) : type(type), u(func_ptr) {}
1148 constexpr NWidgetPart(WidgetType type, NWidgetPartContainer container) : type(type), u(container) {}
1149 constexpr NWidgetPart(WidgetType type, NWidgetPartAspect aspect) : type(type), u(aspect) {}
1150};
1151
1158constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
1159{
1160 return NWidgetPart{WPT_RESIZE, Point{dx, dy}};
1161}
1162
1169constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
1170{
1171 return NWidgetPart{WPT_MINSIZE, Point{x, y}};
1172}
1173
1179{
1180 return NWidgetPart{WPT_MINSIZE, Point{4, 0}};
1181}
1182
1189{
1190 return NWidgetPart{WPT_MINSIZE, Point{20 * width + 2, 22}};
1191}
1192
1200constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size = FS_NORMAL)
1201{
1202 return NWidgetPart{WPT_MINTEXTLINES, NWidgetPartTextLines{lines, spacing, size}};
1203}
1204
1212{
1213 return NWidgetPart{WPT_TEXTSTYLE, NWidgetPartTextStyle{colour, size}};
1214}
1215
1225
1232constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
1233{
1234 return NWidgetPart{WPT_FILL, Point{fill_x, fill_y}};
1235}
1236
1243{
1245}
1246
1253constexpr NWidgetPart SetStringTip(StringID string, StringID tip = {})
1254{
1255 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string}, tip}};
1256}
1257
1264constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip = {})
1265{
1266 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.sprite = sprite}, tip}};
1267}
1268
1276constexpr NWidgetPart SetSpriteStringTip(SpriteID sprite, StringID string, StringID tip = {})
1277{
1278 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.string = string, .sprite = sprite}, tip}};
1279}
1280
1288{
1289 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.arrow_widget_type = widget_type}, tip}};
1290}
1291
1299{
1300 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.resize_widget_type = widget_type}, tip}};
1301}
1302
1309constexpr NWidgetPart SetAlternateColourTip(Colours colour, StringID tip)
1310{
1311 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.alternate_colour = colour}, tip}};
1312}
1313
1321constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip = {})
1322{
1323 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{.matrix{ cols, rows }}, tip}};
1324}
1325
1332{
1333 return NWidgetPart{WPT_DATATIP, NWidgetPartDataTip{{}, tip}};
1334}
1335
1345constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
1346{
1347 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{left, top, right, bottom}};
1348}
1349
1356constexpr NWidgetPart SetPadding(uint8_t horizontal, uint8_t vertical)
1357{
1358 return NWidgetPart{WPT_PADDING, NWidgetPartPaddings{horizontal, vertical, horizontal, vertical}};
1359}
1360
1366constexpr NWidgetPart SetPadding(const RectPadding &padding)
1367{
1369}
1370
1376constexpr NWidgetPart SetPadding(uint8_t padding)
1377{
1378 return SetPadding(padding, padding, padding, padding);
1379}
1380
1388constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
1389{
1390 return NWidgetPart{WPT_PIPSPACE, NWidgetPartPIP{pre, inter, post}};
1391}
1392
1400constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
1401{
1402 return NWidgetPart{WPT_PIPRATIO, NWidgetPartPIP{ratio_pre, ratio_inter, ratio_post}};
1403}
1404
1413{
1414 return NWidgetPart{WPT_SCROLLBAR, NWidgetPartWidget{INVALID_COLOUR, index}};
1415}
1416
1423constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlag::ResizeX)
1424{
1425 return NWidgetPart{WPT_ASPECT, NWidgetPartAspect{ratio, flags}};
1426}
1427
1437constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = INVALID_WIDGET)
1438{
1439 return NWidgetPart{tp, NWidgetPartWidget{col, idx}};
1440}
1441
1449constexpr NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = {}, WidgetID idx = INVALID_WIDGET)
1450{
1451 return NWidgetPart{tp, NWidgetPartContainer{cont_flags, idx}};
1452}
1453
1460{
1461 return NWidgetPart{WPT_FUNCTION, func_ptr};
1462}
1463
1465std::unique_ptr<NWidgetBase> MakeNWidgets(std::span<const NWidgetPart> nwid_parts, std::unique_ptr<NWidgetBase> &&container);
1466std::unique_ptr<NWidgetBase> MakeWindowNWidgetTree(std::span<const NWidgetPart> nwid_parts, NWidgetStacked **shade_select);
1467
1468std::unique_ptr<NWidgetBase> MakeCompanyButtonRows(WidgetID widget_first, WidgetID widget_last, Colours button_colour, int max_length, StringID button_tooltip, bool resizable = true);
1469
1471
1472#endif /* WIDGET_TYPE_H */
Enum-as-bit-set wrapper.
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2338
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:2348
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:2284
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2215
void AdjustPaddingForZoom() override
Adjust the padding based on the user interface zoom.
Definition widget.cpp:2209
NWidgetBackground(WidgetType tp, Colours colour, WidgetID index, std::unique_ptr< NWidgetPIPContainer > &&child=nullptr)
Constructor parent nested widgets.
Definition widget.cpp:2147
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:2181
std::unique_ptr< NWidgetPIPContainer > child
Child widget.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2302
void Add(std::unique_ptr< NWidgetBase > &&nwid)
Add a child to the parent.
Definition widget.cpp:2162
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:2296
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:2200
Baseclass for nested widgets.
void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height)
Store size and position.
virtual TextColour GetHighlightColour() const
Get the colour of the highlighted text.
float aspect_ratio
Desired aspect ratio of widget.
uint GetHorizontalStepSize(SizingType sizing) const
Get the horizontal sizing step.
virtual bool IsHighlighted() const
Whether the widget is currently highlighted or not.
virtual void AdjustPaddingForZoom()
Adjust the padding based on the user interface zoom.
Definition widget.cpp:970
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.
virtual void SetupSmallestSize(Window *w)=0
Compute smallest size needed by the widget.
uint smallest_x
Smallest horizontal size of the widget in a filled window.
AspectFlags aspect_flags
Which dimensions can be resized.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
virtual void Draw(const Window *w)=0
Draw the widgets of the tree.
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.
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.
uint smallest_y
Smallest vertical size of the widget in a filled window.
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).
virtual void SetHighlighted(TextColour highlight_colour)
Highlight the widget or not.
RectPadding padding
Padding added to the widget. Managed by parent container widget. (parent container may swap left and ...
virtual NWidgetCore * GetWidgetFromPos(int x, int y)=0
Retrieve a widget by its position.
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.
void Add(std::unique_ptr< NWidgetBase > &&wid)
Append widget wid to container.
Definition widget.cpp:1293
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1300
void UnfocusWidgets(Window *parent_window)
Unfocuses the focused widget of the window, if the focused widget is contained inside the container.
Definition widget.cpp:3486
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1308
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:1317
void AdjustPaddingForZoom() override
Adjust the padding based on the user interface zoom.
Definition widget.cpp:1281
NWidgetBase * GetWidgetOfType(WidgetType tp) override
Retrieve a widget by its type.
Definition widget.cpp:1271
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:1225
bool IsHighlighted() const override
Whether the widget is currently highlighted or not.
bool IsDisabled() const
Return whether the widget is disabled.
void SetSprite(SpriteID sprite)
Set sprite of the nested widget.
Definition widget.cpp:1175
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:1215
WidgetID GetScrollbarIndex() const
Get the WidgetID of this nested widget's scrollbar.
Definition widget.cpp:1261
TextColour highlight_colour
Colour of highlight.
void SetAlignment(StringAlignment align)
Set the text/image alignment of the nested widget.
Definition widget.cpp:1243
void SetResizeWidgetType(ResizeWidgetValues type)
Set the resize widget type of the nested widget.
Definition widget.cpp:1205
NWidgetCore(WidgetType tp, Colours colour, WidgetID index, uint fill_x, uint fill_y, const WidgetData &widget_data, StringID tool_tip)
Initialization of a 'real' widget.
Definition widget.cpp:1143
void SetSpriteTip(SpriteID sprite, StringID tool_tip)
Set sprite and tool tip of the nested widget.
Definition widget.cpp:1185
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:1252
WidgetID scrollbar_index
Index of an attached scrollbar.
StringID GetToolTip() const
Get the tool tip of the nested widget.
Definition widget.cpp:1234
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1266
void SetString(StringID string)
Set string of the nested widget.
Definition widget.cpp:1155
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:1196
void SetLowered(bool lowered)
Lower or raise the widget.
TextColour GetHighlightColour() const override
Get the colour of the highlighted text.
void SetStringTip(StringID string, StringID tool_tip)
Set string and tool tip of the nested widget.
Definition widget.cpp:1165
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.
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:1714
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1536
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:1605
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2966
static void InvalidateDimensionCache()
Reset the cached dimensions.
Definition widget.cpp:2643
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.
NWidgetLeaf(WidgetType tp, Colours colour, WidgetID index, const WidgetData &data, StringID tip)
Nested leaf widget.
Definition widget.cpp:2670
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:2779
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:3110
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2061
int count
Amount of valid elements.
void SetClicked(int clicked)
Sets the clicked element in the matrix.
Definition widget.cpp:1930
int GetCurrentElement() const
Get current element.
Definition widget.cpp:1980
Scrollbar * sb
The scrollbar we're associated with.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1985
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:1971
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:2116
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:2007
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:2031
int clicked
The currently clicked element.
void SetCount(int count)
Set the number of elements in this matrix.
Definition widget.cpp:1947
int widgets_y
The number of visible widgets in vertical direction.
Colours colour
Colour of this widget.
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:1529
uint8_t uz_pip_inter
Unscaled space between widgets.
uint8_t pip_ratio_pre
Ratio of remaining space before first widget.
void AdjustPaddingForZoom() override
Adjust the padding based on the user interface zoom.
Definition widget.cpp:1492
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:1509
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.
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:1024
bool UpdateSize(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1107
void AdjustPaddingForZoom() override
Adjust the padding based on the user interface zoom.
Definition widget.cpp:1010
uint min_x
Minimal horizontal size of only this widget.
FontSize uz_text_size
'Unscaled' font size, stored for resize calculation.
NWidgetResizeBase(WidgetType tp, WidgetID index, uint fill_x, uint fill_y)
Constructor for resizable nested widgets.
Definition widget.cpp:982
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:1063
void SetMinimalTextLines(uint8_t min_lines, uint8_t spacing, FontSize size)
Set minimal text lines for the widget.
Definition widget.cpp:1050
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:1087
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:1128
bool UpdateVerticalSize(uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1121
void SetResize(uint resize_x, uint resize_y)
Set resize step of the widget.
Definition widget.cpp:1074
void SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Set desired aspect ratio of this widget.
Definition widget.cpp:993
void SetMinimalSizeAbsolute(uint min_x, uint min_y)
Set absolute (post-scaling) minimal size of the widget.
Definition widget.cpp:1037
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2587
NWidgetScrollbar(WidgetType tp, Colours colour, WidgetID index)
Scrollbar widget.
Definition widget.cpp:2545
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2566
static Dimension horizontal_dimension
Cached size of horizontal scrollbar button.
static Dimension vertical_dimension
Cached size of vertical scrollbar button.
NWidgetSpacer(int width, int height)
Generic spacer widget.
Definition widget.cpp:1891
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1921
void SetDirty(const Window *w) const override
Mark the widget as 'dirty' (in need of repaint).
Definition widget.cpp:1916
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1904
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1897
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:1328
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:1369
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1399
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1423
void FillWidgetLookup(WidgetLookup &widget_lookup) override
Fill the Window::widget_lookup with pointers to nested widgets in the tree.
Definition widget.cpp:1389
NWidgetCore * GetWidgetFromPos(int x, int y) override
Retrieve a widget by its position.
Definition widget.cpp:1408
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:1788
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:1719
void UpdateViewportCoordinates(Window *w)
Update the position and size of the viewport (after eg a resize).
Definition widget.cpp:2403
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:2367
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Definition widget.cpp:2360
void InitializeViewport(Window *w, std::variant< TileIndex, VehicleID > focus, ZoomLevel zoom)
Initialize the viewport of the window.
Definition widget.cpp:2394
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:2426
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:2500
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:2447
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:3394
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:3375
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.
#define Rect
Macro that prevents name conflicts between included headers.
#define Point
Macro that prevents name conflicts between included headers.
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
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
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.
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:3318
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:3436
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