OpenTTD Source 20260531-master-g0e951f3528
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 "object.h"
29#include "newgrf_object.h"
30#include "strings_func.h"
31#include "company_func.h"
32#include "company_gui.h"
33#include "vehicle_base.h"
34#include "cheat_func.h"
35#include "transparency_gui.h"
36#include "screenshot.h"
37#include "signs_func.h"
38#include "fios.h"
39#include "console_gui.h"
40#include "news_gui.h"
41#include "ai/ai_gui.hpp"
42#include "game/game_gui.hpp"
43#include "script/script_gui.h"
44#include "tilehighlight_func.h"
45#include "smallmap_gui.h"
46#include "graph_gui.h"
47#include "textbuf_gui.h"
49#include "newgrf_debug.h"
50#include "hotkeys.h"
51#include "engine_base.h"
52#include "highscore.h"
53#include "game/game.hpp"
54#include "goal_base.h"
55#include "story_base.h"
56#include "toolbar_gui.h"
57#include "framerate_type.h"
58#include "screenshot_gui.h"
59#include "misc_cmd.h"
60#include "league_gui.h"
61#include "league_base.h"
62#include "timer/timer.h"
63#include "timer/timer_window.h"
65#include "help_gui.h"
67
69
70#include "network/network.h"
71#include "network/network_gui.h"
73
74#include "table/strings.h"
75
77
78#include "safeguards.h"
79
80
83
87
89enum class ToolbarMode : uint8_t {
93};
94
96enum class CallBackFunction : uint8_t {
100};
101
103
107class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
108public:
109 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)
110 {
111 }
112};
113
119static DropDownOptions GetToolbarDropDownOptions(DropDownOptions options = {})
120{
121 if (_settings_client.gui.toolbar_dropdown_autoselect) options.Set(DropDownOption::InstantClose).Reset(DropDownOption::Filterable);
122 return options;
123}
124
132static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
133{
134 ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions());
135}
136
143static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
144{
145 DropDownList list;
146 int i = 0;
147 for (StringID string : strings) {
148 if (string == STR_NULL) {
149 list.push_back(MakeDropDownListDividerItem());
150 } else {
151 list.push_back(MakeDropDownListStringItem(string, i));
152 i++;
153 }
154 }
155 PopupMainToolbarMenu(w, widget, std::move(list), 0);
156}
157
158/* Special values used in the dropdowns related to companies.
159 * They cannot interfere with valid IDs for companies. */
160static const int CTMN_CLIENT_LIST = MAX_COMPANIES;
161static const int CTMN_SPECTATE = COMPANY_SPECTATOR.base();
162static const int CTMN_SPECTATOR = CompanyID::Invalid().base();
163
170static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
171{
172 DropDownList list;
173
174 switch (widget) {
175 case WID_TN_COMPANIES:
176 if (!_networking) break;
177
178 /* Add the client list button for the companies menu */
179 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
180
182 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
183 }
184 break;
185 case WID_TN_STORY:
186 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
187 break;
188
189 case WID_TN_GOAL:
190 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
191 break;
192 }
193
194 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
195 if (!Company::IsValidID(c)) continue;
196 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
197 }
198
200}
201
202static ToolbarMode _toolbar_mode;
203
204static CallBackFunction SelectSignTool()
205{
209 } else {
210 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WindowClass::MainToolbar, 0);
212 }
213}
214
215/* --- Pausing --- */
216
217static CallBackFunction ToolbarPauseClick(Window *)
218{
219 if (_networking && !_network_server) return CallBackFunction::None; // only server can pause the game
220
221 if (Command<Commands::Pause>::Post(PauseMode::Normal, _pause_mode.None())) {
223 }
225}
226
233{
234 if (_networking) return CallBackFunction::None; // no fast forward in network game
235
236 ChangeGameSpeed(_game_speed == 100);
237
238 SndClickBeep();
240}
241
268
276{
277 DropDownList list;
278 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OptionMenuEntries::GameOptions));
279 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
280 * the settings once they join but never update it. As such don't show the window at all
281 * to network clients. */
283 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OptionMenuEntries::AISettings));
284 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OptionMenuEntries::GameScriptSettings));
285 }
286 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OptionMenuEntries::NewGRFSettings));
287 if (_game_mode != GameMode::Editor && !_networking) {
288 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OptionMenuEntries::SandboxOptions));
289 }
290 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OptionMenuEntries::Transparencies));
291 list.push_back(MakeDropDownListDividerItem());
292 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowTownNames), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames));
293 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowStationNames), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames));
294 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OptionMenuEntries::ShowTrainStationNames, false, false, 1));
295 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OptionMenuEntries::ShowLorryStationNames, false, false, 1));
296 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OptionMenuEntries::ShowBusStationNames, false, false, 1));
297 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OptionMenuEntries::ShowDockNames, false, false, 1));
298 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OptionMenuEntries::ShowAirportNames, false, false, 1));
299 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OptionMenuEntries::ShowGhostStationNames, false, false, 1));
300 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowWaypointNames), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames));
301 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowSigns), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns));
302 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowCompetitorSigns), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OptionMenuEntries::ShowCompetitorSigns));
303 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullAnimation), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation));
304 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullDetail), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails));
307
308 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
310}
311
319{
320 switch (OptionMenuEntries(index)) {
324 case OptionMenuEntries::NewGRFSettings: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CallBackFunction::None;
327
340 InvalidateWindowClassesData(WindowClass::SignList, -1);
341 break;
346 }
349}
350
362
372
380{
381 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
382 STR_NULL, STR_FILE_MENU_EXIT});
384}
385
393{
394 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
395 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
396 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
398}
399
427
428/* --- Map button menu --- */
429
431enum class MapMenuEntries : uint8_t {
436 ShowTownDirectory,
437 ShowIndustryDirectory,
438};
439
440static CallBackFunction ToolbarMapClick(Window *w)
441{
442 DropDownList list;
443 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
445 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MapMenuEntries::ShowLinkGraph));
446 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
447 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
449}
450
451static CallBackFunction ToolbarScenMapTownDir(Window *w)
452{
453 DropDownList list;
454 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
455 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
456 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
457 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MapMenuEntries::ShowTownDirectory));
458 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MapMenuEntries::ShowIndustryDirectory));
459 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
461}
462
481
482/* --- Town button menu --- */
483
490
491static CallBackFunction ToolbarTownClick(Window *w)
492{
493 DropDownList list;
494 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TownMenuEntries::ShowDirectory));
495 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TownMenuEntries::ShowFoundTown));
496 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TownMenuEntries::ShowPlaceHouses));
497
498 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
499
501}
502
510{
511 switch (TownMenuEntries(index)) {
513 case TownMenuEntries::ShowFoundTown: // Setting could be changed when the dropdown was open
514 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
515 break;
516 case TownMenuEntries::ShowPlaceHouses: // Setting could be changed when the dropdown was open
517 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) ShowBuildHousePicker(nullptr);
518 break;
519 }
521}
522
523/* --- Subidies button menu --- */
524
525static CallBackFunction ToolbarSubsidiesClick(Window *w)
526{
527 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
529}
530
537{
538 ShowSubsidiesList();
540}
541
542/* --- Stations button menu --- */
543
544static CallBackFunction ToolbarStationsClick(Window *w)
545{
548}
549
557{
558 ShowCompanyStations((CompanyID)index);
560}
561
562/* --- Finances button menu --- */
563
564static CallBackFunction ToolbarFinancesClick(Window *w)
565{
568}
569
577{
578 ShowCompanyFinances((CompanyID)index);
580}
581
582/* --- Company's button menu --- */
583
584static CallBackFunction ToolbarCompaniesClick(Window *w)
585{
588}
589
597{
598 if (_networking) {
599 switch (index) {
600 case CTMN_CLIENT_LIST:
603
604 case CTMN_SPECTATE:
605 if (_network_server) {
608 } else {
610 }
612 }
613 }
614 ShowCompany((CompanyID)index);
616}
617
618/* --- Story button menu --- */
619
620static CallBackFunction ToolbarStoryClick(Window *w)
621{
624}
625
633{
634 ShowStoryBook(CompanyID(index));
636}
637
638/* --- Goal button menu --- */
639
640static CallBackFunction ToolbarGoalClick(Window *w)
641{
644}
645
653{
654 ShowGoalsList(CompanyID(index));
656}
657
658/* --- Graphs and League Table button menu --- */
659
664static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
665static const int GRMN_INCOME_GRAPH = -2;
666static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
667static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
668static const int GRMN_COMPANY_VALUE_GRAPH = -5;
669static const int GRMN_CARGO_PAYMENT_RATES = -6;
670static const int LTMN_PERFORMANCE_LEAGUE = -7;
671static const int LTMN_PERFORMANCE_RATING = -8;
672static const int LTMN_HIGHSCORE = -9;
673
674static void AddDropDownLeagueTableOptions(DropDownList &list)
675{
676 if (LeagueTable::GetNumItems() > 0) {
677 for (LeagueTable *lt : LeagueTable::Iterate()) {
678 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
679 }
680 } else {
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
683 if (!_networking) {
684 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
685 }
686 }
687}
688
689static CallBackFunction ToolbarGraphsClick(Window *w)
690{
691 DropDownList list;
692
693 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
694 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
695 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
696 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
697 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
698 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
699
700 if (_toolbar_mode != ToolbarMode::Normal) AddDropDownLeagueTableOptions(list);
701
704}
705
706static CallBackFunction ToolbarLeagueClick(Window *w)
707{
708 DropDownList list;
709
710 AddDropDownLeagueTableOptions(list);
711
712 int selected = list[0]->result;
713 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
715}
716
724{
725 switch (index) {
726 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
727 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
728 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
729 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
730 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
731 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
732 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
733 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
734 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
735 default: {
736 if (LeagueTable::IsValidID(index)) {
737 ShowScriptLeagueTable((LeagueTableID)index);
738 }
739 }
740 }
742}
743
744
745
746/* --- Industries button menu --- */
747
748static CallBackFunction ToolbarIndustryClick(Window *w)
749{
750 /* Disable build-industry menu if we are a spectator */
752 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
753 } else {
754 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
755 }
757}
758
766{
767 switch (index) {
768 case 0: ShowIndustryDirectory(); break;
769 case 1: ShowIndustryCargoesWindow(); break;
770 case 2: ShowBuildIndustryWindow(); break;
771 }
773}
774
775/* --- Trains button menu + 1 helper function for all vehicles. --- */
776
777static void ToolbarVehicleClick(Window *w, VehicleType veh)
778{
779 CompanyMask dis{};
780
781 for (const Company *c : Company::Iterate()) {
782 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
783 }
785}
786
787
788static CallBackFunction ToolbarTrainClick(Window *w)
789{
790 ToolbarVehicleClick(w, VehicleType::Train);
792}
793
801{
802 ShowVehicleListWindow((CompanyID)index, VehicleType::Train);
804}
805
806/* --- Road vehicle button menu --- */
807
808static CallBackFunction ToolbarRoadClick(Window *w)
809{
810 ToolbarVehicleClick(w, VehicleType::Road);
812}
813
821{
822 ShowVehicleListWindow((CompanyID)index, VehicleType::Road);
824}
825
826/* --- Ship button menu --- */
827
828static CallBackFunction ToolbarShipClick(Window *w)
829{
830 ToolbarVehicleClick(w, VehicleType::Ship);
832}
833
841{
842 ShowVehicleListWindow((CompanyID)index, VehicleType::Ship);
844}
845
846/* --- Aircraft button menu --- */
847
848static CallBackFunction ToolbarAirClick(Window *w)
849{
850 ToolbarVehicleClick(w, VehicleType::Aircraft);
852}
853
861{
862 ShowVehicleListWindow((CompanyID)index, VehicleType::Aircraft);
864}
865
866/* --- Zoom in button --- */
867
868static CallBackFunction ToolbarZoomInClick(Window *w)
869{
872 }
874}
875
876/* --- Zoom out button --- */
877
878static CallBackFunction ToolbarZoomOutClick(Window *w)
879{
882 }
884}
885
886/* --- Rail button menu --- */
887
888static std::string _railtype_filter;
889static std::string _roadtype_filter;
890static std::string _tramtype_filter;
891
892static CallBackFunction ToolbarBuildRailClick(Window *w)
893{
896}
897
910
911/* --- Road button menu --- */
912
913static CallBackFunction ToolbarBuildRoadClick(Window *w)
914{
917}
918
931
932/* --- Tram button menu --- */
933
934static CallBackFunction ToolbarBuildTramClick(Window *w)
935{
938}
939
952
953/* --- Water button menu --- */
954
955static CallBackFunction ToolbarBuildWaterClick(Window *w)
956{
957 DropDownList list;
958 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
959 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
961}
962
973
974/* --- Airport button menu --- */
975
976static CallBackFunction ToolbarBuildAirClick(Window *w)
977{
978 DropDownList list;
979 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
980 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
982}
983
994
995/* --- Forest button menu --- */
996
997static CallBackFunction ToolbarForestClick(Window *w)
998{
999 DropDownList list;
1000 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
1001 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
1002 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
1003 if (ObjectClass::GetUIClassCount() != 0) {
1004 list.push_back(MakeDropDownListIconItem(SPR_IMG_TRANSMITTER, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_OBJECT, 3));
1005 }
1006 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
1008}
1009
1017{
1018 switch (index) {
1019 case 0: ShowTerraformToolbar(); break;
1020 case 1: ShowBuildTreesToolbar(); break;
1021 case 2: return SelectSignTool();
1022 case 3: ShowBuildObjectPicker(); break;
1023 }
1025}
1026
1027/* --- Music button menu --- */
1028
1029static CallBackFunction ToolbarMusicClick(Window *w)
1030{
1031 PopupMainToolbarMenu(w, _game_mode == GameMode::Editor ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1033}
1034
1041{
1042 ShowMusicWindow();
1044}
1045
1046/* --- Newspaper button menu --- */
1047
1048static CallBackFunction ToolbarNewspaperClick(Window *w)
1049{
1050 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1052}
1053
1061{
1062 switch (index) {
1063 case 0: ShowLastNewsMessage(); break;
1064 case 1: ShowMessageHistory(); break;
1065 case 2: DeleteAllMessages(); break;
1066 }
1068}
1069
1070/* --- Help button menu --- */
1071
1072static CallBackFunction PlaceLandBlockInfo()
1073{
1077 } else {
1078 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WindowClass::MainToolbar, 0);
1080 }
1081}
1082
1083static CallBackFunction ToolbarHelpClick(Window *w)
1084{
1085 if (_settings_client.gui.newgrf_developer_tools) {
1086 PopupMainToolbarMenu(w, _game_mode == GameMode::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 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1090 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1091 } else {
1092 PopupMainToolbarMenu(w, _game_mode == GameMode::Editor ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1093 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1094 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1095 }
1097}
1098
1107{
1108 extern bool _draw_bounding_boxes;
1109 /* Always allow to toggle them off */
1110 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1111 _draw_bounding_boxes = !_draw_bounding_boxes;
1113 }
1114}
1115
1124{
1125 extern bool _draw_dirty_blocks;
1126 /* Always allow to toggle them off */
1127 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1128 _draw_dirty_blocks = !_draw_dirty_blocks;
1130 }
1131}
1132
1138{
1139 extern bool _draw_widget_outlines;
1140 /* Always allow to toggle them off */
1141 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1142 _draw_widget_outlines = !_draw_widget_outlines;
1144 }
1145}
1146
1152{
1153 _settings_game.game_creation.starting_year = Clamp(year, CalendarTime::MIN_YEAR, CalendarTime::MAX_YEAR);
1154 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1155 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1156
1157 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1158 TimerGameCalendar::SetDate(new_calendar_date, 0);
1159
1160 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1161 LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date);
1162 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1163
1164 /* Only change the date after changing cached values above. */
1165 TimerGameEconomy::SetDate(new_economy_date, 0);
1166}
1167
1174{
1175 switch (index) {
1176 case 0: return PlaceLandBlockInfo();
1177 case 1: ShowHelpWindow(); break;
1178 case 2: IConsoleSwitch(); break;
1179 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1180 case 4: ShowScreenshotWindow(); break;
1181 case 5: ShowFramerateWindow(); break;
1182 case 6: ShowAboutWindow(); break;
1183 case 7: ShowSpriteAlignerWindow(); break;
1184 case 8: ToggleBoundingBoxes(); break;
1185 case 9: ToggleDirtyBlocks(); break;
1186 case 10: ToggleWidgetOutlines(); break;
1187 }
1189}
1190
1191/* --- Switch toolbar button --- */
1192
1193static CallBackFunction ToolbarSwitchClick(Window *w)
1194{
1195 if (_toolbar_mode != ToolbarMode::Lower) {
1196 _toolbar_mode = ToolbarMode::Lower;
1197 } else {
1198 _toolbar_mode = ToolbarMode::Upper;
1199 }
1200
1201 w->ReInit();
1203 SndClickBeep();
1205}
1206
1207/* --- Scenario editor specific handlers. */
1208
1214{
1215 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1217}
1218
1219static CallBackFunction ToolbarScenDateBackward(Window *w)
1220{
1221 /* don't allow too fast scrolling */
1222 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1224 w->SetDirty();
1225
1226 SetStartingYear(_settings_game.game_creation.starting_year - 1);
1227 }
1228 _left_button_clicked = false;
1230}
1231
1232static CallBackFunction ToolbarScenDateForward(Window *w)
1233{
1234 /* don't allow too fast scrolling */
1235 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1237 w->SetDirty();
1238
1239 SetStartingYear(_settings_game.game_creation.starting_year + 1);
1240 }
1241 _left_button_clicked = false;
1243}
1244
1245static CallBackFunction ToolbarScenGenLand(Window *w)
1246{
1248
1251}
1252
1253static CallBackFunction ToolbarScenGenTownClick(Window *w)
1254{
1255 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1257}
1258
1259static CallBackFunction ToolbarScenGenTown(int index)
1260{
1261 switch (index) {
1262 case 0: ShowFoundTownWindow(); break;
1263 case 1: ShowBuildHousePicker(nullptr); break;
1264 }
1266}
1267
1268static CallBackFunction ToolbarScenGenIndustry(Window *w)
1269{
1271 ShowBuildIndustryWindow();
1273}
1274
1275static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1276{
1279}
1280
1293
1294static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1295{
1298}
1299
1312
1313static CallBackFunction ToolbarScenBuildDocks(Window *w)
1314{
1318}
1319
1320static CallBackFunction ToolbarScenPlantTrees(Window *w)
1321{
1323 ShowBuildTreesToolbar();
1325}
1326
1327static CallBackFunction ToolbarScenPlaceSign(Window *w)
1328{
1330 return SelectSignTool();
1331}
1332
1333static CallBackFunction ToolbarBtn_NULL(Window *)
1334{
1336}
1337
1338typedef CallBackFunction MenuClickedProc(int index);
1339
1340static MenuClickedProc * const _menu_clicked_procs[] = {
1341 nullptr, // 0
1342 nullptr, // 1
1343 MenuClickSettings, // 2
1344 MenuClickSaveLoad, // 3
1345 MenuClickMap, // 4
1346 MenuClickTown, // 5
1347 MenuClickSubsidies, // 6
1348 MenuClickStations, // 7
1349 MenuClickFinances, // 8
1350 MenuClickCompany, // 9
1351 MenuClickStory, // 10
1352 MenuClickGoal, // 11
1355 MenuClickIndustry, // 14
1356 MenuClickShowTrains, // 15
1357 MenuClickShowRoad, // 16
1358 MenuClickShowShips, // 17
1359 MenuClickShowAir, // 18
1360 MenuClickMap, // 19
1361 nullptr, // 20
1362 MenuClickBuildRail, // 21
1363 MenuClickBuildRoad, // 22
1364 MenuClickBuildTram, // 23
1365 MenuClickBuildWater, // 24
1366 MenuClickBuildAir, // 25
1367 MenuClickForest, // 26
1369 MenuClickNewspaper, // 28
1370 MenuClickHelp, // 29
1371};
1372
1374class NWidgetToolbarContainer : public NWidgetContainer {
1375protected:
1376 uint spacers = 0;
1377
1378public:
1379 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
1380 {
1381 }
1382
1389 {
1390 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1391 }
1392
1393 void SetupSmallestSize(Window *w) override
1394 {
1395 this->smallest_x = 0; // Biggest child
1396 this->smallest_y = 0; // Biggest child
1397 this->fill_x = 1;
1398 this->fill_y = 0;
1399 this->resize_x = 1; // We only resize in this direction
1400 this->resize_y = 0; // We never resize in this direction
1401 this->spacers = 0;
1402
1403 uint nbuttons = 0;
1404 /* First initialise some variables... */
1405 for (const auto &child_wid : this->children) {
1406 child_wid->SetupSmallestSize(w);
1407 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1408 if (this->IsButton(child_wid->type)) {
1409 nbuttons++;
1410 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1411 } else if (child_wid->type == NWID_SPACER) {
1412 this->spacers++;
1413 }
1414 }
1415
1416 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1417 for (const auto &child_wid : this->children) {
1418 child_wid->current_y = this->smallest_y;
1419 if (!this->IsButton(child_wid->type)) {
1420 child_wid->current_x = child_wid->smallest_x;
1421 }
1422 }
1423
1424 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1425 * displayed there will be no spacers anyway. */
1426 --nbuttons;
1427
1428 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1429 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1430 }
1431
1432 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1433 {
1434 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1435
1436 this->pos_x = x;
1437 this->pos_y = y;
1438 this->current_x = given_width;
1439 this->current_y = given_height;
1440
1441 /* Figure out what are the visible buttons */
1442 uint arrangeable_count, button_count, spacer_count;
1443 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_count, button_count, spacer_count);
1444
1445 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1446 std::map<WidgetID, uint> lookup;
1447 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1448 NWidgetBase *nwid = it->get();
1449 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1450 if (nwid->type == NWID_SPACER) continue;
1451 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1452 assert(nwc != nullptr);
1453 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1454 }
1455
1456 /* Now assign the widgets to their rightful place */
1457 uint position = 0; // Place to put next child relative to origin of the container.
1458 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1459 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1460 uint spacer_i = 0;
1461 uint button_i = 0;
1462
1463 /* Index into the arrangement indices. */
1464 const WidgetID *slotp = rtl ? &arrangement[arrangeable_count - 1] : arrangement;
1465 for (uint i = 0; i < arrangeable_count; i++) {
1466 uint slot = lookup[*slotp];
1467 auto &child_wid = this->children[slot];
1468 /* If we have space to give to the spacers, do that. */
1469 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1470 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1471 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1472 uint add = spacer_space / (spacer_count - spacer_i);
1473 position += add;
1474 spacer_space -= add;
1475 spacer_i++;
1476 }
1477 }
1478
1479 /* Buttons can be scaled, the others not. */
1480 if (this->IsButton(child_wid->type)) {
1481 child_wid->current_x = button_space / (button_count - button_i);
1482 button_space -= child_wid->current_x;
1483 button_i++;
1484 } else {
1485 child_wid->current_x = child_wid->smallest_x;
1486 }
1487 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1488 position += child_wid->current_x;
1489
1490 if (rtl) {
1491 slotp--;
1492 } else {
1493 slotp++;
1494 }
1495 }
1496 }
1497
1498 void Draw(const Window *w) override
1499 {
1500 /* Draw brown-red toolbar bg. */
1501 const Rect r = this->GetCurrentRect();
1504
1505 this->NWidgetContainer::Draw(w);
1506 }
1507
1516 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1517};
1518
1520class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
1521 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1522 {
1523 static const uint SMALLEST_ARRANGEMENT = 14;
1524 static const uint BIGGEST_ARRANGEMENT = 20;
1525
1526 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1527 * The total number of buttons should be equal to arrangeable_count * 2.
1528 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_count * 2) like a
1529 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1530 * enough space.
1531 */
1532 static const WidgetID arrange14[] = {
1544 WID_TN_AIR,
1547 /* lower toolbar */
1562 };
1563 static const WidgetID arrange15[] = {
1574 WID_TN_AIR,
1579 /* lower toolbar */
1595 };
1596 static const WidgetID arrange16[] = {
1608 WID_TN_AIR,
1613 /* lower toolbar */
1630 };
1631 static const WidgetID arrange17[] = {
1644 WID_TN_AIR,
1649 /* lower toolbar */
1667 };
1668 static const WidgetID arrange18[] = {
1682 WID_TN_AIR,
1687 /* lower toolbar */
1706 };
1707 static const WidgetID arrange19[] = {
1721 WID_TN_AIR,
1727 /* lower toolbar */
1741 WID_TN_AIR,
1747 };
1748 static const WidgetID arrange20[] = {
1762 WID_TN_AIR,
1769 /* lower toolbar */
1783 WID_TN_AIR,
1790 };
1791 static const WidgetID arrange_all[] = {
1817 WID_TN_AIR,
1822 };
1823
1824 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1825 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1826 if (full_buttons > BIGGEST_ARRANGEMENT) {
1827 _toolbar_mode = ToolbarMode::Normal;
1828 button_count = arrangeable_count = lengthof(arrange_all);
1829 spacer_count = this->spacers;
1830 return arrange_all;
1831 }
1832
1833 /* Introduce the split toolbar */
1834 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1835
1836 button_count = arrangeable_count = full_buttons;
1837 spacer_count = this->spacers;
1838 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == ToolbarMode::Lower) ? full_buttons : 0);
1839 }
1840};
1841
1843class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
1844 std::array<uint, 2> panel_widths{};
1845
1846 void SetupSmallestSize(Window *w) override
1847 {
1849
1850 /* Find the size of panel_widths */
1851 auto it = this->panel_widths.begin();
1852 for (const auto &child_wid : this->children) {
1853 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1854
1855 assert(it != this->panel_widths.end());
1856 *it = child_wid->current_x;
1857 _toolbar_width += child_wid->current_x;
1858 ++it;
1859 }
1860 }
1861
1862 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1863 {
1864 static const WidgetID arrange_all[] = {
1884 };
1885 static const WidgetID arrange_nopanel[] = {
1904 };
1905 static const WidgetID arrange_switch[] = {
1917 /* lower toolbar */
1929 };
1930
1931 /* If we can place all buttons *and* the panels, show them. */
1932 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1933 if (width >= min_full_width) {
1934 width -= this->panel_widths[0] + this->panel_widths[1];
1935 arrangeable_count = lengthof(arrange_all);
1936 button_count = arrangeable_count - 2;
1937 spacer_count = this->spacers;
1938 return arrange_all;
1939 }
1940
1941 /* 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 */
1942 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1943 if (width > min_small_width) {
1944 width -= this->panel_widths[1];
1945 arrangeable_count = lengthof(arrange_nopanel);
1946 button_count = arrangeable_count - 1;
1947 spacer_count = this->spacers - 1;
1948 return arrange_nopanel;
1949 }
1950
1951 /* Split toolbar */
1952 width -= this->panel_widths[1];
1953 arrangeable_count = lengthof(arrange_switch) / 2;
1954 button_count = arrangeable_count - 1;
1955 spacer_count = 0;
1956 return arrange_switch + ((_toolbar_mode == ToolbarMode::Lower) ? arrangeable_count : 0);
1957 }
1958};
1959
1960/* --- Toolbar handling for the 'normal' case */
1961
1968
1969static ToolbarButtonProc * const _toolbar_button_procs[] = {
1970 ToolbarPauseClick,
1974 ToolbarMapClick,
1975 ToolbarTownClick,
1976 ToolbarSubsidiesClick,
1977 ToolbarStationsClick,
1978 ToolbarFinancesClick,
1979 ToolbarCompaniesClick,
1980 ToolbarStoryClick,
1981 ToolbarGoalClick,
1982 ToolbarGraphsClick,
1983 ToolbarLeagueClick,
1984 ToolbarIndustryClick,
1985 ToolbarTrainClick,
1986 ToolbarRoadClick,
1987 ToolbarShipClick,
1988 ToolbarAirClick,
1989 ToolbarZoomInClick,
1990 ToolbarZoomOutClick,
1991 ToolbarBuildRailClick,
1992 ToolbarBuildRoadClick,
1993 ToolbarBuildTramClick,
1994 ToolbarBuildWaterClick,
1995 ToolbarBuildAirClick,
1996 ToolbarForestClick,
1997 ToolbarMusicClick,
1998 ToolbarNewspaperClick,
1999 ToolbarHelpClick,
2000 ToolbarSwitchClick,
2001};
2002
2004struct MainToolbarWindow : Window {
2005 MainToolbarWindow(WindowDesc &desc) : Window(desc)
2006 {
2007 this->InitNested(0);
2008
2010 this->flags.Reset(WindowFlag::WhiteBorder);
2011 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2012 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2013 PositionMainToolbar(this);
2015 }
2016
2017 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2018 {
2019 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2020 }
2021
2022 void OnPaint() override
2023 {
2024 /* If spectator, disable all construction buttons
2025 * ie : Build road, rail, ships, airports and landscaping
2026 * Since enabled state is the default, just disable when needed */
2028 /* disable company list drop downs, if there are no companies */
2030
2033
2034 this->DrawWidgets();
2035 }
2036
2037 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2038 {
2039 if (_game_mode != GameMode::Menu && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2040 }
2041
2042 void OnDropdownSelect(WidgetID widget, int index, int) override
2043 {
2044 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2046 }
2047
2048 EventState OnHotkey(int hotkey) override
2049 {
2051 switch (hotkey) {
2052 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2053 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2054 case MTHK_SETTINGS: ShowGameOptions(); break;
2055 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2057 case MTHK_SMALLMAP: ShowSmallMap(); break;
2058 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2059 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2060 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2061 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2062 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2063 case MTHK_STORY: ShowStoryBook(_local_company); break;
2064 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2065 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2066 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2067 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2068 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VehicleType::Train); break;
2069 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VehicleType::Road); break;
2070 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VehicleType::Ship); break;
2071 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VehicleType::Aircraft); break;
2072 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2073 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2074 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2075 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2076 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2077 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2078 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2079 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2080 case MTHK_MUSIC: ShowMusicWindow(); break;
2081 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2082 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2083 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2084 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2085 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2086 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2087 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2088 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2089 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2090 case MTHK_SIGN_LIST: ShowSignList(); break;
2091 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2092 default: return ES_NOT_HANDLED;
2093 }
2095 return ES_HANDLED;
2096 }
2097
2098 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2099 {
2100 switch (_last_started_action) {
2102 PlaceProc_Sign(tile);
2103 break;
2104
2106 ShowLandInfo(tile);
2107 break;
2108
2109 default: NOT_REACHED();
2110 }
2111 }
2112
2117
2119 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2120 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2123 }
2124
2125 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2128 }
2129 }};
2130
2136 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2137 {
2138 if (!gui_scope) return;
2140 }
2141
2142 static inline HotkeyList hotkeys{"maintoolbar", {
2143 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2144 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2145 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2146 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2147 Hotkey(0, "load_game", MTHK_LOADGAME),
2148 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2149 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2150 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2151 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2152 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2153 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2154 Hotkey(0, "story_book", MTHK_STORY),
2155 Hotkey(0, "goal_list", MTHK_GOAL),
2156 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2157 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2158 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2159 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2160 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2161 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2162 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2163 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2164 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2165 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2166 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2167 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2168 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2169 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2170 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2171 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2172 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2173 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2174 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2175 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2176 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2177 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2178 Hotkey('L', "terraform", MTHK_TERRAFORM),
2179 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2180 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2181 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2182 Hotkey(0, "land_info", MTHK_LANDINFO),
2183 }};
2184};
2185
2187static constexpr std::tuple<WidgetID, WidgetType, SpriteID> _toolbar_button_sprites[] = {
2188 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2189 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2190 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2191 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2192 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2193 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2194 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2195 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2196 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2197 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2198 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2199 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2200 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2201 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2202 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2203 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2204 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2205 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2206 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2207 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2208 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2209 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2210 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2211 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2212 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2213 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2214 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2215 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2216 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2217 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2218 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2219};
2220
2226{
2227 Dimension d{};
2228 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2229 if (!SpriteExists(sprite)) continue;
2230 d = maxdim(d, GetSquareScaledSpriteSize(sprite));
2231 }
2232 return d;
2233}
2234
2239static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2240{
2241 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2242 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2243 switch (widget) {
2244 case WID_TN_SMALL_MAP:
2245 case WID_TN_FINANCES:
2247 case WID_TN_ZOOM_IN:
2249 case WID_TN_MUSIC_SOUND:
2250 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2251 break;
2252 }
2253 auto leaf = std::make_unique<NWidgetLeaf>(tp, Colours::Grey, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2254 leaf->SetToolbarMinimalSize(1);
2255 hor->Add(std::move(leaf));
2256 }
2257
2258 return hor;
2259}
2260
2261static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2263};
2264
2267 WindowPosition::Manual, {}, 0, 0,
2268 WindowClass::MainToolbar, WindowClass::None,
2270 _nested_toolbar_normal_widgets,
2271 &MainToolbarWindow::hotkeys
2272);
2273
2274
2275/* --- Toolbar handling for the scenario editor */
2276
2277static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2278 nullptr, // 0
2279 nullptr, // 1
2280 MenuClickSettings, // 2
2281 MenuClickSaveLoad, // 3
2282 nullptr, // 4
2283 nullptr, // 5
2284 nullptr, // 6
2285 nullptr, // 7
2286 MenuClickMap, // 8
2287 nullptr, // 9
2288 nullptr, // 10
2289 nullptr, // 11
2290 ToolbarScenGenTown, // 12
2291 nullptr, // 13
2294 nullptr, // 16
2295 nullptr, // 17
2296 nullptr, // 18
2297 nullptr, // 19
2299 MenuClickHelp, // 21
2300 nullptr, // 22
2301};
2302
2303static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2304 ToolbarPauseClick,
2308 ToolbarBtn_NULL,
2310 ToolbarScenDateBackward,
2311 ToolbarScenDateForward,
2312 ToolbarScenMapTownDir,
2313 ToolbarZoomInClick,
2314 ToolbarZoomOutClick,
2315 ToolbarScenGenLand,
2316 ToolbarScenGenTownClick,
2317 ToolbarScenGenIndustry,
2318 ToolbarScenBuildRoadClick,
2319 ToolbarScenBuildTramClick,
2320 ToolbarScenBuildDocks,
2321 ToolbarScenPlantTrees,
2322 ToolbarScenPlaceSign,
2323 ToolbarBtn_NULL,
2324 ToolbarMusicClick,
2325 ToolbarHelpClick,
2326 ToolbarSwitchClick,
2327};
2328
2359
2360struct ScenarioEditorToolbarWindow : Window {
2361 ScenarioEditorToolbarWindow(WindowDesc &desc) : Window(desc)
2362 {
2363 this->InitNested(0);
2364
2366 this->flags.Reset(WindowFlag::WhiteBorder);
2367 PositionMainToolbar(this);
2369 }
2370
2371 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2372 {
2373 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2374 }
2375
2385
2386 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2387 {
2388 switch (widget) {
2389 case WID_TE_DATE:
2390 return GetString(STR_JUST_DATE_LONG, TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
2391
2392 default:
2393 return this->Window::GetWidgetString(widget, stringid);
2394 }
2395 }
2396
2397 void DrawWidget(const Rect &r, WidgetID widget) const override
2398 {
2399 switch (widget) {
2400 case WID_TE_SPACER: {
2401 int height = r.Height();
2403 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FontSize::Normal), STR_SCENEDIT_TOOLBAR_OPENTTD, TextColour::FromString, SA_HOR_CENTER);
2404 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TextColour::FromString, SA_HOR_CENTER);
2405 } else {
2406 DrawString(r.left, r.right, (height - GetCharacterHeight(FontSize::Normal)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TextColour::FromString, SA_HOR_CENTER);
2407 }
2408 break;
2409 }
2410 }
2411 }
2412
2413 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2414 {
2415 switch (widget) {
2416 case WID_TE_SPACER:
2417 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2418 break;
2419
2420 case WID_TE_DATE:
2422 break;
2423 }
2424 }
2425
2426 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2427 {
2428 if (_game_mode == GameMode::Menu) return;
2429 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2431 }
2432
2433 void OnDropdownSelect(WidgetID widget, int index, int) override
2434 {
2435 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2437 SndClickBeep();
2438 }
2439
2440 EventState OnHotkey(int hotkey) override
2441 {
2442 if (IsSpecialHotkey(hotkey)) {
2444 switch (MainToolbarEditorHotkeys(hotkey)) {
2447 case MainToolbarEditorHotkeys::Music: ShowMusicWindow(); break;
2448 case MainToolbarEditorHotkeys::LandInfo: cbf = PlaceLandBlockInfo(); break;
2456 case MainToolbarEditorHotkeys::GenerateTown: ShowFoundTownWindow(); break;
2459 default: return ES_NOT_HANDLED;
2460 }
2462 } else {
2463 this->OnClick({}, hotkey, 0);
2464 }
2465 return ES_HANDLED;
2466 }
2467
2468 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2469 {
2470 switch (_last_started_action) {
2472 PlaceProc_Sign(tile);
2473 break;
2474
2476 ShowLandInfo(tile);
2477 break;
2478
2479 default: NOT_REACHED();
2480 }
2481 }
2482
2487
2494
2496 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2497 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2499 this->SetDirty();
2500 }
2501
2502 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2504 this->SetDirty();
2505 }
2506 }};
2507
2513 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2514 {
2515 if (!gui_scope) return;
2517 }
2518
2519 void OnQueryTextFinished(std::optional<std::string> str) override
2520 {
2521 /* Was 'cancel' pressed? */
2522 if (!str.has_value()) return;
2523
2525 if (!str->empty()) {
2526 auto val = ParseInteger(*str, 10, true);
2527 if (!val.has_value()) return;
2528 value = static_cast<TimerGameCalendar::Year>(*val);
2529 } else {
2530 /* An empty string means revert to the default */
2532 }
2533 SetStartingYear(value);
2534
2535 this->SetDirty();
2536 }
2537
2538 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2539 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MainToolbarEditorHotkeys::Pause),
2540 Hotkey(0, "fastforward", MainToolbarEditorHotkeys::FastForward),
2541 Hotkey(WKC_F2, "settings", MainToolbarEditorHotkeys::Settings),
2542 Hotkey(WKC_F3, "saveload", MainToolbarEditorHotkeys::SaveGame),
2543 Hotkey(WKC_F4, "gen_land", MainToolbarEditorHotkeys::GenerateLand),
2544 Hotkey(WKC_F5, "gen_town", MainToolbarEditorHotkeys::GenerateTown),
2545 Hotkey(WKC_F6, "gen_industry", MainToolbarEditorHotkeys::GenerateIndustry),
2546 Hotkey(WKC_F7, "build_road", MainToolbarEditorHotkeys::BuildRoad),
2547 Hotkey(0, "build_tram", MainToolbarEditorHotkeys::BuildTram),
2548 Hotkey(WKC_F8, "build_docks", MainToolbarEditorHotkeys::BuildWater),
2549 Hotkey(WKC_F9, "build_trees", MainToolbarEditorHotkeys::BuildTrees),
2550 Hotkey(WKC_F10, "build_sign", MainToolbarEditorHotkeys::Sign),
2551 Hotkey(WKC_F11, "music", MainToolbarEditorHotkeys::Music),
2552 Hotkey(WKC_F12, "land_info", MainToolbarEditorHotkeys::LandInfo),
2553 Hotkey(WKC_CTRL | 'S', "small_screenshot", MainToolbarEditorHotkeys::SmallScreenshot),
2554 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MainToolbarEditorHotkeys::ZoomedInScreenshot),
2555 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MainToolbarEditorHotkeys::DefaultZoomScreenshot),
2556 Hotkey(0, "giant_screenshot", MainToolbarEditorHotkeys::GiantScreenshot),
2557 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MainToolbarEditorHotkeys::ZoomIn),
2558 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MainToolbarEditorHotkeys::ZoomOut),
2559 Hotkey('L', "terraform", MainToolbarEditorHotkeys::Terraform),
2560 Hotkey('M', "smallmap", MainToolbarEditorHotkeys::SmallMap),
2561 Hotkey('V', "extra_viewport", MainToolbarEditorHotkeys::ExtraViewport),
2562 }};
2563};
2564
2565static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2566 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2567 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2568 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2569 NWidget(WWT_IMGBTN_2, Colours::Grey, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2575 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_DATE_BACKWARD), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1),
2577 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_DATE_FORWARD), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1),
2578 EndContainer(),
2579 EndContainer(),
2581 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2583 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2584 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2586 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2587 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2588 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2589 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2590 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2591 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2592 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2593 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2595 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2596 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2597 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2598};
2599
2600static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2601{
2602 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2603}
2604
2605static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2606 NWidgetFunction(MakeScenarioToolbar),
2607};
2608
2611 WindowPosition::Manual, {}, 0, 0,
2612 WindowClass::MainToolbar, WindowClass::None,
2614 _nested_toolb_scen_widgets,
2615 &ScenarioEditorToolbarWindow::hotkeys
2616);
2617
2620{
2621 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2624
2625 if (_game_mode == GameMode::Editor) {
2627 } else {
2629 }
2630}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:336
Window for configuring the AIs.
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
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.
StrongType::Typedef< int32_t, struct YearTag< struct Calendar >, StrongType::Compare, StrongType::Integer > Year
StrongType::Typedef< int32_t, DateTag< struct Calendar >, StrongType::Compare, StrongType::Integer > 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:416
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:375
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.
@ Save
File is being saved.
Definition fileio_type.h:55
@ Load
File is being loaded.
Definition fileio_type.h:54
@ Savegame
old or new savegame
Definition fileio_type.h:19
@ Scenario
old or new scenario
Definition fileio_type.h:20
@ Heightmap
heightmap file
Definition fileio_type.h:21
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:88
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:899
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
int DrawString(int left, int right, int top, std::string_view str, ExtendedTextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:668
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
@ 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:435
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:444
@ Invalid
Invalid marker.
Definition gfx_type.h:302
@ Grey
Grey.
Definition gfx_type.h:299
@ White
White colour.
Definition gfx_type.h:330
@ FromString
Marker for telling to use the colour from the string.
Definition gfx_type.h:317
@ Checker
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:392
@ WKC_MINUS
Definition gfx_type.h:106
@ WKC_EQUALS
= Equals
Definition gfx_type.h:99
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:311
Graph GUI functions.
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
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:3414
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 SetTextStyle(TextColour colour, FontSize size=FontSize::Normal)
Widget part function for setting the text style.
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:1553
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:315
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.
void ShowClientList()
Open the client list window.
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.
@ Any
Use first found.
Functions/types related to NewGRF debugging.
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
Functions related to NewGRF objects.
void ShowLastNewsMessage()
Show previous news item.
void ShowMessageHistory()
Display window with news messages history.
GUI functions related to the news.
Functions related to objects.
Window * ShowBuildObjectPicker()
Show our object picker.
@ ShowSigns
Display signs.
Definition openttd.h:48
@ FullDetail
Also draw details of track and roads.
Definition openttd.h:50
@ ShowWaypointNames
Display waypoint names.
Definition openttd.h:51
@ ShowTownNames
Display town names.
Definition openttd.h:46
@ ShowStationNames
Display station names.
Definition openttd.h:47
@ FullAnimation
Perform palette animation.
Definition openttd.h:49
@ ShowCompetitorSigns
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition openttd.h:52
@ Normal
A game normally paused.
Definition openttd.h:72
@ Editor
In the scenario editor.
Definition openttd.h:21
@ Menu
In the main menu.
Definition openttd.h:19
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:963
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.
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
@ Tram
Tram type.
Definition road_type.h:39
@ Road
Road type.
Definition road_type.h:38
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:262
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:254
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 which 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 WindowDesc _toolb_normal_desc(WindowPosition::Manual, {}, 0, 0, WindowClass::MainToolbar, WindowClass::None, {WindowDefaultFlag::NoFocus, WindowDefaultFlag::NoClose}, _nested_toolbar_normal_widgets, &MainToolbarWindow::hotkeys)
Window definition for the normal (top) toolbar.
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
static WindowDesc _toolb_scen_desc(WindowPosition::Manual, {}, 0, 0, WindowClass::MainToolbar, WindowClass::None, {WindowDefaultFlag::NoFocus, WindowDefaultFlag::NoClose}, _nested_toolb_scen_widgets, &ScenarioEditorToolbarWindow::hotkeys)
Window definition for the scenario editor (top) toolbar window.
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...
DisplayOptions _display_opt
What do we want to draw/do?
@ Houses
town buildings
void ShowTransparencyToolbar()
Show the transparency toolbar.
GUI functions related to transparency.
@ None
No visual effect.
Definition vehicle.cpp:2824
Base class for all vehicles.
Functions related to vehicles.
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ Ship
Ship vehicle type.
@ Aircraft
Aircraft vehicle type.
@ Road
Road vehicle type.
@ 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
@ Manual
Manually align the window (so no automatic location finding).
Definition window_gui.h:143
int WidgetID
Widget ID.
Definition window_type.h:21
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.