OpenTTD Source: src/game/game_gui.cpp Source File

OpenTTD Source 15.0-RC2

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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
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#include "../core/string_consumer.hpp"
22
23#include "game.hpp"
24#include "game_gui.hpp"
25#include "game_config.hpp"
26#include "game_info.hpp"
27#include "../script/script_gui.h"
28#include "../script_config.hpp"
29
30#include "table/strings.h"
31
32#include "../safeguards.h"
33
34
36 static constexpr std::initializer_list<NWidgetPart> _nested_gs_config_widgets = {
37 NWidget(NWID_HORIZONTAL),
38 NWidget(WWT_CLOSEBOX, COLOUR_MAUVE),
39 NWidget(WWT_CAPTION, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_CAPTION_GAMESCRIPT, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
40 NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE),
41 EndContainer(),
42 NWidget(WWT_PANEL, COLOUR_MAUVE, WID_GSC_BACKGROUND),
43 NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse_resize),
44 NWidget(WWT_FRAME, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_GAMESCRIPT), SetFill(1, 0), SetResize(1, 0),
45 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),
46 EndContainer(),
47 NWidget(WWT_FRAME, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_GAMESCRIPT_PARAM), SetFill(1, 1), SetResize(1, 0), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0),
48 NWidget(NWID_HORIZONTAL),
49 NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_GSC_SETTINGS), SetFill(1, 0), SetResize(1, 1), SetMinimalSize(188, 182), SetMatrixDataTip(1, 0), SetScrollbar(WID_GSC_SCROLLBAR),
50 NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_GSC_SCROLLBAR),
51 EndContainer(),
52 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_RESET), SetFill(1, 0), SetResize(1, 0), SetStringTip(STR_AI_SETTINGS_RESET),
53 EndContainer(),
54 NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0),
55 NWidget(NWID_VERTICAL, NWidContainerFlag::EqualSize),
56 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CHANGE), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_AI_CONFIG_CHANGE_GAMESCRIPT, STR_AI_CONFIG_CHANGE_TOOLTIP),
57 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_CONTENT_DOWNLOAD), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
58 EndContainer(),
59 NWidget(NWID_VERTICAL, NWidContainerFlag::EqualSize),
60 NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
61 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP),
62 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetMinimalSize(93, 0), SetStringTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP),
63 EndContainer(),
64 NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
65 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP),
66 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GSC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP),
67 EndContainer(),
68 EndContainer(),
69 EndContainer(),
70 EndContainer(),
71 NWidget(NWID_HORIZONTAL),
72 NWidget(NWID_SPACER), SetFill(1, 0), SetResize(1, 0),
73 NWidget(WWT_RESIZEBOX, COLOUR_MAUVE), SetResizeWidgetTypeTip(RWV_HIDE_BEVEL, STR_TOOLTIP_RESIZE),
74 EndContainer(),
75 EndContainer(),
76};
77
79 static WindowDesc _gs_config_desc(
80 WDP_CENTER, "settings_gs_config", 500, 350,
81 WC_GAME_OPTIONS, WC_NONE,
82 {},
83 _nested_gs_config_widgets
84);
85
89 struct GSConfigWindow : public Window {
90 ScriptConfig *gs_config = nullptr;
91 int line_height = 0;
92 int clicked_button = -1;
93 bool clicked_increase = false;
94 bool clicked_dropdown = false;
95 bool closing_dropdown = false;
96 int clicked_row = 0;
97 Scrollbar *vscroll = nullptr;
98 typedef std::vector<const ScriptConfigItem *> VisibleSettingsList;
99 VisibleSettingsList visible_settings{};
100
101 GSConfigWindow() : Window(_gs_config_desc)
102 {
103 this->gs_config = GameConfig::GetConfig();
104
105 this->CreateNestedTree(); // Initializes 'this->line_height' as a side effect.
106 this->vscroll = this->GetScrollbar(WID_GSC_SCROLLBAR);
107 this->FinishInitNested(WN_GAME_OPTIONS_GS);
108 this->OnInvalidateData(0);
109
110 this->RebuildVisibleSettings();
111 }
112
113 void Close([[maybe_unused]] int data = 0) override
114 {
115 CloseWindowByClass(WC_SCRIPT_LIST);
116 this->Window::Close();
117 }
118
124 void RebuildVisibleSettings()
125 {
126 this->visible_settings.clear();
127
128 for (const auto &item : *this->gs_config->GetConfigList()) {
129 bool no_hide = !item.flags.Test(ScriptConfigFlag::Developer);
130 if (no_hide || _settings_client.gui.ai_developer_tools) {
131 this->visible_settings.push_back(&item);
132 }
133 }
134
135 this->vscroll->SetCount(this->visible_settings.size());
136 }
137
138 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
139 {
140 switch (widget) {
141 case WID_GSC_SETTINGS:
142 this->line_height = std::max(SETTING_BUTTON_HEIGHT, GetCharacterHeight(FS_NORMAL)) + padding.height;
143 resize.width = 1;
144 fill.height = resize.height = this->line_height;
145 size.height = 5 * this->line_height;
146 break;
147
148 case WID_GSC_GSLIST:
149 this->line_height = GetCharacterHeight(FS_NORMAL) + padding.height;
150 size.height = 1 * this->line_height;
151 break;
152 }
153 }
154
159 static bool IsEditable()
160 {
161 return _game_mode != GM_NORMAL || Game::GetInstance() != nullptr;
162 }
163
168 std::string GetText() const
169 {
170 if (const GameInfo *info = GameConfig::GetConfig()->GetInfo(); info != nullptr) return info->GetName();
171 return GetString(STR_AI_CONFIG_NONE);
172 }
173
174 void DrawWidget(const Rect &r, WidgetID widget) const override
175 {
176 switch (widget) {
177 case WID_GSC_GSLIST: {
178 /* There is only one slot, unlike with the GS GUI, so it should never be white */
179 DrawString(r.Shrink(WidgetDimensions::scaled.matrix), this->GetText(), (IsEditable() ? TC_ORANGE : TC_SILVER));
180 break;
181 }
182 case WID_GSC_SETTINGS: {
183 Rect ir = r.Shrink(WidgetDimensions::scaled.frametext, RectPadding::zero);
184 bool rtl = _current_text_dir == TD_RTL;
185 Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl);
186 Rect tr = ir.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl);
187
188 int y = r.top;
189 int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
190 int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2;
191
192 const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings);
193 for (auto it = first; it != last; ++it) {
194 const ScriptConfigItem &config_item = **it;
195 int current_value = this->gs_config->GetSetting(config_item.name);
196 bool editable = this->IsEditableItem(config_item);
197
198 if (config_item.flags.Test(ScriptConfigFlag::Boolean)) {
199 DrawBoolButton(br.left, y + button_y_offset, COLOUR_YELLOW, COLOUR_MAUVE, current_value != 0, editable);
200 } else {
201 int i = static_cast<int>(std::distance(std::begin(this->visible_settings), it));
202 if (config_item.complete_labels) {
203 DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && this->clicked_dropdown, editable);
204 } else {
205 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);
206 }
207 }
208
209 DrawString(tr.left, tr.right, y + text_y_offset, config_item.GetString(current_value), config_item.GetColour());
210 y += this->line_height;
211 }
212 break;
213 }
214 }
215 }
216
217 void OnPaint() override
218 {
219 if (this->closing_dropdown) {
220 this->closing_dropdown = false;
221 this->clicked_dropdown = false;
222 }
223 this->DrawWidgets();
224 }
225
226 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
227 {
228 if (widget >= WID_GSC_TEXTFILE && widget < WID_GSC_TEXTFILE + TFT_CONTENT_END) {
229 if (GameConfig::GetConfig() == nullptr) return;
230
231 ShowScriptTextfileWindow(this, static_cast<TextfileType>(widget - WID_GSC_TEXTFILE), OWNER_DEITY);
232 return;
233 }
234
235 switch (widget) {
236 case WID_GSC_GSLIST: {
237 this->InvalidateData();
238 if (click_count > 1 && _game_mode != GM_NORMAL) ShowScriptListWindow(OWNER_DEITY, _ctrl_pressed);
239 break;
240 }
241
242 case WID_GSC_CHANGE: // choose other Game Script
243 ShowScriptListWindow(OWNER_DEITY, _ctrl_pressed);
244 break;
245
246 case WID_GSC_CONTENT_DOWNLOAD:
247 if (!_network_available) {
248 ShowErrorMessage(GetEncodedString(STR_NETWORK_ERROR_NOTAVAILABLE), {}, WL_ERROR);
249 } else {
250 ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_GAME);
251 }
252 break;
253
254 case WID_GSC_SETTINGS: {
255 auto it = this->vscroll->GetScrolledItemFromWidget(this->visible_settings, pt.y, this, widget);
256 if (it == this->visible_settings.end()) break;
257
258 const ScriptConfigItem &config_item = **it;
259 if (!this->IsEditableItem(config_item)) return;
260
261 int num = it - this->visible_settings.begin();
262 if (this->clicked_row != num) {
263 this->CloseChildWindows(WC_QUERY_STRING);
264 this->CloseChildWindows(WC_DROPDOWN_MENU);
265 this->clicked_row = num;
266 this->clicked_dropdown = false;
267 }
268
269 bool bool_item = config_item.flags.Test(ScriptConfigFlag::Boolean);
270
271 Rect r = this->GetWidget<NWidgetBase>(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.frametext, RectPadding::zero);
272 int x = pt.x - r.left;
273 if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x;
274
275 /* One of the arrows is clicked (or green/red rect in case of bool value) */
276 int old_val = this->gs_config->GetSetting(config_item.name);
277 if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) {
278 if (this->clicked_dropdown) {
279 /* unclick the dropdown */
280 this->CloseChildWindows(WC_DROPDOWN_MENU);
281 this->clicked_dropdown = false;
282 this->closing_dropdown = false;
283 } else {
284 int rel_y = (pt.y - r.top) % this->line_height;
285
286 Rect wi_rect;
287 wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);
288 wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1;
289 wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
290 wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1;
291
292 /* If the mouse is still held but dragged outside of the dropdown list, keep the dropdown open */
293 if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) {
294 this->clicked_dropdown = true;
295 this->closing_dropdown = false;
296
297 DropDownList list;
298 for (int i = config_item.min_value; i <= config_item.max_value; i++) {
299 list.push_back(MakeDropDownListStringItem(GetString(STR_JUST_RAW_STRING, config_item.labels.find(i)->second), i));
300 }
301
302 ShowDropDownListAt(this, std::move(list), old_val, WID_GSC_SETTING_DROPDOWN, wi_rect, COLOUR_ORANGE);
303 }
304 }
305 } else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) {
306 int new_val = old_val;
307 if (bool_item) {
308 new_val = !new_val;
309 } else if (x >= SETTING_BUTTON_WIDTH / 2) {
310 /* Increase button clicked */
311 new_val += config_item.step_size;
312 if (new_val > config_item.max_value) new_val = config_item.max_value;
313 this->clicked_increase = true;
314 } else {
315 /* Decrease button clicked */
316 new_val -= config_item.step_size;
317 if (new_val < config_item.min_value) new_val = config_item.min_value;
318 this->clicked_increase = false;
319 }
320
321 if (new_val != old_val) {
322 this->gs_config->SetSetting(config_item.name, new_val);
323 this->clicked_button = num;
324 this->unclick_timeout.Reset();
325 }
326 } else if (!bool_item && !config_item.complete_labels) {
327 /* Display a query box so users can enter a custom value. */
328 ShowQueryString(GetString(STR_JUST_INT, old_val), STR_CONFIG_SETTING_QUERY_CAPTION, INT32_DIGITS_WITH_SIGN_AND_TERMINATION, this, CS_NUMERAL_SIGNED, {});
329 }
330 this->SetDirty();
331 break;
332 }
333
334 case WID_GSC_OPEN_URL: {
335 const GameConfig *config = GameConfig::GetConfig();
336 if (config == nullptr || config->GetInfo() == nullptr) return;
337 OpenBrowser(config->GetInfo()->GetURL());
338 break;
339 }
340
341 case WID_GSC_RESET:
342 this->gs_config->ResetEditableSettings(_game_mode == GM_MENU);
343 this->SetDirty();
344 break;
345 }
346 }
347
348 void OnQueryTextFinished(std::optional<std::string> str) override
349 {
350 if (!str.has_value()) return;
351 auto value = ParseInteger<int32_t>(*str, 10, true);
352 if (!value.has_value()) return;
353 this->SetValue(*value);
354 }
355
356 void OnDropdownSelect(WidgetID widget, int index, int) override
357 {
358 if (widget != WID_GSC_SETTING_DROPDOWN) return;
359 assert(this->clicked_dropdown);
360 this->SetValue(index);
361 }
362
363 void OnDropdownClose(Point, WidgetID widget, int, int, bool) override
364 {
365 if (widget != WID_GSC_SETTING_DROPDOWN) return;
366 /* We cannot raise the dropdown button just yet. OnClick needs some hint, whether
367 * the same dropdown button was clicked again, and then not open the dropdown again.
368 * So, we only remember that it was closed, and process it on the next OnPaint, which is
369 * after OnClick. */
370 assert(this->clicked_dropdown);
371 this->closing_dropdown = true;
372 this->SetDirty();
373 }
374
375 void OnResize() override
376 {
377 this->vscroll->SetCapacityFromWidget(this, WID_GSC_SETTINGS);
378 }
379
381 TimeoutTimer<TimerWindow> unclick_timeout = {std::chrono::milliseconds(150), [this]() {
382 this->clicked_button = -1;
383 this->SetDirty();
384 }};
385
391 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
392 {
393 if (!gui_scope) return;
394
395 this->SetWidgetDisabledState(WID_GSC_CHANGE, (_game_mode == GM_NORMAL) || !IsEditable());
396
397 const GameConfig *config = GameConfig::GetConfig();
398 this->SetWidgetDisabledState(WID_GSC_OPEN_URL, config->GetInfo() == nullptr || config->GetInfo()->GetURL().empty());
399 for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) {
400 this->SetWidgetDisabledState(WID_GSC_TEXTFILE + tft, !config->GetTextfile(tft, OWNER_DEITY).has_value());
401 }
402 this->RebuildVisibleSettings();
403 this->CloseChildWindows(WC_DROPDOWN_MENU);
404 this->CloseChildWindows(WC_QUERY_STRING);
405 }
406private:
407 bool IsEditableItem(const ScriptConfigItem &config_item) const
408 {
409 return _game_mode == GM_MENU
410 || _game_mode == GM_EDITOR
411 || config_item.flags.Test(ScriptConfigFlag::InGame)
412 || _settings_client.gui.ai_developer_tools;
413 }
414
415 void SetValue(int value)
416 {
417 const ScriptConfigItem &config_item = *this->visible_settings[this->clicked_row];
418 if (_game_mode == GM_NORMAL && !config_item.flags.Test(ScriptConfigFlag::InGame)) return;
419 this->gs_config->SetSetting(config_item.name, value);
420 this->SetDirty();
421 }
422};
423
425 void ShowGSConfigWindow()
426{
427 CloseWindowByClass(WC_GAME_OPTIONS);
428 new GSConfigWindow();
429}
BaseBitSet::Test
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Definition base_bitset_type.hpp:141
GameConfig
Definition game_config.hpp:15
GameConfig::GetConfig
static GameConfig * GetConfig(ScriptSettingSource source=SSS_DEFAULT)
Get the config of a company.
Definition game_config.cpp:18
GameInfo
All static information from an Game like name, version, etc.
Definition game_info.hpp:16
Game::GetInstance
static class GameInstance * GetInstance()
Get the current active instance.
Definition game.hpp:96
ScriptConfig
Script settings.
Definition script_config.hpp:53
ScriptConfig::GetTextfile
std::optional< std::string > GetTextfile(TextfileType type, CompanyID slot) const
Search a textfile file next to this script.
Definition script_config.cpp:178
ScriptConfig::SetSetting
void SetSetting(std::string_view name, int value)
Set the value of a setting for this config.
Definition script_config.cpp:90
ScriptConfig::GetConfigList
const ScriptConfigItemList * GetConfigList()
Get the config list for this ScriptConfig.
Definition script_config.cpp:60
ScriptConfig::GetSetting
int GetSetting(const std::string &name) const
Get the value of a setting for this config.
Definition script_config.cpp:83
ScriptConfig::ResetEditableSettings
void ResetEditableSettings(bool yet_to_start)
Reset only editable and visible settings to their default value.
Definition script_config.cpp:108
ScriptInfo::GetURL
const std::string & GetURL() const
Get the website for this script.
Definition script_info.hpp:70
Scrollbar
Scrollbar data structure.
Definition widget_type.h:708
Scrollbar::SetCount
void SetCount(size_t num)
Sets the number of elements in the list.
Definition widget_type.h:792
Scrollbar::GetScrolledItemFromWidget
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:891
Scrollbar::SetCapacityFromWidget
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:2499
Scrollbar::GetVisibleRangeIterators
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
Definition widget_type.h:872
TimeoutTimer
A timeout timer will fire once after the interval.
Definition timer.h:116
TimeoutTimer::Reset
void Reset()
Reset the timer, so it will fire again after the timeout.
Definition timer.h:140
WidgetDimensions::scaled
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
WidgetDimensions::unscaled
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:93
WidgetDimensions::matrix
RectPadding matrix
Padding of WWT_MATRIX items.
Definition window_gui.h:42
OWNER_DEITY
static constexpr Owner OWNER_DEITY
The object is owned by a superuser / goal script.
Definition company_type.h:28
ShowDropDownListAt
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, DropDownOptions options)
Show a drop down list.
Definition dropdown.cpp:402
DropDownList
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Definition dropdown_type.h:56
WL_ERROR
@ WL_ERROR
Errors (eg. saving/loading failed)
Definition error.h:26
ShowErrorMessage
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, CommandCost &cc)
Display an error message in a window.
Definition error_gui.cpp:290
GetCharacterHeight
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
game.hpp
Base functions for all Games.
game_config.hpp
GameConfig stores the configuration settings of every Game.
_nested_gs_config_widgets
static constexpr std::initializer_list< NWidgetPart > _nested_gs_config_widgets
Widgets for the configure GS window.
Definition game_gui.cpp:36
ShowGSConfigWindow
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:425
_gs_config_desc
static WindowDesc _gs_config_desc(WDP_CENTER, "settings_gs_config", 500, 350, WC_GAME_OPTIONS, WC_NONE, {}, _nested_gs_config_widgets)
Window definition for the configure GS window.
game_gui.hpp
Window for configuring the Games
game_info.hpp
GameInfo keeps track of all information of an Game, like Author, Description, ...
WID_GSC_GSLIST
@ WID_GSC_GSLIST
List with current selected Game Script.
Definition game_widget.h:18
WID_GSC_SETTING_DROPDOWN
@ WID_GSC_SETTING_DROPDOWN
Dynamically created dropdown for changing setting value.
Definition game_widget.h:27
WID_GSC_SETTINGS
@ WID_GSC_SETTINGS
Panel to draw the Game Script settings on.
Definition game_widget.h:19
WID_GSC_CONTENT_DOWNLOAD
@ WID_GSC_CONTENT_DOWNLOAD
Download content button.
Definition game_widget.h:24
WID_GSC_OPEN_URL
@ WID_GSC_OPEN_URL
Open GS URL.
Definition game_widget.h:22
WID_GSC_SCROLLBAR
@ WID_GSC_SCROLLBAR
Scrollbar to scroll through the selected AIs.
Definition game_widget.h:20
WID_GSC_CHANGE
@ WID_GSC_CHANGE
Select another Game Script button.
Definition game_widget.h:21
WID_GSC_BACKGROUND
@ WID_GSC_BACKGROUND
Window background.
Definition game_widget.h:17
WID_GSC_TEXTFILE
@ WID_GSC_TEXTFILE
Open GS readme, changelog (+1) or license (+2).
Definition game_widget.h:23
WID_GSC_RESET
@ WID_GSC_RESET
Reset button.
Definition game_widget.h:25
DrawString
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:665
_ctrl_pressed
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
FS_NORMAL
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
SetMatrixDataTip
constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip={})
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
Definition widget_type.h:1308
SetFill
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition widget_type.h:1219
SetPIP
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:1375
SetScrollbar
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
Definition widget_type.h:1399
SetPadding
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:1332
SetStringTip
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
Definition widget_type.h:1240
SetMinimalSize
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
Definition widget_type.h:1156
SetResizeWidgetTypeTip
constexpr NWidgetPart SetResizeWidgetTypeTip(ResizeWidgetValues widget_type, StringID tip)
Widget part function for setting the resize widget type and tooltip.
Definition widget_type.h:1285
EndContainer
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition widget_type.h:1229
NWidget
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
Definition widget_type.h:1424
SetResize
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Definition widget_type.h:1145
Window::SetDirty
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:966
IsInsideMM
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
Definition math_func.hpp:267
ShowQueryString
void ShowQueryString(std::string_view 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:1062
_network_available
bool _network_available
is network mode available?
Definition network.cpp:68
ShowNetworkContentListWindow
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.
Definition network_content_gui.cpp:1117
INT32_DIGITS_WITH_SIGN_AND_TERMINATION
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'.
Definition script_config.hpp:18
ScriptConfigFlag::Boolean
@ Boolean
This value is a boolean (either 0 (false) or 1 (true) ).
ScriptConfigFlag::Developer
@ Developer
This setting will only be visible when the Script development tools are active.
ScriptConfigFlag::InGame
@ InGame
This setting can be changed while the Script is running.
ShowScriptTextfileWindow
void ShowScriptTextfileWindow(Window *parent, TextfileType file_type, CompanyID slot)
Open the Script version of the textfile window.
Definition script_gui.cpp:631
ShowScriptListWindow
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:278
_settings_client
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
DrawArrowButtons
void DrawArrowButtons(int x, int y, Colours button_colour, uint8_t state, bool clickable_left, bool clickable_right)
Draw [<][>] boxes.
Definition settings_gui.cpp:1866
DrawBoolButton
void DrawBoolButton(int x, int y, Colours button_colour, Colours background, bool state, bool clickable)
Draw a toggle button.
Definition settings_gui.cpp:1947
DrawDropDownButton
void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool clickable)
Draw a dropdown button.
Definition settings_gui.cpp:1924
SETTING_BUTTON_WIDTH
#define SETTING_BUTTON_WIDTH
Width of setting buttons.
Definition settings_gui.h:17
SETTING_BUTTON_HEIGHT
#define SETTING_BUTTON_HEIGHT
Height of setting buttons.
Definition settings_gui.h:19
CS_NUMERAL_SIGNED
@ CS_NUMERAL_SIGNED
Only numbers and '-' for negative values.
Definition string_type.h:28
GetEncodedString
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
GetString
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
_current_text_dir
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
TD_RTL
@ TD_RTL
Text is written right-to-left by default.
Definition strings_type.h:27
ClientSettings::gui
GUISettings gui
settings related to the GUI
Definition settings_type.h:650
Coord2D< int >
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition geometry_type.hpp:56
GSConfigWindow
Window to configure which GSs will start.
Definition game_gui.cpp:89
GSConfigWindow::OnInvalidateData
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition game_gui.cpp:391
GSConfigWindow::Close
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:113
GSConfigWindow::OnResize
void OnResize() override
Called after the window got resized.
Definition game_gui.cpp:375
GSConfigWindow::OnPaint
void OnPaint() override
The window must be repainted.
Definition game_gui.cpp:217
GSConfigWindow::visible_settings
VisibleSettingsList visible_settings
List of visible GS settings.
Definition game_gui.cpp:99
GSConfigWindow::closing_dropdown
bool closing_dropdown
True, if the dropdown list is currently closing.
Definition game_gui.cpp:95
GSConfigWindow::OnDropdownSelect
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
Definition game_gui.cpp:356
GSConfigWindow::VisibleSettingsList
std::vector< const ScriptConfigItem * > VisibleSettingsList
typdef for a vector of script settings
Definition game_gui.cpp:98
GSConfigWindow::OnQueryTextFinished
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
Definition game_gui.cpp:348
GSConfigWindow::line_height
int line_height
Height of a single GS-name line.
Definition game_gui.cpp:91
GSConfigWindow::OnDropdownClose
void OnDropdownClose(Point, WidgetID widget, int, int, bool) override
A dropdown window associated to this window has been closed.
Definition game_gui.cpp:363
GSConfigWindow::clicked_button
int clicked_button
The button we clicked.
Definition game_gui.cpp:92
GSConfigWindow::RebuildVisibleSettings
void RebuildVisibleSettings()
Rebuilds the list of visible settings.
Definition game_gui.cpp:124
GSConfigWindow::vscroll
Scrollbar * vscroll
Cache of the vertical scrollbar.
Definition game_gui.cpp:97
GSConfigWindow::gs_config
ScriptConfig * gs_config
The configuration we're modifying.
Definition game_gui.cpp:90
GSConfigWindow::unclick_timeout
TimeoutTimer< TimerWindow > unclick_timeout
When reset, unclick the button after a small timeout.
Definition game_gui.cpp:381
GSConfigWindow::UpdateWidgetSize
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:138
GSConfigWindow::clicked_increase
bool clicked_increase
Whether we clicked the increase or decrease button.
Definition game_gui.cpp:93
GSConfigWindow::IsEditable
static bool IsEditable()
Can the GS config be edited?
Definition game_gui.cpp:159
GSConfigWindow::clicked_row
int clicked_row
The clicked row of settings.
Definition game_gui.cpp:96
GSConfigWindow::clicked_dropdown
bool clicked_dropdown
Whether the dropdown is open.
Definition game_gui.cpp:94
GSConfigWindow::GetText
std::string GetText() const
Get text to display for game script name.
Definition game_gui.cpp:168
GSConfigWindow::DrawWidget
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition game_gui.cpp:174
GSConfigWindow::OnClick
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:226
GUISettings::ai_developer_tools
bool ai_developer_tools
activate AI/GS developer tools
Definition settings_type.h:252
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition geometry_type.hpp:101
Rect::WithWidth
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Definition geometry_type.hpp:211
Rect::Width
int Width() const
Get width of Rect.
Definition geometry_type.hpp:111
Rect::Shrink
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Definition geometry_type.hpp:124
Rect::Indent
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Definition geometry_type.hpp:224
ScriptConfigItem
Info about a single Script setting.
Definition script_config.hpp:33
ScriptConfigItem::flags
ScriptConfigFlags flags
Flags for the configuration setting.
Definition script_config.hpp:40
ScriptConfigItem::GetString
std::string GetString(int value) const
Get string to display this setting in the configuration interface.
Definition script_config.cpp:210
ScriptConfigItem::labels
LabelMapping labels
Text labels for the integer values.
Definition script_config.hpp:41
ScriptConfigItem::name
std::string name
The name of the configuration setting.
Definition script_config.hpp:34
ScriptConfigItem::min_value
int min_value
The minimal value this configuration setting can have.
Definition script_config.hpp:36
ScriptConfigItem::max_value
int max_value
The maximal value this configuration setting can have.
Definition script_config.hpp:37
ScriptConfigItem::step_size
int step_size
The step size in the gui.
Definition script_config.hpp:39
ScriptConfigItem::complete_labels
bool complete_labels
True if all values have a label.
Definition script_config.hpp:42
ScriptConfigItem::GetColour
TextColour GetColour() const
Get text colour to display this setting in the configuration interface.
Definition script_config.cpp:222
WindowDesc
High level window description.
Definition window_gui.h:168
Window
Data structure for an opened window.
Definition window_gui.h:274
Window::Close
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::FinishInitNested
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1807
Window::DrawWidgets
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:766
Window::InvalidateData
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3234
Window::CloseChildWindows
void CloseChildWindows(WindowClass wc=WC_INVALID) const
Close all children a window might have in a head-recursive manner.
Definition window.cpp:1075
Window::resize
ResizeInfo resize
Resize information.
Definition window_gui.h:315
Window::CreateNestedTree
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1797
Window::GetScrollbar
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition window.cpp:313
Window::SetWidgetDisabledState
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
CONTENT_TYPE_GAME
@ CONTENT_TYPE_GAME
The content consists of a game script.
Definition tcp_content_type.h:31
TextfileType
TextfileType
Additional text files accompanying Tar archives.
Definition textfile_type.h:14
TFT_LICENSE
@ TFT_LICENSE
Content license.
Definition textfile_type.h:19
TFT_README
@ TFT_README
Content readme.
Definition textfile_type.h:17
TFT_CHANGELOG
@ TFT_CHANGELOG
Content changelog.
Definition textfile_type.h:18
WWT_PUSHTXTBTN
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition widget_type.h:104
NWID_SPACER
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
NWID_HORIZONTAL
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
WWT_MATRIX
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:50
WWT_CAPTION
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:52
NWID_VSCROLLBAR
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:76
NWID_VERTICAL
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
WWT_CLOSEBOX
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
WWT_FRAME
@ WWT_FRAME
Frame.
Definition widget_type.h:51
WWT_RESIZEBOX
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:59
WWT_DEFSIZEBOX
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:56
EqualSize
@ EqualSize
Containers should keep all their (resizing) children equally large.
Definition widget_type.h:541
RWV_HIDE_BEVEL
@ RWV_HIDE_BEVEL
Bevel of resize box is hidden.
Definition widget_type.h:29
CloseWindowByClass
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1205
WDP_CENTER
@ WDP_CENTER
Center the window.
Definition window_gui.h:145
WidgetID
int WidgetID
Widget ID.
Definition window_type.h:20
WN_GAME_OPTIONS_GS
@ WN_GAME_OPTIONS_GS
GS settings.
Definition window_type.h:28
WC_NONE
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
WC_SCRIPT_LIST
@ WC_SCRIPT_LIST
Scripts list; Window numbers:
Definition window_type.h:289
WC_GAME_OPTIONS
@ WC_GAME_OPTIONS
Game options window; Window numbers:
Definition window_type.h:635
WC_DROPDOWN_MENU
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
Definition window_type.h:161
WC_QUERY_STRING
@ WC_QUERY_STRING
Query string window; Window numbers:
Definition window_type.h:128