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