OpenTTD Source 20250528-master-g3aca5d62a8
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 "safeguards.h"
40
48
49
50static constexpr NWidgetPart _nested_land_info_widgets[] = {
52 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
53 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_LAND_AREA_INFORMATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
54 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_LI_LOCATION), SetAspect(WidgetDimensions::ASPECT_LOCATION), SetSpriteTip(SPR_GOTO_LOCATION, STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP),
55 NWidget(WWT_DEBUGBOX, COLOUR_GREY),
58};
59
60static WindowDesc _land_info_desc(
61 WDP_AUTO, {}, 0, 0,
63 {},
64 _nested_land_info_widgets
65);
66
67class LandInfoWindow : public Window {
69 std::string cargo_acceptance{};
70
71public:
73
74 void DrawWidget(const Rect &r, WidgetID widget) const override
75 {
76 if (widget != WID_LI_BACKGROUND) return;
77
78 Rect ir = r.Shrink(WidgetDimensions::scaled.frametext);
79 for (size_t i = 0; i < this->landinfo_data.size(); i++) {
80 DrawString(ir, this->landinfo_data[i], i == 0 ? TC_LIGHT_BLUE : TC_FROMSTRING, SA_HOR_CENTER);
82 }
83
84 if (!this->cargo_acceptance.empty()) {
85 DrawStringMultiLine(ir, GetString(STR_JUST_RAW_STRING, this->cargo_acceptance), TC_FROMSTRING, SA_CENTER);
86 }
87 }
88
89 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
90 {
91 if (widget != WID_LI_BACKGROUND) return;
92
94 for (size_t i = 0; i < this->landinfo_data.size(); i++) {
96 size.width = std::max(size.width, width);
97
99 }
100
101 if (!this->cargo_acceptance.empty()) {
103 size.width = std::max(size.width, std::min(static_cast<uint>(ScaleGUITrad(300)), width));
104 size.height += GetStringHeight(GetString(STR_JUST_RAW_STRING, this->cargo_acceptance), size.width - WidgetDimensions::scaled.frametext.Horizontal());
105 }
106 }
107
108 LandInfoWindow(Tile tile) : Window(_land_info_desc), tile(tile)
109 {
110 this->InitNested();
111
112#if defined(_DEBUG)
113# define LANDINFOD_LEVEL 0
114#else
115# define LANDINFOD_LEVEL 1
116#endif
117 Debug(misc, LANDINFOD_LEVEL, "TILE: {0} (0x{0:x}) ({1},{2})", (TileIndex)tile, TileX(tile), TileY(tile));
118 Debug(misc, LANDINFOD_LEVEL, "type = 0x{:x}", tile.type());
119 Debug(misc, LANDINFOD_LEVEL, "height = 0x{:x}", tile.height());
120 Debug(misc, LANDINFOD_LEVEL, "m1 = 0x{:x}", tile.m1());
121 Debug(misc, LANDINFOD_LEVEL, "m2 = 0x{:x}", tile.m2());
122 Debug(misc, LANDINFOD_LEVEL, "m3 = 0x{:x}", tile.m3());
123 Debug(misc, LANDINFOD_LEVEL, "m4 = 0x{:x}", tile.m4());
124 Debug(misc, LANDINFOD_LEVEL, "m5 = 0x{:x}", tile.m5());
125 Debug(misc, LANDINFOD_LEVEL, "m6 = 0x{:x}", tile.m6());
126 Debug(misc, LANDINFOD_LEVEL, "m7 = 0x{:x}", tile.m7());
127 Debug(misc, LANDINFOD_LEVEL, "m8 = 0x{:x}", tile.m8());
128
129 PrintWaterRegionDebugInfo(tile);
130#undef LANDINFOD_LEVEL
131 }
132
133 void OnInit() override
134 {
136
137 TileDesc td{};
138 td.owner_type[0] = STR_LAND_AREA_INFORMATION_OWNER; // At least one owner is displayed, though it might be "N/A".
139
140 CargoArray acceptance{};
141 AddAcceptedCargo(tile, acceptance, nullptr);
142 GetTileDesc(tile, td);
143
144 this->landinfo_data.clear();
145
146 /* Tiletype */
147 this->landinfo_data.push_back(GetString(td.str, td.dparam));
148
149 /* Up to four owners */
150 for (uint i = 0; i < 4; i++) {
151 if (td.owner_type[i] == STR_NULL) continue;
152
153 if (td.owner[i] == OWNER_NONE || td.owner[i] == OWNER_WATER) {
154 this->landinfo_data.push_back(GetString(td.owner_type[i], STR_LAND_AREA_INFORMATION_OWNER_N_A, std::monostate{}));
155 } else {
156 auto params = GetParamsForOwnedBy(td.owner[i], tile);
157 this->landinfo_data.push_back(GetStringWithArgs(td.owner_type[i], params));
158 }
159 }
160
161 /* Cost to clear/revenue when cleared */
163 if (c != nullptr) {
166 if (costclear.Succeeded()) {
167 Money cost = costclear.GetCost();
168 StringID str;
169 if (cost < 0) {
170 cost = -cost; // Negate negative cost to a positive revenue
171 str = STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED;
172 } else {
173 str = STR_LAND_AREA_INFORMATION_COST_TO_CLEAR;
174 }
175 this->landinfo_data.push_back(GetString(str, cost));
176 } else {
177 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A));
178 }
179 } else {
180 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A));
181 }
182
183 /* Location */
184 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LANDINFO_COORDS, TileX(tile), TileY(tile), GetTileZ(tile)));
185
186 /* Tile index */
187 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LANDINFO_INDEX, tile, tile));
188
189 /* Local authority */
190 if (t == nullptr) {
191 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY, STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE, std::monostate{}));
192 } else {
193 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY, STR_TOWN_NAME, t->index));
194 }
195
196 /* Build date */
197 if (td.build_date != CalendarTime::INVALID_DATE) {
198 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_BUILD_DATE, td.build_date));
199 }
200
201 /* Station class */
202 if (td.station_class != STR_NULL) {
203 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_STATION_CLASS, td.station_class));
204 }
205
206 /* Station type name */
207 if (td.station_name != STR_NULL) {
208 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_STATION_TYPE, td.station_name));
209 }
210
211 /* Airport class */
212 if (td.airport_class != STR_NULL) {
213 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORT_CLASS, td.airport_class));
214 }
215
216 /* Airport name */
217 if (td.airport_name != STR_NULL) {
218 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORT_NAME, td.airport_name));
219 }
220
221 /* Airport tile name */
222 if (td.airport_tile_name != STR_NULL) {
223 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME, td.airport_tile_name));
224 }
225
226 /* Rail type name */
227 if (td.railtype != STR_NULL) {
228 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_RAIL_TYPE, td.railtype));
229 }
230
231 /* Rail speed limit */
232 if (td.rail_speed != 0) {
233 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT, PackVelocity(td.rail_speed, VEH_TRAIN)));
234 }
235
236 /* Road type name */
237 if (td.roadtype != STR_NULL) {
238 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_ROAD_TYPE, td.roadtype));
239 }
240
241 /* Road speed limit */
242 if (td.road_speed != 0) {
243 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT, PackVelocity(td.road_speed, VEH_ROAD)));
244 }
245
246 /* Tram type name */
247 if (td.tramtype != STR_NULL) {
248 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_TRAM_TYPE, td.tramtype));
249 }
250
251 /* Tram speed limit */
252 if (td.tram_speed != 0) {
253 this->landinfo_data.push_back(GetString(STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT, PackVelocity(td.tram_speed, VEH_ROAD)));
254 }
255
256 /* Tile protection status */
257 if (td.town_can_upgrade.has_value()) {
258 this->landinfo_data.push_back(GetString(td.town_can_upgrade.value() ? STR_LAND_AREA_INFORMATION_TOWN_CAN_UPGRADE : STR_LAND_AREA_INFORMATION_TOWN_CANNOT_UPGRADE));
259 }
260
261 /* NewGRF name */
262 if (td.grf.has_value()) {
263 this->landinfo_data.push_back(GetString(STR_LAND_AREA_INFORMATION_NEWGRF_NAME, std::move(*td.grf)));
264 }
265
266 /* Cargo acceptance is displayed in a extra multiline */
267 auto line = BuildCargoAcceptanceString(acceptance, STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED);
268 if (line.has_value()) {
269 this->cargo_acceptance = std::move(*line);
270 } else {
271 this->cargo_acceptance.clear();
272 }
273 }
274
275 bool IsNewGRFInspectable() const override
276 {
277 return ::IsNewGRFInspectable(GetGrfSpecFeature(this->tile), this->tile.base());
278 }
279
280 void ShowNewGRFInspectWindow() const override
281 {
282 ::ShowNewGRFInspectWindow(GetGrfSpecFeature(this->tile), this->tile.base());
283 }
284
285 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
286 {
287 switch (widget) {
288 case WID_LI_LOCATION:
289 if (_ctrl_pressed) {
290 ShowExtraViewportWindow(this->tile);
291 } else {
292 ScrollMainWindowToTile(this->tile);
293 }
294 break;
295 }
296 }
297
303 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
304 {
305 if (!gui_scope) return;
306
307 /* ReInit, "debug" sprite might have changed */
308 if (data == 1) this->ReInit();
309 }
310};
311
317{
319 new LandInfoWindow(tile);
320}
321
322static constexpr NWidgetPart _nested_about_widgets[] = {
324 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
325 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_ABOUT_OPENTTD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
326 EndContainer(),
327 NWidget(WWT_PANEL, COLOUR_GREY), SetPIP(4, 2, 4),
328 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_ABOUT_ORIGINAL_COPYRIGHT),
329 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_ABOUT_VERSION),
330 NWidget(WWT_FRAME, COLOUR_GREY), SetPadding(0, 5, 1, 5),
331 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_A_SCROLLING_TEXT),
332 EndContainer(),
333 NWidget(WWT_LABEL, INVALID_COLOUR, WID_A_WEBSITE),
334 NWidget(WWT_LABEL, INVALID_COLOUR, WID_A_COPYRIGHT),
335 EndContainer(),
336};
337
338static WindowDesc _about_desc(
339 WDP_CENTER, {}, 0, 0,
341 {},
342 _nested_about_widgets
343);
344
345static const std::initializer_list<const std::string_view> _credits = {
346 "Original design by Chris Sawyer",
347 "Original graphics by Simon Foster",
348 "",
349 "The OpenTTD team (in alphabetical order):",
350 " Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)",
351 " Christoph Elsenhans (frosch) - General coding (since 0.6)",
352 " Lo\u00efc Guilloux (glx) - General / Windows Expert (since 0.4.5)",
353 " Koen Bussemaker (Kuhnovic) - General / Ship pathfinder (since 14)",
354 " Charles Pigott (LordAro) - General / Correctness police (since 1.9)",
355 " Michael Lutz (michi_cc) - Path based signals (since 0.7)",
356 " Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)",
357 " Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)",
358 " Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)",
359 " Remko Bijker (Rubidium) - Coder and way more (since 0.4.5)",
360 " Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op",
361 " Tyler Trahan (2TallTyler) - General / Time Lord (since 13)",
362 " Richard Wheeler (zephyris) - Precision pixel production (since 15)",
363 "",
364 "Inactive Developers:",
365 " Grzegorz Duczy\u0144ski (adf88) - General coding (1.7 - 1.8)",
366 " Albert Hofkamp (Alberth) - GUI expert (0.7 - 1.9)",
367 " Jean-Fran\u00e7ois Claeys (Belugas) - GUI, NewGRF and more (0.4.5 - 1.0)",
368 " Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)",
369 " Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)",
370 " Ulf Hermann (fonsinchen) - Cargo Distribution (1.3 - 1.6)",
371 " Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)",
372 " Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)",
373 " Attila B\u00e1n (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)",
374 " Ingo von Borstel (planetmaker) - General coding, Support (1.1 - 1.9)",
375 " Zden\u011bk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)",
376 " Jos\u00e9 Soler (Terkhen) - General coding (1.0 - 1.4)",
377 " Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)",
378 " Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)",
379 " Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6)",
380 "",
381 "Retired Developers:",
382 " Tam\u00e1s Farag\u00f3 (Darkvater) - Ex-Lead coder (0.3 - 0.5)",
383 " Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)",
384 " Emil Djupfeld (egladil) - MacOSX (0.4.5 - 0.6)",
385 " Simon Sasburg (HackyKid) - Many bugfixes (0.4 - 0.4.5)",
386 " Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)",
387 " Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)",
388 " Petr Baudi\u0161 (pasky) - Many patches, NewGRF support (0.3 - 0.3)",
389 " Benedikt Br\u00fcggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)",
390 " Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)",
391 "",
392 "Special thanks go out to:",
393 " Josef Drexler - For his great work on TTDPatch",
394 " Marcin Grzegorczyk - Track foundations and for describing TTD internals",
395 " Stefan Mei\u00dfner (sign_de) - For his work on the console",
396 " Mike Ragsdale - OpenTTD installer",
397 " Christian Rosentreter (tokai) - MorphOS / AmigaOS port",
398 " Richard Kempton (richK) - additional airports, initial TGP implementation",
399 " Alberto Demichelis - Squirrel scripting language \u00a9 2003-2008",
400 " L. Peter Deutsch - MD5 implementation \u00a9 1999, 2000, 2002",
401 " Michael Blunck - Pre-signals and semaphores \u00a9 2003",
402 " George - Canal/Lock graphics \u00a9 2003-2004",
403 " Andrew Parkhouse (andythenorth) - River graphics",
404 " David Dallaston (Pikka) - Tram tracks",
405 " All Translators - Who made OpenTTD a truly international game",
406 " Bug Reporters - Without whom OpenTTD would still be full of bugs!",
407 "",
408 "",
409 "And last but not least:",
410 " Chris Sawyer - For an amazing game!"
411};
412
413struct AboutWindow : public Window {
415 int line_height = 0;
416 static const int num_visible_lines = 19;
417
418 AboutWindow() : Window(_about_desc)
419 {
421
422 this->text_position = this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y + this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->current_y;
423 }
424
425 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
426 {
427 if (widget == WID_A_WEBSITE) return "Website: https://www.openttd.org";
428 if (widget == WID_A_COPYRIGHT) return GetString(STR_ABOUT_COPYRIGHT_OPENTTD, _openttd_revision_year);
429 return this->Window::GetWidgetString(widget, stringid);
430 }
431
432 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
433 {
434 if (widget != WID_A_SCROLLING_TEXT) return;
435
436 this->line_height = GetCharacterHeight(FS_NORMAL);
437
438 Dimension d;
439 d.height = this->line_height * num_visible_lines;
440
441 d.width = 0;
442 for (const auto &str : _credits) {
443 d.width = std::max(d.width, GetStringBoundingBox(str).width);
444 }
445 size = maxdim(size, d);
446 }
447
448 void DrawWidget(const Rect &r, WidgetID widget) const override
449 {
450 if (widget != WID_A_SCROLLING_TEXT) return;
451
452 int y = this->text_position;
453
454 /* Show all scrolling _credits */
455 for (const auto &str : _credits) {
456 if (y >= r.top + 7 && y < r.bottom - this->line_height) {
457 DrawString(r.left, r.right, y, str, TC_BLACK, SA_LEFT | SA_FORCE);
458 }
459 y += this->line_height;
460 }
461 }
462
468 const IntervalTimer<TimerWindow> scroll_interval = {std::chrono::milliseconds(2100) / GetCharacterHeight(FS_NORMAL), [this](uint count) {
469 this->text_position -= count;
470 /* If the last text has scrolled start a new from the start */
471 if (this->text_position < (int)(this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y - std::size(_credits) * this->line_height)) {
472 this->text_position = this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->pos_y + this->GetWidget<NWidgetBase>(WID_A_SCROLLING_TEXT)->current_y;
473 }
475 }};
476};
477
478void ShowAboutWindow()
479{
481 new AboutWindow();
482}
483
490void ShowEstimatedCostOrIncome(Money cost, int x, int y)
491{
492 StringID msg = STR_MESSAGE_ESTIMATED_COST;
493
494 if (cost < 0) {
495 cost = -cost;
496 msg = STR_MESSAGE_ESTIMATED_INCOME;
497 }
498 ShowErrorMessage(GetEncodedString(msg, cost), {}, WL_INFO, x, y);
499}
500
508void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
509{
510 if (cost == 0) {
511 return;
512 }
513 Point pt = RemapCoords(x, y, z);
514 StringID msg = STR_INCOME_FLOAT_COST;
515
516 if (cost < 0) {
517 cost = -cost;
518 msg = STR_INCOME_FLOAT_INCOME;
519 }
520 AddTextEffect(GetEncodedString(msg, cost), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
521}
522
531void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income)
532{
533 Point pt = RemapCoords(x, y, z);
534
535 if (income == 0) {
536 AddTextEffect(GetEncodedString(STR_FEEDER, transfer), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
537 } else {
538 StringID msg = STR_FEEDER_COST;
539 if (income < 0) {
540 income = -income;
541 msg = STR_FEEDER_INCOME;
542 }
543 AddTextEffect(GetEncodedString(msg, transfer, income), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
544 }
545}
546
556TextEffectID ShowFillingPercent(int x, int y, int z, uint8_t percent, StringID string)
557{
558 Point pt = RemapCoords(x, y, z);
559
560 assert(string != STR_NULL);
561
562 return AddTextEffect(GetEncodedString(string, percent), pt.x, pt.y, 0, TE_STATIC);
563}
564
570void UpdateFillingPercent(TextEffectID te_id, uint8_t percent, StringID string)
571{
572 assert(string != STR_NULL);
573
574 UpdateTextEffect(te_id, GetEncodedString(string, percent));
575}
576
581void HideFillingPercent(TextEffectID *te_id)
582{
583 if (*te_id == INVALID_TE_ID) return;
584
585 RemoveTextEffect(*te_id);
586 *te_id = INVALID_TE_ID;
587}
588
589static constexpr NWidgetPart _nested_tooltips_widgets[] = {
590 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_TT_BACKGROUND),
591};
592
593static WindowDesc _tool_tips_desc(
594 WDP_MANUAL, {}, 0, 0, // Coordinates and sizes are not used,
597 _nested_tooltips_widgets
598);
599
601struct TooltipsWindow : public Window
602{
604 TooltipCloseCondition close_cond{};
605
606 TooltipsWindow(Window *parent, EncodedString &&text, TooltipCloseCondition close_tooltip) : Window(_tool_tips_desc), text(std::move(text))
607 {
608 this->parent = parent;
609 this->close_cond = close_tooltip;
610
611 this->InitNested();
612
614 }
615
616 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
617 {
618 /* Find the free screen space between the main toolbar at the top, and the statusbar at the bottom.
619 * Add a fixed distance 2 so the tooltip floats free from both bars.
620 */
621 int scr_top = GetMainViewTop() + 2;
622 int scr_bot = GetMainViewBottom() - 2;
623
624 Point pt;
625
626 /* Correctly position the tooltip position, watch out for window and cursor size
627 * Clamp value to below main toolbar and above statusbar. If tooltip would
628 * go below window, flip it so it is shown above the cursor */
629 pt.y = SoftClamp(_cursor.pos.y + _cursor.total_size.y + _cursor.total_offs.y + 5, scr_top, scr_bot);
630 if (pt.y + sm_height > scr_bot) pt.y = std::min(_cursor.pos.y + _cursor.total_offs.y - 5, scr_bot) - sm_height;
631 pt.x = sm_width >= _screen.width ? 0 : SoftClamp(_cursor.pos.x - (sm_width >> 1), 0, _screen.width - sm_width);
632
633 return pt;
634 }
635
636 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
637 {
638 if (widget != WID_TT_BACKGROUND) return;
639
640 auto str = this->text.GetDecodedString();
641 size.width = std::min<uint>(GetStringBoundingBox(str).width, ScaleGUITrad(194));
642 size.height = GetStringHeight(str, size.width);
643
644 /* Increase slightly to have some space around the box. */
647 }
648
649 void DrawWidget(const Rect &r, WidgetID widget) const override
650 {
651 if (widget != WID_TT_BACKGROUND) return;
654
656 }
657
658 void OnMouseLoop() override
659 {
660 /* Always close tooltips when the cursor is not in our window. */
661 if (!_cursor.in_window) {
662 this->Close();
663 return;
664 }
665
666 /* We can show tooltips while dragging tools. These are shown as long as
667 * we are dragging the tool. Normal tooltips work with hover or rmb. */
668 switch (this->close_cond) {
669 case TCC_RIGHT_CLICK: if (!_right_button_down) this->Close(); break;
670 case TCC_HOVER: if (!_mouse_hovering) this->Close(); break;
671 case TCC_NONE: break;
672
673 case TCC_EXIT_VIEWPORT: {
674 Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
675 if (w == nullptr || IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y) == nullptr) this->Close();
676 break;
677 }
678 }
679 }
680};
681
688void GuiShowTooltips(Window *parent, EncodedString &&text, TooltipCloseCondition close_tooltip)
689{
691
692 if (text.empty() || !_cursor.in_window) return;
693
694 new TooltipsWindow(parent, std::move(text), close_tooltip);
695}
696
697void QueryString::HandleEditBox(Window *w, WidgetID wid)
698{
699 if (w->IsWidgetGloballyFocused(wid) && this->text.HandleCaret()) {
700 w->SetWidgetDirty(wid);
701
702 /* For the OSK also invalidate the parent window */
703 if (w->window_class == WC_OSK) w->InvalidateData();
704 }
705}
706
707static int GetCaretWidth()
708{
709 return GetCharacterWidth(FS_NORMAL, '_');
710}
711
719{
720 const int linewidth = tb.pixels + GetCaretWidth();
721 const int boxwidth = r.Width();
722 if (linewidth <= boxwidth) return r;
723
724 /* Extend to cover whole string. This is left-aligned, adjusted by caret position. */
725 r = r.WithWidth(linewidth, false);
726
727 /* Slide so that the caret is at the centre unless limited by bounds of the line, i.e. near either end. */
728 return r.Translate(-std::clamp(tb.caretxoffs - (boxwidth / 2), 0, linewidth - boxwidth), 0);
729}
730
731void QueryString::DrawEditBox(const Window *w, WidgetID wid) const
732{
733 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
734
735 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
736
737 bool rtl = _current_text_dir == TD_RTL;
738 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
739 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
740
741 Rect r = wi->GetCurrentRect();
742 Rect cr = r.WithWidth(clearbtn_width, !rtl);
743 Rect fr = r.Indent(clearbtn_width, !rtl);
744
746 DrawSpriteIgnorePadding(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr, SA_CENTER);
747 if (this->text.GetText().empty()) GfxFillRect(cr.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(wi->colour, SHADE_DARKER), FILLRECT_CHECKER);
748
749 DrawFrameRect(fr, wi->colour, {FrameFlag::Lowered, FrameFlag::Darkened});
751
752 fr = fr.Shrink(WidgetDimensions::scaled.framerect);
753 /* Limit the drawing of the string inside the widget boundaries */
754 DrawPixelInfo dpi;
755 if (!FillDrawPixelInfo(&dpi, fr)) return;
756 /* Keep coordinates relative to the window. */
757 dpi.left += fr.left;
758 dpi.top += fr.top;
759
760 AutoRestoreBackup dpi_backup(_cur_dpi, &dpi);
761
762 /* We will take the current widget length as maximum width, with a small
763 * space reserved at the end for the caret to show */
764 const Textbuf *tb = &this->text;
765 fr = ScrollEditBoxTextRect(fr, *tb);
766
767 /* If we have a marked area, draw a background highlight. */
768 if (tb->marklength != 0) GfxFillRect(fr.left + tb->markxoffs, fr.top, fr.left + tb->markxoffs + tb->marklength - 1, fr.bottom, PC_GREY);
769
770 DrawString(fr.left, fr.right, CentreBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), tb->GetText(), TC_YELLOW);
771 bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid);
772 if (focussed && tb->caret) {
773 int caret_width = GetCaretWidth();
774 if (rtl) {
775 DrawString(fr.right - tb->pixels + tb->caretxoffs - caret_width, fr.right - tb->pixels + tb->caretxoffs, CentreBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), "_", TC_WHITE);
776 } else {
777 DrawString(fr.left + tb->caretxoffs, fr.left + tb->caretxoffs + caret_width, CentreBounds(fr.top, fr.bottom, GetCharacterHeight(FS_NORMAL)), "_", TC_WHITE);
778 }
779 }
780}
781
789{
790 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
791
792 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
793
794 bool rtl = _current_text_dir == TD_RTL;
795 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
796 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
797
798 Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
799
800 /* Clamp caret position to be inside out current width. */
801 const Textbuf *tb = &this->text;
802 r = ScrollEditBoxTextRect(r, *tb);
803
804 Point pt = {r.left + tb->caretxoffs, r.top};
805 return pt;
806}
807
816Rect QueryString::GetBoundingRect(const Window *w, WidgetID wid, size_t from, size_t to) const
817{
818 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
819
820 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
821
822 bool rtl = _current_text_dir == TD_RTL;
823 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
824 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
825
826 Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
827
828 /* Clamp caret position to be inside our current width. */
829 const Textbuf *tb = &this->text;
830 r = ScrollEditBoxTextRect(r, *tb);
831
832 /* Get location of first and last character. */
833 const auto p1 = GetCharPosInString(tb->GetText(), from, FS_NORMAL);
834 const auto p2 = from != to ? GetCharPosInString(tb->GetText(), to, FS_NORMAL) : p1;
835
836 return { Clamp(r.left + p1.left, r.left, r.right), r.top, Clamp(r.left + p2.right, r.left, r.right), r.bottom };
837}
838
846ptrdiff_t QueryString::GetCharAtPosition(const Window *w, WidgetID wid, const Point &pt) 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 if (!IsInsideMM(pt.y, r.top, r.bottom)) return -1;
859
860 /* Clamp caret position to be inside our current width. */
861 const Textbuf *tb = &this->text;
862 r = ScrollEditBoxTextRect(r, *tb);
863
864 return ::GetCharAtPosition(tb->GetText(), pt.x - r.left);
865}
866
867void QueryString::ClickEditBox(Window *w, Point pt, WidgetID wid, int click_count, bool focus_changed)
868{
869 const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
870
871 assert((wi->type & WWT_MASK) == WWT_EDITBOX);
872
873 bool rtl = _current_text_dir == TD_RTL;
874 Dimension sprite_size = GetScaledSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT);
875 int clearbtn_width = sprite_size.width + WidgetDimensions::scaled.imgbtn.Horizontal();
876
877 Rect cr = wi->GetCurrentRect().WithWidth(clearbtn_width, !rtl);
878
879 if (IsInsideMM(pt.x, cr.left, cr.right)) {
880 if (!this->text.GetText().empty()) {
881 this->text.DeleteAll();
882 w->HandleButtonClick(wid);
883 w->OnEditboxChanged(wid);
884 }
885 return;
886 }
887
889 (!focus_changed || _settings_client.gui.osk_activation == OSKA_IMMEDIATELY) &&
890 (click_count == 2 || _settings_client.gui.osk_activation != OSKA_DOUBLE_CLICK)) {
891 /* Open the OSK window */
892 ShowOnScreenKeyboard(w, wid);
893 }
894}
895
898{
901
902 QueryStringWindow(std::string_view str, StringID caption, uint max_bytes, uint max_chars, WindowDesc &desc, Window *parent, CharSetFilter afilter, QueryStringFlags flags) :
903 Window(desc), editbox(max_bytes, max_chars)
904 {
905 this->editbox.text.Assign(str);
906
907 if (!flags.Test(QueryStringFlag::AcceptUnchanged)) this->editbox.orig = this->editbox.text.GetText();
908
909 this->querystrings[WID_QS_TEXT] = &this->editbox;
910 this->editbox.caption = caption;
911 this->editbox.cancel_button = WID_QS_CANCEL;
912 this->editbox.ok_button = WID_QS_OK;
913 this->editbox.text.afilter = afilter;
914 this->flags = flags;
915
917
918 this->parent = parent;
919
921 }
922
923 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
924 {
925 if (widget == WID_QS_DEFAULT && !this->flags.Test(QueryStringFlag::EnableDefault)) {
926 /* We don't want this widget to show! */
927 fill.width = 0;
928 resize.width = 0;
929 size.width = 0;
930 }
931 }
932
933 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
934 {
935 if (widget == WID_QS_CAPTION) return GetString(this->editbox.caption);
936
937 return this->Window::GetWidgetString(widget, stringid);
938 }
939
940 void OnOk()
941 {
942 if (!this->editbox.orig.has_value() || this->editbox.text.GetText() != this->editbox.orig) {
943 assert(this->parent != nullptr);
944
945 this->parent->OnQueryTextFinished(std::string{this->editbox.text.GetText()});
946 this->editbox.handled = true;
947 }
948 }
949
950 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
951 {
952 switch (widget) {
953 case WID_QS_DEFAULT:
954 this->editbox.text.DeleteAll();
955 [[fallthrough]];
956
957 case WID_QS_OK:
958 this->OnOk();
959 [[fallthrough]];
960
961 case WID_QS_CANCEL:
962 this->Close();
963 break;
964 }
965 }
966
967 void Close([[maybe_unused]] int data = 0) override
968 {
969 if (!this->editbox.handled && this->parent != nullptr) {
970 Window *parent = this->parent;
971 this->parent = nullptr; // so parent doesn't try to close us again
972 parent->OnQueryTextFinished(std::nullopt);
973 }
974 this->Window::Close();
975 }
976};
977
978static constexpr NWidgetPart _nested_query_string_widgets[] = {
980 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
981 NWidget(WWT_CAPTION, COLOUR_GREY, WID_QS_CAPTION), SetTextStyle(TC_WHITE),
982 EndContainer(),
983 NWidget(WWT_PANEL, COLOUR_GREY),
984 NWidget(WWT_EDITBOX, COLOUR_GREY, WID_QS_TEXT), SetMinimalSize(256, 0), SetFill(1, 0), SetPadding(2, 2, 2, 2),
985 EndContainer(),
987 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT),
988 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(86, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL),
989 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK),
990 EndContainer(),
991};
992
993static WindowDesc _query_string_desc(
994 WDP_CENTER, {}, 0, 0,
996 {},
997 _nested_query_string_widgets
998);
999
1009void ShowQueryString(std::string_view str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
1010{
1011 assert(parent != nullptr);
1012
1014 new QueryStringWindow(str, caption, (flags.Test(QueryStringFlag::LengthIsInChars) ? MAX_CHAR_LENGTH : 1) * maxsize, maxsize, _query_string_desc, parent, afilter, flags);
1015}
1016
1020struct QueryWindow : public Window {
1024
1026 : Window(desc), proc(callback), caption(std::move(caption)), message(std::move(message))
1027 {
1028 this->parent = parent;
1029
1030 this->CreateNestedTree();
1032 }
1033
1034 void Close([[maybe_unused]] int data = 0) override
1035 {
1036 if (this->proc != nullptr) this->proc(this->parent, false);
1037 this->Window::Close();
1038 }
1039
1040 void FindWindowPlacementAndResize(int, int, bool) override
1041 {
1042 /* Position query window over the calling window, ensuring it's within screen bounds. */
1043 this->left = SoftClamp(parent->left + (parent->width / 2) - (this->width / 2), 0, _screen.width - this->width);
1044 this->top = SoftClamp(parent->top + (parent->height / 2) - (this->height / 2), 0, _screen.height - this->height);
1045 this->SetDirty();
1046 }
1047
1048 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
1049 {
1050 switch (widget) {
1051 case WID_Q_CAPTION:
1052 return this->caption.GetDecodedString();
1053
1054 default:
1055 return this->Window::GetWidgetString(widget, stringid);
1056 }
1057 }
1058
1059 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1060 {
1061 if (widget != WID_Q_TEXT) return;
1062
1064 }
1065
1066 void DrawWidget(const Rect &r, WidgetID widget) const override
1067 {
1068 if (widget != WID_Q_TEXT) return;
1069
1070 DrawStringMultiLine(r, this->message.GetDecodedString(), TC_FROMSTRING, SA_CENTER);
1071 }
1072
1073 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1074 {
1075 switch (widget) {
1076 case WID_Q_YES: {
1077 /* in the Generate New World window, clicking 'Yes' causes
1078 * CloseNonVitalWindows() to be called - we shouldn't be in a window then */
1079 QueryCallbackProc *proc = this->proc;
1080 Window *parent = this->parent;
1081 /* Prevent the destructor calling the callback function */
1082 this->proc = nullptr;
1083 this->Close();
1084 if (proc != nullptr) {
1085 proc(parent, true);
1086 proc = nullptr;
1087 }
1088 break;
1089 }
1090 case WID_Q_NO:
1091 this->Close();
1092 break;
1093 }
1094 }
1095
1096 EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode) override
1097 {
1098 /* ESC closes the window, Enter confirms the action */
1099 switch (keycode) {
1100 case WKC_RETURN:
1101 case WKC_NUM_ENTER:
1102 if (this->proc != nullptr) {
1103 this->proc(this->parent, true);
1104 this->proc = nullptr;
1105 }
1106 [[fallthrough]];
1107
1108 case WKC_ESC:
1109 this->Close();
1110 return ES_HANDLED;
1111 }
1112 return ES_NOT_HANDLED;
1113 }
1114};
1115
1116static constexpr NWidgetPart _nested_query_widgets[] = {
1118 NWidget(WWT_CLOSEBOX, COLOUR_RED),
1119 NWidget(WWT_CAPTION, COLOUR_RED, WID_Q_CAPTION),
1120 EndContainer(),
1121 NWidget(WWT_PANEL, COLOUR_RED),
1123 NWidget(WWT_TEXT, INVALID_COLOUR, WID_Q_TEXT), SetMinimalSize(200, 12),
1125 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_NO), SetMinimalSize(71, 12), SetFill(1, 1), SetStringTip(STR_QUIT_NO),
1126 NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_Q_YES), SetMinimalSize(71, 12), SetFill(1, 1), SetStringTip(STR_QUIT_YES),
1127 EndContainer(),
1128 EndContainer(),
1129 EndContainer(),
1130};
1131
1132static WindowDesc _query_desc(
1133 WDP_CENTER, {}, 0, 0,
1136 _nested_query_widgets
1137);
1138
1149void ShowQuery(EncodedString &&caption, EncodedString &&message, Window *parent, QueryCallbackProc *callback, bool focus)
1150{
1151 if (parent == nullptr) parent = GetMainWindow();
1152
1153 for (Window *w : Window::Iterate()) {
1154 if (w->window_class != WC_CONFIRM_POPUP_QUERY) continue;
1155
1156 QueryWindow *qw = dynamic_cast<QueryWindow *>(w);
1157 assert(qw != nullptr);
1158 if (qw->parent != parent || qw->proc != callback) continue;
1159
1160 qw->Close();
1161 break;
1162 }
1163
1164 QueryWindow *q = new QueryWindow(_query_desc, std::move(caption), std::move(message), parent, callback);
1165 if (focus) SetFocusedWindow(q);
1166}
std::optional< std::string > BuildCargoAcceptanceString(const CargoArray &acceptance, StringID label)
Build comma-separated cargo acceptance string.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Reset()
Reset all bits.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
Money GetCost() const
The costs as made up to this moment.
Container for an encoded string, created by GetEncodedString.
std::string GetDecodedString() const
Decode the encoded string.
Definition strings.cpp:208
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:74
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition misc_gui.cpp:303
StringList landinfo_data
Info lines to show.
Definition misc_gui.cpp:68
std::string cargo_acceptance
Centered multi-line string for cargo acceptance.
Definition misc_gui.cpp:69
bool IsNewGRFInspectable() const override
Is the data related to this window NewGRF inspectable?
Definition misc_gui.cpp:275
void OnInit() override
Notification that the nested widget tree gets initialized.
Definition misc_gui.cpp:133
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:285
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:89
void ShowNewGRFInspectWindow() const override
Show the NewGRF inspection window.
Definition misc_gui.cpp:280
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:30
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:93
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, 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 CentreBounds(int min, int max, int size)
Determine where to position a centred object.
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Definition gfx.cpp:705
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:887
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:658
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:115
uint8_t GetCharacterWidth(FontSize size, char32_t key)
Return width of character glyph.
Definition gfx.cpp:1263
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion)
Calculate string bounding box for multi-line strings.
Definition gfx.cpp:741
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:775
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:1554
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:68
ParagraphLayouter::Position GetCharPosInString(std::string_view str, size_t pos, 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:251
@ SA_LEFT
Left align the text.
Definition gfx_type.h:383
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:384
@ SA_FORCE
Force the alignment, i.e. don't swap for RTL languages.
Definition gfx_type.h:395
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:393
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:341
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:955
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:688
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:581
void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
Display animated income or costs on the map.
Definition misc_gui.cpp:508
void ShowEstimatedCostOrIncome(Money cost, int x, int y)
Display estimated costs.
Definition misc_gui.cpp:490
OskActivation
Method to open the OSK.
Definition misc_gui.cpp:42
@ OSKA_SINGLE_CLICK
Single click after focus click opens OSK.
Definition misc_gui.cpp:45
@ OSKA_IMMEDIATELY
Focusing click already opens OSK.
Definition misc_gui.cpp:46
@ OSKA_DISABLED
The OSK shall not be activated at all.
Definition misc_gui.cpp:43
@ OSKA_DOUBLE_CLICK
Double click on the edit box opens OSK.
Definition misc_gui.cpp:44
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:316
void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income)
Display animated feeder income.
Definition misc_gui.cpp:531
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:570
TextEffectID ShowFillingPercent(int x, int y, int z, uint8_t percent, StringID string)
Display vehicle loading indicators.
Definition misc_gui.cpp:556
static Rect ScrollEditBoxTextRect(Rect r, const Textbuf &tb)
Reposition edit text box rect based on textbuf length can caret position.
Definition misc_gui.cpp:718
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:388
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:391
bool IsOSKOpenedFor(const Window *w, WidgetID button)
Check whether the OSK is opened for a specific editbox.
Definition osk_gui.cpp:422
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:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
Definition of base types and functions in a cross-platform compatible way.
Functions related to low-level strings.
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:327
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:91
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:415
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:57
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:448
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:432
const IntervalTimer< TimerWindow > scroll_interval
Scroll the text in the about window slow.
Definition misc_gui.cpp:468
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
Definition misc_gui.cpp:425
int text_position
The top of the scrolling text.
Definition misc_gui.cpp:414
static const int num_visible_lines
The number of lines visible simultaneously.
Definition misc_gui.cpp:416
int line_height
The height of a single line.
Definition misc_gui.cpp:415
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:126
bool in_window
mouse inside this window, determines drawing logic
Definition gfx_type.h:148
Point total_size
union of sprite properties
Definition gfx_type.h:138
Dimensions (a width and height) of a rectangle in 2D.
Data about how and where to blit pixels.
Definition gfx_type.h:158
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:898
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:950
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:967
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:923
QueryString editbox
Editbox.
Definition misc_gui.cpp:899
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
Definition misc_gui.cpp:933
QueryStringFlags flags
Flags controlling behaviour of the window.
Definition misc_gui.cpp:900
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:846
Point GetCaretPosition(const Window *w, WidgetID wid) const
Get the current caret position.
Definition misc_gui.cpp:788
Rect GetBoundingRect(const Window *w, WidgetID wid, size_t from, size_t to) const
Get the bounding rectangle for a range of the query string.
Definition misc_gui.cpp:816
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 OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
EncodedString caption
caption for query window.
EncodedString message
message for query window.
void FindWindowPlacementAndResize(int, int, bool) 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:112
std::string_view GetText() const
Get the current text.
Definition textbuf.cpp:284
uint16_t caretxoffs
the current position of the caret in pixels
uint16_t marklength
the length of the marked area in pixels
void Assign(std::string_view text)
Copy a string into the textbuffer.
Definition textbuf.cpp:420
bool caret
is the caret ("_") visible or not
CharSetFilter afilter
Allowed characters.
Tile description for the 'land area information' tool.
Definition tile_cmd.h:38
std::array< StringID, 4 > owner_type
Type of each owner.
Definition tile_cmd.h:42
Window for displaying a tooltip.
Definition misc_gui.cpp:602
TooltipCloseCondition close_cond
Condition for closing the window.
Definition misc_gui.cpp:604
EncodedString text
String to display as tooltip.
Definition misc_gui.cpp:603
void OnMouseLoop() override
Called for every mouse loop run, which is at least once per (game) tick.
Definition misc_gui.cpp:658
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:616
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:636
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition misc_gui.cpp:649
Town data structure.
Definition town.h:52
High level window description.
Definition window_gui.h:167
Data structure for an opened window.
Definition window_gui.h:273
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:967
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1091
bool IsWidgetGloballyFocused(WidgetID widget_index) const
Check if given widget has user input focus.
Definition window_gui.h:431
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1778
std::map< WidgetID, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
Definition window_gui.h:320
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3205
Window * parent
Parent window.
Definition window_gui.h:328
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:555
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:503
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1768
WindowClass window_class
Window class.
Definition window_gui.h:301
virtual void OnQueryTextFinished(std::optional< std::string > str)
The query window opened from this window has closed.
Definition window_gui.h:785
bool SetFocusedWidget(WidgetID widget_index)
Set focus within this window to the given widget.
Definition window.cpp:484
int left
x position of left edge of the window
Definition window_gui.h:309
virtual void OnEditboxChanged(WidgetID widget)
The text in an editbox has been edited.
Definition window_gui.h:777
int top
y position of top edge of the window
Definition window_gui.h:310
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:982
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:594
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1791
WindowFlags flags
Window flags.
Definition window_gui.h:300
AllWindows< false > Iterate
Iterate all windows in whatever order is easiest.
Definition window_gui.h:932
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:312
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:302
@ AcceptUnchanged
return success even when the text didn't change
@ EnableDefault
enable the 'Default' button ("\0" is returned)
@ LengthIsInChars
the length of the string is counted in characters
void QueryCallbackProc(Window *, bool)
Callback procedure for the ShowQuery method.
Definition textbuf_gui.h:27
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
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:95
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:408
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:298
static RectPadding ScaleGUITrad(const RectPadding &r)
Scale a RectPadding to GUI zoom level.
Definition widget.cpp:49
@ 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:49
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:63
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:67
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:45
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:53
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:69
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:61
@ WWT_FRAME
Frame.
Definition widget_type.h:52
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:38
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:50
@ WWT_DEBUGBOX
NewGRF debug box (at top-right of a window, between WWT_CAPTION and WWT_SHADEBOX)
Definition widget_type.h:55
@ 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:1182
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1169
void SetFocusedWindow(Window *w)
Set the window that has the focus.
Definition window.cpp:420
Window * FindWindowFromPt(int x, int y)
Do a search for a window at specific coordinates.
Definition window.cpp:1813
int GetMainViewTop()
Return the top of the main view available for general use.
Definition window.cpp:2107
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1194
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Definition window.cpp:2118
bool _mouse_hovering
The mouse is hovering over the same point.
Definition window.cpp:93
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:145
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:144
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition window_gui.h:143
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.