1 /* $Id: date_gui.cpp 26086 2013-11-24 14:46:26Z rubidium $ */
4 * This file is part of OpenTTD.
5 * 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.
6 * 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.
7 * 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/>.
10 /** @file date_gui.cpp Graphical selection of a date. */
13 #include "strings_func.h"
14 #include "date_func.h"
15 #include "window_func.h"
16 #include "window_gui.h"
18 #include "core/geometry_func.hpp"
20 #include "widgets/dropdown_type.h"
21 #include "widgets/date_widget.h"
23 #include "safeguards.h"
26 /** Window to select a date graphically by using dropdowns */
27 struct SetDateWindow
: Window
{
28 SetDateCallback
*callback
; ///< Callback to call when a date has been selected
29 YearMonthDay date
; ///< The currently selected date
30 Year min_year
; ///< The minimum year in the year dropdown
31 Year max_year
; ///< The maximum year (inclusive) in the year dropdown
34 * Create the new 'set date' window
35 * @param desc the window description
36 * @param window_number number of the window
37 * @param parent the parent window, i.e. if this closes we should close too
38 * @param initial_date the initial date to show
39 * @param min_year the minimum year to show in the year dropdown
40 * @param max_year the maximum year (inclusive) to show in the year dropdown
41 * @param callback the callback to call once a date has been selected
43 SetDateWindow(WindowDesc
*desc
, WindowNumber window_number
, Window
*parent
, Date initial_date
, Year min_year
, Year max_year
, SetDateCallback
*callback
) :
46 min_year(max(MIN_YEAR
, min_year
)),
47 max_year(min(MAX_YEAR
, max_year
))
49 assert(this->min_year
<= this->max_year
);
50 this->parent
= parent
;
51 this->InitNested(window_number
);
53 if (initial_date
== 0) initial_date
= _date
;
54 ConvertDateToYMD(initial_date
, &this->date
);
55 this->date
.year
= Clamp(this->date
.year
, min_year
, max_year
);
58 virtual Point
OnInitialPosition(int16 sm_width
, int16 sm_height
, int window_number
)
60 Point pt
= { this->parent
->left
+ this->parent
->width
/ 2 - sm_width
/ 2, this->parent
->top
+ this->parent
->height
/ 2 - sm_height
/ 2 };
65 * Helper function to construct the dropdown.
66 * @param widget the dropdown widget to create the dropdown for
68 void ShowDateDropDown(int widget
)
71 DropDownList
*list
= new DropDownList();
74 default: NOT_REACHED();
77 for (uint i
= 0; i
< 31; i
++) {
78 *list
->Append() = new DropDownListStringItem(STR_DAY_NUMBER_1ST
+ i
, i
+ 1, false);
80 selected
= this->date
.day
;
84 for (uint i
= 0; i
< 12; i
++) {
85 *list
->Append() = new DropDownListStringItem(STR_MONTH_JAN
+ i
, i
, false);
87 selected
= this->date
.month
;
91 for (Year i
= this->min_year
; i
<= this->max_year
; i
++) {
92 DropDownListParamStringItem
*item
= new DropDownListParamStringItem(STR_JUST_INT
, i
, false);
94 *list
->Append() = item
;
96 selected
= this->date
.year
;
100 ShowDropDownList(this, list
, selected
, widget
);
103 virtual void UpdateWidgetSize(int widget
, Dimension
*size
, const Dimension
&padding
, Dimension
*fill
, Dimension
*resize
)
105 Dimension d
= {0, 0};
110 for (uint i
= 0; i
< 31; i
++) {
111 d
= maxdim(d
, GetStringBoundingBox(STR_DAY_NUMBER_1ST
+ i
));
116 for (uint i
= 0; i
< 12; i
++) {
117 d
= maxdim(d
, GetStringBoundingBox(STR_MONTH_JAN
+ i
));
122 SetDParamMaxValue(0, this->max_year
);
123 d
= maxdim(d
, GetStringBoundingBox(STR_JUST_INT
));
127 d
.width
+= padding
.width
;
128 d
.height
+= padding
.height
;
132 virtual void SetStringParameters(int widget
) const
135 case WID_SD_DAY
: SetDParam(0, this->date
.day
- 1 + STR_DAY_NUMBER_1ST
); break;
136 case WID_SD_MONTH
: SetDParam(0, this->date
.month
+ STR_MONTH_JAN
); break;
137 case WID_SD_YEAR
: SetDParam(0, this->date
.year
); break;
141 virtual void OnClick(Point pt
, int widget
, int click_count
)
147 ShowDateDropDown(widget
);
150 case WID_SD_SET_DATE
:
151 if (this->callback
!= nullptr) this->callback(this, ConvertYMDToDate(this->date
.year
, this->date
.month
, this->date
.day
));
157 virtual void OnDropdownSelect(int widget
, int index
)
161 this->date
.day
= index
;
165 this->date
.month
= index
;
169 this->date
.year
= index
;
176 /** Widgets for the date setting window. */
177 static const NWidgetPart _nested_set_date_widgets
[] = {
178 NWidget(NWID_HORIZONTAL
),
179 NWidget(WWT_CLOSEBOX
, COLOUR_BROWN
),
180 NWidget(WWT_CAPTION
, COLOUR_BROWN
), SetDataTip(STR_DATE_CAPTION
, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS
),
182 NWidget(WWT_PANEL
, COLOUR_BROWN
),
183 NWidget(NWID_VERTICAL
), SetPIP(6, 6, 6),
184 NWidget(NWID_HORIZONTAL
, NC_EQUALSIZE
), SetPIP(6, 6, 6),
185 NWidget(WWT_DROPDOWN
, COLOUR_ORANGE
, WID_SD_DAY
), SetFill(1, 0), SetDataTip(STR_JUST_STRING
, STR_DATE_DAY_TOOLTIP
),
186 NWidget(WWT_DROPDOWN
, COLOUR_ORANGE
, WID_SD_MONTH
), SetFill(1, 0), SetDataTip(STR_JUST_STRING
, STR_DATE_MONTH_TOOLTIP
),
187 NWidget(WWT_DROPDOWN
, COLOUR_ORANGE
, WID_SD_YEAR
), SetFill(1, 0), SetDataTip(STR_JUST_INT
, STR_DATE_YEAR_TOOLTIP
),
189 NWidget(NWID_HORIZONTAL
),
190 NWidget(NWID_SPACER
), SetFill(1, 0),
191 NWidget(WWT_PUSHTXTBTN
, COLOUR_BROWN
, WID_SD_SET_DATE
), SetMinimalSize(100, 12), SetDataTip(STR_DATE_SET_DATE
, STR_DATE_SET_DATE_TOOLTIP
),
192 NWidget(NWID_SPACER
), SetFill(1, 0),
198 /** Description of the date setting window. */
199 static WindowDesc
_set_date_desc(
200 WDP_CENTER
, nullptr, 0, 0,
201 WC_SET_DATE
, WC_NONE
,
203 _nested_set_date_widgets
, lengthof(_nested_set_date_widgets
)
207 * Create the new 'set date' window
208 * @param window_number number for the window
209 * @param parent the parent window, i.e. if this closes we should close too
210 * @param initial_date the initial date to show
211 * @param min_year the minimum year to show in the year dropdown
212 * @param max_year the maximum year (inclusive) to show in the year dropdown
213 * @param callback the callback to call once a date has been selected
215 void ShowSetDateWindow(Window
*parent
, int window_number
, Date initial_date
, Year min_year
, Year max_year
, SetDateCallback
*callback
)
217 DeleteWindowByClass(WC_SET_DATE
);
218 new SetDateWindow(&_set_date_desc
, window_number
, parent
, initial_date
, min_year
, max_year
, callback
);