OpenTTD Source 20260401-master-g3efaeb0eea
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
12#include "gui.h"
13#include "spritecache.h"
14#include "window_gui.h"
15#include "window_func.h"
16#include "viewport_func.h"
17#include "command_func.h"
18#include "dropdown_type.h"
19#include "dropdown_func.h"
20#include "house.h"
21#include "vehicle_gui.h"
22#include "rail_gui.h"
23#include "road.h"
24#include "road_gui.h"
25#include "vehicle_func.h"
26#include "sound_func.h"
27#include "terraform_gui.h"
28#include "strings_func.h"
29#include "company_func.h"
30#include "company_gui.h"
31#include "vehicle_base.h"
32#include "cheat_func.h"
33#include "transparency_gui.h"
34#include "screenshot.h"
35#include "signs_func.h"
36#include "fios.h"
37#include "console_gui.h"
38#include "news_gui.h"
39#include "ai/ai_gui.hpp"
40#include "game/game_gui.hpp"
41#include "script/script_gui.h"
42#include "tilehighlight_func.h"
43#include "smallmap_gui.h"
44#include "graph_gui.h"
45#include "textbuf_gui.h"
47#include "newgrf_debug.h"
48#include "hotkeys.h"
49#include "engine_base.h"
50#include "highscore.h"
51#include "game/game.hpp"
52#include "goal_base.h"
53#include "story_base.h"
54#include "toolbar_gui.h"
55#include "framerate_type.h"
56#include "screenshot_gui.h"
57#include "misc_cmd.h"
58#include "league_gui.h"
59#include "league_base.h"
60#include "timer/timer.h"
61#include "timer/timer_window.h"
63#include "help_gui.h"
65
67
68#include "network/network.h"
69#include "network/network_gui.h"
71
72#include "table/strings.h"
73
75
76#include "safeguards.h"
77
78
81
85
87enum class ToolbarMode : uint8_t {
91};
92
99
101
105class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
106public:
107 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)
108 {
109 }
110};
111
117static DropDownOptions GetToolbarDropDownOptions(DropDownOptions options = {})
118{
119 if (_settings_client.gui.toolbar_dropdown_autoselect) options.Set(DropDownOption::InstantClose).Reset(DropDownOption::Filterable);
120 return options;
121}
122
130static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
131{
132 ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions());
133}
134
141static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
142{
143 DropDownList list;
144 int i = 0;
145 for (StringID string : strings) {
146 if (string == STR_NULL) {
147 list.push_back(MakeDropDownListDividerItem());
148 } else {
149 list.push_back(MakeDropDownListStringItem(string, i));
150 i++;
151 }
152 }
153 PopupMainToolbarMenu(w, widget, std::move(list), 0);
154}
155
156/* Special values used in the dropdowns related to companies.
157 * They cannot interfere with valid IDs for companies. */
158static const int CTMN_CLIENT_LIST = MAX_COMPANIES;
159static const int CTMN_SPECTATE = COMPANY_SPECTATOR.base();
160static const int CTMN_SPECTATOR = CompanyID::Invalid().base();
161
168static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
169{
170 DropDownList list;
171
172 switch (widget) {
173 case WID_TN_COMPANIES:
174 if (!_networking) break;
175
176 /* Add the client list button for the companies menu */
177 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
178
180 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
181 }
182 break;
183 case WID_TN_STORY:
184 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
185 break;
186
187 case WID_TN_GOAL:
188 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
189 break;
190 }
191
192 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
193 if (!Company::IsValidID(c)) continue;
194 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
195 }
196
198}
199
200static ToolbarMode _toolbar_mode;
201
202static CallBackFunction SelectSignTool()
203{
207 } else {
208 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
210 }
211}
212
213/* --- Pausing --- */
214
215static CallBackFunction ToolbarPauseClick(Window *)
216{
217 if (_networking && !_network_server) return CallBackFunction::None; // only server can pause the game
218
219 if (Command<Commands::Pause>::Post(PauseMode::Normal, _pause_mode.None())) {
221 }
223}
224
231{
232 if (_networking) return CallBackFunction::None; // no fast forward in network game
233
234 ChangeGameSpeed(_game_speed == 100);
235
236 SndClickBeep();
238}
239
266
274{
275 DropDownList list;
276 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OptionMenuEntries::GameOptions));
277 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
278 * the settings once they join but never update it. As such don't show the window at all
279 * to network clients. */
281 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OptionMenuEntries::AISettings));
282 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OptionMenuEntries::GameScriptSettings));
283 }
284 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OptionMenuEntries::NewGRFSettings));
285 if (_game_mode != GM_EDITOR && !_networking) {
286 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OptionMenuEntries::SandboxOptions));
287 }
288 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OptionMenuEntries::Transparencies));
289 list.push_back(MakeDropDownListDividerItem());
290 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames));
291 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames));
292 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OptionMenuEntries::ShowTrainStationNames, false, false, 1));
293 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OptionMenuEntries::ShowLorryStationNames, false, false, 1));
294 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OptionMenuEntries::ShowBusStationNames, false, false, 1));
295 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OptionMenuEntries::ShowDockNames, false, false, 1));
296 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OptionMenuEntries::ShowAirportNames, false, false, 1));
297 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OptionMenuEntries::ShowGhostStationNames, false, false, 1));
298 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames));
299 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns));
301 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation));
302 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails));
303 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OptionMenuEntries::TransparentBuildings));
304 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OptionMenuEntries::TransparentStationSigns));
305
306 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
308}
309
317{
318 switch (OptionMenuEntries(index)) {
322 case OptionMenuEntries::NewGRFSettings: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CallBackFunction::None;
325
339 break;
344 }
347}
348
360
370
378{
379 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
380 STR_NULL, STR_FILE_MENU_EXIT});
382}
383
391{
392 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
393 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
394 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
396}
397
425
426/* --- Map button menu --- */
427
429enum class MapMenuEntries : uint8_t {
434 ShowTownDirectory,
435 ShowIndustryDirectory,
436};
437
438static CallBackFunction ToolbarMapClick(Window *w)
439{
440 DropDownList list;
441 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
442 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
443 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MapMenuEntries::ShowLinkGraph));
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
445 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
447}
448
449static CallBackFunction ToolbarScenMapTownDir(Window *w)
450{
451 DropDownList list;
452 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
453 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
454 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
455 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MapMenuEntries::ShowTownDirectory));
456 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MapMenuEntries::ShowIndustryDirectory));
457 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
459}
460
479
480/* --- Town button menu --- */
481
488
489static CallBackFunction ToolbarTownClick(Window *w)
490{
491 DropDownList list;
492 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TownMenuEntries::ShowDirectory));
493 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TownMenuEntries::ShowFoundTown));
494 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TownMenuEntries::ShowPlaceHouses));
495
496 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
497
499}
500
508{
509 switch (TownMenuEntries(index)) {
511 case TownMenuEntries::ShowFoundTown: // Setting could be changed when the dropdown was open
512 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
513 break;
514 case TownMenuEntries::ShowPlaceHouses: // Setting could be changed when the dropdown was open
515 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) ShowBuildHousePicker(nullptr);
516 break;
517 }
519}
520
521/* --- Subidies button menu --- */
522
523static CallBackFunction ToolbarSubsidiesClick(Window *w)
524{
525 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
527}
528
535{
536 ShowSubsidiesList();
538}
539
540/* --- Stations button menu --- */
541
542static CallBackFunction ToolbarStationsClick(Window *w)
543{
546}
547
555{
556 ShowCompanyStations((CompanyID)index);
558}
559
560/* --- Finances button menu --- */
561
562static CallBackFunction ToolbarFinancesClick(Window *w)
563{
566}
567
575{
576 ShowCompanyFinances((CompanyID)index);
578}
579
580/* --- Company's button menu --- */
581
582static CallBackFunction ToolbarCompaniesClick(Window *w)
583{
586}
587
595{
596 if (_networking) {
597 switch (index) {
598 case CTMN_CLIENT_LIST:
599 ShowClientList();
601
602 case CTMN_SPECTATE:
603 if (_network_server) {
606 } else {
608 }
610 }
611 }
612 ShowCompany((CompanyID)index);
614}
615
616/* --- Story button menu --- */
617
618static CallBackFunction ToolbarStoryClick(Window *w)
619{
622}
623
631{
632 ShowStoryBook(CompanyID(index));
634}
635
636/* --- Goal button menu --- */
637
638static CallBackFunction ToolbarGoalClick(Window *w)
639{
642}
643
651{
652 ShowGoalsList(CompanyID(index));
654}
655
656/* --- Graphs and League Table button menu --- */
657
662static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
663static const int GRMN_INCOME_GRAPH = -2;
664static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
665static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
666static const int GRMN_COMPANY_VALUE_GRAPH = -5;
667static const int GRMN_CARGO_PAYMENT_RATES = -6;
668static const int LTMN_PERFORMANCE_LEAGUE = -7;
669static const int LTMN_PERFORMANCE_RATING = -8;
670static const int LTMN_HIGHSCORE = -9;
671
672static void AddDropDownLeagueTableOptions(DropDownList &list)
673{
674 if (LeagueTable::GetNumItems() > 0) {
675 for (LeagueTable *lt : LeagueTable::Iterate()) {
676 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
677 }
678 } else {
679 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
680 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
681 if (!_networking) {
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
683 }
684 }
685}
686
687static CallBackFunction ToolbarGraphsClick(Window *w)
688{
689 DropDownList list;
690
691 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
692 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
693 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
694 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
695 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
696 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
697
698 if (_toolbar_mode != ToolbarMode::Normal) AddDropDownLeagueTableOptions(list);
699
702}
703
704static CallBackFunction ToolbarLeagueClick(Window *w)
705{
706 DropDownList list;
707
708 AddDropDownLeagueTableOptions(list);
709
710 int selected = list[0]->result;
711 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
713}
714
722{
723 switch (index) {
724 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
725 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
726 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
727 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
728 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
729 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
730 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
731 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
732 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
733 default: {
734 if (LeagueTable::IsValidID(index)) {
735 ShowScriptLeagueTable((LeagueTableID)index);
736 }
737 }
738 }
740}
741
742
743
744/* --- Industries button menu --- */
745
746static CallBackFunction ToolbarIndustryClick(Window *w)
747{
748 /* Disable build-industry menu if we are a spectator */
750 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
751 } else {
752 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
753 }
755}
756
764{
765 switch (index) {
766 case 0: ShowIndustryDirectory(); break;
767 case 1: ShowIndustryCargoesWindow(); break;
768 case 2: ShowBuildIndustryWindow(); break;
769 }
771}
772
773/* --- Trains button menu + 1 helper function for all vehicles. --- */
774
775static void ToolbarVehicleClick(Window *w, VehicleType veh)
776{
777 CompanyMask dis{};
778
779 for (const Company *c : Company::Iterate()) {
780 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
781 }
783}
784
785
786static CallBackFunction ToolbarTrainClick(Window *w)
787{
788 ToolbarVehicleClick(w, VEH_TRAIN);
790}
791
799{
800 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
802}
803
804/* --- Road vehicle button menu --- */
805
806static CallBackFunction ToolbarRoadClick(Window *w)
807{
808 ToolbarVehicleClick(w, VEH_ROAD);
810}
811
819{
820 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
822}
823
824/* --- Ship button menu --- */
825
826static CallBackFunction ToolbarShipClick(Window *w)
827{
828 ToolbarVehicleClick(w, VEH_SHIP);
830}
831
839{
840 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
842}
843
844/* --- Aircraft button menu --- */
845
846static CallBackFunction ToolbarAirClick(Window *w)
847{
848 ToolbarVehicleClick(w, VEH_AIRCRAFT);
850}
851
859{
860 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
862}
863
864/* --- Zoom in button --- */
865
866static CallBackFunction ToolbarZoomInClick(Window *w)
867{
869 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
870 }
872}
873
874/* --- Zoom out button --- */
875
876static CallBackFunction ToolbarZoomOutClick(Window *w)
877{
879 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
880 }
882}
883
884/* --- Rail button menu --- */
885
886static std::string _railtype_filter;
887static std::string _roadtype_filter;
888static std::string _tramtype_filter;
889
890static CallBackFunction ToolbarBuildRailClick(Window *w)
891{
894}
895
908
909/* --- Road button menu --- */
910
911static CallBackFunction ToolbarBuildRoadClick(Window *w)
912{
915}
916
929
930/* --- Tram button menu --- */
931
932static CallBackFunction ToolbarBuildTramClick(Window *w)
933{
936}
937
950
951/* --- Water button menu --- */
952
953static CallBackFunction ToolbarBuildWaterClick(Window *w)
954{
955 DropDownList list;
956 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
957 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
959}
960
971
972/* --- Airport button menu --- */
973
974static CallBackFunction ToolbarBuildAirClick(Window *w)
975{
976 DropDownList list;
977 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
978 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
980}
981
992
993/* --- Forest button menu --- */
994
995static CallBackFunction ToolbarForestClick(Window *w)
996{
997 DropDownList list;
998 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
999 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
1000 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
1001 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
1003}
1004
1012{
1013 switch (index) {
1014 case 0: ShowTerraformToolbar(); break;
1015 case 1: ShowBuildTreesToolbar(); break;
1016 case 2: return SelectSignTool();
1017 }
1019}
1020
1021/* --- Music button menu --- */
1022
1023static CallBackFunction ToolbarMusicClick(Window *w)
1024{
1025 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1027}
1028
1035{
1036 ShowMusicWindow();
1038}
1039
1040/* --- Newspaper button menu --- */
1041
1042static CallBackFunction ToolbarNewspaperClick(Window *w)
1043{
1044 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1046}
1047
1055{
1056 switch (index) {
1057 case 0: ShowLastNewsMessage(); break;
1058 case 1: ShowMessageHistory(); break;
1059 case 2: DeleteAllMessages(); break;
1060 }
1062}
1063
1064/* --- Help button menu --- */
1065
1066static CallBackFunction PlaceLandBlockInfo()
1067{
1071 } else {
1072 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1074 }
1075}
1076
1077static CallBackFunction ToolbarHelpClick(Window *w)
1078{
1079 if (_settings_client.gui.newgrf_developer_tools) {
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 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1084 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1085 } else {
1086 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1087 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1088 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1089 }
1091}
1092
1101{
1102 extern bool _draw_bounding_boxes;
1103 /* Always allow to toggle them off */
1104 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1105 _draw_bounding_boxes = !_draw_bounding_boxes;
1107 }
1108}
1109
1118{
1119 extern bool _draw_dirty_blocks;
1120 /* Always allow to toggle them off */
1121 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1122 _draw_dirty_blocks = !_draw_dirty_blocks;
1124 }
1125}
1126
1132{
1133 extern bool _draw_widget_outlines;
1134 /* Always allow to toggle them off */
1135 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1136 _draw_widget_outlines = !_draw_widget_outlines;
1138 }
1139}
1140
1145void SetStartingYear(TimerGameCalendar::Year year)
1146{
1147 _settings_game.game_creation.starting_year = Clamp(year, CalendarTime::MIN_YEAR, CalendarTime::MAX_YEAR);
1148 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1149 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1150
1151 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1152 TimerGameCalendar::SetDate(new_calendar_date, 0);
1153
1154 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1155 LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date);
1156 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1157
1158 /* Only change the date after changing cached values above. */
1159 TimerGameEconomy::SetDate(new_economy_date, 0);
1160}
1161
1168{
1169 switch (index) {
1170 case 0: return PlaceLandBlockInfo();
1171 case 1: ShowHelpWindow(); break;
1172 case 2: IConsoleSwitch(); break;
1173 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1174 case 4: ShowScreenshotWindow(); break;
1175 case 5: ShowFramerateWindow(); break;
1176 case 6: ShowAboutWindow(); break;
1177 case 7: ShowSpriteAlignerWindow(); break;
1178 case 8: ToggleBoundingBoxes(); break;
1179 case 9: ToggleDirtyBlocks(); break;
1180 case 10: ToggleWidgetOutlines(); break;
1181 }
1183}
1184
1185/* --- Switch toolbar button --- */
1186
1187static CallBackFunction ToolbarSwitchClick(Window *w)
1188{
1189 if (_toolbar_mode != ToolbarMode::Lower) {
1190 _toolbar_mode = ToolbarMode::Lower;
1191 } else {
1192 _toolbar_mode = ToolbarMode::Upper;
1193 }
1194
1195 w->ReInit();
1196 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == ToolbarMode::Lower);
1197 SndClickBeep();
1199}
1200
1201/* --- Scenario editor specific handlers. */
1202
1208{
1209 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1211}
1212
1213static CallBackFunction ToolbarScenDateBackward(Window *w)
1214{
1215 /* don't allow too fast scrolling */
1216 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1218 w->SetDirty();
1219
1220 SetStartingYear(_settings_game.game_creation.starting_year - 1);
1221 }
1222 _left_button_clicked = false;
1224}
1225
1226static CallBackFunction ToolbarScenDateForward(Window *w)
1227{
1228 /* don't allow too fast scrolling */
1229 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1231 w->SetDirty();
1232
1233 SetStartingYear(_settings_game.game_creation.starting_year + 1);
1234 }
1235 _left_button_clicked = false;
1237}
1238
1239static CallBackFunction ToolbarScenGenLand(Window *w)
1240{
1242
1245}
1246
1247static CallBackFunction ToolbarScenGenTownClick(Window *w)
1248{
1249 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1251}
1252
1253static CallBackFunction ToolbarScenGenTown(int index)
1254{
1255 switch (index) {
1256 case 0: ShowFoundTownWindow(); break;
1257 case 1: ShowBuildHousePicker(nullptr); break;
1258 }
1260}
1261
1262static CallBackFunction ToolbarScenGenIndustry(Window *w)
1263{
1265 ShowBuildIndustryWindow();
1267}
1268
1269static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1270{
1273}
1274
1287
1288static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1289{
1292}
1293
1306
1307static CallBackFunction ToolbarScenBuildDocks(Window *w)
1308{
1312}
1313
1314static CallBackFunction ToolbarScenPlantTrees(Window *w)
1315{
1317 ShowBuildTreesToolbar();
1319}
1320
1321static CallBackFunction ToolbarScenPlaceSign(Window *w)
1322{
1324 return SelectSignTool();
1325}
1326
1327static CallBackFunction ToolbarBtn_NULL(Window *)
1328{
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
1368class NWidgetToolbarContainer : public NWidgetContainer {
1369protected:
1370 uint spacers = 0;
1371
1372public:
1373 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
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 arrangeable_count, button_count, spacer_count;
1437 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_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[arrangeable_count - 1] : arrangement;
1459 for (uint i = 0; i < arrangeable_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 &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1511};
1512
1514class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
1515 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_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 arrangeable_count * 2.
1522 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_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 _toolbar_mode = ToolbarMode::Normal;
1822 button_count = arrangeable_count = lengthof(arrange_all);
1823 spacer_count = this->spacers;
1824 return arrange_all;
1825 }
1826
1827 /* Introduce the split toolbar */
1828 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1829
1830 button_count = arrangeable_count = full_buttons;
1831 spacer_count = this->spacers;
1832 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == ToolbarMode::Lower) ? full_buttons : 0);
1833 }
1834};
1835
1837class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
1838 std::array<uint, 2> panel_widths{};
1839
1840 void SetupSmallestSize(Window *w) override
1841 {
1843
1844 /* Find the size of panel_widths */
1845 auto it = this->panel_widths.begin();
1846 for (const auto &child_wid : this->children) {
1847 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1848
1849 assert(it != this->panel_widths.end());
1850 *it = child_wid->current_x;
1851 _toolbar_width += child_wid->current_x;
1852 ++it;
1853 }
1854 }
1855
1856 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1857 {
1858 static const WidgetID arrange_all[] = {
1878 };
1879 static const WidgetID arrange_nopanel[] = {
1898 };
1899 static const WidgetID arrange_switch[] = {
1911 /* lower toolbar */
1923 };
1924
1925 /* If we can place all buttons *and* the panels, show them. */
1926 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1927 if (width >= min_full_width) {
1928 width -= this->panel_widths[0] + this->panel_widths[1];
1929 arrangeable_count = lengthof(arrange_all);
1930 button_count = arrangeable_count - 2;
1931 spacer_count = this->spacers;
1932 return arrange_all;
1933 }
1934
1935 /* 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 */
1936 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1937 if (width > min_small_width) {
1938 width -= this->panel_widths[1];
1939 arrangeable_count = lengthof(arrange_nopanel);
1940 button_count = arrangeable_count - 1;
1941 spacer_count = this->spacers - 1;
1942 return arrange_nopanel;
1943 }
1944
1945 /* Split toolbar */
1946 width -= this->panel_widths[1];
1947 arrangeable_count = lengthof(arrange_switch) / 2;
1948 button_count = arrangeable_count - 1;
1949 spacer_count = 0;
1950 return arrange_switch + ((_toolbar_mode == ToolbarMode::Lower) ? arrangeable_count : 0);
1951 }
1952};
1953
1954/* --- Toolbar handling for the 'normal' case */
1955
1962
1963static ToolbarButtonProc * const _toolbar_button_procs[] = {
1964 ToolbarPauseClick,
1968 ToolbarMapClick,
1969 ToolbarTownClick,
1970 ToolbarSubsidiesClick,
1971 ToolbarStationsClick,
1972 ToolbarFinancesClick,
1973 ToolbarCompaniesClick,
1974 ToolbarStoryClick,
1975 ToolbarGoalClick,
1976 ToolbarGraphsClick,
1977 ToolbarLeagueClick,
1978 ToolbarIndustryClick,
1979 ToolbarTrainClick,
1980 ToolbarRoadClick,
1981 ToolbarShipClick,
1982 ToolbarAirClick,
1983 ToolbarZoomInClick,
1984 ToolbarZoomOutClick,
1985 ToolbarBuildRailClick,
1986 ToolbarBuildRoadClick,
1987 ToolbarBuildTramClick,
1988 ToolbarBuildWaterClick,
1989 ToolbarBuildAirClick,
1990 ToolbarForestClick,
1991 ToolbarMusicClick,
1992 ToolbarNewspaperClick,
1993 ToolbarHelpClick,
1994 ToolbarSwitchClick,
1995};
1996
1998struct MainToolbarWindow : Window {
1999 MainToolbarWindow(WindowDesc &desc) : Window(desc)
2000 {
2001 this->InitNested(0);
2002
2004 this->flags.Reset(WindowFlag::WhiteBorder);
2005 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2006 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2007 PositionMainToolbar(this);
2009 }
2010
2011 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2012 {
2013 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2014 }
2015
2016 void OnPaint() override
2017 {
2018 /* If spectator, disable all construction buttons
2019 * ie : Build road, rail, ships, airports and landscaping
2020 * Since enabled state is the default, just disable when needed */
2022 /* disable company list drop downs, if there are no companies */
2024
2027
2028 this->DrawWidgets();
2029 }
2030
2031 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2032 {
2033 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2034 }
2035
2036 void OnDropdownSelect(WidgetID widget, int index, int) override
2037 {
2038 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2040 }
2041
2042 EventState OnHotkey(int hotkey) override
2043 {
2045 switch (hotkey) {
2046 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2047 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2048 case MTHK_SETTINGS: ShowGameOptions(); break;
2049 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2050 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2051 case MTHK_SMALLMAP: ShowSmallMap(); break;
2052 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2053 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2054 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2055 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2056 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2057 case MTHK_STORY: ShowStoryBook(_local_company); break;
2058 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2059 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2060 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2061 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2062 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2063 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2064 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2065 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2066 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2067 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2068 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2069 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2070 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2071 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2072 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2073 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2074 case MTHK_MUSIC: ShowMusicWindow(); break;
2075 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2076 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2077 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2078 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2079 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2080 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2081 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2082 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2083 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2084 case MTHK_SIGN_LIST: ShowSignList(); break;
2085 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2086 default: return ES_NOT_HANDLED;
2087 }
2089 return ES_HANDLED;
2090 }
2091
2092 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2093 {
2094 switch (_last_started_action) {
2096 PlaceProc_Sign(tile);
2097 break;
2098
2100 ShowLandInfo(tile);
2101 break;
2102
2103 default: NOT_REACHED();
2104 }
2105 }
2106
2111
2113 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2114 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2117 }
2118
2119 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2122 }
2123 }};
2124
2130 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2131 {
2132 if (!gui_scope) return;
2134 }
2135
2136 static inline HotkeyList hotkeys{"maintoolbar", {
2137 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2138 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2139 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2140 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2141 Hotkey(0, "load_game", MTHK_LOADGAME),
2142 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2143 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2144 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2145 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2146 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2147 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2148 Hotkey(0, "story_book", MTHK_STORY),
2149 Hotkey(0, "goal_list", MTHK_GOAL),
2150 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2151 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2152 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2153 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2154 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2155 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2156 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2157 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2158 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2159 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2160 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2161 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2162 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2163 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2164 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2165 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2166 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2167 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2168 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2169 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2170 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2171 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2172 Hotkey('L', "terraform", MTHK_TERRAFORM),
2173 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2174 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2175 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2176 Hotkey(0, "land_info", MTHK_LANDINFO),
2177 }};
2178};
2179
2181static constexpr std::tuple<WidgetID, WidgetType, SpriteID> _toolbar_button_sprites[] = {
2182 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2183 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2184 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2185 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2186 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2187 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2188 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2189 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2190 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2191 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2192 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2193 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2194 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2195 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2196 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2197 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2198 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2199 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2200 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2201 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2202 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2203 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2204 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2205 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2206 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2207 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2208 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2209 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2210 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2211 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2212 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2213};
2214
2220{
2221 Dimension d{};
2222 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2223 if (!SpriteExists(sprite)) continue;
2224 d = maxdim(d, GetSquareScaledSpriteSize(sprite));
2225 }
2226 return d;
2227}
2228
2233static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2234{
2235 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2236 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2237 switch (widget) {
2238 case WID_TN_SMALL_MAP:
2239 case WID_TN_FINANCES:
2241 case WID_TN_ZOOM_IN:
2243 case WID_TN_MUSIC_SOUND:
2244 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2245 break;
2246 }
2247 auto leaf = std::make_unique<NWidgetLeaf>(tp, COLOUR_GREY, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2248 leaf->SetToolbarMinimalSize(1);
2249 hor->Add(std::move(leaf));
2250 }
2251
2252 return hor;
2253}
2254
2255static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2257};
2258
2259static WindowDesc _toolb_normal_desc(
2260 WDP_MANUAL, {}, 0, 0,
2263 _nested_toolbar_normal_widgets,
2264 &MainToolbarWindow::hotkeys
2265);
2266
2267
2268/* --- Toolbar handling for the scenario editor */
2269
2270static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2271 nullptr, // 0
2272 nullptr, // 1
2273 MenuClickSettings, // 2
2274 MenuClickSaveLoad, // 3
2275 nullptr, // 4
2276 nullptr, // 5
2277 nullptr, // 6
2278 nullptr, // 7
2279 MenuClickMap, // 8
2280 nullptr, // 9
2281 nullptr, // 10
2282 nullptr, // 11
2283 ToolbarScenGenTown, // 12
2284 nullptr, // 13
2287 nullptr, // 16
2288 nullptr, // 17
2289 nullptr, // 18
2290 nullptr, // 19
2292 MenuClickHelp, // 21
2293 nullptr, // 22
2294};
2295
2296static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2297 ToolbarPauseClick,
2301 ToolbarBtn_NULL,
2303 ToolbarScenDateBackward,
2304 ToolbarScenDateForward,
2305 ToolbarScenMapTownDir,
2306 ToolbarZoomInClick,
2307 ToolbarZoomOutClick,
2308 ToolbarScenGenLand,
2309 ToolbarScenGenTownClick,
2310 ToolbarScenGenIndustry,
2311 ToolbarScenBuildRoadClick,
2312 ToolbarScenBuildTramClick,
2313 ToolbarScenBuildDocks,
2314 ToolbarScenPlantTrees,
2315 ToolbarScenPlaceSign,
2316 ToolbarBtn_NULL,
2317 ToolbarMusicClick,
2318 ToolbarHelpClick,
2319 ToolbarSwitchClick,
2320};
2321
2352
2353struct ScenarioEditorToolbarWindow : Window {
2354 ScenarioEditorToolbarWindow(WindowDesc &desc) : Window(desc)
2355 {
2356 this->InitNested(0);
2357
2359 this->flags.Reset(WindowFlag::WhiteBorder);
2360 PositionMainToolbar(this);
2362 }
2363
2364 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2365 {
2366 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2367 }
2368
2378
2379 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2380 {
2381 switch (widget) {
2382 case WID_TE_DATE:
2383 return GetString(STR_JUST_DATE_LONG, TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
2384
2385 default:
2386 return this->Window::GetWidgetString(widget, stringid);
2387 }
2388 }
2389
2390 void DrawWidget(const Rect &r, WidgetID widget) const override
2391 {
2392 switch (widget) {
2393 case WID_TE_SPACER: {
2394 int height = r.Height();
2395 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2396 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2397 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2398 } else {
2399 DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2400 }
2401 break;
2402 }
2403 }
2404 }
2405
2406 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2407 {
2408 switch (widget) {
2409 case WID_TE_SPACER:
2410 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2411 break;
2412
2413 case WID_TE_DATE:
2415 break;
2416 }
2417 }
2418
2419 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2420 {
2421 if (_game_mode == GM_MENU) return;
2422 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2424 }
2425
2426 void OnDropdownSelect(WidgetID widget, int index, int) override
2427 {
2428 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2430 SndClickBeep();
2431 }
2432
2433 EventState OnHotkey(int hotkey) override
2434 {
2435 if (IsSpecialHotkey(hotkey)) {
2437 switch (MainToolbarEditorHotkeys(hotkey)) {
2440 case MainToolbarEditorHotkeys::Music: ShowMusicWindow(); break;
2441 case MainToolbarEditorHotkeys::LandInfo: cbf = PlaceLandBlockInfo(); break;
2449 case MainToolbarEditorHotkeys::GenerateTown: ShowFoundTownWindow(); break;
2452 default: return ES_NOT_HANDLED;
2453 }
2455 } else {
2456 this->OnClick({}, hotkey, 0);
2457 }
2458 return ES_HANDLED;
2459 }
2460
2461 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2462 {
2463 switch (_last_started_action) {
2465 PlaceProc_Sign(tile);
2466 break;
2467
2469 ShowLandInfo(tile);
2470 break;
2471
2472 default: NOT_REACHED();
2473 }
2474 }
2475
2480
2487
2489 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2490 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2492 this->SetDirty();
2493 }
2494
2495 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2497 this->SetDirty();
2498 }
2499 }};
2500
2506 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2507 {
2508 if (!gui_scope) return;
2510 }
2511
2512 void OnQueryTextFinished(std::optional<std::string> str) override
2513 {
2514 /* Was 'cancel' pressed? */
2515 if (!str.has_value()) return;
2516
2517 TimerGameCalendar::Year value;
2518 if (!str->empty()) {
2519 auto val = ParseInteger(*str, 10, true);
2520 if (!val.has_value()) return;
2521 value = static_cast<TimerGameCalendar::Year>(*val);
2522 } else {
2523 /* An empty string means revert to the default */
2524 value = TimerGameCalendar::Year{CalendarTime::DEF_START_YEAR.base()};
2525 }
2526 SetStartingYear(value);
2527
2528 this->SetDirty();
2529 }
2530
2531 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2532 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MainToolbarEditorHotkeys::Pause),
2533 Hotkey(0, "fastforward", MainToolbarEditorHotkeys::FastForward),
2534 Hotkey(WKC_F2, "settings", MainToolbarEditorHotkeys::Settings),
2535 Hotkey(WKC_F3, "saveload", MainToolbarEditorHotkeys::SaveGame),
2536 Hotkey(WKC_F4, "gen_land", MainToolbarEditorHotkeys::GenerateLand),
2537 Hotkey(WKC_F5, "gen_town", MainToolbarEditorHotkeys::GenerateTown),
2538 Hotkey(WKC_F6, "gen_industry", MainToolbarEditorHotkeys::GenerateIndustry),
2539 Hotkey(WKC_F7, "build_road", MainToolbarEditorHotkeys::BuildRoad),
2540 Hotkey(0, "build_tram", MainToolbarEditorHotkeys::BuildTram),
2541 Hotkey(WKC_F8, "build_docks", MainToolbarEditorHotkeys::BuildWater),
2542 Hotkey(WKC_F9, "build_trees", MainToolbarEditorHotkeys::BuildTrees),
2543 Hotkey(WKC_F10, "build_sign", MainToolbarEditorHotkeys::Sign),
2544 Hotkey(WKC_F11, "music", MainToolbarEditorHotkeys::Music),
2545 Hotkey(WKC_F12, "land_info", MainToolbarEditorHotkeys::LandInfo),
2546 Hotkey(WKC_CTRL | 'S', "small_screenshot", MainToolbarEditorHotkeys::SmallScreenshot),
2547 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MainToolbarEditorHotkeys::ZoomedInScreenshot),
2548 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MainToolbarEditorHotkeys::DefaultZoomScreenshot),
2549 Hotkey(0, "giant_screenshot", MainToolbarEditorHotkeys::GiantScreenshot),
2550 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MainToolbarEditorHotkeys::ZoomIn),
2551 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MainToolbarEditorHotkeys::ZoomOut),
2552 Hotkey('L', "terraform", MainToolbarEditorHotkeys::Terraform),
2553 Hotkey('M', "smallmap", MainToolbarEditorHotkeys::SmallMap),
2554 Hotkey('V', "extra_viewport", MainToolbarEditorHotkeys::ExtraViewport),
2555 }};
2556};
2557
2558static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2559 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2560 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2561 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2562 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2564 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2566 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2568 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),
2569 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2570 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),
2571 EndContainer(),
2572 EndContainer(),
2574 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2576 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2577 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2579 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2580 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2581 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2582 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2583 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2584 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2585 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2586 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2588 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2589 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2590 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2591};
2592
2593static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2594{
2595 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2596}
2597
2598static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2599 NWidgetFunction(MakeScenarioToolbar),
2600};
2601
2602static WindowDesc _toolb_scen_desc(
2603 WDP_MANUAL, {}, 0, 0,
2606 _nested_toolb_scen_widgets,
2607 &ScenarioEditorToolbarWindow::hotkeys
2608);
2609
2612{
2613 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2616
2617 if (_game_mode == GM_EDITOR) {
2618 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2619 } else {
2620 new MainToolbarWindow(_toolb_normal_desc);
2621 }
2622}
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.
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 Timpl & Set()
Set all bits.
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.
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).
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1338
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_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.
std::array< uint, 2 > panel_widths
The width of the two panels (the text panel and date panel).
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
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.
void Draw(const Window *w) override
Draw the widgets of the tree.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
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
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
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:415
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:374
std::unique_ptr< DropDownListItem > MakeDropDownListDividerItem()
Creates new DropDownListDividerItem.
Definition dropdown.cpp:36
std::unique_ptr< DropDownListItem > MakeDropDownListIconItem(SpriteID sprite, PaletteID palette, StringID str, int value, bool masked, bool shaded)
Creates new DropDownListIconItem.
Definition dropdown.cpp:70
std::unique_ptr< DropDownListItem > MakeDropDownListStringItem(StringID str, int value, bool masked, bool shaded)
Creates new DropDownListStringItem.
Definition dropdown.cpp:49
std::unique_ptr< DropDownListItem > MakeDropDownListCheckedItem(bool checked, StringID str, int value, bool masked, bool shaded, uint indent)
Creates new DropDownListCheckedItem.
Definition dropdown.cpp:94
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, DropDownOptions options, std::string *const persistent_filter_text)
Show a drop down list.
Definition dropdown.cpp:587
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.
@ InstantClose
Set if releasing mouse button should close the list regardless of where the cursor is.
@ Filterable
Set if the dropdown is filterable.
Base class for engines.
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:55
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:54
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:20
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:21
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:19
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
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 GS.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:900
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:669
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:39
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:43
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:41
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:51
void GfxFillRect(int left, int top, int right, int bottom, const std::variant< PixelColour, PaletteID > &colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:116
Dimension GetSquareScaledSpriteSize(SpriteID sprid)
Scale sprite size for GUI, as a square.
Definition widget.cpp:85
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:324
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:389
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:398
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:346
@ 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:310
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:3415
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 NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
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:980
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1554
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:322
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.
bool LoadHeightmap(DetailedFileType dft, std::string_view filename)
Load a heightmap from file and change the map in its current dimensions to a landscape representing t...
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.
static constexpr int SPECIAL_HOTKEY_BIT
Bit which denotes that hotkey isn't bound to UI button.
Definition hotkeys.h:77
bool IsSpecialHotkey(const int &hotkey)
Checks if hotkey index is special or not.
Definition hotkeys.h:84
Definition of HouseSpec and accessors.
LeagueTable base class.
League table GUI functions.
PoolID< uint8_t, struct LeagueTableIDTag, 255, 0xFF > LeagueTableID
ID of a league table.
Definition league_type.h:35
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
#define Point
Macro that prevents name conflicts between included headers.
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.
Definition openttd.h:69
static constexpr PixelColour PC_VERY_DARK_RED
Almost-black red palette colour.
static constexpr PixelColour 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:962
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:238
Road specific functions.
RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
Get the mask for road types of the given RoadTramType.
Definition road.h:183
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Functions/types related to the road GUIs.
@ RTT_ROAD
Road road type.
Definition road_type.h:38
@ RTT_TRAM
Tram road type.
Definition road_type.h:39
@ RTTB_ROAD
Road road type bit.
Definition road_type.h:43
@ RTTB_TRAM
Tram road type bit.
Definition road_type.h:44
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.
Window for configuring the scripts.
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.
void SndConfirmBeep()
Play a beep sound for a confirm event if enabled in settings.
Definition sound.cpp:261
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:253
Functions related to sound.
Functions to cache sprites in memory.
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:424
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Settings related to the AI.
Dimensions (a width and height) of a rectangle in 2D.
List of hotkeys for a window.
Definition hotkeys.h:46
All data for a single hotkey.
Definition hotkeys.h:22
Struct about custom league tables.
Definition league_base.h:52
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.
static Pool::IterateWrapper< LeagueTable > Iterate(size_t from=0)
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.
Container with the data associated to a single widget.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:992
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:786
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:570
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:307
std::unique_ptr< ViewportData > viewport
Pointer to viewport data, if present.
Definition window_gui.h:319
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:518
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:516
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:492
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:411
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:527
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:442
virtual void FindWindowPlacementAndResize(int def_width, int def_height, bool allow_resize)
Resize window towards the default size.
Definition window.cpp:1490
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1846
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:609
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1836
WindowFlags flags
Window flags.
Definition window_gui.h:301
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
int height
Height of the window (number of pixels down in y direction).
Definition window_gui.h:313
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:451
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)
Definition textbuf_gui.h:20
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
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.
@ LoadScenario
Load a scenario.
@ ExitGame
Exit to desktop.
@ SaveScenario
Save the scenario.
@ LoadHeightmap
Load a heightmap.
@ SaveHeightmap
Save the heightmap.
@ ExitToMainMenu
Exit to main menu.
RailType _last_built_railtype
The most recently used type of rail.
MainToolbarEditorHotkeys
List of hotkeys available in scenario editor.
@ GenerateTown
Open town generation window.
@ GenerateLand
Open land generation window.
@ Pause
(Un)pause the game.
@ Terraform
Open land generation window.
@ Sign
Toggle sign creation tool.
@ SmallMap
Open small map window.
@ GenerateIndustry
Open industry funding window.
@ Music
Open sound end music window.
@ GiantScreenshot
Take detailed screenshot of whole map.
@ BuildWater
Open window for building locks, canals, rivers and aqueducts.
@ ZoomedInScreenshot
Take zoomed in screenshot.
@ DefaultZoomScreenshot
Take screenshot with default zoom.
@ FastForward
Toggle the fast-forward mode.
@ SaveGame
Open save scenario window.
@ SmallScreenshot
Take small screenshot.
@ LandInfo
Toggle land info tool.
@ BuildTram
Open toolbar window with tools for building tramways.
@ BuildTrees
Open tree selection window.
@ BuildRoad
Open toolbar window with tools for building roads.
@ Settings
Open game options window.
@ ExtraViewport
Open new extra viewport window.
static std::string _railtype_filter
Persistent filter text for railtype dropdown menu.
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 std::string _roadtype_filter
Persistent filter text for roadtype dropdown 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
Toolbar modes.
@ Upper
Toolbar is in split mode and the first part is selected.
@ Normal
Toolbar is in normal mode, in wich all 30 buttons are accessible.
@ Lower
Toolbar is in split mode and the second part is selected.
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.
@ PlaceSign
A new sign will be placed when tile is selected afterwards.
@ None
No action will happen when tile is selected afterwards.
@ PlaceLandInfo
Land info window will appear when tile is selected afterwards.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
static std::string _tramtype_filter
Persistent filter text for tramtype dropdown menu.
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
@ ExitGame
Exit to desktop.
@ ExitToMainMenu
Exit to main menu.
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 DropDownOptions GetToolbarDropDownOptions(DropDownOptions options={})
Get options for toolbar dropdown menus,.
static std::unique_ptr< NWidgetBase > MakeMainToolbar()
Make widgets for the main toolbar.
static CallBackFunction MenuClickSaveLoad(int index=0)
Handle click on one of the entries in the SaveLoad menu.
RoadType _last_built_tramtype
The most recently used type of tram track.
static const int CTMN_CLIENT_LIST
Indicates the "all connected players" entry.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
RoadType _last_built_roadtype
The most recently used type of road.
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.
TownMenuEntries
Town button menu entries.
@ ShowDirectory
Open window with list of towns.
@ ShowPlaceHouses
Open house selection window.
@ ShowFoundTown
Open town generation window.
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.
MapMenuEntries
Map button menu entries.
@ ShowIndustryDirectory
Open window with list of industries.
@ ShowExtraViewport
Open new extra viewport window.
@ ShowSmallMap
Open small map window.
@ ShowLinkGraph
Open cargo flow legend window.
@ ShowTownDirectory
Open window with list of towns.
@ ShowSignList
Open sign list window.
static CallBackFunction _last_started_action
Last started user action.
Dimension GetToolbarMaximalImageSize()
Get maximal square size of a toolbar image.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
CallBackFunction(Window *w) ToolbarButtonProc
Callback for when a button is clicked in the given window.
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.
@ ShowBusStationNames
Toggle visibility of bus station names.
@ FullDetails
Toggle full details.
@ ShowSigns
Toggle visibility of signs.
@ ShowLorryStationNames
Toggle visibility of lorry station names.
@ ShowWaypointNames
Toggle visibility of waypoint names.
@ ShowDockNames
Toggle visibility of dock names.
@ TransparentStationSigns
Toggle transparency of signs and names.
@ ShowGhostStationNames
Toggle visibility of ghost station names.
@ GameScriptSettings
Open GS settings window.
@ ShowTownNames
Toggle visibility of town names.
@ AISettings
Open AI settings window.
@ ShowStationNames
Toggle visibility of station names.
@ TransparentBuildings
Toggle buildings transparency.
@ NewGRFSettings
Open NewGRF settings window.
@ ShowTrainStationNames
Toggle visibility of train station names.
@ Transparencies
Open transparency options window.
@ ShowAirportNames
Toggle visibility of airport names.
@ SandboxOptions
Open sandbox options window.
@ FullAnimation
Toggle full animations.
@ GameOptions
Open game options window.
@ ShowCompetitorSigns
Toggle visibility of competitor signs and names.
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
Indicates the "become spectator" entry.
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 outlines.
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 constexpr std::tuple< WidgetID, WidgetType, SpriteID > _toolbar_button_sprites[]
Sprites to use for the different toolbar buttons.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Indicates that a window is being opened for the 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_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:108
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:35
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:42
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition().
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1195
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3494
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3397
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:3340
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.
Definition window_gui.h:156
@ NoFocus
This window won't get focus/make any other window lose focus when click.
Definition window_gui.h:155
@ WhiteBorder
Window white border counter bit mask.
Definition window_gui.h:235
@ Timeout
Window timeout counter.
Definition window_gui.h:227
@ 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:50
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:63