OpenTTD Source 20260311-master-g511d3794ce
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"
11#include "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
18#include "house.h"
19#include "vehicle_gui.h"
20#include "rail_gui.h"
21#include "road.h"
22#include "road_gui.h"
23#include "vehicle_func.h"
24#include "sound_func.h"
25#include "terraform_gui.h"
26#include "strings_func.h"
27#include "company_func.h"
28#include "company_gui.h"
29#include "vehicle_base.h"
30#include "cheat_func.h"
31#include "transparency_gui.h"
32#include "screenshot.h"
33#include "signs_func.h"
34#include "fios.h"
35#include "console_gui.h"
36#include "news_gui.h"
37#include "ai/ai_gui.hpp"
38#include "game/game_gui.hpp"
39#include "script/script_gui.h"
40#include "tilehighlight_func.h"
41#include "smallmap_gui.h"
42#include "graph_gui.h"
43#include "textbuf_gui.h"
45#include "newgrf_debug.h"
46#include "hotkeys.h"
47#include "engine_base.h"
48#include "highscore.h"
49#include "game/game.hpp"
50#include "goal_base.h"
51#include "story_base.h"
52#include "toolbar_gui.h"
53#include "framerate_type.h"
54#include "screenshot_gui.h"
55#include "misc_cmd.h"
56#include "league_gui.h"
57#include "league_base.h"
58#include "timer/timer.h"
59#include "timer/timer_window.h"
61#include "help_gui.h"
63
65
66#include "network/network.h"
67#include "network/network_gui.h"
69
70#include "table/strings.h"
71
73
74#include "safeguards.h"
75
76
79
83
85enum class ToolbarMode : uint8_t {
89};
90
97
99
103class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
104public:
105 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, GetCompanyPalette(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, GetString(STR_COMPANY_NAME_COMPANY_NUM, company, company), company.base(), false, shaded)
106 {
107 }
108};
109
115static DropDownOptions GetToolbarDropDownOptions(DropDownOptions options = {})
116{
117 if (_settings_client.gui.toolbar_dropdown_autoselect) options.Set(DropDownOption::InstantClose).Reset(DropDownOption::Filterable);
118 return options;
119}
120
128static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
129{
130 ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions());
131}
132
139static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
140{
141 DropDownList list;
142 int i = 0;
143 for (StringID string : strings) {
144 if (string == STR_NULL) {
145 list.push_back(MakeDropDownListDividerItem());
146 } else {
147 list.push_back(MakeDropDownListStringItem(string, i));
148 i++;
149 }
150 }
151 PopupMainToolbarMenu(w, widget, std::move(list), 0);
152}
153
154/* Special values used in the dropdowns related to companies.
155 * They cannot interfere with valid IDs for companies. */
156static const int CTMN_CLIENT_LIST = MAX_COMPANIES;
157static const int CTMN_SPECTATE = COMPANY_SPECTATOR.base();
158static const int CTMN_SPECTATOR = CompanyID::Invalid().base();
159
166static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
167{
168 DropDownList list;
169
170 switch (widget) {
171 case WID_TN_COMPANIES:
172 if (!_networking) break;
173
174 /* Add the client list button for the companies menu */
175 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
176
178 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
179 }
180 break;
181 case WID_TN_STORY:
182 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
183 break;
184
185 case WID_TN_GOAL:
186 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
187 break;
188 }
189
190 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
191 if (!Company::IsValidID(c)) continue;
192 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
193 }
194
196}
197
198static ToolbarMode _toolbar_mode;
199
200static CallBackFunction SelectSignTool()
201{
205 } else {
206 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
208 }
209}
210
211/* --- Pausing --- */
212
213static CallBackFunction ToolbarPauseClick(Window *)
214{
215 if (_networking && !_network_server) return CallBackFunction::None; // only server can pause the game
216
217 if (Command<Commands::Pause>::Post(PauseMode::Normal, _pause_mode.None())) {
219 }
221}
222
229{
230 if (_networking) return CallBackFunction::None; // no fast forward in network game
231
232 ChangeGameSpeed(_game_speed == 100);
233
234 SndClickBeep();
236}
237
264
272{
273 DropDownList list;
274 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OptionMenuEntries::GameOptions));
275 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
276 * the settings once they join but never update it. As such don't show the window at all
277 * to network clients. */
279 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OptionMenuEntries::AISettings));
280 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OptionMenuEntries::GameScriptSettings));
281 }
282 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OptionMenuEntries::NewGRFSettings));
283 if (_game_mode != GM_EDITOR && !_networking) {
284 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OptionMenuEntries::SandboxOptions));
285 }
286 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OptionMenuEntries::Transparencies));
287 list.push_back(MakeDropDownListDividerItem());
288 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames));
289 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames));
290 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OptionMenuEntries::ShowTrainStationNames, false, false, 1));
291 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OptionMenuEntries::ShowLorryStationNames, false, false, 1));
292 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OptionMenuEntries::ShowBusStationNames, false, false, 1));
293 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OptionMenuEntries::ShowDockNames, false, false, 1));
294 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OptionMenuEntries::ShowAirportNames, false, false, 1));
295 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OptionMenuEntries::ShowGhostStationNames, false, false, 1));
296 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames));
297 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns));
299 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation));
300 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails));
301 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OptionMenuEntries::TransparentBuildings));
302 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OptionMenuEntries::TransparentStationSigns));
303
304 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
306}
307
315{
316 switch (OptionMenuEntries(index)) {
320 case OptionMenuEntries::NewGRFSettings: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CallBackFunction::None;
323
337 break;
342 }
345}
346
358
368
376{
377 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
378 STR_NULL, STR_FILE_MENU_EXIT});
380}
381
389{
390 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
391 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
392 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
394}
395
423
424/* --- Map button menu --- */
425
427enum class MapMenuEntries : uint8_t {
432 ShowTownDirectory,
433 ShowIndustryDirectory,
434};
435
436static CallBackFunction ToolbarMapClick(Window *w)
437{
438 DropDownList list;
439 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
440 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
441 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MapMenuEntries::ShowLinkGraph));
442 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
443 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
445}
446
447static CallBackFunction ToolbarScenMapTownDir(Window *w)
448{
449 DropDownList list;
450 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MapMenuEntries::ShowSmallMap));
451 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MapMenuEntries::ShowExtraViewport));
452 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MapMenuEntries::ShowSignList));
453 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MapMenuEntries::ShowTownDirectory));
454 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MapMenuEntries::ShowIndustryDirectory));
455 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
457}
458
477
478/* --- Town button menu --- */
479
486
487static CallBackFunction ToolbarTownClick(Window *w)
488{
489 DropDownList list;
490 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TownMenuEntries::ShowDirectory));
491 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TownMenuEntries::ShowFoundTown));
492 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TownMenuEntries::ShowPlaceHouses));
493
494 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
495
497}
498
506{
507 switch (TownMenuEntries(index)) {
509 case TownMenuEntries::ShowFoundTown: // Setting could be changed when the dropdown was open
510 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
511 break;
512 case TownMenuEntries::ShowPlaceHouses: // Setting could be changed when the dropdown was open
513 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) ShowBuildHousePicker(nullptr);
514 break;
515 }
517}
518
519/* --- Subidies button menu --- */
520
521static CallBackFunction ToolbarSubsidiesClick(Window *w)
522{
523 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
525}
526
533{
534 ShowSubsidiesList();
536}
537
538/* --- Stations button menu --- */
539
540static CallBackFunction ToolbarStationsClick(Window *w)
541{
544}
545
553{
554 ShowCompanyStations((CompanyID)index);
556}
557
558/* --- Finances button menu --- */
559
560static CallBackFunction ToolbarFinancesClick(Window *w)
561{
564}
565
573{
574 ShowCompanyFinances((CompanyID)index);
576}
577
578/* --- Company's button menu --- */
579
580static CallBackFunction ToolbarCompaniesClick(Window *w)
581{
584}
585
593{
594 if (_networking) {
595 switch (index) {
596 case CTMN_CLIENT_LIST:
597 ShowClientList();
599
600 case CTMN_SPECTATE:
601 if (_network_server) {
604 } else {
606 }
608 }
609 }
610 ShowCompany((CompanyID)index);
612}
613
614/* --- Story button menu --- */
615
616static CallBackFunction ToolbarStoryClick(Window *w)
617{
620}
621
629{
630 ShowStoryBook(CompanyID(index));
632}
633
634/* --- Goal button menu --- */
635
636static CallBackFunction ToolbarGoalClick(Window *w)
637{
640}
641
649{
650 ShowGoalsList(CompanyID(index));
652}
653
654/* --- Graphs and League Table button menu --- */
655
660static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
661static const int GRMN_INCOME_GRAPH = -2;
662static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
663static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
664static const int GRMN_COMPANY_VALUE_GRAPH = -5;
665static const int GRMN_CARGO_PAYMENT_RATES = -6;
666static const int LTMN_PERFORMANCE_LEAGUE = -7;
667static const int LTMN_PERFORMANCE_RATING = -8;
668static const int LTMN_HIGHSCORE = -9;
669
670static void AddDropDownLeagueTableOptions(DropDownList &list)
671{
672 if (LeagueTable::GetNumItems() > 0) {
673 for (LeagueTable *lt : LeagueTable::Iterate()) {
674 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
675 }
676 } else {
677 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
678 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
679 if (!_networking) {
680 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
681 }
682 }
683}
684
685static CallBackFunction ToolbarGraphsClick(Window *w)
686{
687 DropDownList list;
688
689 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
690 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
691 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
692 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
693 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
694 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
695
696 if (_toolbar_mode != ToolbarMode::Normal) AddDropDownLeagueTableOptions(list);
697
700}
701
702static CallBackFunction ToolbarLeagueClick(Window *w)
703{
704 DropDownList list;
705
706 AddDropDownLeagueTableOptions(list);
707
708 int selected = list[0]->result;
709 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
711}
712
720{
721 switch (index) {
722 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
723 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
724 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
725 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
726 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
727 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
728 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
729 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
730 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
731 default: {
732 if (LeagueTable::IsValidID(index)) {
733 ShowScriptLeagueTable((LeagueTableID)index);
734 }
735 }
736 }
738}
739
740
741
742/* --- Industries button menu --- */
743
744static CallBackFunction ToolbarIndustryClick(Window *w)
745{
746 /* Disable build-industry menu if we are a spectator */
748 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
749 } else {
750 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
751 }
753}
754
762{
763 switch (index) {
764 case 0: ShowIndustryDirectory(); break;
765 case 1: ShowIndustryCargoesWindow(); break;
766 case 2: ShowBuildIndustryWindow(); break;
767 }
769}
770
771/* --- Trains button menu + 1 helper function for all vehicles. --- */
772
773static void ToolbarVehicleClick(Window *w, VehicleType veh)
774{
775 CompanyMask dis{};
776
777 for (const Company *c : Company::Iterate()) {
778 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
779 }
781}
782
783
784static CallBackFunction ToolbarTrainClick(Window *w)
785{
786 ToolbarVehicleClick(w, VEH_TRAIN);
788}
789
797{
798 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
800}
801
802/* --- Road vehicle button menu --- */
803
804static CallBackFunction ToolbarRoadClick(Window *w)
805{
806 ToolbarVehicleClick(w, VEH_ROAD);
808}
809
817{
818 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
820}
821
822/* --- Ship button menu --- */
823
824static CallBackFunction ToolbarShipClick(Window *w)
825{
826 ToolbarVehicleClick(w, VEH_SHIP);
828}
829
837{
838 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
840}
841
842/* --- Aircraft button menu --- */
843
844static CallBackFunction ToolbarAirClick(Window *w)
845{
846 ToolbarVehicleClick(w, VEH_AIRCRAFT);
848}
849
857{
858 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
860}
861
862/* --- Zoom in button --- */
863
864static CallBackFunction ToolbarZoomInClick(Window *w)
865{
867 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
868 }
870}
871
872/* --- Zoom out button --- */
873
874static CallBackFunction ToolbarZoomOutClick(Window *w)
875{
877 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
878 }
880}
881
882/* --- Rail button menu --- */
883
884static std::string _railtype_filter;
885static std::string _roadtype_filter;
886static std::string _tramtype_filter;
887
888static CallBackFunction ToolbarBuildRailClick(Window *w)
889{
892}
893
906
907/* --- Road button menu --- */
908
909static CallBackFunction ToolbarBuildRoadClick(Window *w)
910{
913}
914
927
928/* --- Tram button menu --- */
929
930static CallBackFunction ToolbarBuildTramClick(Window *w)
931{
934}
935
948
949/* --- Water button menu --- */
950
951static CallBackFunction ToolbarBuildWaterClick(Window *w)
952{
953 DropDownList list;
954 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
955 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
957}
958
969
970/* --- Airport button menu --- */
971
972static CallBackFunction ToolbarBuildAirClick(Window *w)
973{
974 DropDownList list;
975 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
976 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
978}
979
990
991/* --- Forest button menu --- */
992
993static CallBackFunction ToolbarForestClick(Window *w)
994{
995 DropDownList list;
996 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
997 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
998 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
999 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
1001}
1002
1010{
1011 switch (index) {
1012 case 0: ShowTerraformToolbar(); break;
1013 case 1: ShowBuildTreesToolbar(); break;
1014 case 2: return SelectSignTool();
1015 }
1017}
1018
1019/* --- Music button menu --- */
1020
1021static CallBackFunction ToolbarMusicClick(Window *w)
1022{
1023 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1025}
1026
1033{
1034 ShowMusicWindow();
1036}
1037
1038/* --- Newspaper button menu --- */
1039
1040static CallBackFunction ToolbarNewspaperClick(Window *w)
1041{
1042 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1044}
1045
1053{
1054 switch (index) {
1055 case 0: ShowLastNewsMessage(); break;
1056 case 1: ShowMessageHistory(); break;
1057 case 2: DeleteAllMessages(); break;
1058 }
1060}
1061
1062/* --- Help button menu --- */
1063
1064static CallBackFunction PlaceLandBlockInfo()
1065{
1069 } else {
1070 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1072 }
1073}
1074
1075static CallBackFunction ToolbarHelpClick(Window *w)
1076{
1077 if (_settings_client.gui.newgrf_developer_tools) {
1078 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1079 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1080 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1081 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1082 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1083 } else {
1084 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1085 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1086 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1087 }
1089}
1090
1099{
1100 extern bool _draw_bounding_boxes;
1101 /* Always allow to toggle them off */
1102 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1103 _draw_bounding_boxes = !_draw_bounding_boxes;
1105 }
1106}
1107
1116{
1117 extern bool _draw_dirty_blocks;
1118 /* Always allow to toggle them off */
1119 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1120 _draw_dirty_blocks = !_draw_dirty_blocks;
1122 }
1123}
1124
1130{
1131 extern bool _draw_widget_outlines;
1132 /* Always allow to toggle them off */
1133 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1134 _draw_widget_outlines = !_draw_widget_outlines;
1136 }
1137}
1138
1143void SetStartingYear(TimerGameCalendar::Year year)
1144{
1145 _settings_game.game_creation.starting_year = Clamp(year, CalendarTime::MIN_YEAR, CalendarTime::MAX_YEAR);
1146 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1147 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1148
1149 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1150 TimerGameCalendar::SetDate(new_calendar_date, 0);
1151
1152 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1153 LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date);
1154 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1155
1156 /* Only change the date after changing cached values above. */
1157 TimerGameEconomy::SetDate(new_economy_date, 0);
1158}
1159
1166{
1167 switch (index) {
1168 case 0: return PlaceLandBlockInfo();
1169 case 1: ShowHelpWindow(); break;
1170 case 2: IConsoleSwitch(); break;
1171 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1172 case 4: ShowScreenshotWindow(); break;
1173 case 5: ShowFramerateWindow(); break;
1174 case 6: ShowAboutWindow(); break;
1175 case 7: ShowSpriteAlignerWindow(); break;
1176 case 8: ToggleBoundingBoxes(); break;
1177 case 9: ToggleDirtyBlocks(); break;
1178 case 10: ToggleWidgetOutlines(); break;
1179 }
1181}
1182
1183/* --- Switch toolbar button --- */
1184
1185static CallBackFunction ToolbarSwitchClick(Window *w)
1186{
1187 if (_toolbar_mode != ToolbarMode::Lower) {
1188 _toolbar_mode = ToolbarMode::Lower;
1189 } else {
1190 _toolbar_mode = ToolbarMode::Upper;
1191 }
1192
1193 w->ReInit();
1194 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == ToolbarMode::Lower);
1195 SndClickBeep();
1197}
1198
1199/* --- Scenario editor specific handlers. */
1200
1206{
1207 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1209}
1210
1211static CallBackFunction ToolbarScenDateBackward(Window *w)
1212{
1213 /* don't allow too fast scrolling */
1214 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1216 w->SetDirty();
1217
1218 SetStartingYear(_settings_game.game_creation.starting_year - 1);
1219 }
1220 _left_button_clicked = false;
1222}
1223
1224static CallBackFunction ToolbarScenDateForward(Window *w)
1225{
1226 /* don't allow too fast scrolling */
1227 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1229 w->SetDirty();
1230
1231 SetStartingYear(_settings_game.game_creation.starting_year + 1);
1232 }
1233 _left_button_clicked = false;
1235}
1236
1237static CallBackFunction ToolbarScenGenLand(Window *w)
1238{
1240
1243}
1244
1245static CallBackFunction ToolbarScenGenTownClick(Window *w)
1246{
1247 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1249}
1250
1251static CallBackFunction ToolbarScenGenTown(int index)
1252{
1253 switch (index) {
1254 case 0: ShowFoundTownWindow(); break;
1255 case 1: ShowBuildHousePicker(nullptr); break;
1256 }
1258}
1259
1260static CallBackFunction ToolbarScenGenIndustry(Window *w)
1261{
1263 ShowBuildIndustryWindow();
1265}
1266
1267static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1268{
1271}
1272
1285
1286static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1287{
1290}
1291
1304
1305static CallBackFunction ToolbarScenBuildDocks(Window *w)
1306{
1310}
1311
1312static CallBackFunction ToolbarScenPlantTrees(Window *w)
1313{
1315 ShowBuildTreesToolbar();
1317}
1318
1319static CallBackFunction ToolbarScenPlaceSign(Window *w)
1320{
1322 return SelectSignTool();
1323}
1324
1325static CallBackFunction ToolbarBtn_NULL(Window *)
1326{
1328}
1329
1330typedef CallBackFunction MenuClickedProc(int index);
1331
1332static MenuClickedProc * const _menu_clicked_procs[] = {
1333 nullptr, // 0
1334 nullptr, // 1
1335 MenuClickSettings, // 2
1336 MenuClickSaveLoad, // 3
1337 MenuClickMap, // 4
1338 MenuClickTown, // 5
1339 MenuClickSubsidies, // 6
1340 MenuClickStations, // 7
1341 MenuClickFinances, // 8
1342 MenuClickCompany, // 9
1343 MenuClickStory, // 10
1344 MenuClickGoal, // 11
1347 MenuClickIndustry, // 14
1348 MenuClickShowTrains, // 15
1349 MenuClickShowRoad, // 16
1350 MenuClickShowShips, // 17
1351 MenuClickShowAir, // 18
1352 MenuClickMap, // 19
1353 nullptr, // 20
1354 MenuClickBuildRail, // 21
1355 MenuClickBuildRoad, // 22
1356 MenuClickBuildTram, // 23
1357 MenuClickBuildWater, // 24
1358 MenuClickBuildAir, // 25
1359 MenuClickForest, // 26
1361 MenuClickNewspaper, // 28
1362 MenuClickHelp, // 29
1363};
1364
1366class NWidgetToolbarContainer : public NWidgetContainer {
1367protected:
1368 uint spacers = 0;
1369
1370public:
1371 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
1372 {
1373 }
1374
1381 {
1382 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1383 }
1384
1385 void SetupSmallestSize(Window *w) override
1386 {
1387 this->smallest_x = 0; // Biggest child
1388 this->smallest_y = 0; // Biggest child
1389 this->fill_x = 1;
1390 this->fill_y = 0;
1391 this->resize_x = 1; // We only resize in this direction
1392 this->resize_y = 0; // We never resize in this direction
1393 this->spacers = 0;
1394
1395 uint nbuttons = 0;
1396 /* First initialise some variables... */
1397 for (const auto &child_wid : this->children) {
1398 child_wid->SetupSmallestSize(w);
1399 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1400 if (this->IsButton(child_wid->type)) {
1401 nbuttons++;
1402 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1403 } else if (child_wid->type == NWID_SPACER) {
1404 this->spacers++;
1405 }
1406 }
1407
1408 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1409 for (const auto &child_wid : this->children) {
1410 child_wid->current_y = this->smallest_y;
1411 if (!this->IsButton(child_wid->type)) {
1412 child_wid->current_x = child_wid->smallest_x;
1413 }
1414 }
1415
1416 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1417 * displayed there will be no spacers anyway. */
1418 --nbuttons;
1419
1420 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1421 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1422 }
1423
1424 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1425 {
1426 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1427
1428 this->pos_x = x;
1429 this->pos_y = y;
1430 this->current_x = given_width;
1431 this->current_y = given_height;
1432
1433 /* Figure out what are the visible buttons */
1434 uint arrangeable_count, button_count, spacer_count;
1435 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_count, button_count, spacer_count);
1436
1437 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1438 std::map<WidgetID, uint> lookup;
1439 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1440 NWidgetBase *nwid = it->get();
1441 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1442 if (nwid->type == NWID_SPACER) continue;
1443 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1444 assert(nwc != nullptr);
1445 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1446 }
1447
1448 /* Now assign the widgets to their rightful place */
1449 uint position = 0; // Place to put next child relative to origin of the container.
1450 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1451 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1452 uint spacer_i = 0;
1453 uint button_i = 0;
1454
1455 /* Index into the arrangement indices. */
1456 const WidgetID *slotp = rtl ? &arrangement[arrangeable_count - 1] : arrangement;
1457 for (uint i = 0; i < arrangeable_count; i++) {
1458 uint slot = lookup[*slotp];
1459 auto &child_wid = this->children[slot];
1460 /* If we have space to give to the spacers, do that. */
1461 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1462 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1463 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1464 uint add = spacer_space / (spacer_count - spacer_i);
1465 position += add;
1466 spacer_space -= add;
1467 spacer_i++;
1468 }
1469 }
1470
1471 /* Buttons can be scaled, the others not. */
1472 if (this->IsButton(child_wid->type)) {
1473 child_wid->current_x = button_space / (button_count - button_i);
1474 button_space -= child_wid->current_x;
1475 button_i++;
1476 } else {
1477 child_wid->current_x = child_wid->smallest_x;
1478 }
1479 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1480 position += child_wid->current_x;
1481
1482 if (rtl) {
1483 slotp--;
1484 } else {
1485 slotp++;
1486 }
1487 }
1488 }
1489
1490 void Draw(const Window *w) override
1491 {
1492 /* Draw brown-red toolbar bg. */
1493 const Rect r = this->GetCurrentRect();
1496
1497 this->NWidgetContainer::Draw(w);
1498 }
1499
1508 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1509};
1510
1512class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
1513 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1514 {
1515 static const uint SMALLEST_ARRANGEMENT = 14;
1516 static const uint BIGGEST_ARRANGEMENT = 20;
1517
1518 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1519 * The total number of buttons should be equal to arrangeable_count * 2.
1520 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_count * 2) like a
1521 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1522 * enough space.
1523 */
1524 static const WidgetID arrange14[] = {
1536 WID_TN_AIR,
1539 /* lower toolbar */
1554 };
1555 static const WidgetID arrange15[] = {
1566 WID_TN_AIR,
1571 /* lower toolbar */
1587 };
1588 static const WidgetID arrange16[] = {
1600 WID_TN_AIR,
1605 /* lower toolbar */
1622 };
1623 static const WidgetID arrange17[] = {
1636 WID_TN_AIR,
1641 /* lower toolbar */
1659 };
1660 static const WidgetID arrange18[] = {
1674 WID_TN_AIR,
1679 /* lower toolbar */
1698 };
1699 static const WidgetID arrange19[] = {
1713 WID_TN_AIR,
1719 /* lower toolbar */
1733 WID_TN_AIR,
1739 };
1740 static const WidgetID arrange20[] = {
1754 WID_TN_AIR,
1761 /* lower toolbar */
1775 WID_TN_AIR,
1782 };
1783 static const WidgetID arrange_all[] = {
1809 WID_TN_AIR,
1814 };
1815
1816 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1817 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1818 if (full_buttons > BIGGEST_ARRANGEMENT) {
1819 _toolbar_mode = ToolbarMode::Normal;
1820 button_count = arrangeable_count = lengthof(arrange_all);
1821 spacer_count = this->spacers;
1822 return arrange_all;
1823 }
1824
1825 /* Introduce the split toolbar */
1826 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1827
1828 button_count = arrangeable_count = full_buttons;
1829 spacer_count = this->spacers;
1830 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == ToolbarMode::Lower) ? full_buttons : 0);
1831 }
1832};
1833
1835class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
1836 std::array<uint, 2> panel_widths{};
1837
1838 void SetupSmallestSize(Window *w) override
1839 {
1841
1842 /* Find the size of panel_widths */
1843 auto it = this->panel_widths.begin();
1844 for (const auto &child_wid : this->children) {
1845 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1846
1847 assert(it != this->panel_widths.end());
1848 *it = child_wid->current_x;
1849 _toolbar_width += child_wid->current_x;
1850 ++it;
1851 }
1852 }
1853
1854 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1855 {
1856 static const WidgetID arrange_all[] = {
1876 };
1877 static const WidgetID arrange_nopanel[] = {
1896 };
1897 static const WidgetID arrange_switch[] = {
1909 /* lower toolbar */
1921 };
1922
1923 /* If we can place all buttons *and* the panels, show them. */
1924 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1925 if (width >= min_full_width) {
1926 width -= this->panel_widths[0] + this->panel_widths[1];
1927 arrangeable_count = lengthof(arrange_all);
1928 button_count = arrangeable_count - 2;
1929 spacer_count = this->spacers;
1930 return arrange_all;
1931 }
1932
1933 /* 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 */
1934 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1935 if (width > min_small_width) {
1936 width -= this->panel_widths[1];
1937 arrangeable_count = lengthof(arrange_nopanel);
1938 button_count = arrangeable_count - 1;
1939 spacer_count = this->spacers - 1;
1940 return arrange_nopanel;
1941 }
1942
1943 /* Split toolbar */
1944 width -= this->panel_widths[1];
1945 arrangeable_count = lengthof(arrange_switch) / 2;
1946 button_count = arrangeable_count - 1;
1947 spacer_count = 0;
1948 return arrange_switch + ((_toolbar_mode == ToolbarMode::Lower) ? arrangeable_count : 0);
1949 }
1950};
1951
1952/* --- Toolbar handling for the 'normal' case */
1953
1960
1961static ToolbarButtonProc * const _toolbar_button_procs[] = {
1962 ToolbarPauseClick,
1966 ToolbarMapClick,
1967 ToolbarTownClick,
1968 ToolbarSubsidiesClick,
1969 ToolbarStationsClick,
1970 ToolbarFinancesClick,
1971 ToolbarCompaniesClick,
1972 ToolbarStoryClick,
1973 ToolbarGoalClick,
1974 ToolbarGraphsClick,
1975 ToolbarLeagueClick,
1976 ToolbarIndustryClick,
1977 ToolbarTrainClick,
1978 ToolbarRoadClick,
1979 ToolbarShipClick,
1980 ToolbarAirClick,
1981 ToolbarZoomInClick,
1982 ToolbarZoomOutClick,
1983 ToolbarBuildRailClick,
1984 ToolbarBuildRoadClick,
1985 ToolbarBuildTramClick,
1986 ToolbarBuildWaterClick,
1987 ToolbarBuildAirClick,
1988 ToolbarForestClick,
1989 ToolbarMusicClick,
1990 ToolbarNewspaperClick,
1991 ToolbarHelpClick,
1992 ToolbarSwitchClick,
1993};
1994
1996struct MainToolbarWindow : Window {
1997 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1998 {
1999 this->InitNested(0);
2000
2002 this->flags.Reset(WindowFlag::WhiteBorder);
2003 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2004 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2005 PositionMainToolbar(this);
2007 }
2008
2009 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2010 {
2011 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2012 }
2013
2014 void OnPaint() override
2015 {
2016 /* If spectator, disable all construction buttons
2017 * ie : Build road, rail, ships, airports and landscaping
2018 * Since enabled state is the default, just disable when needed */
2020 /* disable company list drop downs, if there are no companies */
2022
2025
2026 this->DrawWidgets();
2027 }
2028
2029 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2030 {
2031 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2032 }
2033
2034 void OnDropdownSelect(WidgetID widget, int index, int) override
2035 {
2036 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2038 }
2039
2040 EventState OnHotkey(int hotkey) override
2041 {
2043 switch (hotkey) {
2044 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2045 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2046 case MTHK_SETTINGS: ShowGameOptions(); break;
2047 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2048 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2049 case MTHK_SMALLMAP: ShowSmallMap(); break;
2050 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2051 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2052 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2053 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2054 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2055 case MTHK_STORY: ShowStoryBook(_local_company); break;
2056 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2057 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2058 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2059 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2060 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2061 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2062 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2063 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2064 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2065 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2066 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2067 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2068 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2069 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2070 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2071 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2072 case MTHK_MUSIC: ShowMusicWindow(); break;
2073 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2074 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2075 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2076 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2077 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2078 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2079 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2080 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2081 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2082 case MTHK_SIGN_LIST: ShowSignList(); break;
2083 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2084 default: return ES_NOT_HANDLED;
2085 }
2087 return ES_HANDLED;
2088 }
2089
2090 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2091 {
2092 switch (_last_started_action) {
2094 PlaceProc_Sign(tile);
2095 break;
2096
2098 ShowLandInfo(tile);
2099 break;
2100
2101 default: NOT_REACHED();
2102 }
2103 }
2104
2109
2111 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2112 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2115 }
2116
2117 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2120 }
2121 }};
2122
2128 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2129 {
2130 if (!gui_scope) return;
2132 }
2133
2134 static inline HotkeyList hotkeys{"maintoolbar", {
2135 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2136 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2137 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2138 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2139 Hotkey(0, "load_game", MTHK_LOADGAME),
2140 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2141 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2142 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2143 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2144 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2145 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2146 Hotkey(0, "story_book", MTHK_STORY),
2147 Hotkey(0, "goal_list", MTHK_GOAL),
2148 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2149 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2150 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2151 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2152 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2153 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2154 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2155 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2156 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2157 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2158 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2159 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2160 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2161 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2162 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2163 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2164 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2165 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2166 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2167 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2168 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2169 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2170 Hotkey('L', "terraform", MTHK_TERRAFORM),
2171 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2172 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2173 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2174 Hotkey(0, "land_info", MTHK_LANDINFO),
2175 }};
2176};
2177
2178static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2179{
2181 static const std::tuple<WidgetID, WidgetType, SpriteID> toolbar_button_sprites[] = {
2182 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2183 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2184 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2185 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2186 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2187 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2188 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2189 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2190 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2191 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2192 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2193 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2194 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2195 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2196 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2197 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2198 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2199 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2200 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2201 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2202 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2203 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2204 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2205 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2206 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2207 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2208 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2209 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2210 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2211 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2212 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2213 };
2214
2215 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2216 for (const auto &[widget, tp, sprite] : toolbar_button_sprites) {
2217 switch (widget) {
2218 case WID_TN_SMALL_MAP:
2219 case WID_TN_FINANCES:
2221 case WID_TN_ZOOM_IN:
2223 case WID_TN_MUSIC_SOUND:
2224 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2225 break;
2226 }
2227 auto leaf = std::make_unique<NWidgetLeaf>(tp, COLOUR_GREY, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2228 leaf->SetMinimalSize(20, 20);
2229 hor->Add(std::move(leaf));
2230 }
2231
2232 return hor;
2233}
2234
2235static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2237};
2238
2239static WindowDesc _toolb_normal_desc(
2240 WDP_MANUAL, {}, 0, 0,
2243 _nested_toolbar_normal_widgets,
2244 &MainToolbarWindow::hotkeys
2245);
2246
2247
2248/* --- Toolbar handling for the scenario editor */
2249
2250static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2251 nullptr, // 0
2252 nullptr, // 1
2253 MenuClickSettings, // 2
2254 MenuClickSaveLoad, // 3
2255 nullptr, // 4
2256 nullptr, // 5
2257 nullptr, // 6
2258 nullptr, // 7
2259 MenuClickMap, // 8
2260 nullptr, // 9
2261 nullptr, // 10
2262 nullptr, // 11
2263 ToolbarScenGenTown, // 12
2264 nullptr, // 13
2267 nullptr, // 16
2268 nullptr, // 17
2269 nullptr, // 18
2270 nullptr, // 19
2272 MenuClickHelp, // 21
2273 nullptr, // 22
2274};
2275
2276static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2277 ToolbarPauseClick,
2281 ToolbarBtn_NULL,
2283 ToolbarScenDateBackward,
2284 ToolbarScenDateForward,
2285 ToolbarScenMapTownDir,
2286 ToolbarZoomInClick,
2287 ToolbarZoomOutClick,
2288 ToolbarScenGenLand,
2289 ToolbarScenGenTownClick,
2290 ToolbarScenGenIndustry,
2291 ToolbarScenBuildRoadClick,
2292 ToolbarScenBuildTramClick,
2293 ToolbarScenBuildDocks,
2294 ToolbarScenPlantTrees,
2295 ToolbarScenPlaceSign,
2296 ToolbarBtn_NULL,
2297 ToolbarMusicClick,
2298 ToolbarHelpClick,
2299 ToolbarSwitchClick,
2300};
2301
2332
2333struct ScenarioEditorToolbarWindow : Window {
2334 ScenarioEditorToolbarWindow(WindowDesc &desc) : Window(desc)
2335 {
2336 this->InitNested(0);
2337
2339 this->flags.Reset(WindowFlag::WhiteBorder);
2340 PositionMainToolbar(this);
2342 }
2343
2344 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2345 {
2346 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2347 }
2348
2358
2359 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2360 {
2361 switch (widget) {
2362 case WID_TE_DATE:
2363 return GetString(STR_JUST_DATE_LONG, TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
2364
2365 default:
2366 return this->Window::GetWidgetString(widget, stringid);
2367 }
2368 }
2369
2370 void DrawWidget(const Rect &r, WidgetID widget) const override
2371 {
2372 switch (widget) {
2373 case WID_TE_SPACER: {
2374 int height = r.Height();
2375 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2376 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2377 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2378 } else {
2379 DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2380 }
2381 break;
2382 }
2383 }
2384 }
2385
2386 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2387 {
2388 switch (widget) {
2389 case WID_TE_SPACER:
2390 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2391 break;
2392
2393 case WID_TE_DATE:
2395 break;
2396 }
2397 }
2398
2399 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2400 {
2401 if (_game_mode == GM_MENU) return;
2402 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2404 }
2405
2406 void OnDropdownSelect(WidgetID widget, int index, int) override
2407 {
2408 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2410 SndClickBeep();
2411 }
2412
2413 EventState OnHotkey(int hotkey) override
2414 {
2415 if (IsSpecialHotkey(hotkey)) {
2417 switch (MainToolbarEditorHotkeys(hotkey)) {
2420 case MainToolbarEditorHotkeys::Music: ShowMusicWindow(); break;
2421 case MainToolbarEditorHotkeys::LandInfo: cbf = PlaceLandBlockInfo(); break;
2429 case MainToolbarEditorHotkeys::GenerateTown: ShowFoundTownWindow(); break;
2432 default: return ES_NOT_HANDLED;
2433 }
2435 } else {
2436 this->OnClick({}, hotkey, 0);
2437 }
2438 return ES_HANDLED;
2439 }
2440
2441 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2442 {
2443 switch (_last_started_action) {
2445 PlaceProc_Sign(tile);
2446 break;
2447
2449 ShowLandInfo(tile);
2450 break;
2451
2452 default: NOT_REACHED();
2453 }
2454 }
2455
2460
2467
2469 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2470 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2472 this->SetDirty();
2473 }
2474
2475 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2477 this->SetDirty();
2478 }
2479 }};
2480
2486 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2487 {
2488 if (!gui_scope) return;
2490 }
2491
2492 void OnQueryTextFinished(std::optional<std::string> str) override
2493 {
2494 /* Was 'cancel' pressed? */
2495 if (!str.has_value()) return;
2496
2497 TimerGameCalendar::Year value;
2498 if (!str->empty()) {
2499 auto val = ParseInteger(*str, 10, true);
2500 if (!val.has_value()) return;
2501 value = static_cast<TimerGameCalendar::Year>(*val);
2502 } else {
2503 /* An empty string means revert to the default */
2504 value = TimerGameCalendar::Year{CalendarTime::DEF_START_YEAR.base()};
2505 }
2506 SetStartingYear(value);
2507
2508 this->SetDirty();
2509 }
2510
2511 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2512 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MainToolbarEditorHotkeys::Pause),
2513 Hotkey(0, "fastforward", MainToolbarEditorHotkeys::FastForward),
2514 Hotkey(WKC_F2, "settings", MainToolbarEditorHotkeys::Settings),
2515 Hotkey(WKC_F3, "saveload", MainToolbarEditorHotkeys::SaveGame),
2516 Hotkey(WKC_F4, "gen_land", MainToolbarEditorHotkeys::GenerateLand),
2517 Hotkey(WKC_F5, "gen_town", MainToolbarEditorHotkeys::GenerateTown),
2518 Hotkey(WKC_F6, "gen_industry", MainToolbarEditorHotkeys::GenerateIndustry),
2519 Hotkey(WKC_F7, "build_road", MainToolbarEditorHotkeys::BuildRoad),
2520 Hotkey(0, "build_tram", MainToolbarEditorHotkeys::BuildTram),
2521 Hotkey(WKC_F8, "build_docks", MainToolbarEditorHotkeys::BuildWater),
2522 Hotkey(WKC_F9, "build_trees", MainToolbarEditorHotkeys::BuildTrees),
2523 Hotkey(WKC_F10, "build_sign", MainToolbarEditorHotkeys::Sign),
2524 Hotkey(WKC_F11, "music", MainToolbarEditorHotkeys::Music),
2525 Hotkey(WKC_F12, "land_info", MainToolbarEditorHotkeys::LandInfo),
2526 Hotkey(WKC_CTRL | 'S', "small_screenshot", MainToolbarEditorHotkeys::SmallScreenshot),
2527 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MainToolbarEditorHotkeys::ZoomedInScreenshot),
2528 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MainToolbarEditorHotkeys::DefaultZoomScreenshot),
2529 Hotkey(0, "giant_screenshot", MainToolbarEditorHotkeys::GiantScreenshot),
2530 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MainToolbarEditorHotkeys::ZoomIn),
2531 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MainToolbarEditorHotkeys::ZoomOut),
2532 Hotkey('L', "terraform", MainToolbarEditorHotkeys::Terraform),
2533 Hotkey('M', "smallmap", MainToolbarEditorHotkeys::SmallMap),
2534 Hotkey('V', "extra_viewport", MainToolbarEditorHotkeys::ExtraViewport),
2535 }};
2536};
2537
2538static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2539 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2540 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2541 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2542 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2544 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2546 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2548 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1),
2549 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2550 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1),
2551 EndContainer(),
2552 EndContainer(),
2554 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2556 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2557 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2559 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2560 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2561 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2562 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2563 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2564 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2565 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2566 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2568 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2569 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2570 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2571};
2572
2573static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2574{
2575 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2576}
2577
2578static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2579 NWidgetFunction(MakeScenarioToolbar),
2580};
2581
2582static WindowDesc _toolb_scen_desc(
2583 WDP_MANUAL, {}, 0, 0,
2586 _nested_toolb_scen_widgets,
2587 &ScenarioEditorToolbarWindow::hotkeys
2588);
2589
2592{
2593 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2596
2597 if (_game_mode == GM_EDITOR) {
2598 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2599 } else {
2600 new MainToolbarWindow(_toolb_normal_desc);
2601 }
2602}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:334
Window for configuring the AIs.
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Set()
Set all bits.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
uint smallest_x
Smallest horizontal size of the widget in a filled window.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
uint smallest_y
Smallest vertical size of the widget in a filled window.
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
uint current_y
Current vertical size (after resizing).
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1310
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
std::array< uint, 2 > panel_widths
The width of the two panels (the text panel and date panel).
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
uint spacers
Number of spacer widgets in this toolbar.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
void Draw(const Window *w) override
Draw the widgets of the tree.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
static Date date
Current date in days (day counter).
static void SetDate(Date date, DateFract fract)
Set the date.
Functions related to commands.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition dock_gui.cpp:415
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:374
std::unique_ptr< DropDownListItem > MakeDropDownListDividerItem()
Creates new DropDownListDividerItem.
Definition dropdown.cpp:36
std::unique_ptr< DropDownListItem > MakeDropDownListIconItem(SpriteID sprite, PaletteID palette, StringID str, int value, bool masked, bool shaded)
Creates new DropDownListIconItem.
Definition dropdown.cpp:70
std::unique_ptr< DropDownListItem > MakeDropDownListStringItem(StringID str, int value, bool masked, bool shaded)
Creates new DropDownListStringItem.
Definition dropdown.cpp:49
std::unique_ptr< DropDownListItem > MakeDropDownListCheckedItem(bool checked, StringID str, int value, bool masked, bool shaded, uint indent)
Creates new DropDownListCheckedItem.
Definition dropdown.cpp:94
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, DropDownOptions options, std::string *const persistent_filter_text)
Show a drop down list.
Definition dropdown.cpp:585
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
@ InstantClose
Set if releasing mouse button should close the list regardless of where the cursor is.
@ Filterable
Set if the dropdown is filterable.
Base class for engines.
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:55
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:54
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:20
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:21
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:19
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:425
Window for configuring GS.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:900
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:669
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:39
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:43
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:41
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:51
void GfxFillRect(int left, int top, int right, int bottom, const std::variant< PixelColour, PaletteID > &colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:116
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:324
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:389
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:398
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:346
@ WKC_MINUS
Definition gfx_type.h:106
@ WKC_EQUALS
= Equals
Definition gfx_type.h:99
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:310
Graph GUI functions.
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
std::unique_ptr< NWidgetBase > MakeNWidgets(std::span< const NWidgetPart > nwid_parts, std::unique_ptr< NWidgetBase > &&container)
Construct a nested widget tree from an array of parts.
Definition widget.cpp:3379
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Definition window.cpp:980
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1554
GUI functions that shouldn't be here.
void ShowStoryBook(CompanyID company, StoryPageID page_id=StoryPageID::Invalid(), bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:322
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameOptions()
Open the game options window.
bool LoadHeightmap(DetailedFileType dft, std::string_view filename)
Load a heightmap from file and change the map in its current dimensions to a landscape representing t...
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
static constexpr int SPECIAL_HOTKEY_BIT
Bit which denotes that hotkey isn't bound to UI button.
Definition hotkeys.h:77
bool IsSpecialHotkey(const int &hotkey)
Checks if hotkey index is special or not.
Definition hotkeys.h:84
Definition of HouseSpec and accessors.
LeagueTable base class.
League table GUI functions.
PoolID< uint8_t, struct LeagueTableIDTag, 255, 0xFF > LeagueTableID
ID of a league table.
Definition league_type.h:35
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
#define Point
Macro that prevents name conflicts between included headers.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Miscellaneous command definitions.
void ShowQueryString(std::string_view str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _networking
are we in networking mode?
Definition network.cpp:67
bool _network_server
network-server is active
Definition network.cpp:68
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:143
Basic functions/variables used all over the place.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Network functions used by other parts of OpenTTD.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
GUIs related to networking.
@ CLIENT_ID_SERVER
Servers always have this ID.
GRFConfigList _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
Functions/types related to NewGRF debugging.
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
void ShowLastNewsMessage()
Show previous news item.
void ShowMessageHistory()
Display window with news messages history.
GUI functions related to the news.
@ DO_SHOW_TOWN_NAMES
Display town names.
Definition openttd.h:46
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition openttd.h:52
@ DO_FULL_DETAIL
Also draw details of track and roads.
Definition openttd.h:50
@ DO_SHOW_SIGNS
Display signs.
Definition openttd.h:48
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
Definition openttd.h:51
@ DO_SHOW_STATION_NAMES
Display station names.
Definition openttd.h:47
@ DO_FULL_ANIMATION
Perform palette animation.
Definition openttd.h:49
@ Normal
A game normally paused.
Definition openttd.h:69
static constexpr PixelColour PC_VERY_DARK_RED
Almost-black red palette colour.
static constexpr PixelColour PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:962
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:238
Road specific functions.
RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
Get the mask for road types of the given RoadTramType.
Definition road.h:183
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Functions/types related to the road GUIs.
@ RTT_ROAD
Road road type.
Definition road_type.h:38
@ RTT_TRAM
Tram road type.
Definition road_type.h:39
@ RTTB_ROAD
Road road type bit.
Definition road_type.h:43
@ RTTB_TRAM
Tram road type bit.
Definition road_type.h:44
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:26
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:25
A number of safeguards to prevent using unsafe methods.
void MakeScreenshotWithConfirm(ScreenshotType t)
Make a screenshot.
Functions to make screenshots.
@ SC_VIEWPORT
Screenshot of viewport.
Definition screenshot.h:17
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:19
@ SC_WORLD
World screenshot.
Definition screenshot.h:21
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:20
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
Window for configuring the scripts.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
void SndConfirmBeep()
Play a beep sound for a confirm event if enabled in settings.
Definition sound.cpp:261
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:253
Functions related to sound.
static constexpr StationFacility STATION_FACILITY_GHOST
Fake 'facility' to allow toggling display of recently-removed station signs.
@ Dock
Station with a dock.
@ TruckStop
Station with truck stops.
@ Train
Station with train station.
@ Airport
Station with an airport.
@ BusStop
Station with bus stops.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271
StoryPage base class.
Parse strings.
static std::optional< T > ParseInteger(std::string_view arg, int base=10, bool clamp=false)
Change a string into its number representation.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Settings related to the AI.
Dimensions (a width and height) of a rectangle in 2D.
List of hotkeys for a window.
Definition hotkeys.h:46
All data for a single hotkey.
Definition hotkeys.h:22
Struct about custom league tables.
Definition league_base.h:52
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
static Pool::IterateWrapper< LeagueTable > Iterate(size_t from=0)
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPaint() override
The window must be repainted.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnTimeout() override
Called when this window's timeout has been reached.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
Container with the data associated to a single widget.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:992
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:768
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:570
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:307
std::unique_ptr< ViewportData > viewport
Pointer to viewport data, if present.
Definition window_gui.h:319
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:518
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:516
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:492
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:411
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:527
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:442
virtual void FindWindowPlacementAndResize(int def_width, int def_height, bool allow_resize)
Resize window towards the default size.
Definition window.cpp:1490
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1845
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition window.cpp:609
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1835
WindowFlags flags
Window flags.
Definition window_gui.h:301
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
int height
Height of the window (number of pixels down in y direction).
Definition window_gui.h:313
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:451
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
Stuff related to the text buffer GUI.
@ EnableDefault
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:20
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
@ HT_RECT
rectangle (stations, depots, ...)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the Window system.
static CallBackFunction MenuClickForest(int index)
Handle click on the entry in the landscaping menu.
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
@ LoadScenario
Load a scenario.
@ ExitGame
Exit to desktop.
@ SaveScenario
Save the scenario.
@ LoadHeightmap
Load a heightmap.
@ SaveHeightmap
Save the heightmap.
@ ExitToMainMenu
Exit to main menu.
RailType _last_built_railtype
The most recently used type of rail.
MainToolbarEditorHotkeys
List of hotkeys available in scenario editor.
@ GenerateTown
Open town generation window.
@ GenerateLand
Open land generation window.
@ Pause
(Un)pause the game.
@ Terraform
Open land generation window.
@ Sign
Toggle sign creation tool.
@ SmallMap
Open small map window.
@ GenerateIndustry
Open industry funding window.
@ Music
Open sound end music window.
@ GiantScreenshot
Take detailed screenshot of whole map.
@ BuildWater
Open window for building locks, canals, rivers and aqueducts.
@ ZoomedInScreenshot
Take zoomed in screenshot.
@ DefaultZoomScreenshot
Take screenshot with default zoom.
@ FastForward
Toggle the fast-forward mode.
@ SaveGame
Open save scenario window.
@ SmallScreenshot
Take small screenshot.
@ LandInfo
Toggle land info tool.
@ BuildTram
Open toolbar window with tools for building tramways.
@ BuildTrees
Open tree selection window.
@ BuildRoad
Open toolbar window with tools for building roads.
@ Settings
Open game options window.
@ ExtraViewport
Open new extra viewport window.
static std::string _railtype_filter
Persistent filter text for railtype dropdown menu.
static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
Pop up a generic text only menu.
static CallBackFunction MenuClickCompany(int index)
Handle click on the entry in the Company menu.
static std::string _roadtype_filter
Persistent filter text for roadtype dropdown menu.
static CallBackFunction MenuClickStations(int index)
Handle click on the entry in the Stations menu.
static CallBackFunction MenuClickTown(int index)
Handle click on one of the entries in the Town menu.
static const int LTMN_PERFORMANCE_LEAGUE
Show default league table.
ToolbarMode
Toolbar modes.
@ Upper
Toolbar is in split mode and the first part is selected.
@ Normal
Toolbar is in normal mode, in wich all 30 buttons are accessible.
@ Lower
Toolbar is in split mode and the second part is selected.
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
static const int LTMN_PERFORMANCE_RATING
Show detailed performance rating.
CallBackFunction
Callback functions.
@ PlaceSign
A new sign will be placed when tile is selected afterwards.
@ None
No action will happen when tile is selected afterwards.
@ PlaceLandInfo
Land info window will appear when tile is selected afterwards.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
static std::string _tramtype_filter
Persistent filter text for tramtype dropdown menu.
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
@ ExitGame
Exit to desktop.
@ ExitToMainMenu
Exit to main menu.
static CallBackFunction MenuClickShowRoad(int index)
Handle click on the entry in the Road Vehicles menu.
static const int GRMN_DELIVERED_CARGO_GRAPH
Show delivered cargo graph.
static CallBackFunction MenuClickGraphsOrLeague(int index)
Handle click on the entry in the Graphs or CompanyLeague.
static CallBackFunction MenuClickHelp(int index)
Choose the proper callback function for the main toolbar's help menu.
uint _toolbar_width
Width of the toolbar, shared by statusbar.
static const int GRMN_PERFORMANCE_HISTORY_GRAPH
Show performance history graph.
static CallBackFunction ToolbarOptionsClick(Window *w)
Handle click on Options button in toolbar.
static CallBackFunction MenuClickShowShips(int index)
Handle click on the entry in the Ships menu.
static DropDownOptions GetToolbarDropDownOptions(DropDownOptions options={})
Get options for toolbar dropdown menus,.
static std::unique_ptr< NWidgetBase > MakeMainToolbar()
static CallBackFunction MenuClickSaveLoad(int index=0)
Handle click on one of the entries in the SaveLoad menu.
RoadType _last_built_tramtype
The most recently used type of tram track.
static const int CTMN_CLIENT_LIST
Indicates the "all connected players" entry.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
RoadType _last_built_roadtype
The most recently used type of road.
static CallBackFunction ToolbarScenBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static const int GRMN_COMPANY_VALUE_GRAPH
Show company value graph.
TownMenuEntries
Town button menu entries.
@ ShowDirectory
Open window with list of towns.
@ ShowPlaceHouses
Open house selection window.
@ ShowFoundTown
Open town generation window.
void ToggleDirtyBlocks()
Toggle drawing of the dirty blocks.
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
static CallBackFunction ToolbarScenBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static CallBackFunction MenuClickBuildRoad(int index)
Handle click on the entry in the Build Road menu.
MapMenuEntries
Map button menu entries.
@ ShowIndustryDirectory
Open window with list of industries.
@ ShowExtraViewport
Open new extra viewport window.
@ ShowSmallMap
Open small map window.
@ ShowLinkGraph
Open cargo flow legend window.
@ ShowTownDirectory
Open window with list of towns.
@ ShowSignList
Open sign list window.
static CallBackFunction _last_started_action
Last started user action.
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 CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Indicates that a window is being opened for the spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:108
StationFacilities _facility_display_opt
What station facilities to draw.
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren't in the game menu (there's never transpar...
uint8_t _display_opt
What do we want to draw/do?
@ TO_HOUSES
town buildings
@ TO_SIGNS
signs
void ShowTransparencyToolbar()
Show the transparency toolbar.
GUI functions related to transparency.
Base class for all vehicles.
Functions related to vehicles.
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void HandleZoomMessage(Window *w, const Viewport &vp, WidgetID widget_zoom_in, WidgetID widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
Definition viewport.cpp:486
Functions related to (drawing on) viewports.
@ ZOOM_IN
Zoom in (get more detailed view).
@ ZOOM_NONE
Hack, used to update the button status.
@ ZOOM_OUT
Zoom out (get helicopter view).
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:35
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:42
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition().
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1195
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3493
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3396
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:3339
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ NoClose
This window can't be interactively closed.
Definition window_gui.h:156
@ NoFocus
This window won't get focus/make any other window lose focus when click.
Definition window_gui.h:155
@ WhiteBorder
Window white border counter bit mask.
Definition window_gui.h:235
@ Timeout
Window timeout counter.
Definition window_gui.h:227
@ WDP_MANUAL
Manually align the window (so no automatic location finding).
Definition window_gui.h:143
int WidgetID
Widget ID.
Definition window_type.h:20
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_SIGN_LIST
Sign list; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:63