OpenTTD Source 20250528-master-g3aca5d62a8
toolbar_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 "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
18#include "house.h"
19#include "vehicle_gui.h"
20#include "rail_gui.h"
21#include "road.h"
22#include "road_gui.h"
23#include "vehicle_func.h"
24#include "sound_func.h"
25#include "terraform_gui.h"
26#include "strings_func.h"
27#include "company_func.h"
28#include "company_gui.h"
29#include "vehicle_base.h"
30#include "cheat_func.h"
31#include "transparency_gui.h"
32#include "screenshot.h"
33#include "signs_func.h"
34#include "fios.h"
35#include "console_gui.h"
36#include "news_gui.h"
37#include "ai/ai_gui.hpp"
38#include "game/game_gui.hpp"
39#include "script/script_gui.h"
40#include "tilehighlight_func.h"
41#include "smallmap_gui.h"
42#include "graph_gui.h"
43#include "textbuf_gui.h"
45#include "newgrf_debug.h"
46#include "hotkeys.h"
47#include "engine_base.h"
48#include "highscore.h"
49#include "game/game.hpp"
50#include "goal_base.h"
51#include "story_base.h"
52#include "toolbar_gui.h"
53#include "framerate_type.h"
54#include "screenshot_gui.h"
55#include "misc_cmd.h"
56#include "league_gui.h"
57#include "league_base.h"
58#include "timer/timer.h"
59#include "timer/timer_window.h"
61#include "help_gui.h"
63
65
66#include "network/network.h"
67#include "network/network_gui.h"
69
70#include "table/strings.h"
71
73
74#include "safeguards.h"
75
76
79
80RailType _last_built_railtype;
81RoadType _last_built_roadtype;
82RoadType _last_built_tramtype;
83
85enum ToolbarMode : uint8_t {
86 TB_NORMAL,
87 TB_UPPER,
88 TB_LOWER
89};
90
92enum CallBackFunction : uint8_t {
93 CBF_NONE,
94 CBF_PLACE_SIGN,
95 CBF_PLACE_LANDINFO,
96};
97
99
103class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
104public:
105 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, GetCompanyPalette(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, GetString(STR_COMPANY_NAME_COMPANY_NUM, company, company), company.base(), false, shaded)
106 {
107 }
108};
109
117static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
118{
119 ShowDropDownList(w, std::move(list), def, widget, 0, true);
121}
122
129static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
130{
131 DropDownList list;
132 int i = 0;
133 for (StringID string : strings) {
134 if (string == STR_NULL) {
135 list.push_back(MakeDropDownListDividerItem());
136 } else {
137 list.push_back(MakeDropDownListStringItem(string, i));
138 i++;
139 }
140 }
141 PopupMainToolbarMenu(w, widget, std::move(list), 0);
142}
143
145static const int CTMN_CLIENT_LIST = -1;
146static const int CTMN_SPECTATE = -2;
147static const int CTMN_SPECTATOR = -3;
148
155static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
156{
157 DropDownList list;
158
159 switch (widget) {
160 case WID_TN_COMPANIES:
161 if (!_networking) break;
162
163 /* Add the client list button for the companies menu */
164 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
165
167 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
168 }
169 break;
170 case WID_TN_STORY:
171 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
172 break;
173
174 case WID_TN_GOAL:
175 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
176 break;
177 }
178
179 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
180 if (!Company::IsValidID(c)) continue;
181 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
182 }
183
185}
186
187static ToolbarMode _toolbar_mode;
188
189static CallBackFunction SelectSignTool()
190{
191 if (_last_started_action == CBF_PLACE_SIGN) {
193 return CBF_NONE;
194 } else {
195 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
196 return CBF_PLACE_SIGN;
197 }
198}
199
200/* --- Pausing --- */
201
202static CallBackFunction ToolbarPauseClick(Window *)
203{
204 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
205
208 }
209 return CBF_NONE;
210}
211
218{
219 if (_networking) return CBF_NONE; // no fast forward in network game
220
221 ChangeGameSpeed(_game_speed == 100);
222
224 return CBF_NONE;
225}
226
230enum OptionMenuEntries : uint8_t {
231 OME_GAMEOPTIONS,
232 OME_AI_SETTINGS,
233 OME_GAMESCRIPT_SETTINGS,
234 OME_NEWGRFSETTINGS,
235 OME_SANDBOX,
236 OME_TRANSPARENCIES,
237 OME_SHOW_TOWNNAMES,
238 OME_SHOW_STATIONNAMES,
239 OME_SHOW_STATIONNAMES_TRAIN,
240 OME_SHOW_STATIONNAMES_LORRY,
241 OME_SHOW_STATIONNAMES_BUS,
242 OME_SHOW_STATIONNAMES_SHIP,
243 OME_SHOW_STATIONNAMES_PLANE,
244 OME_SHOW_STATIONNAMES_GHOST,
245 OME_SHOW_WAYPOINTNAMES,
246 OME_SHOW_SIGNS,
247 OME_SHOW_COMPETITOR_SIGNS,
248 OME_FULL_ANIMATION,
249 OME_FULL_DETAILS,
250 OME_TRANSPARENTBUILDINGS,
251 OME_SHOW_STATIONSIGNS,
252};
253
261{
262 DropDownList list;
263 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
264 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
265 * the settings once they join but never update it. As such don't show the window at all
266 * to network clients. */
268 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
269 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
270 }
271 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
272 if (_game_mode != GM_EDITOR && !_networking) {
273 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
274 }
275 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
276 list.push_back(MakeDropDownListDividerItem());
277 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
278 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
279 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
280 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
281 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
282 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
283 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
284 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1));
285 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
286 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
287 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
288 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
289 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
290 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
291 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
292
293 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true);
295 return CBF_NONE;
296}
297
305{
306 switch (index) {
307 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
308 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
309 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
310 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
311 case OME_SANDBOX: ShowCheatWindow(); break;
312 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
313
314 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
315 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
316 case OME_SHOW_STATIONNAMES_TRAIN: _facility_display_opt.Flip(StationFacility::Train); break;
317 case OME_SHOW_STATIONNAMES_LORRY: _facility_display_opt.Flip(StationFacility::TruckStop); break;
318 case OME_SHOW_STATIONNAMES_BUS: _facility_display_opt.Flip(StationFacility::BusStop); break;
319 case OME_SHOW_STATIONNAMES_SHIP: _facility_display_opt.Flip(StationFacility::Dock); break;
320 case OME_SHOW_STATIONNAMES_PLANE: _facility_display_opt.Flip(StationFacility::Airport); break;
321 case OME_SHOW_STATIONNAMES_GHOST: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break;
322 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
323 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
324 case OME_SHOW_COMPETITOR_SIGNS:
327 break;
328 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
329 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
330 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
331 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
332 }
334 return CBF_NONE;
335}
336
341 SLEME_SAVE_SCENARIO = 0,
342 SLEME_LOAD_SCENARIO,
343 SLEME_SAVE_HEIGHTMAP,
344 SLEME_LOAD_HEIGHTMAP,
345 SLEME_EXIT_TOINTRO,
346 SLEME_EXIT_GAME,
347};
348
353 SLNME_SAVE_GAME = 0,
354 SLNME_LOAD_GAME,
355 SLNME_EXIT_TOINTRO,
356 SLNME_EXIT_GAME,
357};
358
366{
367 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
368 STR_NULL, STR_FILE_MENU_EXIT});
369 return CBF_NONE;
370}
371
379{
380 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
381 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
382 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
383 return CBF_NONE;
384}
385
393{
394 if (_game_mode == GM_EDITOR) {
395 switch (index) {
396 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
397 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
398 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
399 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
400 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
401 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
402 }
403 } else {
404 switch (index) {
405 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
406 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
407 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
408 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
409 }
410 }
411 return CBF_NONE;
412}
413
414/* --- Map button menu --- */
415
416enum MapMenuEntries : uint8_t {
417 MME_SHOW_SMALLMAP = 0,
418 MME_SHOW_EXTRAVIEWPORTS,
419 MME_SHOW_LINKGRAPH,
420 MME_SHOW_SIGNLISTS,
421 MME_SHOW_TOWNDIRECTORY,
422 MME_SHOW_INDUSTRYDIRECTORY,
423};
424
425static CallBackFunction ToolbarMapClick(Window *w)
426{
427 DropDownList list;
428 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
429 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
430 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
431 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
432 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
433 return CBF_NONE;
434}
435
436static CallBackFunction ToolbarScenMapTownDir(Window *w)
437{
438 DropDownList list;
439 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
440 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
441 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
442 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
443 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
444 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
445 return CBF_NONE;
446}
447
455{
456 switch (index) {
457 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
458 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
459 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
460 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
461 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
462 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
463 }
464 return CBF_NONE;
465}
466
467/* --- Town button menu --- */
468
469enum TownMenuEntries {
470 TME_SHOW_DIRECTORY = 0,
471 TME_SHOW_FOUND_TOWN,
472 TME_SHOW_PLACE_HOUSES,
473};
474
475static CallBackFunction ToolbarTownClick(Window *w)
476{
477 DropDownList list;
478 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TME_SHOW_DIRECTORY));
479 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TME_SHOW_FOUND_TOWN));
480 if (_settings_game.economy.place_houses != PH_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TME_SHOW_PLACE_HOUSES));
481
482 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
483
484 return CBF_NONE;
485}
486
494{
495 switch (index) {
496 case TME_SHOW_DIRECTORY: ShowTownDirectory(); break;
497 case TME_SHOW_FOUND_TOWN: // Setting could be changed when the dropdown was open
498 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
499 break;
500 case TME_SHOW_PLACE_HOUSES: // Setting could be changed when the dropdown was open
501 if (_settings_game.economy.place_houses != PH_FORBIDDEN) ShowBuildHousePicker(nullptr);
502 break;
503 }
504 return CBF_NONE;
505}
506
507/* --- Subidies button menu --- */
508
509static CallBackFunction ToolbarSubsidiesClick(Window *w)
510{
511 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
512 return CBF_NONE;
513}
514
521{
522 ShowSubsidiesList();
523 return CBF_NONE;
524}
525
526/* --- Stations button menu --- */
527
528static CallBackFunction ToolbarStationsClick(Window *w)
529{
531 return CBF_NONE;
532}
533
541{
543 return CBF_NONE;
544}
545
546/* --- Finances button menu --- */
547
548static CallBackFunction ToolbarFinancesClick(Window *w)
549{
551 return CBF_NONE;
552}
553
561{
563 return CBF_NONE;
564}
565
566/* --- Company's button menu --- */
567
568static CallBackFunction ToolbarCompaniesClick(Window *w)
569{
571 return CBF_NONE;
572}
573
581{
582 if (_networking) {
583 switch (index) {
584 case CTMN_CLIENT_LIST:
585 ShowClientList();
586 return CBF_NONE;
587
588 case CTMN_SPECTATE:
589 if (_network_server) {
592 } else {
594 }
595 return CBF_NONE;
596 }
597 }
598 ShowCompany((CompanyID)index);
599 return CBF_NONE;
600}
601
602/* --- Story button menu --- */
603
604static CallBackFunction ToolbarStoryClick(Window *w)
605{
607 return CBF_NONE;
608}
609
617{
618 ShowStoryBook(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
619 return CBF_NONE;
620}
621
622/* --- Goal button menu --- */
623
624static CallBackFunction ToolbarGoalClick(Window *w)
625{
627 return CBF_NONE;
628}
629
637{
638 ShowGoalsList(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
639 return CBF_NONE;
640}
641
642/* --- Graphs and League Table button menu --- */
643
648static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
649static const int GRMN_INCOME_GRAPH = -2;
650static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
651static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
652static const int GRMN_COMPANY_VALUE_GRAPH = -5;
653static const int GRMN_CARGO_PAYMENT_RATES = -6;
654static const int LTMN_PERFORMANCE_LEAGUE = -7;
655static const int LTMN_PERFORMANCE_RATING = -8;
656static const int LTMN_HIGHSCORE = -9;
657
658static void AddDropDownLeagueTableOptions(DropDownList &list)
659{
660 if (LeagueTable::GetNumItems() > 0) {
661 for (LeagueTable *lt : LeagueTable::Iterate()) {
662 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
663 }
664 } else {
665 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
666 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
667 if (!_networking) {
668 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
669 }
670 }
671}
672
673static CallBackFunction ToolbarGraphsClick(Window *w)
674{
675 DropDownList list;
676
677 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
678 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
679 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
680 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
683
684 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
685
686 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
688
689 return CBF_NONE;
690}
691
692static CallBackFunction ToolbarLeagueClick(Window *w)
693{
694 DropDownList list;
695
696 AddDropDownLeagueTableOptions(list);
697
698 int selected = list[0]->result;
699 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true);
701
702 return CBF_NONE;
703}
704
712{
713 switch (index) {
714 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
715 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
716 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
717 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
718 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
719 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
720 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
721 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
722 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
723 default: {
724 if (LeagueTable::IsValidID(index)) {
725 ShowScriptLeagueTable((LeagueTableID)index);
726 }
727 }
728 }
729 return CBF_NONE;
730}
731
732
733
734/* --- Industries button menu --- */
735
736static CallBackFunction ToolbarIndustryClick(Window *w)
737{
738 /* Disable build-industry menu if we are a spectator */
740 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
741 } else {
742 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
743 }
744 return CBF_NONE;
745}
746
754{
755 switch (index) {
756 case 0: ShowIndustryDirectory(); break;
757 case 1: ShowIndustryCargoesWindow(); break;
758 case 2: ShowBuildIndustryWindow(); break;
759 }
760 return CBF_NONE;
761}
762
763/* --- Trains button menu + 1 helper function for all vehicles. --- */
764
765static void ToolbarVehicleClick(Window *w, VehicleType veh)
766{
767 CompanyMask dis{};
768
769 for (const Company *c : Company::Iterate()) {
770 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
771 }
773}
774
775
776static CallBackFunction ToolbarTrainClick(Window *w)
777{
778 ToolbarVehicleClick(w, VEH_TRAIN);
779 return CBF_NONE;
780}
781
789{
790 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
791 return CBF_NONE;
792}
793
794/* --- Road vehicle button menu --- */
795
796static CallBackFunction ToolbarRoadClick(Window *w)
797{
798 ToolbarVehicleClick(w, VEH_ROAD);
799 return CBF_NONE;
800}
801
809{
810 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
811 return CBF_NONE;
812}
813
814/* --- Ship button menu --- */
815
816static CallBackFunction ToolbarShipClick(Window *w)
817{
818 ToolbarVehicleClick(w, VEH_SHIP);
819 return CBF_NONE;
820}
821
829{
830 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
831 return CBF_NONE;
832}
833
834/* --- Aircraft button menu --- */
835
836static CallBackFunction ToolbarAirClick(Window *w)
837{
838 ToolbarVehicleClick(w, VEH_AIRCRAFT);
839 return CBF_NONE;
840}
841
849{
850 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
851 return CBF_NONE;
852}
853
854/* --- Zoom in button --- */
855
856static CallBackFunction ToolbarZoomInClick(Window *w)
857{
859 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
861 }
862 return CBF_NONE;
863}
864
865/* --- Zoom out button --- */
866
867static CallBackFunction ToolbarZoomOutClick(Window *w)
868{
870 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
872 }
873 return CBF_NONE;
874}
875
876/* --- Rail button menu --- */
877
878static CallBackFunction ToolbarBuildRailClick(Window *w)
879{
880 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
882 return CBF_NONE;
883}
884
892{
893 _last_built_railtype = (RailType)index;
894 ShowBuildRailToolbar(_last_built_railtype);
895 return CBF_NONE;
896}
897
898/* --- Road button menu --- */
899
900static CallBackFunction ToolbarBuildRoadClick(Window *w)
901{
902 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
904 return CBF_NONE;
905}
906
914{
915 _last_built_roadtype = (RoadType)index;
916 ShowBuildRoadToolbar(_last_built_roadtype);
917 return CBF_NONE;
918}
919
920/* --- Tram button menu --- */
921
922static CallBackFunction ToolbarBuildTramClick(Window *w)
923{
924 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
926 return CBF_NONE;
927}
928
936{
937 _last_built_tramtype = (RoadType)index;
938 ShowBuildRoadToolbar(_last_built_tramtype);
939 return CBF_NONE;
940}
941
942/* --- Water button menu --- */
943
944static CallBackFunction ToolbarBuildWaterClick(Window *w)
945{
946 DropDownList list;
947 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
948 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
950 return CBF_NONE;
951}
952
959{
961 return CBF_NONE;
962}
963
964/* --- Airport button menu --- */
965
966static CallBackFunction ToolbarBuildAirClick(Window *w)
967{
968 DropDownList list;
969 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
970 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
972 return CBF_NONE;
973}
974
981{
983 return CBF_NONE;
984}
985
986/* --- Forest button menu --- */
987
988static CallBackFunction ToolbarForestClick(Window *w)
989{
990 DropDownList list;
991 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
992 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
993 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
994 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
996 return CBF_NONE;
997}
998
1006{
1007 switch (index) {
1008 case 0: ShowTerraformToolbar(); break;
1009 case 1: ShowBuildTreesToolbar(); break;
1010 case 2: return SelectSignTool();
1011 }
1012 return CBF_NONE;
1013}
1014
1015/* --- Music button menu --- */
1016
1017static CallBackFunction ToolbarMusicClick(Window *w)
1018{
1019 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1020 return CBF_NONE;
1021}
1022
1029{
1030 ShowMusicWindow();
1031 return CBF_NONE;
1032}
1033
1034/* --- Newspaper button menu --- */
1035
1036static CallBackFunction ToolbarNewspaperClick(Window *w)
1037{
1038 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1039 return CBF_NONE;
1040}
1041
1049{
1050 switch (index) {
1051 case 0: ShowLastNewsMessage(); break;
1052 case 1: ShowMessageHistory(); break;
1053 case 2: DeleteAllMessages(); break;
1054 }
1055 return CBF_NONE;
1056}
1057
1058/* --- Help button menu --- */
1059
1060static CallBackFunction PlaceLandBlockInfo()
1061{
1062 if (_last_started_action == CBF_PLACE_LANDINFO) {
1064 return CBF_NONE;
1065 } else {
1066 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1067 return CBF_PLACE_LANDINFO;
1068 }
1069}
1070
1071static CallBackFunction ToolbarHelpClick(Window *w)
1072{
1074 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1075 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1076 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1077 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1078 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1079 } else {
1080 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1081 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1082 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1083 }
1084 return CBF_NONE;
1085}
1086
1095{
1096 extern bool _draw_bounding_boxes;
1097 /* Always allow to toggle them off */
1098 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1099 _draw_bounding_boxes = !_draw_bounding_boxes;
1101 }
1102}
1103
1112{
1113 extern bool _draw_dirty_blocks;
1114 /* Always allow to toggle them off */
1115 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1116 _draw_dirty_blocks = !_draw_dirty_blocks;
1118 }
1119}
1120
1126{
1127 extern bool _draw_widget_outlines;
1128 /* Always allow to toggle them off */
1129 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1130 _draw_widget_outlines = !_draw_widget_outlines;
1132 }
1133}
1134
1140{
1143 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1144
1145 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1146 TimerGameCalendar::SetDate(new_calendar_date, 0);
1147
1148 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1150 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1151
1152 /* Only change the date after changing cached values above. */
1153 TimerGameEconomy::SetDate(new_economy_date, 0);
1154}
1155
1162{
1163 switch (index) {
1164 case 0: return PlaceLandBlockInfo();
1165 case 1: ShowHelpWindow(); break;
1166 case 2: IConsoleSwitch(); break;
1167 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1168 case 4: ShowScreenshotWindow(); break;
1169 case 5: ShowFramerateWindow(); break;
1170 case 6: ShowAboutWindow(); break;
1171 case 7: ShowSpriteAlignerWindow(); break;
1172 case 8: ToggleBoundingBoxes(); break;
1173 case 9: ToggleDirtyBlocks(); break;
1174 case 10: ToggleWidgetOutlines(); break;
1175 }
1176 return CBF_NONE;
1177}
1178
1179/* --- Switch toolbar button --- */
1180
1181static CallBackFunction ToolbarSwitchClick(Window *w)
1182{
1183 if (_toolbar_mode != TB_LOWER) {
1184 _toolbar_mode = TB_LOWER;
1185 } else {
1186 _toolbar_mode = TB_UPPER;
1187 }
1188
1189 w->ReInit();
1190 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1192 return CBF_NONE;
1193}
1194
1195/* --- Scenario editor specific handlers. */
1196
1201{
1202 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1203 return CBF_NONE;
1204}
1205
1206static CallBackFunction ToolbarScenDateBackward(Window *w)
1207{
1208 /* don't allow too fast scrolling */
1209 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1211 w->SetDirty();
1212
1214 }
1215 _left_button_clicked = false;
1216 return CBF_NONE;
1217}
1218
1219static CallBackFunction ToolbarScenDateForward(Window *w)
1220{
1221 /* don't allow too fast scrolling */
1222 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1224 w->SetDirty();
1225
1227 }
1228 _left_button_clicked = false;
1229 return CBF_NONE;
1230}
1231
1232static CallBackFunction ToolbarScenGenLand(Window *w)
1233{
1236
1238 return CBF_NONE;
1239}
1240
1241static CallBackFunction ToolbarScenGenTownClick(Window *w)
1242{
1243 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1244 return CBF_NONE;
1245}
1246
1247static CallBackFunction ToolbarScenGenTown(int index)
1248{
1249 switch (index) {
1250 case 0: ShowFoundTownWindow(); break;
1251 case 1: ShowBuildHousePicker(nullptr); break;
1252 }
1253 return CBF_NONE;
1254}
1255
1256static CallBackFunction ToolbarScenGenIndustry(Window *w)
1257{
1260 ShowBuildIndustryWindow();
1261 return CBF_NONE;
1262}
1263
1264static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1265{
1266 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1268 return CBF_NONE;
1269}
1270
1278{
1279 _last_built_roadtype = (RoadType)index;
1280 ShowBuildRoadScenToolbar(_last_built_roadtype);
1281 return CBF_NONE;
1282}
1283
1284static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1285{
1286 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1288 return CBF_NONE;
1289}
1290
1298{
1299 _last_built_tramtype = (RoadType)index;
1300 ShowBuildRoadScenToolbar(_last_built_tramtype);
1301 return CBF_NONE;
1302}
1303
1304static CallBackFunction ToolbarScenBuildDocks(Window *w)
1305{
1309 return CBF_NONE;
1310}
1311
1312static CallBackFunction ToolbarScenPlantTrees(Window *w)
1313{
1316 ShowBuildTreesToolbar();
1317 return CBF_NONE;
1318}
1319
1320static CallBackFunction ToolbarScenPlaceSign(Window *w)
1321{
1324 return SelectSignTool();
1325}
1326
1327static CallBackFunction ToolbarBtn_NULL(Window *)
1328{
1329 return CBF_NONE;
1330}
1331
1332typedef CallBackFunction MenuClickedProc(int index);
1333
1334static MenuClickedProc * const _menu_clicked_procs[] = {
1335 nullptr, // 0
1336 nullptr, // 1
1337 MenuClickSettings, // 2
1338 MenuClickSaveLoad, // 3
1339 MenuClickMap, // 4
1340 MenuClickTown, // 5
1341 MenuClickSubsidies, // 6
1342 MenuClickStations, // 7
1343 MenuClickFinances, // 8
1344 MenuClickCompany, // 9
1345 MenuClickStory, // 10
1346 MenuClickGoal, // 11
1349 MenuClickIndustry, // 14
1350 MenuClickShowTrains, // 15
1351 MenuClickShowRoad, // 16
1352 MenuClickShowShips, // 17
1353 MenuClickShowAir, // 18
1354 MenuClickMap, // 19
1355 nullptr, // 20
1356 MenuClickBuildRail, // 21
1357 MenuClickBuildRoad, // 22
1358 MenuClickBuildTram, // 23
1359 MenuClickBuildWater, // 24
1360 MenuClickBuildAir, // 25
1361 MenuClickForest, // 26
1363 MenuClickNewspaper, // 28
1364 MenuClickHelp, // 29
1365};
1366
1369protected:
1370 uint spacers = 0;
1371
1372public:
1374 {
1375 }
1376
1383 {
1384 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1385 }
1386
1387 void SetupSmallestSize(Window *w) override
1388 {
1389 this->smallest_x = 0; // Biggest child
1390 this->smallest_y = 0; // Biggest child
1391 this->fill_x = 1;
1392 this->fill_y = 0;
1393 this->resize_x = 1; // We only resize in this direction
1394 this->resize_y = 0; // We never resize in this direction
1395 this->spacers = 0;
1396
1397 uint nbuttons = 0;
1398 /* First initialise some variables... */
1399 for (const auto &child_wid : this->children) {
1400 child_wid->SetupSmallestSize(w);
1401 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1402 if (this->IsButton(child_wid->type)) {
1403 nbuttons++;
1404 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1405 } else if (child_wid->type == NWID_SPACER) {
1406 this->spacers++;
1407 }
1408 }
1409
1410 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1411 for (const auto &child_wid : this->children) {
1412 child_wid->current_y = this->smallest_y;
1413 if (!this->IsButton(child_wid->type)) {
1414 child_wid->current_x = child_wid->smallest_x;
1415 }
1416 }
1417
1418 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1419 * displayed there will be no spacers anyway. */
1420 --nbuttons;
1421
1422 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1423 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1424 }
1425
1426 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1427 {
1428 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1429
1430 this->pos_x = x;
1431 this->pos_y = y;
1432 this->current_x = given_width;
1433 this->current_y = given_height;
1434
1435 /* Figure out what are the visible buttons */
1436 uint arrangable_count, button_count, spacer_count;
1437 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1438
1439 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1440 std::map<WidgetID, uint> lookup;
1441 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1442 NWidgetBase *nwid = it->get();
1443 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1444 if (nwid->type == NWID_SPACER) continue;
1445 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1446 assert(nwc != nullptr);
1447 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1448 }
1449
1450 /* Now assign the widgets to their rightful place */
1451 uint position = 0; // Place to put next child relative to origin of the container.
1452 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1453 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1454 uint spacer_i = 0;
1455 uint button_i = 0;
1456
1457 /* Index into the arrangement indices. */
1458 const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1459 for (uint i = 0; i < arrangable_count; i++) {
1460 uint slot = lookup[*slotp];
1461 auto &child_wid = this->children[slot];
1462 /* If we have space to give to the spacers, do that. */
1463 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1464 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1465 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1466 uint add = spacer_space / (spacer_count - spacer_i);
1467 position += add;
1468 spacer_space -= add;
1469 spacer_i++;
1470 }
1471 }
1472
1473 /* Buttons can be scaled, the others not. */
1474 if (this->IsButton(child_wid->type)) {
1475 child_wid->current_x = button_space / (button_count - button_i);
1476 button_space -= child_wid->current_x;
1477 button_i++;
1478 } else {
1479 child_wid->current_x = child_wid->smallest_x;
1480 }
1481 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1482 position += child_wid->current_x;
1483
1484 if (rtl) {
1485 slotp--;
1486 } else {
1487 slotp++;
1488 }
1489 }
1490 }
1491
1492 void Draw(const Window *w) override
1493 {
1494 /* Draw brown-red toolbar bg. */
1495 const Rect r = this->GetCurrentRect();
1498
1499 this->NWidgetContainer::Draw(w);
1500 }
1501
1510 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1511};
1512
1515 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1516 {
1517 static const uint SMALLEST_ARRANGEMENT = 14;
1518 static const uint BIGGEST_ARRANGEMENT = 20;
1519
1520 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1521 * The total number of buttons should be equal to arrangable_count * 2.
1522 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1523 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1524 * enough space.
1525 */
1526 static const WidgetID arrange14[] = {
1538 WID_TN_AIR,
1541 /* lower toolbar */
1556 };
1557 static const WidgetID arrange15[] = {
1568 WID_TN_AIR,
1573 /* lower toolbar */
1589 };
1590 static const WidgetID arrange16[] = {
1602 WID_TN_AIR,
1607 /* lower toolbar */
1624 };
1625 static const WidgetID arrange17[] = {
1638 WID_TN_AIR,
1643 /* lower toolbar */
1661 };
1662 static const WidgetID arrange18[] = {
1676 WID_TN_AIR,
1681 /* lower toolbar */
1700 };
1701 static const WidgetID arrange19[] = {
1715 WID_TN_AIR,
1721 /* lower toolbar */
1735 WID_TN_AIR,
1741 };
1742 static const WidgetID arrange20[] = {
1756 WID_TN_AIR,
1763 /* lower toolbar */
1777 WID_TN_AIR,
1784 };
1785 static const WidgetID arrange_all[] = {
1811 WID_TN_AIR,
1816 };
1817
1818 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1819 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1820 if (full_buttons > BIGGEST_ARRANGEMENT) {
1821 button_count = arrangable_count = lengthof(arrange_all);
1822 spacer_count = this->spacers;
1823 return arrange_all;
1824 }
1825
1826 /* Introduce the split toolbar */
1827 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1828
1829 button_count = arrangable_count = full_buttons;
1830 spacer_count = this->spacers;
1831 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1832 }
1833};
1834
1837 std::array<uint, 2> panel_widths{};
1838
1839 void SetupSmallestSize(Window *w) override
1840 {
1842
1843 /* Find the size of panel_widths */
1844 auto it = this->panel_widths.begin();
1845 for (const auto &child_wid : this->children) {
1846 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1847
1848 assert(it != this->panel_widths.end());
1849 *it = child_wid->current_x;
1850 _toolbar_width += child_wid->current_x;
1851 ++it;
1852 }
1853 }
1854
1855 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1856 {
1857 static const WidgetID arrange_all[] = {
1877 };
1878 static const WidgetID arrange_nopanel[] = {
1897 };
1898 static const WidgetID arrange_switch[] = {
1910 /* lower toolbar */
1922 };
1923
1924 /* If we can place all buttons *and* the panels, show them. */
1925 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1926 if (width >= min_full_width) {
1927 width -= this->panel_widths[0] + this->panel_widths[1];
1928 arrangable_count = lengthof(arrange_all);
1929 button_count = arrangable_count - 2;
1930 spacer_count = this->spacers;
1931 return arrange_all;
1932 }
1933
1934 /* Otherwise don't show the date panel and if we can't fit half the buttons and the panels anymore, split the toolbar in two */
1935 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1936 if (width > min_small_width) {
1937 width -= this->panel_widths[1];
1938 arrangable_count = lengthof(arrange_nopanel);
1939 button_count = arrangable_count - 1;
1940 spacer_count = this->spacers - 1;
1941 return arrange_nopanel;
1942 }
1943
1944 /* Split toolbar */
1945 width -= this->panel_widths[1];
1946 arrangable_count = lengthof(arrange_switch) / 2;
1947 button_count = arrangable_count - 1;
1948 spacer_count = 0;
1949 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1950 }
1951};
1952
1953/* --- Toolbar handling for the 'normal' case */
1954
1955typedef CallBackFunction ToolbarButtonProc(Window *w);
1956
1957static ToolbarButtonProc * const _toolbar_button_procs[] = {
1958 ToolbarPauseClick,
1962 ToolbarMapClick,
1963 ToolbarTownClick,
1964 ToolbarSubsidiesClick,
1965 ToolbarStationsClick,
1966 ToolbarFinancesClick,
1967 ToolbarCompaniesClick,
1968 ToolbarStoryClick,
1969 ToolbarGoalClick,
1970 ToolbarGraphsClick,
1971 ToolbarLeagueClick,
1972 ToolbarIndustryClick,
1973 ToolbarTrainClick,
1974 ToolbarRoadClick,
1975 ToolbarShipClick,
1976 ToolbarAirClick,
1977 ToolbarZoomInClick,
1978 ToolbarZoomOutClick,
1979 ToolbarBuildRailClick,
1980 ToolbarBuildRoadClick,
1981 ToolbarBuildTramClick,
1982 ToolbarBuildWaterClick,
1983 ToolbarBuildAirClick,
1984 ToolbarForestClick,
1985 ToolbarMusicClick,
1986 ToolbarNewspaperClick,
1987 ToolbarHelpClick,
1988 ToolbarSwitchClick,
1989};
1990
1993 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1994 {
1995 this->InitNested(0);
1996
1997 _last_started_action = CBF_NONE;
1999 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2000 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2001 PositionMainToolbar(this);
2003 }
2004
2005 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2006 {
2007 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2008 }
2009
2010 void OnPaint() override
2011 {
2012 /* If spectator, disable all construction buttons
2013 * ie : Build road, rail, ships, airports and landscaping
2014 * Since enabled state is the default, just disable when needed */
2016 /* disable company list drop downs, if there are no companies */
2018
2021
2022 this->DrawWidgets();
2023 }
2024
2025 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2026 {
2027 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2028 }
2029
2030 void OnDropdownSelect(WidgetID widget, int index, int) override
2031 {
2032 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2033 if (cbf != CBF_NONE) _last_started_action = cbf;
2034 }
2035
2036 EventState OnHotkey(int hotkey) override
2037 {
2038 CallBackFunction cbf = CBF_NONE;
2039 switch (hotkey) {
2040 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2041 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2042 case MTHK_SETTINGS: ShowGameOptions(); break;
2043 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2044 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2045 case MTHK_SMALLMAP: ShowSmallMap(); break;
2046 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2047 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2048 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2049 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2050 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2051 case MTHK_STORY: ShowStoryBook(_local_company); break;
2052 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2053 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2054 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2055 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2056 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2057 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2058 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2059 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2060 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2061 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2062 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2063 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2064 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2065 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2066 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2067 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2068 case MTHK_MUSIC: ShowMusicWindow(); break;
2069 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2070 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2071 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2072 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2073 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2074 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2075 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2076 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2077 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2078 case MTHK_SIGN_LIST: ShowSignList(); break;
2079 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2080 default: return ES_NOT_HANDLED;
2081 }
2082 if (cbf != CBF_NONE) _last_started_action = cbf;
2083 return ES_HANDLED;
2084 }
2085
2086 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2087 {
2088 switch (_last_started_action) {
2089 case CBF_PLACE_SIGN:
2090 PlaceProc_Sign(tile);
2091 break;
2092
2093 case CBF_PLACE_LANDINFO:
2094 ShowLandInfo(tile);
2095 break;
2096
2097 default: NOT_REACHED();
2098 }
2099 }
2100
2101 void OnPlaceObjectAbort() override
2102 {
2103 _last_started_action = CBF_NONE;
2104 }
2105
2107 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2108 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2111 }
2112
2113 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2116 }
2117 }};
2118
2119 void OnTimeout() override
2120 {
2121 /* We do not want to automatically raise the pause, fast forward and
2122 * switchbar buttons; they have to stay down when pressed etc. */
2123 for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2124 this->RaiseWidgetWhenLowered(i);
2125 }
2126 }
2127
2133 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2134 {
2135 if (!gui_scope) return;
2137 }
2138
2139 static inline HotkeyList hotkeys{"maintoolbar", {
2140 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2141 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2142 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2143 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2144 Hotkey(0, "load_game", MTHK_LOADGAME),
2145 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2146 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2147 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2148 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2149 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2150 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2151 Hotkey(0, "story_book", MTHK_STORY),
2152 Hotkey(0, "goal_list", MTHK_GOAL),
2153 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2154 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2155 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2156 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2157 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2158 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2159 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2160 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2161 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2162 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2163 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2164 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2165 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2166 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2167 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2168 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2169 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2170 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2171 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2172 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2173 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2174 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2175 Hotkey('L', "terraform", MTHK_TERRAFORM),
2176 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2177 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2178 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2179 Hotkey(0, "land_info", MTHK_LANDINFO),
2180 }};
2181};
2182
2183static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2184{
2186 static const SpriteID toolbar_button_sprites[] = {
2187 SPR_IMG_PAUSE, // WID_TN_PAUSE
2188 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2189 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2190 SPR_IMG_SAVE, // WID_TN_SAVE
2191 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2192 SPR_IMG_TOWN, // WID_TN_TOWNS
2193 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2194 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2195 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2196 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2197 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2198 SPR_IMG_GOAL, // WID_TN_GOAL
2199 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2200 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2201 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2202 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2203 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2204 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2205 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2206 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2207 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2208 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2209 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2210 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2211 SPR_IMG_BUILDWATER, // WID_TN_WATER
2212 SPR_IMG_BUILDAIR, // WID_TN_AIR
2213 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2214 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2215 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2216 SPR_IMG_QUERY, // WID_TN_HELP
2217 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2218 };
2219
2220 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2221 for (WidgetID i = 0; i < WID_TN_END; i++) {
2222 switch (i) {
2223 case WID_TN_SMALL_MAP:
2224 case WID_TN_FINANCES:
2226 case WID_TN_ZOOM_IN:
2228 case WID_TN_MUSIC_SOUND:
2229 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2230 break;
2231 }
2232 auto leaf = std::make_unique<NWidgetLeaf>(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, WidgetData{.sprite = toolbar_button_sprites[i]}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i);
2233 leaf->SetMinimalSize(20, 20);
2234 hor->Add(std::move(leaf));
2235 }
2236
2237 return hor;
2238}
2239
2240static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2242};
2243
2244static WindowDesc _toolb_normal_desc(
2245 WDP_MANUAL, {}, 0, 0,
2248 _nested_toolbar_normal_widgets,
2249 &MainToolbarWindow::hotkeys
2250);
2251
2252
2253/* --- Toolbar handling for the scenario editor */
2254
2255static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2256 nullptr, // 0
2257 nullptr, // 1
2258 MenuClickSettings, // 2
2259 MenuClickSaveLoad, // 3
2260 nullptr, // 4
2261 nullptr, // 5
2262 nullptr, // 6
2263 nullptr, // 7
2264 MenuClickMap, // 8
2265 nullptr, // 9
2266 nullptr, // 10
2267 nullptr, // 11
2268 ToolbarScenGenTown, // 12
2269 nullptr, // 13
2272 nullptr, // 16
2273 nullptr, // 17
2274 nullptr, // 18
2275 nullptr, // 19
2277 MenuClickHelp, // 21
2278 nullptr, // 22
2279};
2280
2281static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2282 ToolbarPauseClick,
2286 ToolbarBtn_NULL,
2288 ToolbarScenDateBackward,
2289 ToolbarScenDateForward,
2290 ToolbarScenMapTownDir,
2291 ToolbarZoomInClick,
2292 ToolbarZoomOutClick,
2293 ToolbarScenGenLand,
2294 ToolbarScenGenTownClick,
2295 ToolbarScenGenIndustry,
2296 ToolbarScenBuildRoadClick,
2297 ToolbarScenBuildTramClick,
2298 ToolbarScenBuildDocks,
2299 ToolbarScenPlantTrees,
2300 ToolbarScenPlaceSign,
2301 ToolbarBtn_NULL,
2302 ToolbarMusicClick,
2303 ToolbarHelpClick,
2304 ToolbarSwitchClick,
2305};
2306
2307enum MainToolbarEditorHotkeys : int32_t {
2308 MTEHK_PAUSE,
2309 MTEHK_FASTFORWARD,
2310 MTEHK_SETTINGS,
2311 MTEHK_SAVEGAME,
2312 MTEHK_GENLAND,
2313 MTEHK_GENTOWN,
2314 MTEHK_GENINDUSTRY,
2315 MTEHK_BUILD_ROAD,
2316 MTEHK_BUILD_TRAM,
2317 MTEHK_BUILD_DOCKS,
2318 MTEHK_BUILD_TREES,
2319 MTEHK_SIGN,
2320 MTEHK_MUSIC,
2321 MTEHK_LANDINFO,
2322 MTEHK_SMALL_SCREENSHOT,
2323 MTEHK_ZOOMEDIN_SCREENSHOT,
2324 MTEHK_DEFAULTZOOM_SCREENSHOT,
2325 MTEHK_GIANT_SCREENSHOT,
2326 MTEHK_ZOOM_IN,
2327 MTEHK_ZOOM_OUT,
2328 MTEHK_TERRAFORM,
2329 MTEHK_SMALLMAP,
2330 MTEHK_EXTRA_VIEWPORT,
2331};
2332
2335 {
2336 this->InitNested(0);
2337
2338 _last_started_action = CBF_NONE;
2340 PositionMainToolbar(this);
2342 }
2343
2344 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2345 {
2346 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2347 }
2348
2358
2359 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2360 {
2361 switch (widget) {
2362 case WID_TE_DATE:
2364
2365 default:
2366 return this->Window::GetWidgetString(widget, stringid);
2367 }
2368 }
2369
2370 void DrawWidget(const Rect &r, WidgetID widget) const override
2371 {
2372 switch (widget) {
2373 case WID_TE_SPACER: {
2374 int height = r.Height();
2375 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2376 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2377 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2378 } else {
2379 DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2380 }
2381 break;
2382 }
2383 }
2384 }
2385
2386 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2387 {
2388 switch (widget) {
2389 case WID_TE_SPACER:
2390 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2391 break;
2392
2393 case WID_TE_DATE:
2395 break;
2396 }
2397 }
2398
2399 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2400 {
2401 if (_game_mode == GM_MENU) return;
2402 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2403 if (cbf != CBF_NONE) _last_started_action = cbf;
2404 }
2405
2406 void OnDropdownSelect(WidgetID widget, int index, int) override
2407 {
2408 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2409 if (cbf != CBF_NONE) _last_started_action = cbf;
2411 }
2412
2413 EventState OnHotkey(int hotkey) override
2414 {
2415 CallBackFunction cbf = CBF_NONE;
2416 switch (hotkey) {
2417 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2418 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2419 case MTEHK_SETTINGS: ShowGameOptions(); break;
2420 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2421 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2422 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2423 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2424 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2425 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2426 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2427 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2428 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2429 case MTEHK_MUSIC: ShowMusicWindow(); break;
2430 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2431 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2432 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2433 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2434 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2435 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2436 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2437 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2438 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2439 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2440 default: return ES_NOT_HANDLED;
2441 }
2442 if (cbf != CBF_NONE) _last_started_action = cbf;
2443 return ES_HANDLED;
2444 }
2445
2446 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2447 {
2448 switch (_last_started_action) {
2449 case CBF_PLACE_SIGN:
2450 PlaceProc_Sign(tile);
2451 break;
2452
2453 case CBF_PLACE_LANDINFO:
2454 ShowLandInfo(tile);
2455 break;
2456
2457 default: NOT_REACHED();
2458 }
2459 }
2460
2461 void OnPlaceObjectAbort() override
2462 {
2463 _last_started_action = CBF_NONE;
2464 }
2465
2472
2474 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2475 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2477 this->SetDirty();
2478 }
2479
2480 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2482 this->SetDirty();
2483 }
2484 }};
2485
2491 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2492 {
2493 if (!gui_scope) return;
2495 }
2496
2497 void OnQueryTextFinished(std::optional<std::string> str) override
2498 {
2499 /* Was 'cancel' pressed? */
2500 if (!str.has_value()) return;
2501
2503 if (!str->empty()) {
2504 auto val = ParseInteger(*str, 10, true);
2505 if (!val.has_value()) return;
2506 value = static_cast<TimerGameCalendar::Year>(*val);
2507 } else {
2508 /* An empty string means revert to the default */
2510 }
2511 SetStartingYear(value);
2512
2513 this->SetDirty();
2514 }
2515
2516 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2517 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2518 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2519 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2520 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2521 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2522 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2523 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2524 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2525 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2526 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2527 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2528 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2529 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2530 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2531 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2532 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2533 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2534 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2535 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2536 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2537 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2538 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2539 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2540 }};
2541};
2542
2543static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2544 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2545 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2546 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2547 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2549 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2551 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2553 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1),
2554 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2555 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1),
2556 EndContainer(),
2557 EndContainer(),
2559 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2561 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2562 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2564 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2565 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2566 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2567 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2568 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2569 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2570 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2571 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2573 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2574 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2575 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2576};
2577
2578static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2579{
2580 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2581}
2582
2583static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2584 NWidgetFunction(MakeScenarioToolbar),
2585};
2586
2587static WindowDesc _toolb_scen_desc(
2588 WDP_MANUAL, {}, 0, 0,
2591 _nested_toolb_scen_widgets,
2592 &ScenarioEditorToolbarWindow::hotkeys
2593);
2594
2597{
2598 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2599 _last_built_roadtype = ROADTYPE_ROAD;
2600 _last_built_tramtype = ROADTYPE_TRAM;
2601
2602 if (_game_mode == GM_EDITOR) {
2603 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2604 } else {
2605 new MainToolbarWindow(_toolb_normal_desc);
2606 }
2607}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:334
Window for configuring the AIs
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr bool None() const
Test if none of the values are set.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Flip(Tvalue_type value)
Flip the value-th bit.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
Drop down icon component.
Company name list item, with company-colour icon, name, and lock components.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
void ShiftDates(TimerGameEconomy::Date interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
Baseclass for nested widgets.
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
uint smallest_x
Smallest horizontal size of the widget in a filled window.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
uint smallest_y
Smallest vertical size of the widget in a filled window.
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
uint current_y
Current vertical size (after resizing).
Baseclass for container widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1327
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
WidgetID GetIndex() const
Get the WidgetID of this nested widget.
Definition widget.cpp:1267
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
std::array< uint, 2 > panel_widths
The width of the two panels (the text panel and date panel)
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Full blown container to make it behave exactly as we want :)
uint spacers
Number of spacer widgets in this toolbar.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
void Draw(const Window *w) override
Draw the widgets of the tree.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
The absolute minimum year in OTTD.
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
static Date date
Current date in days (day counter).
static void SetDate(Date date, DateFract fract)
Set the date.
Functions related to commands.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition dock_gui.cpp:410
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:369
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:414
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:54
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:53
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:19
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:20
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:18
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition fios_gui.cpp:984
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:425
Window for configuring the Games
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
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:40
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
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:50
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:325
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:251
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:384
@ 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
@ WKC_MINUS
Definition gfx_type.h:106
@ WKC_EQUALS
= Equals
Definition gfx_type.h:99
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:311
Graph GUI functions.
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
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 SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
std::unique_ptr< NWidgetBase > MakeNWidgets(std::span< const NWidgetPart > nwid_parts, std::unique_ptr< NWidgetBase > &&container)
Construct a nested widget tree from an array of parts.
Definition widget.cpp:3431
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:955
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1535
GUI functions that shouldn't be here.
void ShowStoryBook(CompanyID company, StoryPageID page_id=StoryPageID::Invalid(), bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:316
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
definition of HouseSpec and accessors
LeagueTable base class.
League table GUI functions.
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Miscellaneous command definitions.
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.
bool _networking
are we in networking mode?
Definition network.cpp:67
bool _network_server
network-server is active
Definition network.cpp:68
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:143
Basic functions/variables used all over the place.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Network functions used by other parts of OpenTTD.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
GUIs related to networking.
@ CLIENT_ID_SERVER
Servers always have this ID.
GRFConfigList _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
Functions/types related to NewGRF debugging.
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
void ShowLastNewsMessage()
Show previous news item.
void ShowMessageHistory()
Display window with news messages history.
GUI functions related to the news.
@ DO_SHOW_TOWN_NAMES
Display town names.
Definition openttd.h:46
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition openttd.h:52
@ DO_FULL_DETAIL
Also draw details of track and roads.
Definition openttd.h:50
@ DO_SHOW_SIGNS
Display signs.
Definition openttd.h:48
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
Definition openttd.h:51
@ DO_SHOW_STATION_NAMES
Display station names.
Definition openttd.h:47
@ DO_FULL_ANIMATION
Perform palette animation.
Definition openttd.h:49
@ Normal
A game normally paused.
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
static const uint8_t PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:919
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:226
Road specific functions.
RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
Get the mask for road types of the given RoadTramType.
Definition road.h:198
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition road_gui.cpp:997
Functions/types related to the road GUIs.
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:26
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:25
A number of safeguards to prevent using unsafe methods.
void MakeScreenshotWithConfirm(ScreenshotType t)
Make a screenshot.
Functions to make screenshots.
@ SC_VIEWPORT
Screenshot of viewport.
Definition screenshot.h:17
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:19
@ SC_WORLD
World screenshot.
Definition screenshot.h:21
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:20
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
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
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
static constexpr StationFacility STATION_FACILITY_GHOST
Fake 'facility' to allow toggling display of recently-removed station signs.
@ Dock
Station with a dock.
@ TruckStop
Station with truck stops.
@ Train
Station with train station.
@ Airport
Station with an airport.
@ BusStop
Station with bus stops.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271
StoryPage base class.
Parse strings.
static std::optional< T > ParseInteger(std::string_view arg, int base=10, bool clamp=false)
Change a string into its number representation.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:415
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
PlaceHouses place_houses
players are allowed to place town houses.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
TimerGameCalendar::Year starting_year
starting date
EconomySettings economy
settings to change the economy
GameCreationSettings game_creation
settings used during the creation of a game (map)
List of hotkeys for a window.
Definition hotkeys.h:37
All data for a single hotkey.
Definition hotkeys.h:21
Struct about custom league tables.
Definition league_base.h:55
void OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPaint() override
The window must be repainted.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnTimeout() override
Called when this window's timeout has been reached.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
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.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
Templated helper to make a type-safe 'typedef' representing a single POD value.
Container with the data associated to a single widget.
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
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:777
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:555
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:306
std::unique_ptr< ViewportData > viewport
Pointer to viewport data, if present.
Definition window_gui.h:318
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:503
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition window_gui.h:478
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:515
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:491
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:410
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:526
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:441
virtual void FindWindowPlacementAndResize(int def_width, int def_height, bool allow_resize)
Resize window towards the default size.
Definition window.cpp:1463
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
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:381
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
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:450
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
Stuff related to the text buffer GUI.
@ EnableDefault
enable the 'Default' button ("\0" is returned)
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
@ HT_RECT
rectangle (stations, depots, ...)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the Window system.
static CallBackFunction MenuClickForest(int index)
Handle click on the entry in the landscaping menu.
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
Pop up a generic text only menu.
static CallBackFunction MenuClickCompany(int index)
Handle click on the entry in the Company menu.
static CallBackFunction MenuClickStations(int index)
Handle click on the entry in the Stations menu.
static CallBackFunction MenuClickTown(int index)
Handle click on one of the entries in the Town menu.
static const int LTMN_PERFORMANCE_LEAGUE
Show default league table.
ToolbarMode
Toobar modes.
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
static const int LTMN_PERFORMANCE_RATING
Show detailed performance rating.
CallBackFunction
Callback functions.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
static CallBackFunction MenuClickShowRoad(int index)
Handle click on the entry in the Road Vehicles menu.
static const int GRMN_DELIVERED_CARGO_GRAPH
Show delivered cargo graph.
static CallBackFunction MenuClickGraphsOrLeague(int index)
Handle click on the entry in the Graphs or CompanyLeague.
static CallBackFunction MenuClickHelp(int index)
Choose the proper callback function for the main toolbar's help menu.
uint _toolbar_width
Width of the toolbar, shared by statusbar.
static const int GRMN_PERFORMANCE_HISTORY_GRAPH
Show performance history graph.
static CallBackFunction ToolbarOptionsClick(Window *w)
Handle click on Options button in toolbar.
static CallBackFunction MenuClickShowShips(int index)
Handle click on the entry in the Ships menu.
static std::unique_ptr< NWidgetBase > MakeMainToolbar()
static CallBackFunction MenuClickSaveLoad(int index=0)
Handle click on one of the entries in the SaveLoad menu.
static const int CTMN_CLIENT_LIST
Enum for the Company Toolbar's network related buttons.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
static CallBackFunction ToolbarScenBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static const int GRMN_COMPANY_VALUE_GRAPH
Show company value graph.
void ToggleDirtyBlocks()
Toggle drawing of the dirty blocks.
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
static CallBackFunction ToolbarScenBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static CallBackFunction MenuClickBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static CallBackFunction _last_started_action
Last started user action.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
static const int GRMN_OPERATING_PROFIT_GRAPH
Enum for the League Toolbar's and Graph Toolbar's related buttons.
static CallBackFunction MenuClickBuildRail(int index)
Handle click on the entry in the Build Rail menu.
static CallBackFunction MenuClickShowAir(int index)
Handle click on the entry in the Aircraft menu.
void AllocateToolbar()
Allocate the toolbar.
static const int GRMN_CARGO_PAYMENT_RATES
Show cargo payment rates graph.
static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
Handle click on SaveLoad button in toolbar in the scenario editor.
static CallBackFunction MenuClickBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static CallBackFunction ToolbarFastForwardClick(Window *)
Toggle fast forward mode.
OptionMenuEntries
Game Option button menu entries.
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey={})
Pop up a generic company list menu.
static CallBackFunction MenuClickBuildWater(int)
Handle click on the entry in the Build Waterways menu.
static const int CTMN_SPECTATE
Become spectator.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
static CallBackFunction MenuClickStory(int index)
Handle click on the entry in the Story menu.
void ToggleBoundingBoxes()
Toggle drawing of sprites' bounding boxes.
static CallBackFunction MenuClickBuildAir(int)
Handle click on the entry in the Build Air menu.
void ToggleWidgetOutlines()
Toggle drawing of widget outlihes.
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Show a company window as spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_END
Helper for knowing the amount of widgets.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:97
StationFacilities _facility_display_opt
What station facilities to draw.
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren't in the game menu (there's never transpar...
uint8_t _display_opt
What do we want to draw/do?
@ TO_HOUSES
town buildings
@ TO_SIGNS
signs
void ShowTransparencyToolbar()
Show the transparency toolbar.
GUI functions related to transparency.
Base class for all vehicles.
Functions related to vehicles.
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void HandleZoomMessage(Window *w, const Viewport &vp, WidgetID widget_zoom_in, WidgetID widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
Definition viewport.cpp:486
Functions related to (drawing on) viewports.
@ ZOOM_IN
Zoom in (get more detailed view).
@ ZOOM_NONE
Hack, used to update the button status.
@ ZOOM_OUT
Zoom out (get helicopter view).
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:36
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:42
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:43
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:71
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:67
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:50
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1169
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3436
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3339
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3282
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ NoClose
This window can't be interactively closed.
@ NoFocus
This window won't get focus/make any other window lose focus when click.
@ WhiteBorder
Window white border counter bit mask.
@ Timeout
Window timeout counter.
@ 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
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_SIGN_LIST
Sign list; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:60