OpenTTD Source: src/misc_gui.cpp Source File

OpenTTD Source 15.0-beta1

misc_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 "debug.h"
12#include "landscape.h"
13#include "error.h"
14#include "gui.h"
15#include "gfx_layout.h"
16#include "command_func.h"
17#include "company_func.h"
18#include "town.h"
19#include "string_func.h"
20#include "company_base.h"
21#include "texteff.hpp"
22#include "strings_func.h"
23#include "window_func.h"
24#include "querystring_gui.h"
25#include "core/geometry_func.hpp"
26#include "newgrf_debug.h"
27#include "zoom_func.h"
28#include "viewport_func.h"
29#include "landscape_cmd.h"
30#include "rev.h"
31#include "timer/timer.h"
32#include "timer/timer_window.h"
33#include "pathfinder/water_regions.h"
34
35#include "widgets/misc_widget.h"
36
37#include "table/strings.h"
38
39#include <sstream>
40#include <iomanip>
41
42#include "safeguards.h"
43
45 enum OskActivation {
46 OSKA_DISABLED,
47 OSKA_DOUBLE_CLICK,
48 OSKA_SINGLE_CLICK,
49 OSKA_IMMEDIATELY,
50};
51
52
53static constexpr NWidgetPart _nested_land_info_widgets[] = {
54 NWidget(NWID_HORIZONTAL),
55 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
56 NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_LAND_AREA_INFORMATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
57 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_LI_LOCATION), SetAspect(WidgetDimensions::ASPECT_LOCATION), SetDataTip(SPR_GOTO_LOCATION, STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP),
58 NWidget(WWT_DEBUGBOX, COLOUR_GREY),
59 EndContainer(),
60 NWidget(WWT_PANEL, COLOUR_GREY, WID_LI_BACKGROUND), EndContainer(),
61};
62
63static WindowDesc _land_info_desc(
64 WDP_AUTO, nullptr, 0, 0,
65 WC_LAND_INFO, WC_NONE,
66 0,
67 _nested_land_info_widgets
68);
69
70 class LandInfoWindow : public Window {
71 StringList landinfo_data;
72 std::string cargo_acceptance;
73
74public:
75 TileIndex tile;
76
77 void DrawWidget(const Rect &r, WidgetID widget) const override
78 {
79 if (widget != WID_LI_BACKGROUND) return;
80
81 Rect ir = r.Shrink(WidgetDimensions::scaled.frametext);
82 for (size_t i = 0; i < this->landinfo_data.size(); i++) {
83 DrawString(ir, this->landinfo_data[i], i == 0 ? TC_LIGHT_BLUE : TC_FROMSTRING, SA_HOR_CENTER);
84 ir.top += GetCharacterHeight(FS_NORMAL) + (i == 0 ? WidgetDimensions::scaled.vsep_wide : WidgetDimensions::scaled.vsep_normal);
85 }
86
87 if (!this->cargo_acceptance.empty()) {
88 SetDParamStr(0, this->cargo_acceptance);
89 DrawStringMultiLine(ir, STR_JUST_RAW_STRING, TC_FROMSTRING, SA_CENTER);
90 }
91 }
92
93 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
94 {
95 if (widget != WID_LI_BACKGROUND) return;
96
97 size.height = WidgetDimensions::scaled.frametext.Vertical();
98 for (size_t i = 0; i < this->landinfo_data.size(); i++) {
99 uint width = GetStringBoundingBox(this->landinfo_data[i]).width + WidgetDimensions::scaled.frametext.Horizontal();
100 size.width = std::max(size.width, width);
101
102 size.height += GetCharacterHeight(FS_NORMAL) + (i == 0 ? WidgetDimensions::scaled.vsep_wide : WidgetDimensions::scaled.vsep_normal);
103 }
104
105 if (!this->cargo_acceptance.empty()) {
106 uint width = GetStringBoundingBox(this->cargo_acceptance).width + WidgetDimensions::scaled.frametext.Horizontal();
107 size.width = std::max(size.width, std::min(static_cast<uint>(ScaleGUITrad(300)), width));
108 SetDParamStr(0, cargo_acceptance);
109 size.height += GetStringHeight(STR_JUST_RAW_STRING, size.width - WidgetDimensions::scaled.frametext.Horizontal());
110 }
111 }
112
113 LandInfoWindow(Tile tile) : Window(_land_info_desc), tile(tile)
114 {
115 this->InitNested();
116
117#if defined(_DEBUG)
118# define LANDINFOD_LEVEL 0
119#else
120# define LANDINFOD_LEVEL 1
121#endif
122 Debug(misc, LANDINFOD_LEVEL, "TILE: {0} (0x{0:x}) ({1},{2})", (TileIndex)tile, TileX(tile), TileY(tile));
123 Debug(misc, LANDINFOD_LEVEL, "type = 0x{:x}", tile.type());
124 Debug(misc, LANDINFOD_LEVEL, "height = 0x{:x}", tile.height());
125 Debug(misc, LANDINFOD_LEVEL, "m1 = 0x{:x}", tile.m1());
126 Debug(misc, LANDINFOD_LEVEL, "m2 = 0x{:x}", tile.m2());
127 Debug(misc, LANDINFOD_LEVEL, "m3 = 0x{:x}", tile.m3());
128 Debug(misc, LANDINFOD_LEVEL, "m4 = 0x{:x}", tile.m4());
129 Debug(misc, LANDINFOD_LEVEL, "m5 = 0x{:x}", tile.m5());
130 Debug(misc, LANDINFOD_LEVEL, "m6 = 0x{:x}", tile.m6());
131 Debug(misc, LANDINFOD_LEVEL, "m7 = 0x{:x}", tile.m7());
132 Debug(misc, LANDINFOD_LEVEL, "m8 = 0x{:x}", tile.m8());
133
134 PrintWaterRegionDebugInfo(tile);
135#undef LANDINFOD_LEVEL
136 }
137
138 void OnInit() override
139 {
140 Town *t = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority);
141
142 /* Because build_date is not set yet in every TileDesc, we make sure it is empty */
143 TileDesc td;
144
145 td.build_date = CalendarTime::INVALID_DATE;
146
147 /* Most tiles have only one owner, but
148 * - drivethrough roadstops can be build on town owned roads (up to 2 owners) and
149 * - roads can have up to four owners (railroad, road, tram, 3rd-roadtype "highway").
150 */
151 td.owner_type[0] = STR_LAND_AREA_INFORMATION_OWNER; // At least one owner is displayed, though it might be "N/A".
152 td.owner_type[1] = STR_NULL; // STR_NULL results in skipping the owner
153 td.owner_type[2] = STR_NULL;
154 td.owner_type[3] = STR_NULL;
155 td.owner[0] = OWNER_NONE;
156 td.owner[1] = OWNER_NONE;
157 td.owner[2] = OWNER_NONE;
158 td.owner[3] = OWNER_NONE;
159
160 td.station_class = STR_NULL;
161 td.station_name = STR_NULL;
162 td.airport_class = STR_NULL;
163 td.airport_name = STR_NULL;
164 td.airport_tile_name = STR_NULL;
165 td.railtype = STR_NULL;
166 td.rail_speed = 0;
167 td.roadtype = STR_NULL;
168 td.road_speed = 0;
169 td.tramtype = STR_NULL;
170 td.tram_speed = 0;
171
172 td.grf = nullptr;
173
174 CargoArray acceptance{};
175 AddAcceptedCargo(tile, acceptance, nullptr);
176 GetTileDesc(tile, &td);
177
178 this->landinfo_data.clear();
179
180 /* Tiletype */
181 SetDParam(0, td.dparam);
182 this->landinfo_data.push_back(GetString(td.str));
183
184 /* Up to four owners */
185 for (uint i = 0; i < 4; i++) {
186 if (td.owner_type[i] == STR_NULL) continue;
187
188 SetDParam(0, STR_LAND_AREA_INFORMATION_OWNER_N_A);
189 if (td.owner[i] != OWNER_NONE && td.owner[i] != OWNER_WATER) SetDParamsForOwnedBy(td.owner[i], tile);
190 this->landinfo_data.push_back(GetString(td.owner_type[i]));
191 }
192
193 /* Cost to clear/revenue when cleared */
194 StringID str = STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A;
195 Company *c = Company::GetIfValid(_local_company);
196 if (c != nullptr) {
197 assert(_current_company == _local_company);
198 CommandCost costclear = Command<CMD_LANDSCAPE_CLEAR>::Do(DC_QUERY_COST, tile);
199 if (costclear.Succeeded()) {
200 Money cost = costclear.GetCost();
201 if (cost < 0) {
202 cost = -cost; // Negate negative cost to a positive revenue
203 str = STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED;
204 } else {
205 str = STR_LAND_AREA_INFORMATION_COST_TO_CLEAR;
206 }
207 SetDParam(0, cost);
208 }
209 }
210 this->landinfo_data.push_back(GetString(str));
211
212 /* Location */
213 SetDParam(0, TileX(tile));
214 SetDParam(1, TileY(tile));
215 SetDParam(2, GetTileZ(tile));
216 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LANDINFO_COORDS));
217
218 /* Tile index */
219 SetDParam(0, tile);
220 SetDParam(1, tile);
221 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LANDINFO_INDEX));
222
223 /* Local authority */
224 SetDParam(0, STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE);
225 if (t != nullptr) {
226 SetDParam(0, STR_TOWN_NAME);
227 SetDParam(1, t->index);
228 }
229 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY));
230
231 /* Build date */
232 if (td.build_date != CalendarTime::INVALID_DATE) {
233 SetDParam(0, td.build_date);
234 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_BUILD_DATE));
235 }
236
237 /* Station class */
238 if (td.station_class != STR_NULL) {
239 SetDParam(0, td.station_class);
240 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_STATION_CLASS));
241 }
242
243 /* Station type name */
244 if (td.station_name != STR_NULL) {
245 SetDParam(0, td.station_name);
246 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_STATION_TYPE));
247 }
248
249 /* Airport class */
250 if (td.airport_class != STR_NULL) {
251 SetDParam(0, td.airport_class);
252 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORT_CLASS));
253 }
254
255 /* Airport name */
256 if (td.airport_name != STR_NULL) {
257 SetDParam(0, td.airport_name);
258 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORT_NAME));
259 }
260
261 /* Airport tile name */
262 if (td.airport_tile_name != STR_NULL) {
263 SetDParam(0, td.airport_tile_name);
264 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME));
265 }
266
267 /* Rail type name */
268 if (td.railtype != STR_NULL) {
269 SetDParam(0, td.railtype);
270 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_RAIL_TYPE));
271 }
272
273 /* Rail speed limit */
274 if (td.rail_speed != 0) {
275 SetDParam(0, PackVelocity(td.rail_speed, VEH_TRAIN));
276 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT));
277 }
278
279 /* Road type name */
280 if (td.roadtype != STR_NULL) {
281 SetDParam(0, td.roadtype);
282 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_ROAD_TYPE));
283 }
284
285 /* Road speed limit */
286 if (td.road_speed != 0) {
287 SetDParam(0, PackVelocity(td.road_speed, VEH_ROAD));
288 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT));
289 }
290
291 /* Tram type name */
292 if (td.tramtype != STR_NULL) {
293 SetDParam(0, td.tramtype);
294 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_TRAM_TYPE));
295 }
296
297 /* Tram speed limit */
298 if (td.tram_speed != 0) {
299 SetDParam(0, PackVelocity(td.tram_speed, VEH_ROAD));
300 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT));
301 }
302
303 /* NewGRF name */
304 if (td.grf != nullptr) {
305 SetDParamStr(0, td.grf);
306 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_NEWGRF_NAME));
307 }
308
309 /* Cargo acceptance is displayed in a extra multiline */
310 auto line = BuildCargoAcceptanceString(acceptance, STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED);
311 if (line.has_value()) {
312 this->cargo_acceptance = std::move(*line);
313 } else {
314 this->cargo_acceptance.clear();
315 }
316 }
317
318 bool IsNewGRFInspectable() const override
319 {
320 return ::IsNewGRFInspectable(GetGrfSpecFeature(this->tile), this->tile.base());
321 }
322
323 void ShowNewGRFInspectWindow() const override
324 {
325 ::ShowNewGRFInspectWindow(GetGrfSpecFeature(this->tile), this->tile.base());
326 }
327
328 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
329 {
330 switch (widget) {
331 case WID_LI_LOCATION:
332 if (_ctrl_pressed) {
333 ShowExtraViewportWindow(this->tile);
334 } else {
335 ScrollMainWindowToTile(this->tile);
336 }
337 break;
338 }
339 }
340
346 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
347 {
348 if (!gui_scope) return;
349
350 /* ReInit, "debug" sprite might have changed */
351 if (data == 1) this->ReInit();
352 }
353};
354
359 void ShowLandInfo(TileIndex tile)
360{
361 CloseWindowById(WC_LAND_INFO, 0);
362 new LandInfoWindow(tile);
363}
364
365static constexpr NWidgetPart _nested_about_widgets[] = {
366 NWidget(NWID_HORIZONTAL),
367 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
368 NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_ABOUT_OPENTTD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
369 EndContainer(),
370 NWidget(WWT_PANEL, COLOUR_GREY), SetPIP(4, 2, 4),
371 NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_ABOUT_ORIGINAL_COPYRIGHT, STR_NULL),
372 NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_ABOUT_VERSION, STR_NULL),
373 NWidget(WWT_FRAME, COLOUR_GREY), SetPadding(0, 5, 1, 5),
374 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_A_SCROLLING_TEXT),
375 EndContainer(),
376 NWidget(WWT_LABEL, COLOUR_GREY, WID_A_WEBSITE), SetDataTip(STR_JUST_RAW_STRING, STR_NULL),
377 NWidget(WWT_LABEL, COLOUR_GREY, WID_A_COPYRIGHT), SetDataTip(STR_ABOUT_COPYRIGHT_OPENTTD, STR_NULL),
378 EndContainer(),
379};
380
381static WindowDesc _about_desc(
382 WDP_CENTER, nullptr, 0, 0,
383 WC_GAME_OPTIONS, WC_NONE,
384 0,
385 _nested_about_widgets
386);
387
388static const std::initializer_list<const std::string_view> _credits = {
389 "Original design by Chris Sawyer",
390 "Original graphics by Simon Foster",
391 "",
392 "The OpenTTD team (in alphabetical order):",
393 " Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)",
394 " Christoph Elsenhans (frosch) - General coding (since 0.6)",
395 " Lo\u00efc Guilloux (glx) - General / Windows Expert (since 0.4.5)",
396 " Koen Bussemaker (Kuhnovic) - General / Ship pathfinder (since 14)",
397 " Charles Pigott (LordAro) - General / Correctness police (since 1.9)",
398 " Michael Lutz (michi_cc) - Path based signals (since 0.7)",
399 " Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)",
400 " Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)",
401 " Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)",
402 " Remko Bijker (Rubidium) - Coder and way more (since 0.4.5)",
403 " Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op",
404 " Tyler Trahan (2TallTyler) - General / Time Lord (since 13)",
405 "",
406 "Inactive Developers:",
407 " Grzegorz Duczy\u0144ski (adf88) - General coding (1.7 - 1.8)",
408 " Albert Hofkamp (Alberth) - GUI expert (0.7 - 1.9)",
409 " Jean-Fran\u00e7ois Claeys (Belugas) - GUI, NewGRF and more (0.4.5 - 1.0)",
410 " Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)",
411 " Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)",
412 " Ulf Hermann (fonsinchen) - Cargo Distribution (1.3 - 1.6)",
413 " Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)",
414 " Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)",
415 " Attila B\u00e1n (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)",
416 " Ingo von Borstel (planetmaker) - General coding, Support (1.1 - 1.9)",
417 " Zden\u011bk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)",
418 " Jos\u00e9 Soler (Terkhen) - General coding (1.0 - 1.4)",
419 " Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)",
420 " Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)",
421 " Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6)",
422 "",
423 "Retired Developers:",
424 " Tam\u00e1s Farag\u00f3 (Darkvater) - Ex-Lead coder (0.3 - 0.5)",
425 " Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)",
426 " Emil Djupfeld (egladil) - MacOSX (0.4.5 - 0.6)",
427 " Simon Sasburg (HackyKid) - Many bugfixes (0.4 - 0.4.5)",
428 " Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)",
429 " Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)",
430 " Petr Baudi\u0161 (pasky) - Many patches, NewGRF support (0.3 - 0.3)",
431 " Benedikt Br\u00fcggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)",
432 " Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)",
433 "",
434 "Special thanks go out to:",
435 " Josef Drexler - For his great work on TTDPatch",
436 " Marcin Grzegorczyk - Track foundations and for describing TTD internals",
437 " Stefan Mei\u00dfner (sign_de) - For his work on the console",
438 " Mike Ragsdale - OpenTTD installer",
439 " Christian Rosentreter (tokai) - MorphOS / AmigaOS port",
440 " Richard Kempton (richK) - additional airports, initial TGP implementation",
441 " Alberto Demichelis - Squirrel scripting language \u00a9 2003-2008",
442 " L. Peter Deutsch - MD5 implementation \u00a9 1999, 2000, 2002",
443 " Michael Blunck - Pre-signals and semaphores \u00a9 2003",
444 " George - Canal/Lock graphics \u00a9 2003-2004",
445 " Andrew Parkhouse (andythenorth) - River graphics",
446 " David Dallaston (Pikka) - Tram tracks",
447 " All Translators - Who made OpenTTD a truly international game",
448 " Bug Reporters - Without whom OpenTTD would still be full of bugs!",
449 "",
450 "",
451 "And last but not least:",
452 " Chris Sawyer - For an amazing game!"
453};
454
455 struct AboutWindow : public Window {
456 int text_position;
457 int line_height;
458 static const int num_visible_lines = 19;
459
460 AboutWindow() : Window(_about_desc)
461 {
462 this->InitNested(WN_GAME_OPTIONS_ABOUT);
463
464 this->text_position = this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y + this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->current_y;
465 }
466
467 void SetStringParameters(WidgetID widget) const override
468 {
469 if (widget == WID_A_WEBSITE) SetDParamStr(0, "Website: https://www.openttd.org");
470 if (widget == WID_A_COPYRIGHT) SetDParamStr(0, _openttd_revision_year);
471 }
472
473 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
474 {
475 if (widget != WID_A_SCROLLING_TEXT) return;
476
477 this->line_height = GetCharacterHeight(FS_NORMAL);
478
479 Dimension d;
480 d.height = this->line_height * num_visible_lines;
481
482 d.width = 0;
483 for (const auto &str : _credits) {
484 d.width = std::max(d.width, GetStringBoundingBox(str).width);
485 }
486 size = maxdim(size, d);
487 }
488
489 void DrawWidget(const Rect &r, WidgetID widget) const override
490 {
491 if (widget != WID_A_SCROLLING_TEXT) return;
492
493 int y = this->text_position;
494
495 /* Show all scrolling _credits */
496 for (const auto &str : _credits) {
497 if (y >= r.top + 7 && y < r.bottom - this->line_height) {
498 DrawString(r.left, r.right, y, str, TC_BLACK, SA_LEFT | SA_FORCE);
499 }
500 y += this->line_height;
501 }
502 }
503
509 IntervalTimer<TimerWindow> scroll_interval = {std::chrono::milliseconds(2100) / GetCharacterHeight(FS_NORMAL), [this](uint count) {
510 this->text_position -= count;
511 /* If the last text has scrolled start a new from the start */
512 if (this->text_position < (int)(this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y - std::size(_credits) * this->line_height)) {
513 this->text_position = this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y + this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->current_y;
514 }
515 this->SetWidgetDirty(WID_A_SCROLLING_TEXT);
516 }};
517};
518
519void ShowAboutWindow()
520{
521 CloseWindowByClass(WC_GAME_OPTIONS);
522 new AboutWindow();
523}
524
531 void ShowEstimatedCostOrIncome(Money cost, int x, int y)
532{
533 StringID msg = STR_MESSAGE_ESTIMATED_COST;
534
535 if (cost < 0) {
536 cost = -cost;
537 msg = STR_MESSAGE_ESTIMATED_INCOME;
538 }
539 SetDParam(0, cost);
540 ShowErrorMessage(msg, INVALID_STRING_ID, WL_INFO, x, y);
541}
542
550 void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
551{
552 if (cost == 0) {
553 return;
554 }
555 Point pt = RemapCoords(x, y, z);
556 StringID msg = STR_INCOME_FLOAT_COST;
557
558 if (cost < 0) {
559 cost = -cost;
560 msg = STR_INCOME_FLOAT_INCOME;
561 }
562 SetDParam(0, cost);
563 AddTextEffect(msg, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
564}
565
574 void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income)
575{
576 Point pt = RemapCoords(x, y, z);
577
578 SetDParam(0, transfer);
579 if (income == 0) {
580 AddTextEffect(STR_FEEDER, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
581 } else {
582 StringID msg = STR_FEEDER_COST;
583 if (income < 0) {
584 income = -income;
585 msg = STR_FEEDER_INCOME;
586 }
587 SetDParam(1, income);
588 AddTextEffect(msg, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
589 }
590}
591
601TextEffectID ShowFillingPercent(int x, int y, int z, uint8_t percent, StringID string)
602{
603 Point pt = RemapCoords(x, y, z);
604
605 assert(string != STR_NULL);
606
607 SetDParam(0, percent);
608 return AddTextEffect(string, pt.x, pt.y, 0, TE_STATIC);
609}
610
616 void UpdateFillingPercent(TextEffectID te_id, uint8_t percent, StringID string)
617{
618 assert(string != STR_NULL);
619
620 SetDParam(0, percent);
621 UpdateTextEffect(te_id, string);
622}
623
628 void HideFillingPercent(TextEffectID *te_id)
629{
630 if (*te_id == INVALID_TE_ID) return;
631
632 RemoveTextEffect(*te_id);
633 *te_id = INVALID_TE_ID;
634}
635
636static constexpr NWidgetPart _nested_tooltips_widgets[] = {
637 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_TT_BACKGROUND),
638};
639
640static WindowDesc _tool_tips_desc(
641 WDP_MANUAL, nullptr, 0, 0, // Coordinates and sizes are not used,
642 WC_TOOLTIPS, WC_NONE,
643 WDF_NO_FOCUS | WDF_NO_CLOSE,
644 _nested_tooltips_widgets
645);
646
648 struct TooltipsWindow : public Window
649{
650 StringID string_id;
651 std::vector<StringParameterData> params;
652 TooltipCloseCondition close_cond;
653
654 TooltipsWindow(Window *parent, StringID str, uint paramcount, TooltipCloseCondition close_tooltip) : Window(_tool_tips_desc)
655 {
656 this->parent = parent;
657 this->string_id = str;
658 CopyOutDParam(this->params, paramcount);
659 this->close_cond = close_tooltip;
660
661 this->InitNested();
662
663 CLRBITS(this->flags, WF_WHITE_BORDER);
664 }
665
666 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
667 {
668 /* Find the free screen space between the main toolbar at the top, and the statusbar at the bottom.
669 * Add a fixed distance 2 so the tooltip floats free from both bars.
670 */
671 int scr_top = GetMainViewTop() + 2;
672 int scr_bot = GetMainViewBottom() - 2;
673
674 Point pt;
675
676 /* Correctly position the tooltip position, watch out for window and cursor size
677 * Clamp value to below main toolbar and above statusbar. If tooltip would
678 * go below window, flip it so it is shown above the cursor */
679 pt.y = SoftClamp(_cursor.pos.y + _cursor.total_size.y + _cursor.total_offs.y + 5, scr_top, scr_bot);
680 if (pt.y + sm_height > scr_bot) pt.y = std::min(_cursor.pos.y + _cursor.total_offs.y - 5, scr_bot) - sm_height;
681 pt.x = sm_width >= _screen.width ? 0 : SoftClamp(_cursor.pos.x - (sm_width >> 1), 0, _screen.width - sm_width);
682
683 return pt;
684 }
685
686 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
687 {
688 if (widget != WID_TT_BACKGROUND) return;
689 CopyInDParam(this->params);
690
691 size.width = std::min<uint>(GetStringBoundingBox(this->string_id).width, ScaleGUITrad(194));
692 size.height = GetStringHeight(this->string_id, size.width);
693
694 /* Increase slightly to have some space around the box. */
695 size.width += WidgetDimensions::scaled.framerect.Horizontal() + WidgetDimensions::scaled.fullbevel.Horizontal();
696 size.height += WidgetDimensions::scaled.framerect.Vertical() + WidgetDimensions::scaled.fullbevel.Vertical();
697 }
698
699 void DrawWidget(const Rect &r, WidgetID widget) const override
700 {
701 if (widget != WID_TT_BACKGROUND) return;
702 GfxFillRect(r, PC_BLACK);
703 GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_LIGHT_YELLOW);
704
705 CopyInDParam(this->params);
706 DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect).Shrink(WidgetDimensions::scaled.fullbevel), this->string_id, TC_BLACK, SA_CENTER);
707 }
708
709 void OnMouseLoop() override
710 {
711 /* Always close tooltips when the cursor is not in our window. */
712 if (!_cursor.in_window) {
713 this->Close();
714 return;
715 }
716
717 /* We can show tooltips while dragging tools. These are shown as long as
718 * we are dragging the tool. Normal tooltips work with hover or rmb. */
719 switch (this->close_cond) {
720 case TCC_RIGHT_CLICK: if (!_right_button_down) this->Close(); break;
721 case TCC_HOVER: if (!_mouse_hovering) this->Close(); break;
722 case TCC_NONE: break;
723
724 case TCC_EXIT_VIEWPORT: {
725 Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
726 if (w == nullptr || IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y) == nullptr) this->Close();
727 break;
728 }
729 }
730 }
731};
732
740 void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
741{
742 CloseWindowById(WC_TOOLTIPS, 0);
743
744 if (str == STR_NULL || !_cursor.in_window) return;
745
746 new TooltipsWindow(parent, str, paramcount, close_tooltip);
747}
748
749void QueryString::HandleEditBox(Window *w, WidgetID wid)
750{
751 if (w->IsWidgetGloballyFocused(wid) && this->text.HandleCaret()) {
752 w->SetWidgetDirty(wid);
753
754 /* For the OSK also invalidate the parent window */
755 if (w->window_class == WC_OSK) w->InvalidateData();
756 }
757}
758
759static int GetCaretWidth()
760{
761 return GetCharacterWidth(FS_NORMAL, '_');
762}
763
770 static Rect ScrollEditBoxTextRect(Rect r, const Textbuf &tb)
771{
772 const int linewidth = tb.pixels + GetCaretWidth();
773 const int boxwidth = r.Width();
774 if (linewidth <= boxwidth) return r;
775
776 /* Extend to cover whole string. This is left-aligned, adjusted by caret position. */
777 r = r.WithWidth(linewidth, false);
778
779 /* Slide so that the caret is at the centre unless limited by bounds of the line, i.e. near either end. */
780 return r.Translate(-std::clamp(tb.caretxoffs - (boxwidth / 2), 0, linewidth - boxwidth), 0);
781}
782
783void QueryString::DrawEditBox(const Window *w, WidgetID wid) const
784{
785 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
786
787 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
788
789 bool rtl = _current_text_dir == TD_RTL;
790 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
791 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
792
793 Rect r = wi->GetCurrentRect();
794 Rect cr = r.WithWidth(clearbtn_width, !rtl);
795 Rect fr = r.Indent(clearbtn_width, !rtl);
796
797 DrawFrameRect(cr, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE);
798 DrawSpriteIgnorePadding(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr, SA_CENTER);
799 if (this->text.bytes == 1) GfxFillRect(cr.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(wi->colour, SHADE_DARKER), FILLRECT_CHECKER);
800
801 DrawFrameRect(fr, wi->colour, FR_LOWERED | FR_DARKENED);
802 GfxFillRect(fr.Shrink(WidgetDimensions::scaled.bevel), PC_BLACK);
803
804 fr = fr.Shrink(WidgetDimensions::scaled.framerect);
805 /* Limit the drawing of the string inside the widget boundaries */
806 DrawPixelInfo dpi;
807 if (!FillDrawPixelInfo(&dpi, fr)) return;
808 /* Keep coordinates relative to the window. */
809 dpi.left += fr.left;
810 dpi.top += fr.top;
811
812 AutoRestoreBackup dpi_backup(_cur_dpi, &dpi);
813
814 /* We will take the current widget length as maximum width, with a small
815 * space reserved at the end for the caret to show */
816 const Textbuf *tb = &this->text;
817 fr = ScrollEditBoxTextRect(fr, *tb);
818
819 /* If we have a marked area, draw a background highlight. */
820 if (tb->marklength != 0) GfxFillRect(fr.left + tb->markxoffs, fr.top, fr.left + tb->markxoffs + tb->marklength - 1, fr.bottom, PC_GREY);
821
822 DrawString(fr.left, fr.right, CenterBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), tb->buf, TC_YELLOW);
823 bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid);
824 if (focussed && tb->caret) {
825 int caret_width = GetCaretWidth();
826 if (rtl) {
827 DrawString(fr.right - tb->pixels + tb->caretxoffs - caret_width, fr.right - tb->pixels + tb->caretxoffs, CenterBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), "_", TC_WHITE);
828 } else {
829 DrawString(fr.left + tb->caretxoffs, fr.left + tb->caretxoffs + caret_width, CenterBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), "_", TC_WHITE);
830 }
831 }
832}
833
840 Point QueryString::GetCaretPosition(const Window *w, WidgetID wid) const
841{
842 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
843
844 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
845
846 bool rtl = _current_text_dir == TD_RTL;
847 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
848 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
849
850 Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
851
852 /* Clamp caret position to be inside out current width. */
853 const Textbuf *tb = &this->text;
854 r = ScrollEditBoxTextRect(r, *tb);
855
856 Point pt = {r.left + tb->caretxoffs, r.top};
857 return pt;
858}
859
868 Rect QueryString::GetBoundingRect(const Window *w, WidgetID wid, const char *from, const char *to) const
869{
870 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
871
872 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
873
874 bool rtl = _current_text_dir == TD_RTL;
875 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
876 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
877
878 Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
879
880 /* Clamp caret position to be inside our current width. */
881 const Textbuf *tb = &this->text;
882 r = ScrollEditBoxTextRect(r, *tb);
883
884 /* Get location of first and last character. */
885 const auto p1 = GetCharPosInString(tb->buf, from, FS_NORMAL);
886 const auto p2 = from != to ? GetCharPosInString(tb->buf, to, FS_NORMAL) : p1;
887
888 return { Clamp(r.left + p1.left, r.left, r.right), r.top, Clamp(r.left + p2.right, r.left, r.right), r.bottom };
889}
890
898ptrdiff_t QueryString::GetCharAtPosition(const Window *w, WidgetID wid, const Point &pt) const
899{
900 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
901
902 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
903
904 bool rtl = _current_text_dir == TD_RTL;
905 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
906 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
907
908 Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
909
910 if (!IsInsideMM(pt.y, r.top, r.bottom)) return -1;
911
912 /* Clamp caret position to be inside our current width. */
913 const Textbuf *tb = &this->text;
914 r = ScrollEditBoxTextRect(r, *tb);
915
916 return ::GetCharAtPosition(tb->buf, pt.x - r.left);
917}
918
919void QueryString::ClickEditBox(Window *w, Point pt, WidgetID wid, int click_count, bool focus_changed)
920{
921 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
922
923 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
924
925 bool rtl = _current_text_dir == TD_RTL;
926 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
927 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
928
929 Rect cr = wi->GetCurrentRect().WithWidth(clearbtn_width, !rtl);
930
931 if (IsInsideMM(pt.x, cr.left, cr.right)) {
932 if (this->text.bytes > 1) {
933 this->text.DeleteAll();
934 w->HandleButtonClick(wid);
935 w->OnEditboxChanged(wid);
936 }
937 return;
938 }
939
940 if (w->window_class != WC_OSK && _settings_client.gui.osk_activation != OSKA_DISABLED &&
941 (!focus_changed || _settings_client.gui.osk_activation == OSKA_IMMEDIATELY) &&
942 (click_count == 2 || _settings_client.gui.osk_activation != OSKA_DOUBLE_CLICK)) {
943 /* Open the OSK window */
944 ShowOnScreenKeyboard(w, wid);
945 }
946}
947
949 struct QueryStringWindow : public Window
950{
951 QueryString editbox;
952 QueryStringFlags flags;
953
954 QueryStringWindow(StringID str, StringID caption, uint max_bytes, uint max_chars, WindowDesc &desc, Window *parent, CharSetFilter afilter, QueryStringFlags flags) :
955 Window(desc), editbox(max_bytes, max_chars)
956 {
957 this->editbox.text.Assign(str);
958
959 if ((flags & QSF_ACCEPT_UNCHANGED) == 0) this->editbox.orig = this->editbox.text.buf;
960
961 this->querystrings[WID_QS_TEXT] = &this->editbox;
962 this->editbox.caption = caption;
963 this->editbox.cancel_button = WID_QS_CANCEL;
964 this->editbox.ok_button = WID_QS_OK;
965 this->editbox.text.afilter = afilter;
966 this->flags = flags;
967
968 this->InitNested(WN_QUERY_STRING);
969
970 this->parent = parent;
971
972 this->SetFocusedWidget(WID_QS_TEXT);
973 }
974
975 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
976 {
977 if (widget == WID_QS_DEFAULT && (this->flags & QSF_ENABLE_DEFAULT) == 0) {
978 /* We don't want this widget to show! */
979 fill.width = 0;
980 resize.width = 0;
981 size.width = 0;
982 }
983 }
984
985 void SetStringParameters(WidgetID widget) const override
986 {
987 if (widget == WID_QS_CAPTION) SetDParam(0, this->editbox.caption);
988 }
989
990 void OnOk()
991 {
992 if (!this->editbox.orig.has_value() || this->editbox.text.buf != this->editbox.orig) {
993 assert(this->parent != nullptr);
994
995 this->parent->OnQueryTextFinished(this->editbox.text.buf);
996 this->editbox.handled = true;
997 }
998 }
999
1000 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1001 {
1002 switch (widget) {
1003 case WID_QS_DEFAULT:
1004 this->editbox.text.DeleteAll();
1005 [[fallthrough]];
1006
1007 case WID_QS_OK:
1008 this->OnOk();
1009 [[fallthrough]];
1010
1011 case WID_QS_CANCEL:
1012 this->Close();
1013 break;
1014 }
1015 }
1016
1017 void Close([[maybe_unused]] int data = 0) override
1018 {
1019 if (!this->editbox.handled && this->parent != nullptr) {
1020 Window *parent = this->parent;
1021 this->parent = nullptr; // so parent doesn't try to close us again
1022 parent->OnQueryTextFinished(std::nullopt);
1023 }
1024 this->Window::Close();
1025 }
1026};
1027
1028static constexpr NWidgetPart _nested_query_string_widgets[] = {
1029 NWidget(NWID_HORIZONTAL),
1030 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
1031 NWidget(WWT_CAPTION, COLOUR_GREY, WID_QS_CAPTION), SetDataTip(STR_JUST_STRING, STR_NULL), SetTextStyle(TC_WHITE),
1032 EndContainer(),
1033 NWidget(WWT_PANEL, COLOUR_GREY),
1034 NWidget(WWT_EDITBOX, COLOUR_GREY, WID_QS_TEXT), SetMinimalSize(256, 0), SetFill(1, 0), SetPadding(2, 2, 2, 2),
1035 EndContainer(),
1036 NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
1037 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(87, 12), SetFill(1, 1), SetDataTip(STR_BUTTON_DEFAULT, STR_NULL),
1038 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(86, 12), SetFill(1, 1), SetDataTip(STR_BUTTON_CANCEL, STR_NULL),
1039 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(87, 12), SetFill(1, 1), SetDataTip(STR_BUTTON_OK, STR_NULL),
1040 EndContainer(),
1041};
1042
1043static WindowDesc _query_string_desc(
1044 WDP_CENTER, nullptr, 0, 0,
1045 WC_QUERY_STRING, WC_NONE,
1046 0,
1047 _nested_query_string_widgets
1048);
1049
1059 void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
1060{
1061 assert(parent != nullptr);
1062
1063 CloseWindowByClass(WC_QUERY_STRING);
1064 new QueryStringWindow(str, caption, ((flags & QSF_LEN_IN_CHARS) ? MAX_CHAR_LENGTH : 1) * maxsize, maxsize, _query_string_desc, parent, afilter, flags);
1065}
1066
1070 struct QueryWindow : public Window {
1071 QueryCallbackProc *proc;
1072 std::vector<StringParameterData> params;
1073 StringID message;
1074
1075 QueryWindow(WindowDesc &desc, StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) : Window(desc)
1076 {
1077 /* Create a backup of the variadic arguments to strings because it will be
1078 * overridden pretty often. We will copy these back for drawing */
1079 CopyOutDParam(this->params, 10);
1080 this->message = message;
1081 this->proc = callback;
1082 this->parent = parent;
1083
1084 this->CreateNestedTree();
1085 this->GetWidget<NWidgetCore>(WID_Q_CAPTION)->SetDataTip(caption, STR_NULL);
1086 this->FinishInitNested(WN_CONFIRM_POPUP_QUERY);
1087 }
1088
1089 void Close([[maybe_unused]] int data = 0) override
1090 {
1091 if (this->proc != nullptr) this->proc(this->parent, false);
1092 this->Window::Close();
1093 }
1094
1095 void FindWindowPlacementAndResize([[maybe_unused]] int def_width, [[maybe_unused]] int def_height) override
1096 {
1097 /* Position query window over the calling window, ensuring it's within screen bounds. */
1098 this->left = SoftClamp(parent->left + (parent->width / 2) - (this->width / 2), 0, _screen.width - this->width);
1099 this->top = SoftClamp(parent->top + (parent->height / 2) - (this->height / 2), 0, _screen.height - this->height);
1100 this->SetDirty();
1101 }
1102
1103 void SetStringParameters(WidgetID widget) const override
1104 {
1105 switch (widget) {
1106 case WID_Q_CAPTION:
1107 case WID_Q_TEXT:
1108 CopyInDParam(this->params);
1109 break;
1110 }
1111 }
1112
1113 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1114 {
1115 if (widget != WID_Q_TEXT) return;
1116
1117 size = GetStringMultiLineBoundingBox(this->message, size);
1118 }
1119
1120 void DrawWidget(const Rect &r, WidgetID widget) const override
1121 {
1122 if (widget != WID_Q_TEXT) return;
1123
1124 DrawStringMultiLine(r, this->message, TC_FROMSTRING, SA_CENTER);
1125 }
1126
1127 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1128 {
1129 switch (widget) {
1130 case WID_Q_YES: {
1131 /* in the Generate New World window, clicking 'Yes' causes
1132 * CloseNonVitalWindows() to be called - we shouldn't be in a window then */
1133 QueryCallbackProc *proc = this->proc;
1134 Window *parent = this->parent;
1135 /* Prevent the destructor calling the callback function */
1136 this->proc = nullptr;
1137 this->Close();
1138 if (proc != nullptr) {
1139 proc(parent, true);
1140 proc = nullptr;
1141 }
1142 break;
1143 }
1144 case WID_Q_NO:
1145 this->Close();
1146 break;
1147 }
1148 }
1149
1150 EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode) override
1151 {
1152 /* ESC closes the window, Enter confirms the action */
1153 switch (keycode) {
1154 case WKC_RETURN:
1155 case WKC_NUM_ENTER:
1156 if (this->proc != nullptr) {
1157 this->proc(this->parent, true);
1158 this->proc = nullptr;
1159 }
1160 [[fallthrough]];
1161
1162 case WKC_ESC:
1163 this->Close();
1164 return ES_HANDLED;
1165 }
1166 return ES_NOT_HANDLED;
1167 }
1168};
1169
1170static constexpr NWidgetPart _nested_query_widgets[] = {
1171 NWidget(NWID_HORIZONTAL),
1172 NWidget(WWT_CLOSEBOX, COLOUR_RED),
1173 NWidget(WWT_CAPTION, COLOUR_RED, WID_Q_CAPTION), // The caption's string is set in the constructor
1174 EndContainer(),
1175 NWidget(WWT_PANEL, COLOUR_RED),
1176 NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup),
1177 NWidget(WWT_TEXT, COLOUR_RED, WID_Q_TEXT), SetMinimalSize(200, 12),
1178 NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(WidgetDimensions::unscaled.hsep_indent, WidgetDimensions::unscaled.hsep_indent, WidgetDimensions::unscaled.hsep_indent),
1179 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_NO), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_NO, STR_NULL),
1180 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_YES), SetMinimalSize(71, 12), SetFill(1, 1), SetDataTip(STR_QUIT_YES, STR_NULL),
1181 EndContainer(),
1182 EndContainer(),
1183 EndContainer(),
1184};
1185
1186static WindowDesc _query_desc(
1187 WDP_CENTER, nullptr, 0, 0,
1188 WC_CONFIRM_POPUP_QUERY, WC_NONE,
1189 WDF_MODAL,
1190 _nested_query_widgets
1191);
1192
1203 void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus)
1204{
1205 if (parent == nullptr) parent = GetMainWindow();
1206
1207 for (Window *w : Window::Iterate()) {
1208 if (w->window_class != WC_CONFIRM_POPUP_QUERY) continue;
1209
1210 QueryWindow *qw = dynamic_cast<QueryWindow *>(w);
1211 if (qw->parent != parent || qw->proc != callback) continue;
1212
1213 qw->Close();
1214 break;
1215 }
1216
1217 QueryWindow *q = new QueryWindow(_query_desc, caption, message, parent, callback);
1218 if (focus) SetFocusedWindow(q);
1219}
CLRBITS
#define CLRBITS(x, y)
Clears several bits in a variable.
Definition bitmath_func.hpp:166
BuildCargoAcceptanceString
std::optional< std::string > BuildCargoAcceptanceString(const CargoArray &acceptance, StringID label)
Build comma-separated cargo acceptance string.
Definition cargotype.cpp:269
CommandCost
Common return value for all commands.
Definition command_type.h:23
IntervalTimer
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
LandInfoWindow
Definition misc_gui.cpp:70
LandInfoWindow::DrawWidget
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition misc_gui.cpp:77
LandInfoWindow::OnInvalidateData
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition misc_gui.cpp:346
LandInfoWindow::landinfo_data
StringList landinfo_data
Info lines to show.
Definition misc_gui.cpp:71
LandInfoWindow::cargo_acceptance
std::string cargo_acceptance
Centered multi-line string for cargo acceptance.
Definition misc_gui.cpp:72
LandInfoWindow::IsNewGRFInspectable
bool IsNewGRFInspectable() const override
Is the data related to this window NewGRF inspectable?
Definition misc_gui.cpp:318
LandInfoWindow::OnInit
void OnInit() override
Notification that the nested widget tree gets initialized.
Definition misc_gui.cpp:138
LandInfoWindow::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 misc_gui.cpp:328
LandInfoWindow::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 misc_gui.cpp:93
LandInfoWindow::ShowNewGRFInspectWindow
void ShowNewGRFInspectWindow() const override
Show the NewGRF inspection window.
Definition misc_gui.cpp:323
NWidgetBase::type
WidgetType type
Type of the widget / nested widget.
Definition widget_type.h:233
NWidgetCore::colour
Colours colour
Colour of this widget.
Definition widget_type.h:392
NWidgetCore::IsLowered
bool IsLowered() const
Return whether the widget is lowered.
Definition widget_type.h:435
NWidgetLeaf
Leaf widget.
Definition widget_type.h:916
OverflowSafeInt< int64_t >
Ticks::DAY_TICKS
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
Definition timer_game_tick.h:75
Tile
Wrapper class to abstract away the way the tiles are stored.
Definition map_func.h:25
TimerGameConst< struct Calendar >::INVALID_DATE
static constexpr TimerGame< struct Calendar >::Date INVALID_DATE
Representation of an invalid date.
Definition timer_game_common.h:193
WidgetDimensions::framerect
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:42
WidgetDimensions::frametext
RectPadding frametext
Padding inside frame with text.
Definition window_gui.h:43
WidgetDimensions::scaled
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
WidgetDimensions::imgbtn
RectPadding imgbtn
Padding around image button image.
Definition window_gui.h:36
WidgetDimensions::vsep_normal
int vsep_normal
Normal vertical spacing.
Definition window_gui.h:60
WidgetDimensions::vsep_wide
int vsep_wide
Wide vertical spacing.
Definition window_gui.h:62
WidgetDimensions::fullbevel
RectPadding fullbevel
Always-scaled bevel thickness.
Definition window_gui.h:41
WidgetDimensions::unscaled
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:96
WidgetDimensions::bevel
RectPadding bevel
Bevel thickness, affected by "scaled bevels" game option.
Definition window_gui.h:40
command_func.h
Functions related to commands.
DC_QUERY_COST
@ DC_QUERY_COST
query cost only, don't build.
Definition command_type.h:378
company_base.h
Definition of stuff that is very close to a company, like the company struct itself.
SetDParamsForOwnedBy
void SetDParamsForOwnedBy(Owner owner, TileIndex tile)
Set the right DParams for STR_ERROR_OWNED_BY.
Definition company_cmd.cpp:334
_local_company
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition company_cmd.cpp:52
_current_company
CompanyID _current_company
Company currently doing an action.
Definition company_cmd.cpp:53
company_func.h
Functions related to companies.
OWNER_NONE
@ OWNER_NONE
The tile has no ownership.
Definition company_type.h:25
OWNER_WATER
@ OWNER_WATER
The tile/execution is done by "water".
Definition company_type.h:26
debug.h
Functions related to debugging.
Debug
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
Definition debug.h:37
error.h
Functions related to errors.
ShowErrorMessage
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
Display an error message in a window.
Definition error_gui.cpp:367
WL_INFO
@ WL_INFO
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
Definition error.h:24
GetCharacterHeight
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
maxdim
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Definition geometry_func.cpp:22
geometry_func.hpp
Geometry functions.
GetStringHeight
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Definition gfx.cpp:704
GetStringBoundingBox
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
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:657
_ctrl_pressed
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
GfxFillRect
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:114
GetCharacterWidth
uint8_t GetCharacterWidth(FontSize size, char32_t key)
Return width of character glyph.
Definition gfx.cpp:1227
GetStringMultiLineBoundingBox
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion)
Calculate string bounding box for multi-line strings.
Definition gfx.cpp:740
DrawStringMultiLine
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition gfx.cpp:774
FillDrawPixelInfo
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
Definition gfx.cpp:1548
_right_button_down
bool _right_button_down
Is right mouse button pressed?
Definition gfx.cpp:43
GetScaledSpriteSize
Dimension GetScaledSpriteSize(SpriteID sprid)
Scale sprite size for GUI.
Definition widget.cpp:54
CenterBounds
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
Definition gfx_func.h:166
GetCharPosInString
ParagraphLayouter::Position GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize)
Get the leading corner of a character in a single-line string relative to the start of the string.
Definition gfx_layout.cpp:421
gfx_layout.h
Functions related to laying out the texts.
SA_LEFT
@ SA_LEFT
Left align the text.
Definition gfx_type.h:343
SA_HOR_CENTER
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:344
SA_FORCE
@ SA_FORCE
Force the alignment, i.e. don't swap for RTL languages.
Definition gfx_type.h:355
SA_CENTER
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:353
FS_NORMAL
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
FILLRECT_CHECKER
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:299
SetFill
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition widget_type.h:1181
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:1271
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:1228
SetDataTip
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition widget_type.h:1202
SetTextStyle
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
Definition widget_type.h:1160
SetMinimalSize
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
Definition widget_type.h:1137
NWidget
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition widget_type.h:1320
EndContainer
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition widget_type.h:1191
SetAspect
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Widget part function for setting the aspect ratio.
Definition widget_type.h:1306
Window::SetDirty
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:940
gui.h
GUI functions that shouldn't be here.
ShowExtraViewportWindow
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
Definition viewport_gui.cpp:156
landscape.h
Functions related to OTTD's landscape.
RemapCoords
Point RemapCoords(int x, int y, int z)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
Definition landscape.h:79
landscape_cmd.h
Command definitions related to landscape (slopes etc.).
TileY
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:425
TileX
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:415
SoftClamp
constexpr T SoftClamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:102
Clamp
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
IsInsideMM
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
HideFillingPercent
void HideFillingPercent(TextEffectID *te_id)
Hide vehicle loading indicators.
Definition misc_gui.cpp:628
OskActivation
OskActivation
Method to open the OSK.
Definition misc_gui.cpp:45
OSKA_SINGLE_CLICK
@ OSKA_SINGLE_CLICK
Single click after focus click opens OSK.
Definition misc_gui.cpp:48
OSKA_IMMEDIATELY
@ OSKA_IMMEDIATELY
Focusing click already opens OSK.
Definition misc_gui.cpp:49
OSKA_DISABLED
@ OSKA_DISABLED
The OSK shall not be activated at all.
Definition misc_gui.cpp:46
OSKA_DOUBLE_CLICK
@ OSKA_DOUBLE_CLICK
Double click on the edit box opens OSK.
Definition misc_gui.cpp:47
ShowCostOrIncomeAnimation
void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
Display animated income or costs on the map.
Definition misc_gui.cpp:550
GuiShowTooltips
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
Definition misc_gui.cpp:740
ShowEstimatedCostOrIncome
void ShowEstimatedCostOrIncome(Money cost, int x, int y)
Display estimated costs.
Definition misc_gui.cpp:531
ShowLandInfo
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:359
ShowFeederIncomeAnimation
void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income)
Display animated feeder income.
Definition misc_gui.cpp:574
UpdateFillingPercent
void UpdateFillingPercent(TextEffectID te_id, uint8_t percent, StringID string)
Update vehicle loading indicators.
Definition misc_gui.cpp:616
ShowFillingPercent
TextEffectID ShowFillingPercent(int x, int y, int z, uint8_t percent, StringID string)
Display vehicle loading indicators.
Definition misc_gui.cpp:601
ShowQuery
void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus)
Show a confirmation window with standard 'yes' and 'no' buttons The window is aligned to the centre o...
Definition misc_gui.cpp:1203
ScrollEditBoxTextRect
static Rect ScrollEditBoxTextRect(Rect r, const Textbuf &tb)
Reposition edit text box rect based on textbuf length can caret position.
Definition misc_gui.cpp:770
ShowQueryString
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:1059
misc_widget.h
Types related to the misc widgets.
WID_TT_BACKGROUND
@ WID_TT_BACKGROUND
Background of the window.
Definition misc_widget.h:21
WID_QS_DEFAULT
@ WID_QS_DEFAULT
Default button.
Definition misc_widget.h:35
WID_QS_CAPTION
@ WID_QS_CAPTION
Caption of the window.
Definition misc_widget.h:33
WID_QS_TEXT
@ WID_QS_TEXT
Text of the query.
Definition misc_widget.h:34
WID_QS_CANCEL
@ WID_QS_CANCEL
Cancel button.
Definition misc_widget.h:36
WID_QS_OK
@ WID_QS_OK
OK button.
Definition misc_widget.h:37
WID_A_WEBSITE
@ WID_A_WEBSITE
URL of OpenTTD website.
Definition misc_widget.h:27
WID_A_COPYRIGHT
@ WID_A_COPYRIGHT
Copyright string.
Definition misc_widget.h:28
WID_A_SCROLLING_TEXT
@ WID_A_SCROLLING_TEXT
The actually scrolling text.
Definition misc_widget.h:26
WID_Q_NO
@ WID_Q_NO
Yes button.
Definition misc_widget.h:44
WID_Q_YES
@ WID_Q_YES
No button.
Definition misc_widget.h:45
WID_Q_CAPTION
@ WID_Q_CAPTION
Caption of the window.
Definition misc_widget.h:42
WID_Q_TEXT
@ WID_Q_TEXT
Text of the query.
Definition misc_widget.h:43
WID_LI_BACKGROUND
@ WID_LI_BACKGROUND
Background of the window.
Definition misc_widget.h:16
WID_LI_LOCATION
@ WID_LI_LOCATION
Scroll to location.
Definition misc_widget.h:15
newgrf_debug.h
Functions/types related to NewGRF debugging.
GetGrfSpecFeature
GrfSpecFeature GetGrfSpecFeature(TileIndex tile)
Get the GrfSpecFeature associated with the tile.
Definition newgrf_debug_gui.cpp:763
GetColourGradient
uint8_t GetColourGradient(Colours colour, ColourShade shade)
Get colour gradient palette index.
Definition palette.cpp:314
PC_LIGHT_YELLOW
static const uint8_t PC_LIGHT_YELLOW
Light yellow palette colour.
Definition palette_func.h:81
PC_GREY
static const uint8_t PC_GREY
Grey palette colour.
Definition palette_func.h:69
PC_BLACK
static const uint8_t PC_BLACK
Black palette colour.
Definition palette_func.h:67
querystring_gui.h
Base for the GUIs that have an edit box in them.
ShowOnScreenKeyboard
void ShowOnScreenKeyboard(Window *parent, WidgetID button)
Show the on-screen keyboard (osk) associated with a given textbox.
Definition osk_gui.cpp:395
IsOSKOpenedFor
bool IsOSKOpenedFor(const Window *w, WidgetID button)
Check whether the OSK is opened for a specific editbox.
Definition osk_gui.cpp:426
rev.h
declaration of OTTD revision dependent variables
safeguards.h
A number of safeguards to prevent using unsafe methods.
_settings_game
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:57
_settings_client
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:56
stdafx.h
Definition of base types and functions in a cross-platform compatible way.
string_func.h
Functions related to low-level strings.
CharSetFilter
CharSetFilter
Valid filter types for IsValidChar.
Definition string_type.h:24
StringList
std::vector< std::string > StringList
Type for a list of strings.
Definition string_type.h:60
SetDParam
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
GetString
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:333
CopyOutDParam
void CopyOutDParam(std::vector< StringParameterData > &backup, size_t num)
Copy num string parameters from the global string parameter array to the backup.
Definition strings.cpp:171
CopyInDParam
void CopyInDParam(const std::span< const StringParameterData > backup)
Copy the parameters from the backup into the global string parameter array.
Definition strings.cpp:159
_current_text_dir
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
SetDParamStr
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
strings_func.h
Functions related to OTTD's strings.
PackVelocity
int64_t PackVelocity(uint speed, VehicleType type)
Pack velocity and vehicle type for use with SCC_VELOCITY string parameter.
Definition strings_func.h:75
TD_RTL
@ TD_RTL
Text is written right-to-left by default.
Definition strings_type.h:24
StringID
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition strings_type.h:16
INVALID_STRING_ID
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition strings_type.h:17
MAX_CHAR_LENGTH
static const int MAX_CHAR_LENGTH
Max. length of UTF-8 encoded unicode character.
Definition strings_type.h:18
AboutWindow
Definition misc_gui.cpp:455
AboutWindow::DrawWidget
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition misc_gui.cpp:489
AboutWindow::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 misc_gui.cpp:473
AboutWindow::scroll_interval
IntervalTimer< TimerWindow > scroll_interval
Scroll the text in the about window slow.
Definition misc_gui.cpp:509
AboutWindow::text_position
int text_position
The top of the scrolling text.
Definition misc_gui.cpp:456
AboutWindow::num_visible_lines
static const int num_visible_lines
The number of lines visible simultaneously.
Definition misc_gui.cpp:458
AboutWindow::SetStringParameters
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
Definition misc_gui.cpp:467
AboutWindow::line_height
int line_height
The height of a single line.
Definition misc_gui.cpp:457
AutoRestoreBackup
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
Definition backup_type.hpp:150
CargoArray
Class for storing amounts of cargo.
Definition cargo_type.h:114
ClientSettings::gui
GUISettings gui
settings related to the GUI
Definition settings_type.h:610
CommandHelper
Definition command_func.h:83
Company
Definition company_base.h:133
CursorVars::pos
Point pos
logical mouse position
Definition gfx_type.h:125
CursorVars::in_window
bool in_window
mouse inside this window, determines drawing logic
Definition gfx_type.h:147
CursorVars::total_size
Point total_size
union of sprite properties
Definition gfx_type.h:137
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition geometry_type.hpp:30
DrawPixelInfo
Data about how and where to blit pixels.
Definition gfx_type.h:157
EconomySettings::dist_local_authority
uint8_t dist_local_authority
distance for town local authority, default 20
Definition settings_type.h:518
GUISettings::osk_activation
uint8_t osk_activation
Mouse gesture to trigger the OSK.
Definition settings_type.h:203
GameSettings::economy
EconomySettings economy
settings to change the economy
Definition settings_type.h:602
NWidgetPart
Partial widget specification to allow NWidgets to be written nested.
Definition widget_type.h:1075
Point
Coordinates of a point in 2D.
Definition geometry_type.hpp:21
Pool::PoolItem::index
Tindex index
Index of this pool item.
Definition pool_type.hpp:238
Pool::PoolItem<&_company_pool >::GetIfValid
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition pool_type.hpp:350
QueryStringWindow
Class for the string query window.
Definition misc_gui.cpp:950
QueryStringWindow::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 misc_gui.cpp:1000
QueryStringWindow::Close
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition misc_gui.cpp:1017
QueryStringWindow::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 misc_gui.cpp:975
QueryStringWindow::editbox
QueryString editbox
Editbox.
Definition misc_gui.cpp:951
QueryStringWindow::SetStringParameters
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
Definition misc_gui.cpp:985
QueryStringWindow::flags
QueryStringFlags flags
Flags controlling behaviour of the window.
Definition misc_gui.cpp:952
QueryString
Data stored about a string that can be modified in the GUI.
Definition querystring_gui.h:20
QueryString::ok_button
int ok_button
Widget button of parent window to simulate when pressing OK in OSK.
Definition querystring_gui.h:27
QueryString::cancel_button
int cancel_button
Widget button of parent window to simulate when pressing CANCEL in OSK.
Definition querystring_gui.h:28
QueryString::GetCharAtPosition
ptrdiff_t GetCharAtPosition(const Window *w, WidgetID wid, const Point &pt) const
Get the character that is rendered at a position.
Definition misc_gui.cpp:898
QueryString::GetBoundingRect
Rect GetBoundingRect(const Window *w, WidgetID wid, const char *from, const char *to) const
Get the bounding rectangle for a range of the query string.
Definition misc_gui.cpp:868
QueryString::GetCaretPosition
Point GetCaretPosition(const Window *w, WidgetID wid) const
Get the current caret position.
Definition misc_gui.cpp:840
QueryWindow
Window used for asking the user a YES/NO question.
Definition misc_gui.cpp:1070
QueryWindow::Close
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition misc_gui.cpp:1089
QueryWindow::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 misc_gui.cpp:1113
QueryWindow::proc
QueryCallbackProc * proc
callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' click...
Definition misc_gui.cpp:1071
QueryWindow::OnKeyPress
EventState OnKeyPress(char32_t key, uint16_t keycode) override
A key has been pressed.
Definition misc_gui.cpp:1150
QueryWindow::SetStringParameters
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
Definition misc_gui.cpp:1103
QueryWindow::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 misc_gui.cpp:1127
QueryWindow::message
StringID message
message shown for query window
Definition misc_gui.cpp:1073
QueryWindow::FindWindowPlacementAndResize
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
Definition misc_gui.cpp:1095
QueryWindow::DrawWidget
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition misc_gui.cpp:1120
QueryWindow::params
std::vector< StringParameterData > params
local copy of _global_string_params
Definition misc_gui.cpp:1072
RectPadding::Horizontal
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
Definition geometry_type.hpp:63
RectPadding::Vertical
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Definition geometry_type.hpp:69
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition geometry_type.hpp:75
Rect::WithWidth
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Definition geometry_type.hpp:185
Rect::Width
int Width() const
Get width of Rect.
Definition geometry_type.hpp:85
Rect::Shrink
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Definition geometry_type.hpp:98
Rect::Indent
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Definition geometry_type.hpp:198
Rect::Translate
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
Definition geometry_type.hpp:174
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > >
Textbuf
Helper/buffer for input fields.
Definition textbuf_type.h:30
Textbuf::pixels
uint16_t pixels
the current size of the string in pixels
Definition textbuf_type.h:37
Textbuf::markxoffs
uint16_t markxoffs
the start position of the marked area in pixels
Definition textbuf_type.h:43
Textbuf::DeleteAll
void DeleteAll()
Delete every character in the textbuffer.
Definition textbuf.cpp:114
Textbuf::Assign
void Assign(StringID string)
Render a string into the textbuffer.
Definition textbuf.cpp:431
Textbuf::bytes
uint16_t bytes
the current size of the string in bytes (including terminating '\0')
Definition textbuf_type.h:35
Textbuf::caretxoffs
uint16_t caretxoffs
the current position of the caret in pixels
Definition textbuf_type.h:40
Textbuf::marklength
uint16_t marklength
the length of the marked area in pixels
Definition textbuf_type.h:44
Textbuf::caret
bool caret
is the caret ("_") visible or not
Definition textbuf_type.h:38
Textbuf::afilter
CharSetFilter afilter
Allowed characters.
Definition textbuf_type.h:31
Textbuf::buf
char *const buf
buffer in which text is saved
Definition textbuf_type.h:32
TileDesc
Tile description for the 'land area information' tool.
Definition tile_cmd.h:52
TileDesc::rail_speed
uint16_t rail_speed
Speed limit of rail (bridges and track)
Definition tile_cmd.h:65
TileDesc::station_name
StringID station_name
Type of station within the class.
Definition tile_cmd.h:59
TileDesc::str
StringID str
Description of the tile.
Definition tile_cmd.h:53
TileDesc::build_date
TimerGameCalendar::Date build_date
Date of construction of tile contents.
Definition tile_cmd.h:57
TileDesc::dparam
uint64_t dparam
Parameter of the str string.
Definition tile_cmd.h:54
TileDesc::airport_class
StringID airport_class
Name of the airport class.
Definition tile_cmd.h:60
TileDesc::airport_name
StringID airport_name
Name of the airport.
Definition tile_cmd.h:61
TileDesc::tram_speed
uint16_t tram_speed
Speed limit of tram (bridges and track)
Definition tile_cmd.h:69
TileDesc::roadtype
StringID roadtype
Type of road on the tile.
Definition tile_cmd.h:66
TileDesc::tramtype
StringID tramtype
Type of tram on the tile.
Definition tile_cmd.h:68
TileDesc::railtype
StringID railtype
Type of rail on the tile.
Definition tile_cmd.h:64
TileDesc::road_speed
uint16_t road_speed
Speed limit of road (bridges and track)
Definition tile_cmd.h:67
TileDesc::grf
const char * grf
newGRF used for the tile contents
Definition tile_cmd.h:63
TileDesc::airport_tile_name
StringID airport_tile_name
Name of the airport tile.
Definition tile_cmd.h:62
TileDesc::owner
Owner owner[4]
Name of the owner(s)
Definition tile_cmd.h:55
TileDesc::owner_type
StringID owner_type[4]
Type of each owner.
Definition tile_cmd.h:56
TileDesc::station_class
StringID station_class
Class of station.
Definition tile_cmd.h:58
TooltipsWindow
Window for displaying a tooltip.
Definition misc_gui.cpp:649
TooltipsWindow::close_cond
TooltipCloseCondition close_cond
Condition for closing the window.
Definition misc_gui.cpp:652
TooltipsWindow::params
std::vector< StringParameterData > params
The string parameters.
Definition misc_gui.cpp:651
TooltipsWindow::string_id
StringID string_id
String to display as tooltip.
Definition misc_gui.cpp:650
TooltipsWindow::OnMouseLoop
void OnMouseLoop() override
Called for every mouse loop run, which is at least once per (game) tick.
Definition misc_gui.cpp:709
TooltipsWindow::OnInitialPosition
Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number) override
Compute the initial position of the window.
Definition misc_gui.cpp:666
TooltipsWindow::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 misc_gui.cpp:686
TooltipsWindow::DrawWidget
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition misc_gui.cpp:699
Town
Town data structure.
Definition town.h:54
WindowDesc
High level window description.
Definition window_gui.h:159
Window
Data structure for an opened window.
Definition window_gui.h:273
Window::ReInit
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:952
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:1047
Window::IsWidgetGloballyFocused
bool IsWidgetGloballyFocused(WidgetID widget_index) const
Check if given widget has user input focus.
Definition window_gui.h:437
Window::FinishInitNested
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1733
Window::querystrings
std::map< WidgetID, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
Definition window_gui.h:320
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:3159
Window::parent
Window * parent
Parent window.
Definition window_gui.h:328
Window::SetWidgetDirty
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:551
Window::resize
ResizeInfo resize
Resize information.
Definition window_gui.h:314
Window::CreateNestedTree
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1723
Window::window_class
WindowClass window_class
Window class.
Definition window_gui.h:301
Window::OnQueryTextFinished
virtual void OnQueryTextFinished(std::optional< std::string > str)
The query window opened from this window has closed.
Definition window_gui.h:779
Window::SetFocusedWidget
bool SetFocusedWidget(WidgetID widget_index)
Set focus within this window to the given widget.
Definition window.cpp:486
Window::left
int left
x position of left edge of the window
Definition window_gui.h:309
Window::OnEditboxChanged
virtual void OnEditboxChanged(WidgetID widget)
The text in an editbox has been edited.
Definition window_gui.h:771
Window::top
int top
y position of top edge of the window
Definition window_gui.h:310
Window::GetWidget
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:977
Window::HandleButtonClick
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition window.cpp:590
Window::InitNested
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1746
Window::flags
WindowFlags flags
Window flags.
Definition window_gui.h:300
Window::Iterate
AllWindows< false > Iterate
Iterate all windows in whatever order is easiest.
Definition window_gui.h:927
Window::height
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:312
Window::width
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
Window::window_number
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:302
QueryCallbackProc
void QueryCallbackProc(Window *, bool)
Callback procedure for the ShowQuery method.
Definition textbuf_gui.h:28
QueryStringFlags
QueryStringFlags
Flags used in ShowQueryString() call.
Definition textbuf_gui.h:18
QSF_ENABLE_DEFAULT
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:21
QSF_ACCEPT_UNCHANGED
@ QSF_ACCEPT_UNCHANGED
return success even when the text didn't change
Definition textbuf_gui.h:20
QSF_LEN_IN_CHARS
@ QSF_LEN_IN_CHARS
the length of the string is counted in characters
Definition textbuf_gui.h:22
texteff.hpp
Functions related to text effects.
TE_STATIC
@ TE_STATIC
Keep the text effect static.
Definition texteff.hpp:22
TE_RISING
@ TE_RISING
Make the text effect slowly go upwards.
Definition texteff.hpp:21
GetTileZ
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
Definition tile_map.cpp:116
timer.h
Definition of Interval and OneShot timers.
timer_window.h
Definition of the Window system.
town.h
Base of the town class.
ClosestTownFromTile
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
Definition town_cmd.cpp:3896
VEH_ROAD
@ VEH_ROAD
Road vehicle type.
Definition vehicle_type.h:25
VEH_TRAIN
@ VEH_TRAIN
Train vehicle type.
Definition vehicle_type.h:24
ScrollMainWindowToTile
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
Scrolls the viewport of the main window to a given location.
Definition viewport.cpp:2515
IsPtInWindowViewport
Viewport * IsPtInWindowViewport(const Window *w, int x, int y)
Is a xy position inside the viewport of the window?
Definition viewport.cpp:411
viewport_func.h
Functions related to (drawing on) viewports.
water_regions.h
Handles dividing the water in the map into regions to assist pathfinding.
DrawFrameRect
void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
Draw frame rectangle.
Definition widget.cpp:283
ScaleGUITrad
static RectPadding ScaleGUITrad(const RectPadding &r)
Scale a RectPadding to GUI zoom level.
Definition widget.cpp:35
NC_EQUALSIZE
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
Definition widget_type.h:524
WWT_PUSHTXTBTN
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition widget_type.h:113
WWT_PUSHIMGBTN
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
Definition widget_type.h:114
WWT_LABEL
@ WWT_LABEL
Centered label.
Definition widget_type.h:57
WWT_EDITBOX
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:71
NWID_HORIZONTAL
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
WWT_TEXTBTN
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:55
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
WWT_CAPTION
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
NWID_VERTICAL
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
WWT_CLOSEBOX
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
WWT_FRAME
@ WWT_FRAME
Frame.
Definition widget_type.h:60
WWT_EMPTY
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:48
WWT_TEXT
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:58
WWT_DEBUGBOX
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:63
CloseWindowById
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition window.cpp:1140
GetMainWindow
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1127
SetFocusedWindow
void SetFocusedWindow(Window *w)
Set the window that has the focus.
Definition window.cpp:422
FindWindowFromPt
Window * FindWindowFromPt(int x, int y)
Do a search for a window at specific coordinates.
Definition window.cpp:1768
GetMainViewTop
int GetMainViewTop()
Return the top of the main view available for general use.
Definition window.cpp:2062
CloseWindowByClass
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1152
GetMainViewBottom
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Definition window.cpp:2073
_mouse_hovering
bool _mouse_hovering
The mouse is hovering over the same point.
Definition window.cpp:91
window_func.h
Window functions not directly related to making/drawing windows.
WF_WHITE_BORDER
@ WF_WHITE_BORDER
Window white border counter bit mask.
Definition window_gui.h:236
FR_DARKENED
@ FR_DARKENED
If set the background is darker, allows for lowered frames with normal background colour when used wi...
Definition window_gui.h:29
FR_LOWERED
@ FR_LOWERED
If set the frame is lowered and the background colour brighter (ie. buttons when pressed)
Definition window_gui.h:28
WDF_NO_CLOSE
@ WDF_NO_CLOSE
This window can't be interactively closed.
Definition window_gui.h:206
WDF_MODAL
@ WDF_MODAL
The window is a modal child of some other window, meaning the parent is 'inactive'.
Definition window_gui.h:204
WDF_NO_FOCUS
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
Definition window_gui.h:205
WDP_CENTER
@ WDP_CENTER
Center the window.
Definition window_gui.h:148
WDP_AUTO
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:147
WDP_MANUAL
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition window_gui.h:146
WidgetID
int WidgetID
Widget ID.
Definition window_type.h:18
WN_QUERY_STRING
@ WN_QUERY_STRING
Query string.
Definition window_type.h:29
WN_GAME_OPTIONS_ABOUT
@ WN_GAME_OPTIONS_ABOUT
About window.
Definition window_type.h:24
WN_CONFIRM_POPUP_QUERY
@ WN_CONFIRM_POPUP_QUERY
Query popup confirm.
Definition window_type.h:32
EventState
EventState
State of handling an event.
Definition window_type.h:743
ES_HANDLED
@ ES_HANDLED
The passed event is handled.
Definition window_type.h:744
ES_NOT_HANDLED
@ ES_NOT_HANDLED
The passed event is not handled.
Definition window_type.h:745
WC_LAND_INFO
@ WC_LAND_INFO
Land info window; Window numbers:
Definition window_type.h:150
WC_OSK
@ WC_OSK
On Screen Keyboard; Window numbers:
Definition window_type.h:162
WC_NONE
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:45
WC_CONFIRM_POPUP_QUERY
@ WC_CONFIRM_POPUP_QUERY
Popup with confirm question; Window numbers:
Definition window_type.h:130
WC_GAME_OPTIONS
@ WC_GAME_OPTIONS
Game options window; Window numbers:
Definition window_type.h:624
WC_QUERY_STRING
@ WC_QUERY_STRING
Query string window; Window numbers:
Definition window_type.h:123
WC_TOOLTIPS
@ WC_TOOLTIPS
Tooltip window; Window numbers:
Definition window_type.h:116
zoom_func.h
Functions related to zooming.