OpenTTD Source 20260621-master-g720d10536d
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 "goal_gui.h"
56#include "story_base.h"
57#include "toolbar_gui.h"
58#include "framerate_type.h"
59#include "screenshot_gui.h"
60#include "misc_cmd.h"
61#include "league_gui.h"
62#include "league_base.h"
63#include "timer/timer.h"
64#include "timer/timer_window.h"
66#include "help_gui.h"
68
70
71#include "network/network.h"
72#include "network/network_gui.h"
74
75#include "table/strings.h"
76
78
79#include "safeguards.h"
80
81
84
88
90enum class ToolbarMode : uint8_t {
94};
95
102
104
108class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
109public:
110 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)
111 {
112 }
113};
114
121{
122 if (_settings_client.gui.toolbar_dropdown_autoselect) options.Set(DropDownOption::InstantClose).Reset(DropDownOption::Filterable);
123 return options;
124}
125
133static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
134{
135 ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions());
136}
137
144static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
145{
146 DropDownList list;
147 int i = 0;
148 for (StringID string : strings) {
149 if (string == STR_NULL) {
150 list.push_back(MakeDropDownListDividerItem());
151 } else {
152 list.push_back(MakeDropDownListStringItem(string, i));
153 i++;
154 }
155 }
156 PopupMainToolbarMenu(w, widget, std::move(list), 0);
157}
158
159/* Special values used in the dropdowns related to companies.
160 * They cannot interfere with valid IDs for companies. */
161static const int CTMN_CLIENT_LIST = MAX_COMPANIES;
162static const int CTMN_SPECTATE = COMPANY_SPECTATOR.base();
163static const int CTMN_SPECTATOR = CompanyID::Invalid().base();
164
171static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
172{
173 DropDownList list;
174
175 switch (widget) {
176 case WID_TN_COMPANIES:
177 if (!_networking) break;
178
179 /* Add the client list button for the companies menu */
180 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
181
183 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
184 }
185 break;
186 case WID_TN_STORY:
187 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
188 break;
189
190 case WID_TN_GOAL:
191 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
192 break;
193 }
194
195 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
196 if (!Company::IsValidID(c)) continue;
197 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
198 }
199
201}
202
203static ToolbarMode _toolbar_mode;
204
205static CallBackFunction SelectSignTool()
206{
210 } else {
211 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WindowClass::MainToolbar, 0);
213 }
214}
215
216/* --- Pausing --- */
217
218static CallBackFunction ToolbarPauseClick(Window *)
219{
220 if (_networking && !_network_server) return CallBackFunction::None; // only server can pause the game
221
222 if (Command<Commands::Pause>::Post(PauseMode::Normal, _pause_mode.None())) {
224 }
226}
227
234{
235 if (_networking) return CallBackFunction::None; // no fast forward in network game
236
237 ChangeGameSpeed(_game_speed == 100);
238
239 SndClickBeep();
241}
242
269
277{
278 DropDownList list;
279 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OptionMenuEntries::GameOptions));
280 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
281 * the settings once they join but never update it. As such don't show the window at all
282 * to network clients. */
284 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OptionMenuEntries::AISettings));
285 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OptionMenuEntries::GameScriptSettings));
286 }
287 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OptionMenuEntries::NewGRFSettings));
288 if (_game_mode != GameMode::Editor && !_networking) {
289 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OptionMenuEntries::SandboxOptions));
290 }
291 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OptionMenuEntries::Transparencies));
292 list.push_back(MakeDropDownListDividerItem());
293 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowTownNames), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames));
294 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowStationNames), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames));
295 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OptionMenuEntries::ShowTrainStationNames, false, false, 1));
296 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OptionMenuEntries::ShowLorryStationNames, false, false, 1));
297 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OptionMenuEntries::ShowBusStationNames, false, false, 1));
298 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OptionMenuEntries::ShowDockNames, false, false, 1));
299 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OptionMenuEntries::ShowAirportNames, false, false, 1));
300 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OptionMenuEntries::ShowGhostStationNames, false, false, 1));
301 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowWaypointNames), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames));
302 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowSigns), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns));
303 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowCompetitorSigns), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OptionMenuEntries::ShowCompetitorSigns));
304 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullAnimation), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation));
305 list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullDetail), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails));
308
309 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
311}
312
320{
321 switch (OptionMenuEntries(index)) {
325 case OptionMenuEntries::NewGRFSettings: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CallBackFunction::None;
328
341 InvalidateWindowClassesData(WindowClass::SignList, -1);
342 break;
347 }
350}
351
363
373
381{
382 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
383 STR_NULL, STR_FILE_MENU_EXIT});
385}
386
394{
395 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
396 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
397 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
399}
400
428
429/* --- Map button menu --- */
430
432enum class MapMenuEntries : uint8_t {
437 ShowTownDirectory,
438 ShowIndustryDirectory,
439};
440
441static CallBackFunction ToolbarMapClick(Window *w)
442{
443 DropDownList list;
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
445 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
446 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MapMenuEntries::ShowLinkGraph));
447 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
448 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
450}
451
452static CallBackFunction ToolbarScenMapTownDir(Window *w)
453{
454 DropDownList list;
455 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
456 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
457 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
458 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MapMenuEntries::ShowTownDirectory));
459 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MapMenuEntries::ShowIndustryDirectory));
460 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
462}
463
482
483/* --- Town button menu --- */
484
491
492static CallBackFunction ToolbarTownClick(Window *w)
493{
494 DropDownList list;
495 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TownMenuEntries::ShowDirectory));
496 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TownMenuEntries::ShowFoundTown));
497 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TownMenuEntries::ShowPlaceHouses));
498
499 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
500
502}
503
511{
512 switch (TownMenuEntries(index)) {
514 case TownMenuEntries::ShowFoundTown: // Setting could be changed when the dropdown was open
515 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
516 break;
517 case TownMenuEntries::ShowPlaceHouses: // Setting could be changed when the dropdown was open
518 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) ShowBuildHousePicker(nullptr);
519 break;
520 }
522}
523
524/* --- Subidies button menu --- */
525
526static CallBackFunction ToolbarSubsidiesClick(Window *w)
527{
528 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
530}
531
538{
539 ShowSubsidiesList();
541}
542
543/* --- Stations button menu --- */
544
545static CallBackFunction ToolbarStationsClick(Window *w)
546{
549}
550
558{
559 ShowCompanyStations((CompanyID)index);
561}
562
563/* --- Finances button menu --- */
564
565static CallBackFunction ToolbarFinancesClick(Window *w)
566{
569}
570
578{
579 ShowCompanyFinances((CompanyID)index);
581}
582
583/* --- Company's button menu --- */
584
585static CallBackFunction ToolbarCompaniesClick(Window *w)
586{
589}
590
598{
599 if (_networking) {
600 switch (index) {
601 case CTMN_CLIENT_LIST:
604
605 case CTMN_SPECTATE:
606 if (_network_server) {
609 } else {
611 }
613 }
614 }
615 ShowCompany((CompanyID)index);
617}
618
619/* --- Story button menu --- */
620
621static CallBackFunction ToolbarStoryClick(Window *w)
622{
625}
626
634{
635 ShowStoryBook(CompanyID(index));
637}
638
639/* --- Goal button menu --- */
640
641static CallBackFunction ToolbarGoalClick(Window *w)
642{
645}
646
654{
655 ShowGoalsList(CompanyID(index));
657}
658
659/* --- Graphs and League Table button menu --- */
660
665static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
666static const int GRMN_INCOME_GRAPH = -2;
667static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
668static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
669static const int GRMN_COMPANY_VALUE_GRAPH = -5;
670static const int GRMN_CARGO_PAYMENT_RATES = -6;
671static const int LTMN_PERFORMANCE_LEAGUE = -7;
672static const int LTMN_PERFORMANCE_RATING = -8;
673static const int LTMN_HIGHSCORE = -9;
674
675static void AddDropDownLeagueTableOptions(DropDownList &list)
676{
677 if (LeagueTable::GetNumItems() > 0) {
678 for (LeagueTable *lt : LeagueTable::Iterate()) {
679 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
680 }
681 } else {
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
683 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
684 if (!_networking) {
685 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
686 }
687 }
688}
689
690static CallBackFunction ToolbarGraphsClick(Window *w)
691{
692 DropDownList list;
693
694 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
695 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
696 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
697 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
698 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
699 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
700
701 if (_toolbar_mode != ToolbarMode::Normal) AddDropDownLeagueTableOptions(list);
702
705}
706
707static CallBackFunction ToolbarLeagueClick(Window *w)
708{
709 DropDownList list;
710
711 AddDropDownLeagueTableOptions(list);
712
713 int selected = list[0]->result;
714 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
716}
717
725{
726 switch (index) {
727 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
728 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
729 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
730 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
731 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
732 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
733 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
734 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
735 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
736 default: {
737 if (LeagueTable::IsValidID(index)) {
738 ShowScriptLeagueTable((LeagueTableID)index);
739 }
740 }
741 }
743}
744
745
746
747/* --- Industries button menu --- */
748
749static CallBackFunction ToolbarIndustryClick(Window *w)
750{
751 /* Disable build-industry menu if we are a spectator */
753 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
754 } else {
755 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
756 }
758}
759
767{
768 switch (index) {
769 case 0: ShowIndustryDirectory(); break;
770 case 1: ShowIndustryCargoesWindow(); break;
771 case 2: ShowBuildIndustryWindow(); break;
772 }
774}
775
776/* --- Trains button menu + 1 helper function for all vehicles. --- */
777
778static void ToolbarVehicleClick(Window *w, VehicleType veh)
779{
780 CompanyMask dis{};
781
782 for (const Company *c : Company::Iterate()) {
783 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
784 }
786}
787
788
789static CallBackFunction ToolbarTrainClick(Window *w)
790{
791 ToolbarVehicleClick(w, VehicleType::Train);
793}
794
802{
803 ShowVehicleListWindow((CompanyID)index, VehicleType::Train);
805}
806
807/* --- Road vehicle button menu --- */
808
809static CallBackFunction ToolbarRoadClick(Window *w)
810{
811 ToolbarVehicleClick(w, VehicleType::Road);
813}
814
822{
823 ShowVehicleListWindow((CompanyID)index, VehicleType::Road);
825}
826
827/* --- Ship button menu --- */
828
829static CallBackFunction ToolbarShipClick(Window *w)
830{
831 ToolbarVehicleClick(w, VehicleType::Ship);
833}
834
842{
843 ShowVehicleListWindow((CompanyID)index, VehicleType::Ship);
845}
846
847/* --- Aircraft button menu --- */
848
849static CallBackFunction ToolbarAirClick(Window *w)
850{
851 ToolbarVehicleClick(w, VehicleType::Aircraft);
853}
854
862{
863 ShowVehicleListWindow((CompanyID)index, VehicleType::Aircraft);
865}
866
867/* --- Zoom in button --- */
868
869static CallBackFunction ToolbarZoomInClick(Window *w)
870{
873 }
875}
876
877/* --- Zoom out button --- */
878
879static CallBackFunction ToolbarZoomOutClick(Window *w)
880{
883 }
885}
886
887/* --- Rail button menu --- */
888
889static std::string _railtype_filter;
890static std::string _roadtype_filter;
891static std::string _tramtype_filter;
892
893static CallBackFunction ToolbarBuildRailClick(Window *w)
894{
897}
898
911
912/* --- Road button menu --- */
913
914static CallBackFunction ToolbarBuildRoadClick(Window *w)
915{
918}
919
932
933/* --- Tram button menu --- */
934
935static CallBackFunction ToolbarBuildTramClick(Window *w)
936{
939}
940
953
954/* --- Water button menu --- */
955
956static CallBackFunction ToolbarBuildWaterClick(Window *w)
957{
958 DropDownList list;
959 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
960 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
962}
963
974
975/* --- Airport button menu --- */
976
977static CallBackFunction ToolbarBuildAirClick(Window *w)
978{
979 DropDownList list;
980 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
981 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
983}
984
995
996/* --- Forest button menu --- */
997
998static CallBackFunction ToolbarForestClick(Window *w)
999{
1000 DropDownList list;
1001 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
1002 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
1003 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
1004 if (ObjectClass::GetUIClassCount() != 0) {
1005 list.push_back(MakeDropDownListIconItem(SPR_IMG_TRANSMITTER, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_OBJECT, 3));
1006 }
1007 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
1009}
1010
1018{
1019 switch (index) {
1020 case 0: ShowTerraformToolbar(); break;
1021 case 1: ShowBuildTreesToolbar(); break;
1022 case 2: return SelectSignTool();
1023 case 3: ShowBuildObjectPicker(); break;
1024 }
1026}
1027
1028/* --- Music button menu --- */
1029
1030static CallBackFunction ToolbarMusicClick(Window *w)
1031{
1032 PopupMainToolbarMenu(w, _game_mode == GameMode::Editor ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1034}
1035
1042{
1043 ShowMusicWindow();
1045}
1046
1047/* --- Newspaper button menu --- */
1048
1049static CallBackFunction ToolbarNewspaperClick(Window *w)
1050{
1051 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1053}
1054
1062{
1063 switch (index) {
1064 case 0: ShowLastNewsMessage(); break;
1065 case 1: ShowMessageHistory(); break;
1066 case 2: DeleteAllMessages(); break;
1067 }
1069}
1070
1071/* --- Help button menu --- */
1072
1073static CallBackFunction PlaceLandBlockInfo()
1074{
1078 } else {
1079 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WindowClass::MainToolbar, 0);
1081 }
1082}
1083
1084static CallBackFunction ToolbarHelpClick(Window *w)
1085{
1086 if (_settings_client.gui.newgrf_developer_tools) {
1087 PopupMainToolbarMenu(w, _game_mode == GameMode::Editor ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1088 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1089 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1090 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1091 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1092 } else {
1093 PopupMainToolbarMenu(w, _game_mode == GameMode::Editor ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1094 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1095 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1096 }
1098}
1099
1108{
1109 extern bool _draw_bounding_boxes;
1110 /* Always allow to toggle them off */
1111 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1112 _draw_bounding_boxes = !_draw_bounding_boxes;
1114 }
1115}
1116
1125{
1126 extern bool _draw_dirty_blocks;
1127 /* Always allow to toggle them off */
1128 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1129 _draw_dirty_blocks = !_draw_dirty_blocks;
1131 }
1132}
1133
1139{
1140 extern bool _draw_widget_outlines;
1141 /* Always allow to toggle them off */
1142 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1143 _draw_widget_outlines = !_draw_widget_outlines;
1145 }
1146}
1147
1153{
1154 _settings_game.game_creation.starting_year = Clamp(year, CalendarTime::MIN_YEAR, CalendarTime::MAX_YEAR);
1155 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1156 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1157
1158 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1159 TimerGameCalendar::SetDate(new_calendar_date, 0);
1160
1161 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1162 LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date);
1163 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1164
1165 /* Only change the date after changing cached values above. */
1166 TimerGameEconomy::SetDate(new_economy_date, 0);
1167}
1168
1175{
1176 switch (index) {
1177 case 0: return PlaceLandBlockInfo();
1178 case 1: ShowHelpWindow(); break;
1179 case 2: IConsoleSwitch(); break;
1180 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1181 case 4: ShowScreenshotWindow(); break;
1182 case 5: ShowFramerateWindow(); break;
1183 case 6: ShowAboutWindow(); break;
1184 case 7: ShowSpriteAlignerWindow(); break;
1185 case 8: ToggleBoundingBoxes(); break;
1186 case 9: ToggleDirtyBlocks(); break;
1187 case 10: ToggleWidgetOutlines(); break;
1188 }
1190}
1191
1192/* --- Switch toolbar button --- */
1193
1194static CallBackFunction ToolbarSwitchClick(Window *w)
1195{
1196 if (_toolbar_mode != ToolbarMode::Lower) {
1197 _toolbar_mode = ToolbarMode::Lower;
1198 } else {
1199 _toolbar_mode = ToolbarMode::Upper;
1200 }
1201
1202 w->ReInit();
1204 SndClickBeep();
1206}
1207
1208/* --- Scenario editor specific handlers. */
1209
1215{
1216 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1218}
1219
1220static CallBackFunction ToolbarScenDateBackward(Window *w)
1221{
1222 /* don't allow too fast scrolling */
1223 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1225 w->SetDirty();
1226
1227 SetStartingYear(_settings_game.game_creation.starting_year - 1);
1228 }
1229 _left_button_clicked = false;
1231}
1232
1233static CallBackFunction ToolbarScenDateForward(Window *w)
1234{
1235 /* don't allow too fast scrolling */
1236 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1238 w->SetDirty();
1239
1240 SetStartingYear(_settings_game.game_creation.starting_year + 1);
1241 }
1242 _left_button_clicked = false;
1244}
1245
1246static CallBackFunction ToolbarScenGenLand(Window *w)
1247{
1249
1252}
1253
1254static CallBackFunction ToolbarScenGenTownClick(Window *w)
1255{
1256 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1258}
1259
1260static CallBackFunction ToolbarScenGenTown(int index)
1261{
1262 switch (index) {
1263 case 0: ShowFoundTownWindow(); break;
1264 case 1: ShowBuildHousePicker(nullptr); break;
1265 }
1267}
1268
1269static CallBackFunction ToolbarScenGenIndustry(Window *w)
1270{
1272 ShowBuildIndustryWindow();
1274}
1275
1276static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1277{
1280}
1281
1294
1295static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1296{
1299}
1300
1313
1314static CallBackFunction ToolbarScenBuildDocks(Window *w)
1315{
1319}
1320
1321static CallBackFunction ToolbarScenPlantTrees(Window *w)
1322{
1324 ShowBuildTreesToolbar();
1326}
1327
1328static CallBackFunction ToolbarScenPlaceSign(Window *w)
1329{
1331 return SelectSignTool();
1332}
1333
1334static CallBackFunction ToolbarBtn_NULL(Window *)
1335{
1337}
1338
1339typedef CallBackFunction MenuClickedProc(int index);
1340
1341static MenuClickedProc * const _menu_clicked_procs[] = {
1342 nullptr, // 0
1343 nullptr, // 1
1344 MenuClickSettings, // 2
1345 MenuClickSaveLoad, // 3
1346 MenuClickMap, // 4
1347 MenuClickTown, // 5
1348 MenuClickSubsidies, // 6
1349 MenuClickStations, // 7
1350 MenuClickFinances, // 8
1351 MenuClickCompany, // 9
1352 MenuClickStory, // 10
1353 MenuClickGoal, // 11
1356 MenuClickIndustry, // 14
1357 MenuClickShowTrains, // 15
1358 MenuClickShowRoad, // 16
1359 MenuClickShowShips, // 17
1360 MenuClickShowAir, // 18
1361 MenuClickMap, // 19
1362 nullptr, // 20
1363 MenuClickBuildRail, // 21
1364 MenuClickBuildRoad, // 22
1365 MenuClickBuildTram, // 23
1366 MenuClickBuildWater, // 24
1367 MenuClickBuildAir, // 25
1368 MenuClickForest, // 26
1370 MenuClickNewspaper, // 28
1371 MenuClickHelp, // 29
1372};
1373
1375class NWidgetToolbarContainer : public NWidgetContainer {
1376protected:
1377 uint spacers = 0;
1378
1379public:
1380 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
1381 {
1382 }
1383
1390 {
1391 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1392 }
1393
1394 void SetupSmallestSize(Window *w) override
1395 {
1396 this->smallest_x = 0; // Biggest child
1397 this->smallest_y = 0; // Biggest child
1398 this->fill_x = 1;
1399 this->fill_y = 0;
1400 this->resize_x = 1; // We only resize in this direction
1401 this->resize_y = 0; // We never resize in this direction
1402 this->spacers = 0;
1403
1404 uint nbuttons = 0;
1405 /* First initialise some variables... */
1406 for (const auto &child_wid : this->children) {
1407 child_wid->SetupSmallestSize(w);
1408 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1409 if (this->IsButton(child_wid->type)) {
1410 nbuttons++;
1411 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1412 } else if (child_wid->type == NWID_SPACER) {
1413 this->spacers++;
1414 }
1415 }
1416
1417 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1418 for (const auto &child_wid : this->children) {
1419 child_wid->current_y = this->smallest_y;
1420 if (!this->IsButton(child_wid->type)) {
1421 child_wid->current_x = child_wid->smallest_x;
1422 }
1423 }
1424
1425 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1426 * displayed there will be no spacers anyway. */
1427 --nbuttons;
1428
1429 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1430 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1431 }
1432
1433 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1434 {
1435 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1436
1437 this->pos_x = x;
1438 this->pos_y = y;
1439 this->current_x = given_width;
1440 this->current_y = given_height;
1441
1442 /* Figure out what are the visible buttons */
1443 uint arrangeable_count, button_count, spacer_count;
1444 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_count, button_count, spacer_count);
1445
1446 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1447 std::map<WidgetID, uint> lookup;
1448 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1449 NWidgetBase *nwid = it->get();
1450 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1451 if (nwid->type == NWID_SPACER) continue;
1452 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1453 assert(nwc != nullptr);
1454 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1455 }
1456
1457 /* Now assign the widgets to their rightful place */
1458 uint position = 0; // Place to put next child relative to origin of the container.
1459 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1460 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1461 uint spacer_i = 0;
1462 uint button_i = 0;
1463
1464 /* Index into the arrangement indices. */
1465 const WidgetID *slotp = rtl ? &arrangement[arrangeable_count - 1] : arrangement;
1466 for (uint i = 0; i < arrangeable_count; i++) {
1467 uint slot = lookup[*slotp];
1468 auto &child_wid = this->children[slot];
1469 /* If we have space to give to the spacers, do that. */
1470 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1471 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1472 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1473 uint add = spacer_space / (spacer_count - spacer_i);
1474 position += add;
1475 spacer_space -= add;
1476 spacer_i++;
1477 }
1478 }
1479
1480 /* Buttons can be scaled, the others not. */
1481 if (this->IsButton(child_wid->type)) {
1482 child_wid->current_x = button_space / (button_count - button_i);
1483 button_space -= child_wid->current_x;
1484 button_i++;
1485 } else {
1486 child_wid->current_x = child_wid->smallest_x;
1487 }
1488 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1489 position += child_wid->current_x;
1490
1491 if (rtl) {
1492 slotp--;
1493 } else {
1494 slotp++;
1495 }
1496 }
1497 }
1498
1499 void Draw(const Window *w) override
1500 {
1501 /* Draw brown-red toolbar bg. */
1502 const Rect r = this->GetCurrentRect();
1505
1506 this->NWidgetContainer::Draw(w);
1507 }
1508
1517 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1518};
1519
1521class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
1522 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1523 {
1524 static const uint SMALLEST_ARRANGEMENT = 14;
1525 static const uint BIGGEST_ARRANGEMENT = 20;
1526
1527 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1528 * The total number of buttons should be equal to arrangeable_count * 2.
1529 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_count * 2) like a
1530 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1531 * enough space.
1532 */
1533 static const WidgetID arrange14[] = {
1545 WID_TN_AIR,
1548 /* lower toolbar */
1563 };
1564 static const WidgetID arrange15[] = {
1575 WID_TN_AIR,
1580 /* lower toolbar */
1596 };
1597 static const WidgetID arrange16[] = {
1609 WID_TN_AIR,
1614 /* lower toolbar */
1631 };
1632 static const WidgetID arrange17[] = {
1645 WID_TN_AIR,
1650 /* lower toolbar */
1668 };
1669 static const WidgetID arrange18[] = {
1683 WID_TN_AIR,
1688 /* lower toolbar */
1707 };
1708 static const WidgetID arrange19[] = {
1722 WID_TN_AIR,
1728 /* lower toolbar */
1742 WID_TN_AIR,
1748 };
1749 static const WidgetID arrange20[] = {
1763 WID_TN_AIR,
1770 /* lower toolbar */
1784 WID_TN_AIR,
1791 };
1792 static const WidgetID arrange_all[] = {
1818 WID_TN_AIR,
1823 };
1824
1825 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1826 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1827 if (full_buttons > BIGGEST_ARRANGEMENT) {
1828 _toolbar_mode = ToolbarMode::Normal;
1829 button_count = arrangeable_count = lengthof(arrange_all);
1830 spacer_count = this->spacers;
1831 return arrange_all;
1832 }
1833
1834 /* Introduce the split toolbar */
1835 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1836
1837 button_count = arrangeable_count = full_buttons;
1838 spacer_count = this->spacers;
1839 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == ToolbarMode::Lower) ? full_buttons : 0);
1840 }
1841};
1842
1844class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
1845 std::array<uint, 2> panel_widths{};
1846
1847 void SetupSmallestSize(Window *w) override
1848 {
1850
1851 /* Find the size of panel_widths */
1852 auto it = this->panel_widths.begin();
1853 for (const auto &child_wid : this->children) {
1854 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1855
1856 assert(it != this->panel_widths.end());
1857 *it = child_wid->current_x;
1858 _toolbar_width += child_wid->current_x;
1859 ++it;
1860 }
1861 }
1862
1863 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1864 {
1865 static const WidgetID arrange_all[] = {
1885 };
1886 static const WidgetID arrange_nopanel[] = {
1905 };
1906 static const WidgetID arrange_switch[] = {
1918 /* lower toolbar */
1930 };
1931
1932 /* If we can place all buttons *and* the panels, show them. */
1933 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1934 if (width >= min_full_width) {
1935 width -= this->panel_widths[0] + this->panel_widths[1];
1936 arrangeable_count = lengthof(arrange_all);
1937 button_count = arrangeable_count - 2;
1938 spacer_count = this->spacers;
1939 return arrange_all;
1940 }
1941
1942 /* 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 */
1943 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1944 if (width > min_small_width) {
1945 width -= this->panel_widths[1];
1946 arrangeable_count = lengthof(arrange_nopanel);
1947 button_count = arrangeable_count - 1;
1948 spacer_count = this->spacers - 1;
1949 return arrange_nopanel;
1950 }
1951
1952 /* Split toolbar */
1953 width -= this->panel_widths[1];
1954 arrangeable_count = lengthof(arrange_switch) / 2;
1955 button_count = arrangeable_count - 1;
1956 spacer_count = 0;
1957 return arrange_switch + ((_toolbar_mode == ToolbarMode::Lower) ? arrangeable_count : 0);
1958 }
1959};
1960
1961/* --- Toolbar handling for the 'normal' case */
1962
1969
1970static ToolbarButtonProc * const _toolbar_button_procs[] = {
1971 ToolbarPauseClick,
1975 ToolbarMapClick,
1976 ToolbarTownClick,
1977 ToolbarSubsidiesClick,
1978 ToolbarStationsClick,
1979 ToolbarFinancesClick,
1980 ToolbarCompaniesClick,
1981 ToolbarStoryClick,
1982 ToolbarGoalClick,
1983 ToolbarGraphsClick,
1984 ToolbarLeagueClick,
1985 ToolbarIndustryClick,
1986 ToolbarTrainClick,
1987 ToolbarRoadClick,
1988 ToolbarShipClick,
1989 ToolbarAirClick,
1990 ToolbarZoomInClick,
1991 ToolbarZoomOutClick,
1992 ToolbarBuildRailClick,
1993 ToolbarBuildRoadClick,
1994 ToolbarBuildTramClick,
1995 ToolbarBuildWaterClick,
1996 ToolbarBuildAirClick,
1997 ToolbarForestClick,
1998 ToolbarMusicClick,
1999 ToolbarNewspaperClick,
2000 ToolbarHelpClick,
2001 ToolbarSwitchClick,
2002};
2003
2005struct MainToolbarWindow : Window {
2006 MainToolbarWindow(WindowDesc &desc) : Window(desc)
2007 {
2008 this->InitNested(0);
2009
2011 this->flags.Reset(WindowFlag::WhiteBorder);
2012 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2013 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2014 PositionMainToolbar(this);
2016 }
2017
2018 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2019 {
2020 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2021 }
2022
2023 void OnPaint() override
2024 {
2025 /* If spectator, disable all construction buttons
2026 * ie : Build road, rail, ships, airports and landscaping
2027 * Since enabled state is the default, just disable when needed */
2029 /* disable company list drop downs, if there are no companies */
2031
2034
2035 this->DrawWidgets();
2036 }
2037
2038 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2039 {
2040 if (_game_mode != GameMode::Menu && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2041 }
2042
2043 void OnDropdownSelect(WidgetID widget, int index, int) override
2044 {
2045 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2047 }
2048
2049 EventState OnHotkey(int hotkey) override
2050 {
2052 switch (hotkey) {
2053 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2054 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2055 case MTHK_SETTINGS: ShowGameOptions(); break;
2056 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2058 case MTHK_SMALLMAP: ShowSmallMap(); break;
2059 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2060 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2061 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2062 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2063 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2064 case MTHK_STORY: ShowStoryBook(_local_company); break;
2065 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2066 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2067 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2068 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2069 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VehicleType::Train); break;
2070 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VehicleType::Road); break;
2071 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VehicleType::Ship); break;
2072 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VehicleType::Aircraft); break;
2073 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2074 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2075 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2076 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2077 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2078 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2079 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2080 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2081 case MTHK_MUSIC: ShowMusicWindow(); break;
2082 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2083 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2084 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2085 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2086 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2087 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2088 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2089 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2090 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2091 case MTHK_SIGN_LIST: ShowSignList(); break;
2092 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2093 default: return EventState::NotHandled;
2094 }
2096 return EventState::Handled;
2097 }
2098
2099 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2100 {
2101 switch (_last_started_action) {
2103 PlaceProc_Sign(tile);
2104 break;
2105
2107 ShowLandInfo(tile);
2108 break;
2109
2110 default: NOT_REACHED();
2111 }
2112 }
2113
2118
2120 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2121 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2124 }
2125
2126 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2129 }
2130 }};
2131
2137 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2138 {
2139 if (!gui_scope) return;
2141 }
2142
2143 static inline HotkeyList hotkeys{"maintoolbar", {
2144 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2145 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2146 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2147 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2148 Hotkey(0, "load_game", MTHK_LOADGAME),
2149 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2150 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2151 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2152 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2153 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2154 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2155 Hotkey(0, "story_book", MTHK_STORY),
2156 Hotkey(0, "goal_list", MTHK_GOAL),
2157 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2158 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2159 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2160 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2161 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2162 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2163 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2164 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2165 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2166 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2167 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2168 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2169 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2170 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2171 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2172 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2173 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2174 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2175 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2176 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2177 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2178 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2179 Hotkey('L', "terraform", MTHK_TERRAFORM),
2180 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2181 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2182 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2183 Hotkey(0, "land_info", MTHK_LANDINFO),
2184 }};
2185};
2186
2188static constexpr std::tuple<WidgetID, WidgetType, SpriteID> _toolbar_button_sprites[] = {
2189 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2190 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2191 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2192 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2193 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2194 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2195 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2196 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2197 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2198 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2199 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2200 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2201 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2202 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2203 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2204 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2205 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2206 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2207 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2208 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2209 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2210 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2211 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2212 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2213 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2214 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2215 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2216 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2217 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2218 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2219 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2220};
2221
2227{
2228 Dimension d{};
2229 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2230 if (!SpriteExists(sprite)) continue;
2231 d = maxdim(d, GetSquareScaledSpriteSize(sprite));
2232 }
2233 return d;
2234}
2235
2240static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2241{
2242 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2243 for (const auto &[widget, tp, sprite] : _toolbar_button_sprites) {
2244 switch (widget) {
2245 case WID_TN_SMALL_MAP:
2246 case WID_TN_FINANCES:
2248 case WID_TN_ZOOM_IN:
2250 case WID_TN_MUSIC_SOUND:
2251 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2252 break;
2253 }
2254 auto leaf = std::make_unique<NWidgetLeaf>(tp, Colours::Grey, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2255 leaf->SetToolbarMinimalSize(1);
2256 hor->Add(std::move(leaf));
2257 }
2258
2259 return hor;
2260}
2261
2262static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2264};
2265
2268 WindowPosition::Manual, {}, 0, 0,
2269 WindowClass::MainToolbar, WindowClass::None,
2271 _nested_toolbar_normal_widgets,
2272 &MainToolbarWindow::hotkeys
2273);
2274
2275
2276/* --- Toolbar handling for the scenario editor */
2277
2278static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2279 nullptr, // 0
2280 nullptr, // 1
2281 MenuClickSettings, // 2
2282 MenuClickSaveLoad, // 3
2283 nullptr, // 4
2284 nullptr, // 5
2285 nullptr, // 6
2286 nullptr, // 7
2287 MenuClickMap, // 8
2288 nullptr, // 9
2289 nullptr, // 10
2290 nullptr, // 11
2291 ToolbarScenGenTown, // 12
2292 nullptr, // 13
2295 nullptr, // 16
2296 nullptr, // 17
2297 nullptr, // 18
2298 nullptr, // 19
2300 MenuClickHelp, // 21
2301 nullptr, // 22
2302};
2303
2304static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2305 ToolbarPauseClick,
2309 ToolbarBtn_NULL,
2311 ToolbarScenDateBackward,
2312 ToolbarScenDateForward,
2313 ToolbarScenMapTownDir,
2314 ToolbarZoomInClick,
2315 ToolbarZoomOutClick,
2316 ToolbarScenGenLand,
2317 ToolbarScenGenTownClick,
2318 ToolbarScenGenIndustry,
2319 ToolbarScenBuildRoadClick,
2320 ToolbarScenBuildTramClick,
2321 ToolbarScenBuildDocks,
2322 ToolbarScenPlantTrees,
2323 ToolbarScenPlaceSign,
2324 ToolbarBtn_NULL,
2325 ToolbarMusicClick,
2326 ToolbarHelpClick,
2327 ToolbarSwitchClick,
2328};
2329
2360
2361struct ScenarioEditorToolbarWindow : Window {
2362 ScenarioEditorToolbarWindow(WindowDesc &desc) : Window(desc)
2363 {
2364 this->InitNested(0);
2365
2367 this->flags.Reset(WindowFlag::WhiteBorder);
2368 PositionMainToolbar(this);
2370 }
2371
2372 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2373 {
2374 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2375 }
2376
2386
2387 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2388 {
2389 switch (widget) {
2390 case WID_TE_DATE:
2391 return GetString(STR_JUST_DATE_LONG, TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
2392
2393 default:
2394 return this->Window::GetWidgetString(widget, stringid);
2395 }
2396 }
2397
2398 void DrawWidget(const Rect &r, WidgetID widget) const override
2399 {
2400 switch (widget) {
2401 case WID_TE_SPACER: {
2402 int height = r.Height();
2404 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FontSize::Normal), STR_SCENEDIT_TOOLBAR_OPENTTD, TextColour::FromString, SA_HOR_CENTER);
2405 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TextColour::FromString, SA_HOR_CENTER);
2406 } else {
2407 DrawString(r.left, r.right, (height - GetCharacterHeight(FontSize::Normal)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TextColour::FromString, SA_HOR_CENTER);
2408 }
2409 break;
2410 }
2411 }
2412 }
2413
2414 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2415 {
2416 switch (widget) {
2417 case WID_TE_SPACER:
2418 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2419 break;
2420
2421 case WID_TE_DATE:
2423 break;
2424 }
2425 }
2426
2427 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2428 {
2429 if (_game_mode == GameMode::Menu) return;
2430 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2432 }
2433
2434 void OnDropdownSelect(WidgetID widget, int index, int) override
2435 {
2436 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2438 SndClickBeep();
2439 }
2440
2441 EventState OnHotkey(int hotkey) override
2442 {
2443 if (IsSpecialHotkey(hotkey)) {
2445 switch (MainToolbarEditorHotkeys(hotkey)) {
2448 case MainToolbarEditorHotkeys::Music: ShowMusicWindow(); break;
2449 case MainToolbarEditorHotkeys::LandInfo: cbf = PlaceLandBlockInfo(); break;
2457 case MainToolbarEditorHotkeys::GenerateTown: ShowFoundTownWindow(); break;
2460 default: return EventState::NotHandled;
2461 }
2463 } else {
2464 this->OnClick({}, hotkey, 0);
2465 }
2466 return EventState::Handled;
2467 }
2468
2469 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2470 {
2471 switch (_last_started_action) {
2473 PlaceProc_Sign(tile);
2474 break;
2475
2477 ShowLandInfo(tile);
2478 break;
2479
2480 default: NOT_REACHED();
2481 }
2482 }
2483
2488
2495
2497 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2498 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2500 this->SetDirty();
2501 }
2502
2503 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2505 this->SetDirty();
2506 }
2507 }};
2508
2514 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2515 {
2516 if (!gui_scope) return;
2518 }
2519
2520 void OnQueryTextFinished(std::optional<std::string> str) override
2521 {
2522 /* Was 'cancel' pressed? */
2523 if (!str.has_value()) return;
2524
2526 if (!str->empty()) {
2527 auto val = ParseInteger(*str, 10, true);
2528 if (!val.has_value()) return;
2529 value = static_cast<TimerGameCalendar::Year>(*val);
2530 } else {
2531 /* An empty string means revert to the default */
2533 }
2534 SetStartingYear(value);
2535
2536 this->SetDirty();
2537 }
2538
2539 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2540 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MainToolbarEditorHotkeys::Pause),
2541 Hotkey(0, "fastforward", MainToolbarEditorHotkeys::FastForward),
2542 Hotkey(WKC_F2, "settings", MainToolbarEditorHotkeys::Settings),
2543 Hotkey(WKC_F3, "saveload", MainToolbarEditorHotkeys::SaveGame),
2544 Hotkey(WKC_F4, "gen_land", MainToolbarEditorHotkeys::GenerateLand),
2545 Hotkey(WKC_F5, "gen_town", MainToolbarEditorHotkeys::GenerateTown),
2546 Hotkey(WKC_F6, "gen_industry", MainToolbarEditorHotkeys::GenerateIndustry),
2547 Hotkey(WKC_F7, "build_road", MainToolbarEditorHotkeys::BuildRoad),
2548 Hotkey(0, "build_tram", MainToolbarEditorHotkeys::BuildTram),
2549 Hotkey(WKC_F8, "build_docks", MainToolbarEditorHotkeys::BuildWater),
2550 Hotkey(WKC_F9, "build_trees", MainToolbarEditorHotkeys::BuildTrees),
2551 Hotkey(WKC_F10, "build_sign", MainToolbarEditorHotkeys::Sign),
2552 Hotkey(WKC_F11, "music", MainToolbarEditorHotkeys::Music),
2553 Hotkey(WKC_F12, "land_info", MainToolbarEditorHotkeys::LandInfo),
2554 Hotkey(WKC_CTRL | 'S', "small_screenshot", MainToolbarEditorHotkeys::SmallScreenshot),
2555 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MainToolbarEditorHotkeys::ZoomedInScreenshot),
2556 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MainToolbarEditorHotkeys::DefaultZoomScreenshot),
2557 Hotkey(0, "giant_screenshot", MainToolbarEditorHotkeys::GiantScreenshot),
2558 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MainToolbarEditorHotkeys::ZoomIn),
2559 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MainToolbarEditorHotkeys::ZoomOut),
2560 Hotkey('L', "terraform", MainToolbarEditorHotkeys::Terraform),
2561 Hotkey('M', "smallmap", MainToolbarEditorHotkeys::SmallMap),
2562 Hotkey('V', "extra_viewport", MainToolbarEditorHotkeys::ExtraViewport),
2563 }};
2564};
2565
2566static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2567 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2568 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2569 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2570 NWidget(WWT_IMGBTN_2, Colours::Grey, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2576 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),
2578 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),
2579 EndContainer(),
2580 EndContainer(),
2582 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2584 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2585 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2587 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2588 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2589 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2590 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2591 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2592 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2593 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2594 NWidget(WWT_PUSHIMGBTN, Colours::Grey, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2596 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2597 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2598 NWidget(WWT_IMGBTN, Colours::Grey, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2599};
2600
2601static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2602{
2603 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2604}
2605
2606static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2607 NWidgetFunction(MakeScenarioToolbar),
2608};
2609
2612 WindowPosition::Manual, {}, 0, 0,
2613 WindowClass::MainToolbar, WindowClass::None,
2615 _nested_toolb_scen_widgets,
2616 &ScenarioEditorToolbarWindow::hotkeys
2617);
2618
2621{
2622 if (_game_mode == GameMode::Editor) {
2624 } else {
2626 }
2627}
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:1337
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.
EnumBitSet< DropDownOption, uint8_t > DropDownOptions
Bitset of DropDownOption elements.
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:437
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:446
@ Invalid
Invalid marker.
Definition gfx_type.h:303
@ Grey
Grey.
Definition gfx_type.h:300
@ White
White colour.
Definition gfx_type.h:331
@ FromString
Marker for telling to use the colour from the string.
Definition gfx_type.h:318
@ Checker
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:394
@ 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:312
Goal GUI functions.
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:3413
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:972
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:185
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
@ 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:172
Data structure for an opened window.
Definition window_gui.h:273
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:984
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:562
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:306
std::unique_ptr< ViewportData > viewport
Pointer to viewport data, if present.
Definition window_gui.h:318
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:510
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:515
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:491
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:410
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:526
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:441
virtual void FindWindowPlacementAndResize(int def_width, int def_height, bool allow_resize)
Resize window towards the default size.
Definition window.cpp:1482
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1838
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:601
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1828
WindowFlags flags
Window flags.
Definition window_gui.h:300
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:381
int height
Height of the window (number of pixels down in y direction).
Definition window_gui.h:312
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:450
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
Stuff related to the text buffer GUI.
@ EnableDefault
enable the 'Default' button ("\0" is returned)
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:109
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.
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:1187
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3487
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3390
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:3333
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:158
@ NoFocus
This window won't get focus/make any other window lose focus when click.
Definition window_gui.h:157
@ WhiteBorder
Window white border counter bit mask.
Definition window_gui.h:232
@ Timeout
Window timeout counter.
Definition window_gui.h:224
@ Manual
Manually align the window (so no automatic location finding).
Definition window_gui.h:145
int WidgetID
Widget ID.
Definition window_type.h:21
EventState
State of handling an event.
@ Handled
The passed event is handled.
@ NotHandled
The passed event is not handled.