OpenTTD Source 20250924-master-gbec4e71d53
date_gui.cpp
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#include "stdafx.h"
11#include "strings_func.h"
13#include "window_func.h"
14#include "window_gui.h"
15#include "date_gui.h"
17#include "dropdown_type.h"
18#include "dropdown_func.h"
19
20#include "widgets/date_widget.h"
21
22#include "table/strings.h"
23
24#include "safeguards.h"
25
26
30 TimerGameEconomy::YearMonthDay date{};
33
45 Window(desc),
46 callback(std::move(callback)),
47 min_year(std::max(EconomyTime::MIN_YEAR, min_year)),
48 max_year(std::min(EconomyTime::MAX_YEAR, max_year))
49 {
50 assert(this->min_year <= this->max_year);
51 this->parent = parent;
52 this->InitNested(window_number);
53
54 if (initial_date == 0) initial_date = TimerGameEconomy::date;
55 this->date = TimerGameEconomy::ConvertDateToYMD(initial_date);
56 this->date.year = Clamp(this->date.year, min_year, max_year);
57 }
58
59 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
60 {
61 Point pt = { this->parent->left + this->parent->width / 2 - sm_width / 2, this->parent->top + this->parent->height / 2 - sm_height / 2 };
62 return pt;
63 }
64
70 {
71 int selected;
72 DropDownList list;
73
74 switch (widget) {
75 default: NOT_REACHED();
76
77 case WID_SD_DAY:
78 for (uint i = 0; i < 31; i++) {
79 list.push_back(MakeDropDownListStringItem(STR_DAY_NUMBER_1ST + i, i + 1));
80 }
81 selected = this->date.day;
82 break;
83
84 case WID_SD_MONTH:
85 for (uint i = 0; i < 12; i++) {
86 list.push_back(MakeDropDownListStringItem(STR_MONTH_JAN + i, i));
87 }
88 selected = this->date.month;
89 break;
90
91 case WID_SD_YEAR:
92 for (TimerGameEconomy::Year i = this->min_year; i <= this->max_year; i++) {
93 list.push_back(MakeDropDownListStringItem(GetString(STR_JUST_INT, i), i.base()));
94 }
95 selected = this->date.year.base();
96 break;
97 }
98
99 ShowDropDownList(this, std::move(list), selected, widget);
100 }
101
102 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
103 {
104 Dimension d = {0, 0};
105 switch (widget) {
106 default: return;
107
108 case WID_SD_DAY:
109 for (uint i = 0; i < 31; i++) {
110 d = maxdim(d, GetStringBoundingBox(STR_DAY_NUMBER_1ST + i));
111 }
112 break;
113
114 case WID_SD_MONTH:
115 for (uint i = 0; i < 12; i++) {
116 d = maxdim(d, GetStringBoundingBox(STR_MONTH_JAN + i));
117 }
118 break;
119
120 case WID_SD_YEAR:
121 d = maxdim(d, GetStringBoundingBox(GetString(STR_JUST_INT, GetParamMaxValue(this->max_year.base()))));
122 break;
123 }
124
125 d.width += padding.width;
126 d.height += padding.height;
127 size = d;
128 }
129
130 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
131 {
132 switch (widget) {
133 case WID_SD_DAY: return GetString(STR_DAY_NUMBER_1ST + this->date.day - 1);
134 case WID_SD_MONTH: return GetString(STR_MONTH_JAN + this->date.month);
135 case WID_SD_YEAR: return GetString(STR_JUST_INT, this->date.year);
136 default: return this->Window::GetWidgetString(widget, stringid);
137 }
138 }
139
140 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
141 {
142 switch (widget) {
143 case WID_SD_DAY:
144 case WID_SD_MONTH:
145 case WID_SD_YEAR:
146 ShowDateDropDown(widget);
147 break;
148
149 case WID_SD_SET_DATE:
150 this->callback(this, TimerGameEconomy::ConvertYMDToDate(this->date.year, this->date.month, this->date.day));
151 this->Close();
152 break;
153 }
154 }
155
156 void OnDropdownSelect(WidgetID widget, int index, int) override
157 {
158 switch (widget) {
159 case WID_SD_DAY:
160 this->date.day = index;
161 break;
162
163 case WID_SD_MONTH:
164 this->date.month = index;
165 break;
166
167 case WID_SD_YEAR:
168 this->date.year = TimerGameEconomy::Year{index};
169 break;
170 }
171 this->SetDirty();
172 }
173};
174
178 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
179 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_DATE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
180 EndContainer(),
181 NWidget(WWT_PANEL, COLOUR_BROWN),
182 NWidget(NWID_VERTICAL), SetPIP(6, 6, 6),
184 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_SD_DAY), SetFill(1, 0), SetToolTip(STR_DATE_DAY_TOOLTIP),
185 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_SD_MONTH), SetFill(1, 0), SetToolTip(STR_DATE_MONTH_TOOLTIP),
186 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_SD_YEAR), SetFill(1, 0), SetToolTip(STR_DATE_YEAR_TOOLTIP),
187 EndContainer(),
190 NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_SD_SET_DATE), SetMinimalSize(100, 12), SetStringTip(STR_DATE_SET_DATE, STR_DATE_SET_DATE_TOOLTIP),
192 EndContainer(),
193 EndContainer(),
195};
196
199 WDP_CENTER, {}, 0, 0,
201 {},
203);
204
214void ShowSetDateWindow(Window *parent, int window_number, TimerGameEconomy::Date initial_date, TimerGameEconomy::Year min_year, TimerGameEconomy::Year max_year, SetDateCallback &&callback)
215{
217 new SetDateWindow(_set_date_desc, window_number, parent, initial_date, min_year, max_year, std::move(callback));
218}
Storage class for Economy time constants.
static Date date
Current date in days (day counter).
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static WindowDesc _set_date_desc(WDP_CENTER, {}, 0, 0, WC_SET_DATE, WC_NONE, {}, _nested_set_date_widgets)
Description of the date setting window.
void ShowSetDateWindow(Window *parent, int window_number, TimerGameEconomy::Date initial_date, TimerGameEconomy::Year min_year, TimerGameEconomy::Year max_year, SetDateCallback &&callback)
Create the new 'set date' window.
Definition date_gui.cpp:214
static constexpr NWidgetPart _nested_set_date_widgets[]
Widgets for the date setting window.
Definition date_gui.cpp:176
Functions related to the graphical selection of a date.
std::function< void(const Window *w, TimerGameEconomy::Date date)> SetDateCallback
Callback for when a date has been chosen.
Definition date_gui.h:21
Types related to the date widgets.
@ WID_SD_DAY
Dropdown for the day.
Definition date_widget.h:15
@ WID_SD_YEAR
Dropdown for the year.
Definition date_widget.h:17
@ WID_SD_SET_DATE
Actually set the date.
Definition date_widget.h:18
@ WID_SD_MONTH
Dropdown for the month.
Definition date_widget.h:16
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:415
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:895
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
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 NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:966
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
A number of safeguards to prevent using unsafe methods.
Definition of base types and functions in a cross-platform compatible way.
uint64_t GetParamMaxValue(uint64_t max_value, uint min_count, FontSize size)
Get some number that is suitable for string size computations.
Definition strings.cpp:236
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
Functions related to OTTD's 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.
Partial widget specification to allow NWidgets to be written nested.
Window to select a date graphically by using dropdowns.
Definition date_gui.cpp:28
Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number) override
Compute the initial position of the window.
Definition date_gui.cpp:59
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition date_gui.cpp:140
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
Definition date_gui.cpp:102
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
Definition date_gui.cpp:156
TimerGameEconomy::Year min_year
The minimum year in the year dropdown.
Definition date_gui.cpp:31
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
Definition date_gui.cpp:130
SetDateCallback callback
Callback to call when a date has been selected.
Definition date_gui.cpp:29
SetDateWindow(WindowDesc &desc, WindowNumber window_number, Window *parent, TimerGameEconomy::Date initial_date, TimerGameEconomy::Year min_year, TimerGameEconomy::Year max_year, SetDateCallback &&callback)
Create the new 'set date' window.
Definition date_gui.cpp:44
void ShowDateDropDown(WidgetID widget)
Helper function to construct the dropdown.
Definition date_gui.cpp:69
TimerGameEconomy::Year max_year
The maximum year (inclusive) in the year dropdown.
Definition date_gui.cpp:32
TimerGameEconomy::YearMonthDay date
The currently selected date.
Definition date_gui.cpp:30
Templated helper to make a type-safe 'typedef' representing a single POD value.
High level window description.
Definition window_gui.h:167
Number to differentiate different windows of the same class.
Data structure for an opened window.
Definition window_gui.h:273
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1102
Window * parent
Parent window.
Definition window_gui.h:328
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:504
ResizeInfo resize
Resize information.
Definition window_gui.h:314
int left
x position of left edge of the window
Definition window_gui.h:309
int top
y position of top edge of the window
Definition window_gui.h:310
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1802
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:312
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:302
Definition of the game-economy-timer.
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:71
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:67
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:53
@ 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_DROPDOWN
Drop down list.
Definition widget_type.h:62
@ EqualSize
Containers should keep all their (resizing) children equally large.
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1205
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WDP_CENTER
Center the window.
Definition window_gui.h:145
int WidgetID
Widget ID.
Definition window_type.h:20
@ WC_SET_DATE
Set date; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50