OpenTTD Source  20241108-master-g80f628063a
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 
34 static constexpr NWidgetPart _nested_gs_config_widgets[] = {
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),
39  EndContainer(),
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),
44  EndContainer(),
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),
49  EndContainer(),
50  NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_AI_SETTINGS_RESET, STR_NULL),
51  EndContainer(),
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),
56  EndContainer(),
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),
61  EndContainer(),
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),
65  EndContainer(),
66  EndContainer(),
67  EndContainer(),
68  EndContainer(),
70  NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0),
71  NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), SetDataTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE),
72  EndContainer(),
73  EndContainer(),
74 };
75 
78  WDP_CENTER, "settings_gs_config", 500, 350,
80  0,
82 );
83 
87 struct GSConfigWindow : public Window {
96  typedef std::vector<const ScriptConfigItem *> VisibleSettingsList;
98 
100  clicked_button(-1),
101  clicked_dropdown(false),
102  closing_dropdown(false)
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 
111  this->RebuildVisibleSettings();
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;
131  if (no_hide || _settings_client.gui.ai_developer_tools) {
132  visible_settings.push_back(&item);
133  }
134  }
135 
136  this->vscroll->SetCount(this->visible_settings.size());
137  }
138 
139  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
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: {
169  StringID text = STR_AI_CONFIG_NONE;
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;
183  Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl);
184  Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, 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 {
203  str = STR_AI_SETTINGS_SETTING;
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);
210  SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
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()) {
221  SetDParam(idx++, STR_JUST_RAW_STRING);
222  SetDParamStr(idx++, config_iterator->second);
223  } else {
224  SetDParam(idx++, STR_JUST_INT);
225  SetDParam(idx++, current_value);
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) {
268  ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
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);
349  ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, INT32_DIGITS_WITH_SIGN_AND_TERMINATION, this, CS_NUMERAL_SIGNED, QSF_NONE);
350  }
351  this->SetDirty();
352  break;
353  }
354 
355  case WID_GSC_OPEN_URL: {
356  const GameConfig *config = GameConfig::GetConfig();
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 
417  const GameConfig *config = GameConfig::GetConfig();
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++) {
420  this->SetWidgetDisabledState(WID_GSC_TEXTFILE + tft, !config->GetTextfile(tft, (CompanyID)OWNER_DEITY).has_value());
421  }
422  this->RebuildVisibleSettings();
425  }
426 private:
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  {
437  const ScriptConfigItem &config_item = *this->visible_settings[this->clicked_row];
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 
446 {
448  new GSConfigWindow();
449 }
static GameConfig * GetConfig(ScriptSettingSource source=SSS_DEFAULT)
Get the config of a company.
Definition: game_config.cpp:18
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.
Definition: script_info.hpp:76
Scrollbar data structure.
Definition: widget_type.h:694
void SetCount(size_t num)
Sets the number of elements in the list.
Definition: widget_type.h:780
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.
Definition: widget_type.h:879
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:2394
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
Definition: widget_type.h:860
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:68
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition: window_gui.h:67
RectPadding matrix
Padding of WWT_MATRIX items.
Definition: window_gui.h:44
Owner
Enum for all companies/owners.
Definition: company_type.h:18
@ OWNER_DEITY
The object is owned by a superuser / goal script.
Definition: company_type.h:27
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.
Definition: dropdown_type.h:50
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
Display an error message in a window.
Definition: error_gui.cpp:367
@ 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.
Definition: widget_type.h:1181
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1260
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
Definition: widget_type.h:1284
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.
Definition: widget_type.h:1228
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1202
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
Definition: widget_type.h:1137
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1309
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
Definition: widget_type.h:1214
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1191
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Definition: widget_type.h:1126
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.
Definition: math_func.hpp:268
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
Definition: misc_gui.cpp:1079
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.
Definition: script_gui.cpp:661
void ShowScriptListWindow(CompanyID slot, bool show_all)
Open the Script list window to chose a script for the given company slot.
Definition: script_gui.cpp:277
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.
Definition: settings_gui.h:17
#define SETTING_BUTTON_HEIGHT
Height of setting buttons.
Definition: settings_gui.h:19
@ 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:357
@ TD_RTL
Text is written right-to-left by default.
Definition: strings_type.h:24
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:17
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 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
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 OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
Definition: game_gui.cpp:411
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 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.
Definition: widget_type.h:1075
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.
ScriptConfigFlags flags
Flags for the configuration setting.
LabelMapping labels
Text labels for the integer values.
std::string name
The name of the configuration setting.
int min_value
The minimal value this configuration setting can have.
int max_value
The maximal value this configuration setting can have.
int step_size
The step size in the gui.
std::string description
The description of the configuration setting.
bool complete_labels
True if all values have a label.
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:731
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition: window.cpp:3151
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 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.
Definition: textfile_type.h:14
@ TFT_LICENSE
Content license.
Definition: textfile_type.h:19
@ TFT_README
Content readme.
Definition: textfile_type.h:17
@ TFT_CHANGELOG
Content changelog.
Definition: textfile_type.h:18
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
Definition: widget_type.h:524
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition: widget_type.h:112
@ 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:84
@ 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:
Definition: window_type.h:284
@ WC_GAME_OPTIONS
Game options window; Window numbers:
Definition: window_type.h:624
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
Definition: window_type.h:156
@ WC_QUERY_STRING
Query string window; Window numbers:
Definition: window_type.h:123