OpenTTD Source 20241222-master-gc72542431a
toolbar_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
19#include "house.h"
20#include "vehicle_gui.h"
21#include "rail_gui.h"
22#include "road.h"
23#include "road_gui.h"
24#include "vehicle_func.h"
25#include "sound_func.h"
26#include "terraform_gui.h"
27#include "strings_func.h"
28#include "company_func.h"
29#include "company_gui.h"
30#include "vehicle_base.h"
31#include "cheat_func.h"
32#include "transparency_gui.h"
33#include "screenshot.h"
34#include "signs_func.h"
35#include "fios.h"
36#include "console_gui.h"
37#include "news_gui.h"
38#include "ai/ai_gui.hpp"
39#include "game/game_gui.hpp"
40#include "script/script_gui.h"
41#include "tilehighlight_func.h"
42#include "smallmap_gui.h"
43#include "graph_gui.h"
44#include "textbuf_gui.h"
46#include "newgrf_debug.h"
47#include "hotkeys.h"
48#include "engine_base.h"
49#include "highscore.h"
50#include "game/game.hpp"
51#include "goal_base.h"
52#include "story_base.h"
53#include "toolbar_gui.h"
54#include "framerate_type.h"
55#include "screenshot_gui.h"
56#include "misc_cmd.h"
57#include "league_gui.h"
58#include "league_base.h"
59#include "timer/timer.h"
60#include "timer/timer_window.h"
62#include "help_gui.h"
63
65
66#include "network/network.h"
67#include "network/network_gui.h"
69
70#include "safeguards.h"
71
72
75
76RailType _last_built_railtype;
77RoadType _last_built_roadtype;
78RoadType _last_built_tramtype;
79
82 TB_NORMAL,
83 TB_UPPER,
84 TB_LOWER
85};
86
89 CBF_NONE,
90 CBF_PLACE_SIGN,
91 CBF_PLACE_LANDINFO,
92};
93
95
99class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
100public:
101 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, STR_NULL, company, false, shaded)
102 {
103 SetDParam(0, company);
104 SetDParam(1, company);
105 this->SetString(GetString(STR_COMPANY_NAME_COMPANY_NUM));
106 }
107};
108
116static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
117{
118 ShowDropDownList(w, std::move(list), def, widget, 0, true);
120}
121
128static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
129{
130 DropDownList list;
131 int i = 0;
132 for (StringID string : strings) {
133 if (string == STR_NULL) {
134 list.push_back(MakeDropDownListDividerItem());
135 } else {
136 list.push_back(MakeDropDownListStringItem(string, i));
137 i++;
138 }
139 }
140 PopupMainToolbarMenu(w, widget, std::move(list), 0);
141}
142
144static const int CTMN_CLIENT_LIST = -1;
145static const int CTMN_SPECTATE = -2;
146static const int CTMN_SPECTATOR = -3;
147
154static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = 0)
155{
156 DropDownList list;
157
158 switch (widget) {
159 case WID_TN_COMPANIES:
160 if (!_networking) break;
161
162 /* Add the client list button for the companies menu */
163 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
164
166 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
167 }
168 break;
169 case WID_TN_STORY:
170 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
171 break;
172
173 case WID_TN_GOAL:
174 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
175 break;
176 }
177
178 for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
179 if (!Company::IsValidID(c)) continue;
180 list.push_back(std::make_unique<DropDownListCompanyItem>(c, HasBit(grey, c)));
181 }
182
184}
185
186static ToolbarMode _toolbar_mode;
187
188static CallBackFunction SelectSignTool()
189{
190 if (_last_started_action == CBF_PLACE_SIGN) {
192 return CBF_NONE;
193 } else {
194 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
195 return CBF_PLACE_SIGN;
196 }
197}
198
199/* --- Pausing --- */
200
201static CallBackFunction ToolbarPauseClick(Window *)
202{
203 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
204
207 }
208 return CBF_NONE;
209}
210
217{
218 if (_networking) return CBF_NONE; // no fast forward in network game
219
220 ChangeGameSpeed(_game_speed == 100);
221
223 return CBF_NONE;
224}
225
230 OME_GAMEOPTIONS,
231 OME_SETTINGS,
232 OME_AI_SETTINGS,
233 OME_GAMESCRIPT_SETTINGS,
234 OME_NEWGRFSETTINGS,
235 OME_SANDBOX,
236 OME_TRANSPARENCIES,
237 OME_SHOW_TOWNNAMES,
238 OME_SHOW_STATIONNAMES,
239 OME_SHOW_WAYPOINTNAMES,
240 OME_SHOW_SIGNS,
241 OME_SHOW_COMPETITOR_SIGNS,
242 OME_FULL_ANIMATION,
243 OME_FULL_DETAILS,
244 OME_TRANSPARENTBUILDINGS,
245 OME_SHOW_STATIONSIGNS,
246};
247
255{
256 DropDownList list;
257 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
258 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS));
259 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
260 * the settings once they join but never update it. As such don't show the window at all
261 * to network clients. */
263 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
264 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
265 }
266 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
267 if (_game_mode != GM_EDITOR && !_networking) {
268 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
269 }
270 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
271 list.push_back(MakeDropDownListDividerItem());
272 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
273 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
274 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
275 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
276 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
277 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
278 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
279 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
280 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
281
282 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true);
284 return CBF_NONE;
285}
286
294{
295 switch (index) {
296 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
297 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
298 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
299 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
300 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE;
301 case OME_SANDBOX: ShowCheatWindow(); break;
302 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
303
304 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
305 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
306 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
307 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
308 case OME_SHOW_COMPETITOR_SIGNS:
311 break;
312 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
313 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
314 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
315 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
316 }
318 return CBF_NONE;
319}
320
325 SLEME_SAVE_SCENARIO = 0,
326 SLEME_LOAD_SCENARIO,
327 SLEME_SAVE_HEIGHTMAP,
328 SLEME_LOAD_HEIGHTMAP,
329 SLEME_EXIT_TOINTRO,
330 SLEME_EXIT_GAME,
331};
332
337 SLNME_SAVE_GAME = 0,
338 SLNME_LOAD_GAME,
339 SLNME_EXIT_TOINTRO,
340 SLNME_EXIT_GAME,
341};
342
350{
351 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
352 STR_NULL, STR_FILE_MENU_EXIT});
353 return CBF_NONE;
354}
355
363{
364 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
365 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
366 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
367 return CBF_NONE;
368}
369
377{
378 if (_game_mode == GM_EDITOR) {
379 switch (index) {
380 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
381 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
382 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
383 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
384 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
385 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
386 }
387 } else {
388 switch (index) {
389 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
390 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
391 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
392 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
393 }
394 }
395 return CBF_NONE;
396}
397
398/* --- Map button menu --- */
399
400enum MapMenuEntries {
401 MME_SHOW_SMALLMAP = 0,
402 MME_SHOW_EXTRAVIEWPORTS,
403 MME_SHOW_LINKGRAPH,
404 MME_SHOW_SIGNLISTS,
405 MME_SHOW_TOWNDIRECTORY,
406 MME_SHOW_INDUSTRYDIRECTORY,
407};
408
409static CallBackFunction ToolbarMapClick(Window *w)
410{
411 DropDownList list;
412 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
413 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
414 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
415 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
416 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
417 return CBF_NONE;
418}
419
420static CallBackFunction ToolbarScenMapTownDir(Window *w)
421{
422 DropDownList list;
423 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
424 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
425 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
426 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
427 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
428 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
429 return CBF_NONE;
430}
431
439{
440 switch (index) {
441 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
442 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
443 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
444 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
445 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
446 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
447 }
448 return CBF_NONE;
449}
450
451/* --- Town button menu --- */
452
453static CallBackFunction ToolbarTownClick(Window *w)
454{
456 PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY});
457 } else {
458 PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY, STR_TOWN_MENU_FOUND_TOWN});
459 }
460 return CBF_NONE;
461}
462
470{
471 switch (index) {
472 case 0: ShowTownDirectory(); break;
473 case 1: // setting could be changed when the dropdown was open
474 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
475 break;
476 }
477 return CBF_NONE;
478}
479
480/* --- Subidies button menu --- */
481
482static CallBackFunction ToolbarSubsidiesClick(Window *w)
483{
484 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
485 return CBF_NONE;
486}
487
494{
495 ShowSubsidiesList();
496 return CBF_NONE;
497}
498
499/* --- Stations button menu --- */
500
501static CallBackFunction ToolbarStationsClick(Window *w)
502{
504 return CBF_NONE;
505}
506
514{
516 return CBF_NONE;
517}
518
519/* --- Finances button menu --- */
520
521static CallBackFunction ToolbarFinancesClick(Window *w)
522{
524 return CBF_NONE;
525}
526
534{
536 return CBF_NONE;
537}
538
539/* --- Company's button menu --- */
540
541static CallBackFunction ToolbarCompaniesClick(Window *w)
542{
544 return CBF_NONE;
545}
546
554{
555 if (_networking) {
556 switch (index) {
557 case CTMN_CLIENT_LIST:
558 ShowClientList();
559 return CBF_NONE;
560
561 case CTMN_SPECTATE:
562 if (_network_server) {
565 } else {
567 }
568 return CBF_NONE;
569 }
570 }
571 ShowCompany((CompanyID)index);
572 return CBF_NONE;
573}
574
575/* --- Story button menu --- */
576
577static CallBackFunction ToolbarStoryClick(Window *w)
578{
580 return CBF_NONE;
581}
582
590{
592 return CBF_NONE;
593}
594
595/* --- Goal button menu --- */
596
597static CallBackFunction ToolbarGoalClick(Window *w)
598{
600 return CBF_NONE;
601}
602
610{
612 return CBF_NONE;
613}
614
615/* --- Graphs and League Table button menu --- */
616
621static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
622static const int GRMN_INCOME_GRAPH = -2;
623static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
624static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
625static const int GRMN_COMPANY_VALUE_GRAPH = -5;
626static const int GRMN_CARGO_PAYMENT_RATES = -6;
627static const int LTMN_PERFORMANCE_LEAGUE = -7;
628static const int LTMN_PERFORMANCE_RATING = -8;
629static const int LTMN_HIGHSCORE = -9;
630
631static void AddDropDownLeagueTableOptions(DropDownList &list)
632{
633 if (LeagueTable::GetNumItems() > 0) {
634 for (LeagueTable *lt : LeagueTable::Iterate()) {
635 list.push_back(MakeDropDownListStringItem(lt->title, lt->index));
636 }
637 } else {
638 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
639 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
640 if (!_networking) {
641 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
642 }
643 }
644}
645
646static CallBackFunction ToolbarGraphsClick(Window *w)
647{
648 DropDownList list;
649
650 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
651 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
652 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
653 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
654 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
655 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
656
657 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
658
659 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
661
662 return CBF_NONE;
663}
664
665static CallBackFunction ToolbarLeagueClick(Window *w)
666{
667 DropDownList list;
668
669 AddDropDownLeagueTableOptions(list);
670
671 int selected = list[0]->result;
672 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true);
674
675 return CBF_NONE;
676}
677
685{
686 switch (index) {
687 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
688 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
689 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
690 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
691 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
692 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
693 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
694 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
695 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
696 default: {
697 if (LeagueTable::IsValidID(index)) {
698 ShowScriptLeagueTable((LeagueTableID)index);
699 }
700 }
701 }
702 return CBF_NONE;
703}
704
705
706
707/* --- Industries button menu --- */
708
709static CallBackFunction ToolbarIndustryClick(Window *w)
710{
711 /* Disable build-industry menu if we are a spectator */
713 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
714 } else {
715 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
716 }
717 return CBF_NONE;
718}
719
727{
728 switch (index) {
729 case 0: ShowIndustryDirectory(); break;
730 case 1: ShowIndustryCargoesWindow(); break;
731 case 2: ShowBuildIndustryWindow(); break;
732 }
733 return CBF_NONE;
734}
735
736/* --- Trains button menu + 1 helper function for all vehicles. --- */
737
738static void ToolbarVehicleClick(Window *w, VehicleType veh)
739{
740 CompanyMask dis = 0;
741
742 for (const Company *c : Company::Iterate()) {
743 if (c->group_all[veh].num_vehicle == 0) SetBit(dis, c->index);
744 }
746}
747
748
749static CallBackFunction ToolbarTrainClick(Window *w)
750{
751 ToolbarVehicleClick(w, VEH_TRAIN);
752 return CBF_NONE;
753}
754
762{
763 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
764 return CBF_NONE;
765}
766
767/* --- Road vehicle button menu --- */
768
769static CallBackFunction ToolbarRoadClick(Window *w)
770{
771 ToolbarVehicleClick(w, VEH_ROAD);
772 return CBF_NONE;
773}
774
782{
783 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
784 return CBF_NONE;
785}
786
787/* --- Ship button menu --- */
788
789static CallBackFunction ToolbarShipClick(Window *w)
790{
791 ToolbarVehicleClick(w, VEH_SHIP);
792 return CBF_NONE;
793}
794
802{
803 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
804 return CBF_NONE;
805}
806
807/* --- Aircraft button menu --- */
808
809static CallBackFunction ToolbarAirClick(Window *w)
810{
811 ToolbarVehicleClick(w, VEH_AIRCRAFT);
812 return CBF_NONE;
813}
814
822{
823 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
824 return CBF_NONE;
825}
826
827/* --- Zoom in button --- */
828
829static CallBackFunction ToolbarZoomInClick(Window *w)
830{
832 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
834 }
835 return CBF_NONE;
836}
837
838/* --- Zoom out button --- */
839
840static CallBackFunction ToolbarZoomOutClick(Window *w)
841{
843 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
845 }
846 return CBF_NONE;
847}
848
849/* --- Rail button menu --- */
850
851static CallBackFunction ToolbarBuildRailClick(Window *w)
852{
853 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
855 return CBF_NONE;
856}
857
865{
866 _last_built_railtype = (RailType)index;
867 ShowBuildRailToolbar(_last_built_railtype);
868 return CBF_NONE;
869}
870
871/* --- Road button menu --- */
872
873static CallBackFunction ToolbarBuildRoadClick(Window *w)
874{
875 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
877 return CBF_NONE;
878}
879
887{
888 _last_built_roadtype = (RoadType)index;
889 ShowBuildRoadToolbar(_last_built_roadtype);
890 return CBF_NONE;
891}
892
893/* --- Tram button menu --- */
894
895static CallBackFunction ToolbarBuildTramClick(Window *w)
896{
897 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
899 return CBF_NONE;
900}
901
909{
910 _last_built_tramtype = (RoadType)index;
911 ShowBuildRoadToolbar(_last_built_tramtype);
912 return CBF_NONE;
913}
914
915/* --- Water button menu --- */
916
917static CallBackFunction ToolbarBuildWaterClick(Window *w)
918{
919 DropDownList list;
920 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
921 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
923 return CBF_NONE;
924}
925
932{
934 return CBF_NONE;
935}
936
937/* --- Airport button menu --- */
938
939static CallBackFunction ToolbarBuildAirClick(Window *w)
940{
941 DropDownList list;
942 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
943 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
945 return CBF_NONE;
946}
947
954{
956 return CBF_NONE;
957}
958
959/* --- Forest button menu --- */
960
961static CallBackFunction ToolbarForestClick(Window *w)
962{
963 DropDownList list;
964 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
965 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
966 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
967 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
969 return CBF_NONE;
970}
971
979{
980 switch (index) {
981 case 0: ShowTerraformToolbar(); break;
982 case 1: ShowBuildTreesToolbar(); break;
983 case 2: return SelectSignTool();
984 }
985 return CBF_NONE;
986}
987
988/* --- Music button menu --- */
989
990static CallBackFunction ToolbarMusicClick(Window *w)
991{
992 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
993 return CBF_NONE;
994}
995
1002{
1003 ShowMusicWindow();
1004 return CBF_NONE;
1005}
1006
1007/* --- Newspaper button menu --- */
1008
1009static CallBackFunction ToolbarNewspaperClick(Window *w)
1010{
1011 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1012 return CBF_NONE;
1013}
1014
1022{
1023 switch (index) {
1024 case 0: ShowLastNewsMessage(); break;
1025 case 1: ShowMessageHistory(); break;
1026 case 2: DeleteAllMessages(); break;
1027 }
1028 return CBF_NONE;
1029}
1030
1031/* --- Help button menu --- */
1032
1033static CallBackFunction PlaceLandBlockInfo()
1034{
1035 if (_last_started_action == CBF_PLACE_LANDINFO) {
1037 return CBF_NONE;
1038 } else {
1039 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1040 return CBF_PLACE_LANDINFO;
1041 }
1042}
1043
1044static CallBackFunction ToolbarHelpClick(Window *w)
1045{
1047 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1048 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1049 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1050 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1051 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1052 } else {
1053 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1054 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1055 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1056 }
1057 return CBF_NONE;
1058}
1059
1068{
1069 extern bool _draw_bounding_boxes;
1070 /* Always allow to toggle them off */
1071 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1072 _draw_bounding_boxes = !_draw_bounding_boxes;
1074 }
1075}
1076
1085{
1086 extern bool _draw_dirty_blocks;
1087 /* Always allow to toggle them off */
1088 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1089 _draw_dirty_blocks = !_draw_dirty_blocks;
1091 }
1092}
1093
1099{
1100 extern bool _draw_widget_outlines;
1101 /* Always allow to toggle them off */
1102 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1103 _draw_widget_outlines = !_draw_widget_outlines;
1105 }
1106}
1107
1113{
1115 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1116 TimerGameEconomy::Date new_economy_date = new_calendar_date.base();
1117
1118 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1119 TimerGameCalendar::SetDate(new_calendar_date, 0);
1120
1121 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1123 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1124
1125 /* Only change the date after changing cached values above. */
1126 TimerGameEconomy::SetDate(new_economy_date, 0);
1127}
1128
1135{
1136 switch (index) {
1137 case 0: return PlaceLandBlockInfo();
1138 case 1: ShowHelpWindow(); break;
1139 case 2: IConsoleSwitch(); break;
1141 case 4: ShowScreenshotWindow(); break;
1142 case 5: ShowFramerateWindow(); break;
1143 case 6: ShowAboutWindow(); break;
1144 case 7: ShowSpriteAlignerWindow(); break;
1145 case 8: ToggleBoundingBoxes(); break;
1146 case 9: ToggleDirtyBlocks(); break;
1147 case 10: ToggleWidgetOutlines(); break;
1148 }
1149 return CBF_NONE;
1150}
1151
1152/* --- Switch toolbar button --- */
1153
1154static CallBackFunction ToolbarSwitchClick(Window *w)
1155{
1156 if (_toolbar_mode != TB_LOWER) {
1157 _toolbar_mode = TB_LOWER;
1158 } else {
1159 _toolbar_mode = TB_UPPER;
1160 }
1161
1162 w->ReInit();
1163 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1165 return CBF_NONE;
1166}
1167
1168/* --- Scenario editor specific handlers. */
1169
1174{
1176 ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
1177 return CBF_NONE;
1178}
1179
1180static CallBackFunction ToolbarScenDateBackward(Window *w)
1181{
1182 /* don't allow too fast scrolling */
1183 if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1185 w->SetDirty();
1186
1188 }
1189 _left_button_clicked = false;
1190 return CBF_NONE;
1191}
1192
1193static CallBackFunction ToolbarScenDateForward(Window *w)
1194{
1195 /* don't allow too fast scrolling */
1196 if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1198 w->SetDirty();
1199
1201 }
1202 _left_button_clicked = false;
1203 return CBF_NONE;
1204}
1205
1206static CallBackFunction ToolbarScenGenLand(Window *w)
1207{
1210
1212 return CBF_NONE;
1213}
1214
1215static CallBackFunction ToolbarScenGenTownClick(Window *w)
1216{
1217 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1218 return CBF_NONE;
1219}
1220
1221static CallBackFunction ToolbarScenGenTown(int index)
1222{
1223 switch (index) {
1224 case 0: ShowFoundTownWindow(); break;
1225 case 1: ShowBuildHousePicker(nullptr); break;
1226 }
1227 return CBF_NONE;
1228}
1229
1230static CallBackFunction ToolbarScenGenIndustry(Window *w)
1231{
1234 ShowBuildIndustryWindow();
1235 return CBF_NONE;
1236}
1237
1238static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1239{
1240 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1242 return CBF_NONE;
1243}
1244
1252{
1253 _last_built_roadtype = (RoadType)index;
1254 ShowBuildRoadScenToolbar(_last_built_roadtype);
1255 return CBF_NONE;
1256}
1257
1258static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1259{
1260 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1262 return CBF_NONE;
1263}
1264
1272{
1273 _last_built_tramtype = (RoadType)index;
1274 ShowBuildRoadScenToolbar(_last_built_tramtype);
1275 return CBF_NONE;
1276}
1277
1278static CallBackFunction ToolbarScenBuildDocks(Window *w)
1279{
1283 return CBF_NONE;
1284}
1285
1286static CallBackFunction ToolbarScenPlantTrees(Window *w)
1287{
1290 ShowBuildTreesToolbar();
1291 return CBF_NONE;
1292}
1293
1294static CallBackFunction ToolbarScenPlaceSign(Window *w)
1295{
1298 return SelectSignTool();
1299}
1300
1301static CallBackFunction ToolbarBtn_NULL(Window *)
1302{
1303 return CBF_NONE;
1304}
1305
1306typedef CallBackFunction MenuClickedProc(int index);
1307
1308static MenuClickedProc * const _menu_clicked_procs[] = {
1309 nullptr, // 0
1310 nullptr, // 1
1311 MenuClickSettings, // 2
1312 MenuClickSaveLoad, // 3
1313 MenuClickMap, // 4
1314 MenuClickTown, // 5
1315 MenuClickSubsidies, // 6
1316 MenuClickStations, // 7
1317 MenuClickFinances, // 8
1318 MenuClickCompany, // 9
1319 MenuClickStory, // 10
1320 MenuClickGoal, // 11
1323 MenuClickIndustry, // 14
1324 MenuClickShowTrains, // 15
1325 MenuClickShowRoad, // 16
1326 MenuClickShowShips, // 17
1327 MenuClickShowAir, // 18
1328 MenuClickMap, // 19
1329 nullptr, // 20
1330 MenuClickBuildRail, // 21
1331 MenuClickBuildRoad, // 22
1332 MenuClickBuildTram, // 23
1333 MenuClickBuildWater, // 24
1334 MenuClickBuildAir, // 25
1335 MenuClickForest, // 26
1337 MenuClickNewspaper, // 28
1338 MenuClickHelp, // 29
1339};
1340
1343protected:
1344 uint spacers;
1345
1346public:
1348 {
1349 }
1350
1357 {
1358 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1359 }
1360
1361 void SetupSmallestSize(Window *w) override
1362 {
1363 this->smallest_x = 0; // Biggest child
1364 this->smallest_y = 0; // Biggest child
1365 this->fill_x = 1;
1366 this->fill_y = 0;
1367 this->resize_x = 1; // We only resize in this direction
1368 this->resize_y = 0; // We never resize in this direction
1369 this->spacers = 0;
1370
1371 uint nbuttons = 0;
1372 /* First initialise some variables... */
1373 for (const auto &child_wid : this->children) {
1374 child_wid->SetupSmallestSize(w);
1375 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1376 if (this->IsButton(child_wid->type)) {
1377 nbuttons++;
1378 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1379 } else if (child_wid->type == NWID_SPACER) {
1380 this->spacers++;
1381 }
1382 }
1383
1384 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1385 for (const auto &child_wid : this->children) {
1386 child_wid->current_y = this->smallest_y;
1387 if (!this->IsButton(child_wid->type)) {
1388 child_wid->current_x = child_wid->smallest_x;
1389 }
1390 }
1391 _toolbar_width = nbuttons * this->smallest_x;
1392 }
1393
1394 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1395 {
1396 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1397
1398 this->pos_x = x;
1399 this->pos_y = y;
1400 this->current_x = given_width;
1401 this->current_y = given_height;
1402
1403 /* Figure out what are the visible buttons */
1404 uint arrangable_count, button_count, spacer_count;
1405 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1406
1407 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1408 std::map<WidgetID, uint> lookup;
1409 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1410 NWidgetBase *nwid = it->get();
1411 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1412 if (nwid->type == NWID_SPACER) continue;
1413 lookup[dynamic_cast<NWidgetCore *>(nwid)->index] = std::distance(this->children.begin(), it);
1414 }
1415
1416 /* Now assign the widgets to their rightful place */
1417 uint position = 0; // Place to put next child relative to origin of the container.
1418 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1419 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1420 uint spacer_i = 0;
1421 uint button_i = 0;
1422
1423 /* Index into the arrangement indices. */
1424 const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1425 for (uint i = 0; i < arrangable_count; i++) {
1426 uint slot = lookup[*slotp];
1427 auto &child_wid = this->children[slot];
1428 /* If we have space to give to the spacers, do that. */
1429 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1430 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1431 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1432 uint add = spacer_space / (spacer_count - spacer_i);
1433 position += add;
1434 spacer_space -= add;
1435 spacer_i++;
1436 }
1437 }
1438
1439 /* Buttons can be scaled, the others not. */
1440 if (this->IsButton(child_wid->type)) {
1441 child_wid->current_x = button_space / (button_count - button_i);
1442 button_space -= child_wid->current_x;
1443 button_i++;
1444 } else {
1445 child_wid->current_x = child_wid->smallest_x;
1446 }
1447 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1448 position += child_wid->current_x;
1449
1450 if (rtl) {
1451 slotp--;
1452 } else {
1453 slotp++;
1454 }
1455 }
1456 }
1457
1458 void Draw(const Window *w) override
1459 {
1460 /* Draw brown-red toolbar bg. */
1461 const Rect r = this->GetCurrentRect();
1464
1465 this->NWidgetContainer::Draw(w);
1466 }
1467
1476 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1477};
1478
1481 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1482 {
1483 static const uint SMALLEST_ARRANGEMENT = 14;
1484 static const uint BIGGEST_ARRANGEMENT = 20;
1485
1486 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1487 * The total number of buttons should be equal to arrangable_count * 2.
1488 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1489 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1490 * enough space.
1491 */
1492 static const WidgetID arrange14[] = {
1504 WID_TN_AIR,
1507 // lower toolbar
1522 };
1523 static const WidgetID arrange15[] = {
1534 WID_TN_AIR,
1539 // lower toolbar
1555 };
1556 static const WidgetID arrange16[] = {
1568 WID_TN_AIR,
1573 // lower toolbar
1590 };
1591 static const WidgetID arrange17[] = {
1604 WID_TN_AIR,
1609 // lower toolbar
1627 };
1628 static const WidgetID arrange18[] = {
1642 WID_TN_AIR,
1647 // lower toolbar
1666 };
1667 static const WidgetID arrange19[] = {
1681 WID_TN_AIR,
1687 // lower toolbar
1701 WID_TN_AIR,
1707 };
1708 static const WidgetID arrange20[] = {
1722 WID_TN_AIR,
1729 // lower toolbar
1743 WID_TN_AIR,
1750 };
1751 static const WidgetID arrange_all[] = {
1777 WID_TN_AIR,
1782 };
1783
1784 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1785 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1786 if (full_buttons > BIGGEST_ARRANGEMENT) {
1787 button_count = arrangable_count = lengthof(arrange_all);
1788 spacer_count = this->spacers;
1789 return arrange_all;
1790 }
1791
1792 /* Introduce the split toolbar */
1793 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1794
1795 button_count = arrangable_count = full_buttons;
1796 spacer_count = this->spacers;
1797 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1798 }
1799};
1800
1804
1805 void SetupSmallestSize(Window *w) override
1806 {
1808
1809 /* Find the size of panel_widths */
1810 uint i = 0;
1811 for (const auto &child_wid : this->children) {
1812 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1813
1814 assert(i < lengthof(this->panel_widths));
1815 this->panel_widths[i++] = child_wid->current_x;
1816 _toolbar_width += child_wid->current_x;
1817 }
1818 }
1819
1820 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1821 {
1822 static const WidgetID arrange_all[] = {
1842 };
1843 static const WidgetID arrange_nopanel[] = {
1862 };
1863 static const WidgetID arrange_switch[] = {
1875 // lower toolbar
1887 };
1888
1889 /* If we can place all buttons *and* the panels, show them. */
1890 uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1891 if (width >= min_full_width) {
1892 width -= this->panel_widths[0] + this->panel_widths[1];
1893 arrangable_count = lengthof(arrange_all);
1894 button_count = arrangable_count - 2;
1895 spacer_count = this->spacers;
1896 return arrange_all;
1897 }
1898
1899 /* 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 */
1900 uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1901 if (width > min_small_width) {
1902 width -= this->panel_widths[1];
1903 arrangable_count = lengthof(arrange_nopanel);
1904 button_count = arrangable_count - 1;
1905 spacer_count = this->spacers - 1;
1906 return arrange_nopanel;
1907 }
1908
1909 /* Split toolbar */
1910 width -= this->panel_widths[1];
1911 arrangable_count = lengthof(arrange_switch) / 2;
1912 button_count = arrangable_count - 1;
1913 spacer_count = 0;
1914 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1915 }
1916};
1917
1918/* --- Toolbar handling for the 'normal' case */
1919
1920typedef CallBackFunction ToolbarButtonProc(Window *w);
1921
1922static ToolbarButtonProc * const _toolbar_button_procs[] = {
1923 ToolbarPauseClick,
1927 ToolbarMapClick,
1928 ToolbarTownClick,
1929 ToolbarSubsidiesClick,
1930 ToolbarStationsClick,
1931 ToolbarFinancesClick,
1932 ToolbarCompaniesClick,
1933 ToolbarStoryClick,
1934 ToolbarGoalClick,
1935 ToolbarGraphsClick,
1936 ToolbarLeagueClick,
1937 ToolbarIndustryClick,
1938 ToolbarTrainClick,
1939 ToolbarRoadClick,
1940 ToolbarShipClick,
1941 ToolbarAirClick,
1942 ToolbarZoomInClick,
1943 ToolbarZoomOutClick,
1944 ToolbarBuildRailClick,
1945 ToolbarBuildRoadClick,
1946 ToolbarBuildTramClick,
1947 ToolbarBuildWaterClick,
1948 ToolbarBuildAirClick,
1949 ToolbarForestClick,
1950 ToolbarMusicClick,
1951 ToolbarNewspaperClick,
1952 ToolbarHelpClick,
1953 ToolbarSwitchClick,
1954};
1955
1958 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1959 {
1960 this->InitNested(0);
1961
1962 _last_started_action = CBF_NONE;
1964 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1965 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1966 PositionMainToolbar(this);
1968 }
1969
1974
1975 void OnPaint() override
1976 {
1977 /* If spectator, disable all construction buttons
1978 * ie : Build road, rail, ships, airports and landscaping
1979 * Since enabled state is the default, just disable when needed */
1981 /* disable company list drop downs, if there are no companies */
1983
1986
1987 this->DrawWidgets();
1988 }
1989
1990 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1991 {
1992 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
1993 }
1994
1995 void OnDropdownSelect(WidgetID widget, int index) override
1996 {
1997 CallBackFunction cbf = _menu_clicked_procs[widget](index);
1998 if (cbf != CBF_NONE) _last_started_action = cbf;
1999 }
2000
2002 {
2003 CallBackFunction cbf = CBF_NONE;
2004 switch (hotkey) {
2005 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2006 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2007 case MTHK_SETTINGS: ShowGameOptions(); break;
2008 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2009 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2010 case MTHK_SMALLMAP: ShowSmallMap(); break;
2011 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2012 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2013 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2014 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2015 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2016 case MTHK_STORY: ShowStoryBook(_local_company); break;
2017 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2018 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2019 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2020 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2021 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2022 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2023 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2024 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2025 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2026 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2027 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2028 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2029 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2030 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2031 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2032 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2033 case MTHK_MUSIC: ShowMusicWindow(); break;
2034 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2035 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2036 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2037 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2038 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2039 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2040 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2041 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2042 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2043 case MTHK_SIGN_LIST: ShowSignList(); break;
2044 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2045 default: return ES_NOT_HANDLED;
2046 }
2047 if (cbf != CBF_NONE) _last_started_action = cbf;
2048 return ES_HANDLED;
2049 }
2050
2052 {
2053 switch (_last_started_action) {
2054 case CBF_PLACE_SIGN:
2055 PlaceProc_Sign(tile);
2056 break;
2057
2058 case CBF_PLACE_LANDINFO:
2059 ShowLandInfo(tile);
2060 break;
2061
2062 default: NOT_REACHED();
2063 }
2064 }
2065
2066 void OnPlaceObjectAbort() override
2067 {
2068 _last_started_action = CBF_NONE;
2069 }
2070
2072 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2073 if (this->IsWidgetLowered(WID_TN_PAUSE) != !!_pause_mode) {
2076 }
2077
2078 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2081 }
2082 }};
2083
2084 void OnTimeout() override
2085 {
2086 /* We do not want to automatically raise the pause, fast forward and
2087 * switchbar buttons; they have to stay down when pressed etc. */
2088 for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2089 this->RaiseWidgetWhenLowered(i);
2090 }
2091 }
2092
2098 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2099 {
2100 if (!gui_scope) return;
2102 }
2103
2104 static inline HotkeyList hotkeys{"maintoolbar", {
2105 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2106 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2107 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2108 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2109 Hotkey(0, "load_game", MTHK_LOADGAME),
2110 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2111 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2112 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2113 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2114 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2115 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2116 Hotkey(0, "story_book", MTHK_STORY),
2117 Hotkey(0, "goal_list", MTHK_GOAL),
2118 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2119 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2120 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2121 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2122 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2123 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2124 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2125 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2126 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2127 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2128 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2129 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2130 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2131 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2132 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2133 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2134 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2135 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2136 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2137 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2138 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2139 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2140 Hotkey('L', "terraform", MTHK_TERRAFORM),
2141 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2142 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2143 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2144 Hotkey(0, "land_info", MTHK_LANDINFO),
2145 }};
2146};
2147
2148static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2149{
2151 static const SpriteID toolbar_button_sprites[] = {
2152 SPR_IMG_PAUSE, // WID_TN_PAUSE
2153 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2154 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2155 SPR_IMG_SAVE, // WID_TN_SAVE
2156 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2157 SPR_IMG_TOWN, // WID_TN_TOWNS
2158 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2159 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2160 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2161 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2162 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2163 SPR_IMG_GOAL, // WID_TN_GOAL
2164 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2165 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2166 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2167 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2168 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2169 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2170 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2171 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2172 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2173 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2174 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2175 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2176 SPR_IMG_BUILDWATER, // WID_TN_WATER
2177 SPR_IMG_BUILDAIR, // WID_TN_AIR
2178 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2179 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2180 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2181 SPR_IMG_QUERY, // WID_TN_HELP
2182 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2183 };
2184
2185 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2186 for (WidgetID i = 0; i < WID_TN_END; i++) {
2187 switch (i) {
2188 case WID_TN_SMALL_MAP:
2189 case WID_TN_FINANCES:
2191 case WID_TN_ZOOM_IN:
2193 case WID_TN_MUSIC_SOUND:
2194 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2195 break;
2196 }
2197 auto leaf = std::make_unique<NWidgetLeaf>(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i);
2198 leaf->SetMinimalSize(20, 20);
2199 hor->Add(std::move(leaf));
2200 }
2201
2202 return hor;
2203}
2204
2205static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2207};
2208
2209static WindowDesc _toolb_normal_desc(
2210 WDP_MANUAL, nullptr, 0, 0,
2213 _nested_toolbar_normal_widgets,
2214 &MainToolbarWindow::hotkeys
2215);
2216
2217
2218/* --- Toolbar handling for the scenario editor */
2219
2220static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2221 nullptr, // 0
2222 nullptr, // 1
2223 MenuClickSettings, // 2
2224 MenuClickSaveLoad, // 3
2225 nullptr, // 4
2226 nullptr, // 5
2227 nullptr, // 6
2228 nullptr, // 7
2229 MenuClickMap, // 8
2230 nullptr, // 9
2231 nullptr, // 10
2232 nullptr, // 11
2233 ToolbarScenGenTown, // 12
2234 nullptr, // 13
2237 nullptr, // 16
2238 nullptr, // 17
2239 nullptr, // 18
2240 nullptr, // 19
2242 MenuClickHelp, // 21
2243 nullptr, // 22
2244};
2245
2246static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2247 ToolbarPauseClick,
2251 ToolbarBtn_NULL,
2253 ToolbarScenDateBackward,
2254 ToolbarScenDateForward,
2255 ToolbarScenMapTownDir,
2256 ToolbarZoomInClick,
2257 ToolbarZoomOutClick,
2258 ToolbarScenGenLand,
2259 ToolbarScenGenTownClick,
2260 ToolbarScenGenIndustry,
2261 ToolbarScenBuildRoadClick,
2262 ToolbarScenBuildTramClick,
2263 ToolbarScenBuildDocks,
2264 ToolbarScenPlantTrees,
2265 ToolbarScenPlaceSign,
2266 ToolbarBtn_NULL,
2267 ToolbarMusicClick,
2268 ToolbarHelpClick,
2269 ToolbarSwitchClick,
2270};
2271
2272enum MainToolbarEditorHotkeys {
2273 MTEHK_PAUSE,
2274 MTEHK_FASTFORWARD,
2275 MTEHK_SETTINGS,
2276 MTEHK_SAVEGAME,
2277 MTEHK_GENLAND,
2278 MTEHK_GENTOWN,
2279 MTEHK_GENINDUSTRY,
2280 MTEHK_BUILD_ROAD,
2281 MTEHK_BUILD_TRAM,
2282 MTEHK_BUILD_DOCKS,
2283 MTEHK_BUILD_TREES,
2284 MTEHK_SIGN,
2285 MTEHK_MUSIC,
2286 MTEHK_LANDINFO,
2287 MTEHK_SMALL_SCREENSHOT,
2288 MTEHK_ZOOMEDIN_SCREENSHOT,
2289 MTEHK_DEFAULTZOOM_SCREENSHOT,
2290 MTEHK_GIANT_SCREENSHOT,
2291 MTEHK_ZOOM_IN,
2292 MTEHK_ZOOM_OUT,
2293 MTEHK_TERRAFORM,
2294 MTEHK_SMALLMAP,
2295 MTEHK_EXTRA_VIEWPORT,
2296};
2297
2300 {
2301 this->InitNested(0);
2302
2303 _last_started_action = CBF_NONE;
2305 PositionMainToolbar(this);
2307 }
2308
2313
2323
2324 void SetStringParameters(WidgetID widget) const override
2325 {
2326 switch (widget) {
2327 case WID_TE_DATE:
2329 break;
2330 }
2331 }
2332
2333 void DrawWidget(const Rect &r, WidgetID widget) const override
2334 {
2335 switch (widget) {
2336 case WID_TE_SPACER: {
2337 int height = r.Height();
2338 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2340 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2341 } else {
2343 }
2344 break;
2345 }
2346 }
2347 }
2348
2350 {
2351 switch (widget) {
2352 case WID_TE_SPACER:
2354 break;
2355
2356 case WID_TE_DATE:
2359 break;
2360 }
2361 }
2362
2363 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2364 {
2365 if (_game_mode == GM_MENU) return;
2366 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2367 if (cbf != CBF_NONE) _last_started_action = cbf;
2368 }
2369
2370 void OnDropdownSelect(WidgetID widget, int index) override
2371 {
2372 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2373 if (cbf != CBF_NONE) _last_started_action = cbf;
2375 }
2376
2378 {
2379 CallBackFunction cbf = CBF_NONE;
2380 switch (hotkey) {
2381 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2382 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2383 case MTEHK_SETTINGS: ShowGameOptions(); break;
2384 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2385 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2386 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2387 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2388 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2389 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2390 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2391 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2392 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2393 case MTEHK_MUSIC: ShowMusicWindow(); break;
2394 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2395 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2396 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2397 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2398 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2399 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2400 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2401 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2402 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2403 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2404 default: return ES_NOT_HANDLED;
2405 }
2406 if (cbf != CBF_NONE) _last_started_action = cbf;
2407 return ES_HANDLED;
2408 }
2409
2411 {
2412 switch (_last_started_action) {
2413 case CBF_PLACE_SIGN:
2414 PlaceProc_Sign(tile);
2415 break;
2416
2417 case CBF_PLACE_LANDINFO:
2418 ShowLandInfo(tile);
2419 break;
2420
2421 default: NOT_REACHED();
2422 }
2423 }
2424
2425 void OnPlaceObjectAbort() override
2426 {
2427 _last_started_action = CBF_NONE;
2428 }
2429
2436
2438 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2439 if (this->IsWidgetLowered(WID_TE_PAUSE) != !!_pause_mode) {
2441 this->SetDirty();
2442 }
2443
2444 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2446 this->SetDirty();
2447 }
2448 }};
2449
2455 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2456 {
2457 if (!gui_scope) return;
2459 }
2460
2461 void OnQueryTextFinished(std::optional<std::string> str) override
2462 {
2463 /* Was 'cancel' pressed? */
2464 if (!str.has_value()) return;
2465
2467 if (!str->empty()) {
2468 value = atoi(str->c_str());
2469 } else {
2470 /* An empty string means revert to the default */
2471 value = CalendarTime::DEF_START_YEAR.base();
2472 }
2473 SetStartingYear(value);
2474
2475 this->SetDirty();
2476 }
2477
2478 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2479 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2480 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2481 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2482 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2483 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2484 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2485 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2486 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2487 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2488 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2489 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2490 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2491 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2492 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2493 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2494 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2495 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2496 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2497 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2498 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2499 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2500 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2501 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2502 }};
2503};
2504
2505static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2506 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2507 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2508 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2509 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
2511 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2513 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2515 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1),
2516 NWidget(WWT_TEXT, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_JUST_DATE_LONG, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2517 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
2518 EndContainer(),
2519 EndContainer(),
2521 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
2523 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2524 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2526 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
2527 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
2528 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
2529 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
2530 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetDataTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION),
2531 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2532 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
2533 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
2535 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2536 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2537 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2538};
2539
2540static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2541{
2542 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2543}
2544
2545static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2546 NWidgetFunction(MakeScenarioToolbar),
2547};
2548
2549static WindowDesc _toolb_scen_desc(
2550 WDP_MANUAL, nullptr, 0, 0,
2553 _nested_toolb_scen_widgets,
2554 &ScenarioEditorToolbarWindow::hotkeys
2555);
2556
2559{
2560 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2561 _last_built_roadtype = ROADTYPE_ROAD;
2562 _last_built_tramtype = ROADTYPE_TRAM;
2563
2564 if (_game_mode == GM_EDITOR) {
2565 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2566 } else {
2567 new MainToolbarWindow(_toolb_normal_desc);
2568 }
2569}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:324
Window for configuring the AIs
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
#define CLRBITS(x, y)
Clears several bits in a variable.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
Drop down icon component.
Company name list item, with company-colour icon, name, and lock components.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
void ShiftDates(TimerGameEconomy::Date interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
Baseclass for nested widgets.
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
uint smallest_x
Smallest horizontal size of the widget in a filled window.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
uint smallest_y
Smallest vertical size of the widget in a filled window.
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
uint current_y
Current vertical size (after resizing).
Baseclass for container widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1212
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in contaier.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
uint panel_widths[2]
The width of the two panels (the text panel and date panel)
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Full blown container to make it behave exactly as we want :)
uint spacers
Number of spacer widgets in this toolbar.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
void Draw(const Window *w) override
Draw the widgets of the tree.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
The absolute minimum year in OTTD.
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
static Date date
Current date in days (day counter).
static void SetDate(Date date, DateFract fract)
Set the date.
Functions related to commands.
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.
Owner
Enum for all companies/owners.
@ INVALID_COMPANY
An invalid company.
@ COMPANY_SPECTATOR
The client is spectating.
@ COMPANY_FIRST
First company, same as owner.
@ MAX_COMPANIES
Maximum number of companies.
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:403
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:362
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:404
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:19
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:20
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:18
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:56
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:55
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition fios_gui.cpp:986
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:445
Window for configuring the Games
PauseMode _pause_mode
The current pause mode.
Definition gfx.cpp:50
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
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:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:40
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:114
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:313
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:18
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:344
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:353
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
@ WKC_MINUS
Definition gfx_type.h:105
@ WKC_EQUALS
= Equals
Definition gfx_type.h:98
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:299
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:316
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 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 SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
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:3297
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:940
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1529
GUI functions that shouldn't be here.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:359
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameSettings()
Open advanced settings window.
void ShowStoryBook(CompanyID company, uint16_t page_id=INVALID_STORY_PAGE, bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
definition of HouseSpec and accessors
LeagueTable base class.
League table GUI functions.
uint8_t LeagueTableID
ID of a league table.
Definition league_type.h:32
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Miscellaneous command definitions.
void ShowQueryString(StringID 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:65
bool _network_server
network-server is active
Definition network.cpp:66
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:141
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.
GRFConfig * _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **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.
@ PM_UNPAUSED
A normal unpaused game.
Definition openttd.h:69
@ PM_PAUSED_NORMAL
A game normally paused.
Definition openttd.h:70
@ 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
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
static const uint8_t PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:918
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:27
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:227
Road specific functions.
RoadTypes _roadtypes_type
Bitmap of road/tram types.
Definition road_cmd.cpp:62
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition road_gui.cpp:994
Functions/types related to the road GUIs.
@ ROADTYPES_NONE
No roadtypes.
Definition road_type.h:39
RoadType
The different roadtypes we support.
Definition road_type.h:25
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:28
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:27
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:19
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:21
@ SC_WORLD
World screenshot.
Definition screenshot.h:23
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:22
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:56
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
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:280
StoryPage base class.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:333
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
TimerGameCalendar::Year starting_year
starting date
EconomySettings economy
settings to change the economy
GameCreationSettings game_creation
settings used during the creation of a game (map)
List of hotkeys for a window.
Definition hotkeys.h:37
All data for a single hotkey.
Definition hotkeys.h:21
Struct about custom league tables.
Definition league_base.h:52
void OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
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 def_width, int def_height) 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.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPaint() override
The window must be repainted.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnTimeout() override
Called when this window's timeout has been reached.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
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 SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
Templated helper to make a type-safe 'typedef' representing a single POD value.
High level window description.
Definition window_gui.h:159
Data structure for an opened window.
Definition window_gui.h:273
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:952
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:732
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:551
uint8_t timeout_timer
Timer value of the WF_TIMEOUT for flags.
Definition window_gui.h:306
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition window_gui.h:484
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:521
ViewportData * viewport
Pointer to viewport data, if present.
Definition window_gui.h:318
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:497
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:416
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:532
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:447
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:977
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:590
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1746
WindowFlags flags
Window flags.
Definition window_gui.h:300
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:387
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:312
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:456
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
Definition window.cpp:1420
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.
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:21
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.
static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
Pop up a generic text only menu.
static CallBackFunction MenuClickCompany(int index)
Handle click on the entry in the Company menu.
static CallBackFunction MenuClickStations(int index)
Handle click on the entry in the Stations menu.
static CallBackFunction MenuClickTown(int index)
Handle click on one of the entries in the Town menu.
static const int LTMN_PERFORMANCE_LEAGUE
Show default league table.
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
static const int LTMN_PERFORMANCE_RATING
Show detailed performance rating.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
static CallBackFunction MenuClickShowRoad(int index)
Handle click on the entry in the Road Vehicles menu.
static const int GRMN_DELIVERED_CARGO_GRAPH
Show delivered cargo graph.
static CallBackFunction MenuClickGraphsOrLeague(int index)
Handle click on the entry in the Graphs or CompanyLeague.
static CallBackFunction MenuClickHelp(int index)
Choose the proper callback function for the main toolbar's help menu.
uint _toolbar_width
Width of the toolbar, shared by statusbar.
static const int GRMN_PERFORMANCE_HISTORY_GRAPH
Show performance history graph.
static CallBackFunction ToolbarOptionsClick(Window *w)
Handle click on Options button in toolbar.
static CallBackFunction MenuClickShowShips(int index)
Handle click on the entry in the Ships menu.
static std::unique_ptr< NWidgetBase > MakeMainToolbar()
static CallBackFunction MenuClickSaveLoad(int index=0)
Handle click on one of the entries in the SaveLoad menu.
static const int CTMN_CLIENT_LIST
Enum for the Company Toolbar's network related buttons.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
static CallBackFunction ToolbarScenBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static const int GRMN_COMPANY_VALUE_GRAPH
Show company value graph.
OptionMenuEntries
Game Option button menu entries.
void ToggleDirtyBlocks()
Toggle drawing of the dirty blocks.
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
static CallBackFunction ToolbarScenBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static CallBackFunction MenuClickBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey=0)
Pop up a generic company list menu.
static CallBackFunction _last_started_action
Last started user action.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
ToolbarMode
Toobar modes.
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.
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
static CallBackFunction MenuClickBuildWater(int)
Handle click on the entry in the Build Waterways menu.
static const int CTMN_SPECTATE
Become spectator.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
static CallBackFunction MenuClickStory(int index)
Handle click on the entry in the Story menu.
void ToggleBoundingBoxes()
Toggle drawing of sprites' bounding boxes.
static CallBackFunction MenuClickBuildAir(int)
Handle click on the entry in the Build Air menu.
void ToggleWidgetOutlines()
Toggle drawing of widget outlihes.
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
CallBackFunction
Callback functions.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Show a company window as spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_END
Helper for knowing the amount of widgets.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:95
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
@ TO_HOUSES
town buildings
@ TO_SIGNS
signs
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?
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:494
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:46
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:52
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:53
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:79
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:58
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1127
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3390
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3293
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:3236
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WF_WHITE_BORDER
Window white border counter bit mask.
Definition window_gui.h:236
@ WF_TIMEOUT
Window timeout counter.
Definition window_gui.h:228
@ WDF_NO_CLOSE
This window can't be interactively closed.
Definition window_gui.h:206
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
Definition window_gui.h:205
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition window_gui.h:146
int WidgetID
Widget ID.
Definition window_type.h:18
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:45
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:58