OpenTTD Source 20241224-master-gee860a5c8e
game_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 "../error.h"
12#include "../settings_gui.h"
13#include "../querystring_gui.h"
14#include "../window_func.h"
15#include "../network/network.h"
16#include "../network/network_content.h"
17#include "../dropdown_type.h"
18#include "../dropdown_func.h"
19#include "../timer/timer.h"
20#include "../timer/timer_window.h"
21
22#include "game.hpp"
23#include "game_gui.hpp"
24#include "game_config.hpp"
25#include "game_info.hpp"
26#include "../script/script_gui.h"
27#include "../script_config.hpp"
28#include "../table/strings.h"
29
30#include "../safeguards.h"
31
32
36 NWidget(WWT_CLOSEBOX, COLOUR_MAUVE),
37 NWidget(WWT_CAPTION, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_CAPTION_GAMESCRIPT, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
38 NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE),
40 NWidget(WWT_PANEL, COLOUR_MAUVE, WID_GSC_BACKGROUND),
42 NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT, STR_NULL), SetFill(1, 0), SetResize(1, 0),
43 NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_GSLIST), SetMinimalSize(288, 14), SetFill(1, 1), SetResize(1, 0), SetMatrixDataTip(1, 1, STR_AI_CONFIG_GAMELIST_TOOLTIP),
45 NWidget(WWT_FRAME, COLOUR_MAUVE), SetDataTip(STR_AI_CONFIG_GAMESCRIPT_PARAM, STR_NULL), SetFill(1, 1), SetResize(1, 0), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0),
47 NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_SETTINGS), SetFill(1, 0), SetResize(1, 1), SetMinimalSize(188, 182), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_GSC_SCROLLBAR),
50 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL),
54 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP),
55 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
59 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP),
60 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP),
63 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP),
64 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP),
70 NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0),
71 NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE),
74};
75
78 WDP_CENTER, "settings_gs_config", 500, 350,
80 0,
82);
83
87struct GSConfigWindow : public Window {
96 typedef std::vector<const ScriptConfigItem *> VisibleSettingsList;
98
100 clicked_button(-1),
103 {
104 this->gs_config = GameConfig::GetConfig();
105
106 this->CreateNestedTree(); // Initializes 'this->line_height' as a side effect.
107 this->vscroll = this->GetScrollbar(WID_GSC_SCROLLBAR);
109 this->OnInvalidateData(0);
110
112 }
113
114 void Close([[maybe_unused]] int data = 0) override
115 {
117 this->Window::Close();
118 }
119
126 {
127 visible_settings.clear();
128
129 for (const auto &item : *this->gs_config->GetConfigList()) {
130 bool no_hide = (item.flags & SCRIPTCONFIG_DEVELOPER) == 0;
132 visible_settings.push_back(&item);
133 }
134 }
135
136 this->vscroll->SetCount(this->visible_settings.size());
137 }
138
140 {
141 switch (widget) {
142 case WID_GSC_SETTINGS:
143 this->line_height = std::max(SETTING_BUTTON_HEIGHT, GetCharacterHeight(FS_NORMAL)) + padding.height;
144 resize.width = 1;
145 resize.height = this->line_height;
146 size.height = 5 * this->line_height;
147 break;
148
149 case WID_GSC_GSLIST:
150 this->line_height = GetCharacterHeight(FS_NORMAL) + padding.height;
151 size.height = 1 * this->line_height;
152 break;
153 }
154 }
155
160 static bool IsEditable()
161 {
162 return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr;
163 }
164
165 void DrawWidget(const Rect &r, WidgetID widget) const override
166 {
167 switch (widget) {
168 case WID_GSC_GSLIST: {
170
171 if (GameConfig::GetConfig()->GetInfo() != nullptr) {
172 SetDParamStr(0, GameConfig::GetConfig()->GetInfo()->GetName());
173 text = STR_JUST_RAW_STRING;
174 }
175
176 /* There is only one slot, unlike with the GS GUI, so it should never be white */
177 DrawString(r.Shrink(WidgetDimensions::scaled.matrix), text, (IsEditable() ? TC_ORANGE : TC_SILVER));
178 break;
179 }
180 case WID_GSC_SETTINGS: {
181 Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
182 bool rtl = _current_text_dir == TD_RTL;
185
186 int y = r.top;
187 int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
188 int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2;
189
190 const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings);
191 for (auto it = first; it != last; ++it) {
192 const ScriptConfigItem &config_item = **it;
193 int current_value = this->gs_config->GetSetting(config_item.name);
194 bool editable = this->IsEditableItem(config_item);
195
196 StringID str;
197 TextColour colour;
198 uint idx = 0;
199 if (config_item.description.empty()) {
200 str = STR_JUST_STRING1;
201 colour = TC_ORANGE;
202 } else {
204 colour = TC_LIGHT_BLUE;
205 SetDParamStr(idx++, config_item.description);
206 }
207
208 if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) {
209 DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable);
211 } else {
212 int i = static_cast<int>(std::distance(std::begin(this->visible_settings), it));
213 if (config_item.complete_labels) {
214 DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
215 } else {
216 DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
217 }
218
219 auto config_iterator = config_item.labels.find(current_value);
220 if (config_iterator != config_item.labels.end()) {
222 SetDParamStr(idx++, config_iterator->second);
223 } else {
226 }
227 }
228
229 DrawString(tr.left, tr.right, y + text_y_offset, str, colour);
230 y += this->line_height;
231 }
232 break;
233 }
234 }
235 }
236
237 void OnPaint() override
238 {
239 if (this->closing_dropdown) {
240 this->closing_dropdown = false;
241 this->clicked_dropdown = false;
242 }
243 this->DrawWidgets();
244 }
245
246 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
247 {
248 if (widget >= WID_GSC_TEXTFILE && widget < WID_GSC_TEXTFILE + TFT_CONTENT_END) {
249 if (GameConfig::GetConfig() == nullptr) return;
250
252 return;
253 }
254
255 switch (widget) {
256 case WID_GSC_GSLIST: {
257 this->InvalidateData();
258 if (click_count > 1 && _game_mode != GM_NORMAL) ShowScriptListWindow((CompanyID)OWNER_DEITY, _ctrl_pressed);
259 break;
260 }
261
262 case WID_GSC_CHANGE: // choose other Game Script
264 break;
265
267 if (!_network_available) {
269 } else {
271 }
272 break;
273
274 case WID_GSC_SETTINGS: {
275 auto it = this->vscroll->GetScrolledItemFromWidget(this->visible_settings, pt.y, this, widget);
276 if (it == this->visible_settings.end()) break;
277
278 const ScriptConfigItem &config_item = **it;
279 if (!this->IsEditableItem(config_item)) return;
280
281 int num = it - this->visible_settings.begin();
282 if (this->clicked_row != num) {
285 this->clicked_row = num;
286 this->clicked_dropdown = false;
287 }
288
289 bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0;
290
291 Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.matrix, RectPadding::zero);
292 int x = pt.x - r.left;
293 if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x;
294
295 /* One of the arrows is clicked (or green/red rect in case of bool value) */
296 int old_val = this->gs_config->GetSetting(config_item.name);
297 if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) {
298 if (this->clicked_dropdown) {
299 /* unclick the dropdown */
301 this->clicked_dropdown = false;
302 this->closing_dropdown = false;
303 } else {
304 int rel_y = (pt.y - r.top) % this->line_height;
305
306 Rect wi_rect;
307 wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);
308 wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1;
309 wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
310 wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1;
311
312 /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */
313 if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) {
314 this->clicked_dropdown = true;
315 this->closing_dropdown = false;
316
317 DropDownList list;
318 for (int i = config_item.min_value; i <= config_item.max_value; i++) {
319 list.push_back(MakeDropDownListStringItem(config_item.labels.find(i)->second, i));
320 }
321
322 ShowDropDownListAt(this, std::move(list), old_val, WID_GSC_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE);
323 }
324 }
325 } else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) {
326 int new_val = old_val;
327 if (bool_item) {
328 new_val = !new_val;
329 } else if (x >= SETTING_BUTTON_WIDTH / 2) {
330 /* Increase button clicked */
331 new_val += config_item.step_size;
332 if (new_val > config_item.max_value) new_val = config_item.max_value;
333 this->clicked_increase = true;
334 } else {
335 /* Decrease button clicked */
336 new_val -= config_item.step_size;
337 if (new_val < config_item.min_value) new_val = config_item.min_value;
338 this->clicked_increase = false;
339 }
340
341 if (new_val != old_val) {
342 this->gs_config->SetSetting(config_item.name, new_val);
343 this->clicked_button = num;
344 this->unclick_timeout.Reset();
345 }
346 } else if (!bool_item && !config_item.complete_labels) {
347 /* Display a query box so users can enter a custom value. */
348 SetDParam(0, old_val);
350 }
351 this->SetDirty();
352 break;
353 }
354
355 case WID_GSC_OPEN_URL: {
357 if (config == nullptr || config->GetInfo() == nullptr) return;
358 OpenBrowser(config->GetInfo()->GetURL());
359 break;
360 }
361
362 case WID_GSC_RESET:
363 this->gs_config->ResetEditableSettings(_game_mode == GM_MENU);
364 this->SetDirty();
365 break;
366 }
367 }
368
369 void OnQueryTextFinished(std::optional<std::string> str) override
370 {
371 if (!str.has_value() || str->empty()) return;
372 int32_t value = atoi(str->c_str());
373 SetValue(value);
374 }
375
376 void OnDropdownSelect(WidgetID widget, int index) override
377 {
378 if (widget != WID_GSC_SETTING_DROPDOWN) return;
379 assert(this->clicked_dropdown);
380 SetValue(index);
381 }
382
383 void OnDropdownClose(Point, WidgetID widget, int, bool) override
384 {
385 if (widget != WID_GSC_SETTING_DROPDOWN) return;
386 /* We cannot raise the dropdown button just yet. OnClick needs some hint, whether
387 * the same dropdown button was clicked again, and then not open the dropdown again.
388 * So, we only remember that it was closed, and process it on the next OnPaint, which is
389 * after OnClick. */
390 assert(this->clicked_dropdown);
391 this->closing_dropdown = true;
392 this->SetDirty();
393 }
394
395 void OnResize() override
396 {
397 this->vscroll->SetCapacityFromWidget(this, WID_GSC_SETTINGS);
398 }
399
401 TimeoutTimer<TimerWindow> unclick_timeout = {std::chrono::milliseconds(150), [this]() {
402 this->clicked_button = -1;
403 this->SetDirty();
404 }};
405
411 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
412 {
413 if (!gui_scope) return;
414
415 this->SetWidgetDisabledState(WID_GSC_CHANGE, (_game_mode == GM_NORMAL) || !IsEditable());
416
418 this->SetWidgetDisabledState(WID_GSC_OPEN_URL, config->GetInfo() == nullptr || config->GetInfo()->GetURL().empty());
419 for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) {
421 }
425 }
426private:
427 bool IsEditableItem(const ScriptConfigItem &config_item) const
428 {
429 return _game_mode == GM_MENU
430 || _game_mode == GM_EDITOR
431 || (config_item.flags & SCRIPTCONFIG_INGAME) != 0
433 }
434
435 void SetValue(int value)
436 {
438 if (_game_mode == GM_NORMAL && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
439 this->gs_config->SetSetting(config_item.name, value);
440 this->SetDirty();
441 }
442};
443
static GameConfig * GetConfig(ScriptSettingSource source=SSS_DEFAULT)
Get the config of a company.
static class GameInstance * GetInstance()
Get the current active instance.
Definition game.hpp:101
Script settings.
std::optional< std::string > GetTextfile(TextfileType type, CompanyID slot) const
Search a textfile file next to this script.
void SetSetting(const std::string_view name, int value)
Set the value of a setting for this config.
const ScriptConfigItemList * GetConfigList()
Get the config list for this ScriptConfig.
int GetSetting(const std::string &name) const
Get the value of a setting for this config.
void ResetEditableSettings(bool yet_to_start)
Reset only editable and visible settings to their default value.
const std::string & GetURL() const
Get the website for this script.
Scrollbar data structure.
void SetCount(size_t num)
Sets the number of elements in the list.
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.
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:2451
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
A timeout timer will fire once after the interval.
Definition timer.h:116
void Reset()
Reset the timer, so it will fire again after the timeout.
Definition timer.h:140
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:96
RectPadding matrix
Padding of WWT_MATRIX items.
Definition window_gui.h:44
Owner
Enum for all companies/owners.
@ OWNER_DEITY
The object is owned by a superuser / goal script.
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:386
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
Display an error message in a window.
@ WL_ERROR
Errors (eg. saving/loading failed)
Definition error.h:26
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Base functions for all Games.
GameConfig stores the configuration settings of every Game.
static constexpr NWidgetPart _nested_gs_config_widgets[]
Widgets for the configure GS window.
Definition game_gui.cpp:34
static WindowDesc _gs_config_desc(WDP_CENTER, "settings_gs_config", 500, 350, WC_GAME_OPTIONS, WC_NONE, 0, _nested_gs_config_widgets)
Window definition for the configure GS window.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:445
Window for configuring the Games
GameInfo keeps track of all information of an Game, like Author, Description, ...
@ WID_GSC_GSLIST
List with current selected Game Script.
Definition game_widget.h:18
@ WID_GSC_SETTING_DROPDOWN
Dynamically created dropdown for changing setting value.
Definition game_widget.h:27
@ WID_GSC_SETTINGS
Panel to draw the Game Script settings on.
Definition game_widget.h:19
@ WID_GSC_CONTENT_DOWNLOAD
Download content button.
Definition game_widget.h:24
@ WID_GSC_OPEN_URL
Open GS URL.
Definition game_widget.h:22
@ WID_GSC_SCROLLBAR
Scrollbar to scroll through the selected AIs.
Definition game_widget.h:20
@ WID_GSC_CHANGE
Select another Game Script button.
Definition game_widget.h:21
@ WID_GSC_BACKGROUND
Window background.
Definition game_widget.h:17
@ WID_GSC_TEXTFILE
Open GS readme, changelog (+1) or license (+2).
Definition game_widget.h:23
@ WID_GSC_RESET
Reset button.
Definition game_widget.h:25
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition gfx_type.h:260
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 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 SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:940
constexpr bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _network_available
is network mode available?
Definition network.cpp:67
void ShowNetworkContentListWindow(ContentVector *cv=nullptr, ContentType type1=CONTENT_TYPE_END, ContentType type2=CONTENT_TYPE_END)
Show the content list window with a given set of content.
@ SCRIPTCONFIG_INGAME
This setting can be changed while the Script is running.
@ SCRIPTCONFIG_BOOLEAN
This value is a boolean (either 0 (false) or 1 (true) ).
@ SCRIPTCONFIG_DEVELOPER
This setting will only be visible when the Script development tools are active.
static const int INT32_DIGITS_WITH_SIGN_AND_TERMINATION
Maximum of 10 digits for MIN / MAX_INT32, 1 for the sign and 1 for '\0'.
void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot)
Open the Script version of the textfile window.
void ShowScriptListWindow(CompanyID slot, bool show_all)
Open the Script list window to chose a script for the given company slot.
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:56
void DrawArrowButtons(int x, int y, Colours button_colour, uint8_t state, bool clickable_left, bool clickable_right)
Draw [<][>] boxes.
void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool clickable)
Draw a dropdown button.
void DrawBoolButton(int x, int y, bool state, bool clickable)
Draw a toggle button.
#define SETTING_BUTTON_WIDTH
Width of setting buttons.
#define SETTING_BUTTON_HEIGHT
Height of setting buttons.
@ CS_NUMERAL_SIGNED
Only numbers and '-' for negative values.
Definition string_type.h:28
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Definition strings.cpp:371
@ TD_RTL
Text is written right-to-left by default.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
Window to configure which GSs will start.
Definition game_gui.cpp:87
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition game_gui.cpp:411
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
Definition game_gui.cpp:376
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition game_gui.cpp:114
void OnResize() override
Called after the window got resized.
Definition game_gui.cpp:395
void OnPaint() override
The window must be repainted.
Definition game_gui.cpp:237
VisibleSettingsList visible_settings
List of visible GS settings.
Definition game_gui.cpp:97
bool closing_dropdown
True, if the dropdown list is currently closing.
Definition game_gui.cpp:93
std::vector< const ScriptConfigItem * > VisibleSettingsList
typdef for a vector of script settings
Definition game_gui.cpp:96
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
Definition game_gui.cpp:369
int line_height
Height of a single GS-name line.
Definition game_gui.cpp:89
int clicked_button
The button we clicked.
Definition game_gui.cpp:90
void RebuildVisibleSettings()
Rebuilds the list of visible settings.
Definition game_gui.cpp:125
Scrollbar * vscroll
Cache of the vertical scrollbar.
Definition game_gui.cpp:95
ScriptConfig * gs_config
The configuration we're modifying.
Definition game_gui.cpp:88
TimeoutTimer< TimerWindow > unclick_timeout
When reset, unclick the button after a small timeout.
Definition game_gui.cpp:401
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 game_gui.cpp:139
bool clicked_increase
Whether we clicked the increase or decrease button.
Definition game_gui.cpp:91
static bool IsEditable()
Can the GS config be edited?
Definition game_gui.cpp:160
int clicked_row
The clicked row of settings.
Definition game_gui.cpp:94
bool clicked_dropdown
Whether the dropdown is open.
Definition game_gui.cpp:92
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition game_gui.cpp:165
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition game_gui.cpp:246
void OnDropdownClose(Point, WidgetID widget, int, bool) override
A dropdown window associated to this window has been closed.
Definition game_gui.cpp:383
bool ai_developer_tools
activate AI/GS developer tools
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
int Width() const
Get width of Rect.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Info about a single Script setting.
std::string name
The name of the configuration setting.
High level window description.
Definition window_gui.h:159
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:1047
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1733
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:732
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3159
void CloseChildWindows(WindowClass wc=WC_INVALID) const
Close all children a window might have in a head-recursive manner.
Definition window.cpp:1035
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1723
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:977
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition window.cpp:314
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:387
@ CONTENT_TYPE_GAME
The content consists of a game script.
TextfileType
Additional text files accompanying Tar archives.
@ TFT_LICENSE
Content license.
@ TFT_README
Content readme.
@ TFT_CHANGELOG
Content changelog.
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:79
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:59
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:85
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
@ WWT_FRAME
Frame.
Definition widget_type.h:60
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:68
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:65
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:40
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1152
@ WDP_CENTER
Center the window.
Definition window_gui.h:148
int WidgetID
Widget ID.
Definition window_type.h:18
@ WN_GAME_OPTIONS_GS
GS settings.
Definition window_type.h:23
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:45
@ WC_SCRIPT_LIST
Scripts list; Window numbers:
@ WC_GAME_OPTIONS
Game options window; Window numbers:
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
@ WC_QUERY_STRING
Query string window; Window numbers: