OpenTTD Source 20260129-master-g2bb01bd0e4
toolbar_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#include "stdafx.h"
11#include "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
18#include "house.h"
19#include "vehicle_gui.h"
20#include "rail_gui.h"
21#include "road.h"
22#include "road_gui.h"
23#include "vehicle_func.h"
24#include "sound_func.h"
25#include "terraform_gui.h"
26#include "strings_func.h"
27#include "company_func.h"
28#include "company_gui.h"
29#include "vehicle_base.h"
30#include "cheat_func.h"
31#include "transparency_gui.h"
32#include "screenshot.h"
33#include "signs_func.h"
34#include "fios.h"
35#include "console_gui.h"
36#include "news_gui.h"
37#include "ai/ai_gui.hpp"
38#include "game/game_gui.hpp"
39#include "script/script_gui.h"
40#include "tilehighlight_func.h"
41#include "smallmap_gui.h"
42#include "graph_gui.h"
43#include "textbuf_gui.h"
45#include "newgrf_debug.h"
46#include "hotkeys.h"
47#include "engine_base.h"
48#include "highscore.h"
49#include "game/game.hpp"
50#include "goal_base.h"
51#include "story_base.h"
52#include "toolbar_gui.h"
53#include "framerate_type.h"
54#include "screenshot_gui.h"
55#include "misc_cmd.h"
56#include "league_gui.h"
57#include "league_base.h"
58#include "timer/timer.h"
59#include "timer/timer_window.h"
61#include "help_gui.h"
63
65
66#include "network/network.h"
67#include "network/network_gui.h"
69
70#include "table/strings.h"
71
73
74#include "safeguards.h"
75
76
79
80RailType _last_built_railtype;
81RoadType _last_built_roadtype;
82RoadType _last_built_tramtype;
83
85enum ToolbarMode : uint8_t {
86 TB_NORMAL,
87 TB_UPPER,
88 TB_LOWER
89};
90
92enum CallBackFunction : uint8_t {
93 CBF_NONE,
94 CBF_PLACE_SIGN,
95 CBF_PLACE_LANDINFO,
96};
97
99
103class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
104public:
105 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, GetCompanyPalette(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, GetString(STR_COMPANY_NAME_COMPANY_NUM, company, company), company.base(), false, shaded)
106 {
107 }
108};
109
110static DropDownOptions GetToolbarDropDownOptions()
111{
113 return {};
114}
115
123static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
124{
125 ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions());
126}
127
134static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
135{
136 DropDownList list;
137 int i = 0;
138 for (StringID string : strings) {
139 if (string == STR_NULL) {
140 list.push_back(MakeDropDownListDividerItem());
141 } else {
142 list.push_back(MakeDropDownListStringItem(string, i));
143 i++;
144 }
145 }
146 PopupMainToolbarMenu(w, widget, std::move(list), 0);
147}
148
149/* Special values used in the dropdowns related to companies.
150 * They cannot interfere with valid IDs for companies. */
151static const int CTMN_CLIENT_LIST = MAX_COMPANIES;
152static const int CTMN_SPECTATE = COMPANY_SPECTATOR.base();
153static const int CTMN_SPECTATOR = CompanyID::Invalid().base();
154
161static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
162{
163 DropDownList list;
164
165 switch (widget) {
166 case WID_TN_COMPANIES:
167 if (!_networking) break;
168
169 /* Add the client list button for the companies menu */
170 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
171
173 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
174 }
175 break;
176 case WID_TN_STORY:
177 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
178 break;
179
180 case WID_TN_GOAL:
181 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
182 break;
183 }
184
185 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
186 if (!Company::IsValidID(c)) continue;
187 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
188 }
189
191}
192
193static ToolbarMode _toolbar_mode;
194
195static CallBackFunction SelectSignTool()
196{
197 if (_last_started_action == CBF_PLACE_SIGN) {
199 return CBF_NONE;
200 } else {
201 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
202 return CBF_PLACE_SIGN;
203 }
204}
205
206/* --- Pausing --- */
207
208static CallBackFunction ToolbarPauseClick(Window *)
209{
210 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
211
214 }
215 return CBF_NONE;
216}
217
224{
225 if (_networking) return CBF_NONE; // no fast forward in network game
226
227 ChangeGameSpeed(_game_speed == 100);
228
229 SndClickBeep();
230 return CBF_NONE;
231}
232
236enum OptionMenuEntries : uint8_t {
237 OME_GAMEOPTIONS,
238 OME_AI_SETTINGS,
239 OME_GAMESCRIPT_SETTINGS,
240 OME_NEWGRFSETTINGS,
241 OME_SANDBOX,
242 OME_TRANSPARENCIES,
243 OME_SHOW_TOWNNAMES,
244 OME_SHOW_STATIONNAMES,
245 OME_SHOW_STATIONNAMES_TRAIN,
246 OME_SHOW_STATIONNAMES_LORRY,
247 OME_SHOW_STATIONNAMES_BUS,
248 OME_SHOW_STATIONNAMES_SHIP,
249 OME_SHOW_STATIONNAMES_PLANE,
250 OME_SHOW_STATIONNAMES_GHOST,
251 OME_SHOW_WAYPOINTNAMES,
252 OME_SHOW_SIGNS,
253 OME_SHOW_COMPETITOR_SIGNS,
254 OME_FULL_ANIMATION,
255 OME_FULL_DETAILS,
256 OME_TRANSPARENTBUILDINGS,
257 OME_SHOW_STATIONSIGNS,
258};
259
267{
268 DropDownList list;
269 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
270 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
271 * the settings once they join but never update it. As such don't show the window at all
272 * to network clients. */
274 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
275 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
276 }
277 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
278 if (_game_mode != GM_EDITOR && !_networking) {
279 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
280 }
281 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
282 list.push_back(MakeDropDownListDividerItem());
283 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
284 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
285 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
286 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
287 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
288 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
289 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
290 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1));
291 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
292 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
293 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
294 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
295 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
296 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
297 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
298
299 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
300 return CBF_NONE;
301}
302
310{
311 switch (index) {
312 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
313 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
314 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
315 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
316 case OME_SANDBOX: ShowCheatWindow(); break;
317 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
318
319 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
320 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
321 case OME_SHOW_STATIONNAMES_TRAIN: _facility_display_opt.Flip(StationFacility::Train); break;
322 case OME_SHOW_STATIONNAMES_LORRY: _facility_display_opt.Flip(StationFacility::TruckStop); break;
323 case OME_SHOW_STATIONNAMES_BUS: _facility_display_opt.Flip(StationFacility::BusStop); break;
324 case OME_SHOW_STATIONNAMES_SHIP: _facility_display_opt.Flip(StationFacility::Dock); break;
325 case OME_SHOW_STATIONNAMES_PLANE: _facility_display_opt.Flip(StationFacility::Airport); break;
326 case OME_SHOW_STATIONNAMES_GHOST: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break;
327 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
328 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
329 case OME_SHOW_COMPETITOR_SIGNS:
332 break;
333 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
334 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
335 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
336 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
337 }
339 return CBF_NONE;
340}
341
346 SLEME_SAVE_SCENARIO = 0,
347 SLEME_LOAD_SCENARIO,
348 SLEME_SAVE_HEIGHTMAP,
349 SLEME_LOAD_HEIGHTMAP,
350 SLEME_EXIT_TOINTRO,
351 SLEME_EXIT_GAME,
352};
353
358 SLNME_SAVE_GAME = 0,
359 SLNME_LOAD_GAME,
360 SLNME_EXIT_TOINTRO,
361 SLNME_EXIT_GAME,
362};
363
371{
372 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
373 STR_NULL, STR_FILE_MENU_EXIT});
374 return CBF_NONE;
375}
376
384{
385 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
386 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
387 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
388 return CBF_NONE;
389}
390
398{
399 if (_game_mode == GM_EDITOR) {
400 switch (index) {
401 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
402 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
403 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
404 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
405 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
406 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
407 }
408 } else {
409 switch (index) {
410 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
411 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
412 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
413 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
414 }
415 }
416 return CBF_NONE;
417}
418
419/* --- Map button menu --- */
420
421enum MapMenuEntries : uint8_t {
422 MME_SHOW_SMALLMAP = 0,
423 MME_SHOW_EXTRAVIEWPORTS,
424 MME_SHOW_LINKGRAPH,
425 MME_SHOW_SIGNLISTS,
426 MME_SHOW_TOWNDIRECTORY,
427 MME_SHOW_INDUSTRYDIRECTORY,
428};
429
430static CallBackFunction ToolbarMapClick(Window *w)
431{
432 DropDownList list;
433 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
434 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
435 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
436 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
437 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
438 return CBF_NONE;
439}
440
441static CallBackFunction ToolbarScenMapTownDir(Window *w)
442{
443 DropDownList list;
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
445 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
446 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
447 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
448 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
449 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
450 return CBF_NONE;
451}
452
460{
461 switch (index) {
462 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
463 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
464 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
465 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
466 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
467 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
468 }
469 return CBF_NONE;
470}
471
472/* --- Town button menu --- */
473
474enum TownMenuEntries {
475 TME_SHOW_DIRECTORY = 0,
476 TME_SHOW_FOUND_TOWN,
477 TME_SHOW_PLACE_HOUSES,
478};
479
480static CallBackFunction ToolbarTownClick(Window *w)
481{
482 DropDownList list;
483 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TME_SHOW_DIRECTORY));
484 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TME_SHOW_FOUND_TOWN));
485 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TME_SHOW_PLACE_HOUSES));
486
487 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
488
489 return CBF_NONE;
490}
491
499{
500 switch (index) {
501 case TME_SHOW_DIRECTORY: ShowTownDirectory(); break;
502 case TME_SHOW_FOUND_TOWN: // Setting could be changed when the dropdown was open
503 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
504 break;
505 case TME_SHOW_PLACE_HOUSES: // Setting could be changed when the dropdown was open
506 if (_settings_game.economy.place_houses != PlaceHouses::Forbidden) ShowBuildHousePicker(nullptr);
507 break;
508 }
509 return CBF_NONE;
510}
511
512/* --- Subidies button menu --- */
513
514static CallBackFunction ToolbarSubsidiesClick(Window *w)
515{
516 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
517 return CBF_NONE;
518}
519
526{
527 ShowSubsidiesList();
528 return CBF_NONE;
529}
530
531/* --- Stations button menu --- */
532
533static CallBackFunction ToolbarStationsClick(Window *w)
534{
536 return CBF_NONE;
537}
538
546{
548 return CBF_NONE;
549}
550
551/* --- Finances button menu --- */
552
553static CallBackFunction ToolbarFinancesClick(Window *w)
554{
556 return CBF_NONE;
557}
558
566{
568 return CBF_NONE;
569}
570
571/* --- Company's button menu --- */
572
573static CallBackFunction ToolbarCompaniesClick(Window *w)
574{
576 return CBF_NONE;
577}
578
586{
587 if (_networking) {
588 switch (index) {
589 case CTMN_CLIENT_LIST:
590 ShowClientList();
591 return CBF_NONE;
592
593 case CTMN_SPECTATE:
594 if (_network_server) {
597 } else {
599 }
600 return CBF_NONE;
601 }
602 }
603 ShowCompany((CompanyID)index);
604 return CBF_NONE;
605}
606
607/* --- Story button menu --- */
608
609static CallBackFunction ToolbarStoryClick(Window *w)
610{
612 return CBF_NONE;
613}
614
622{
623 ShowStoryBook(CompanyID(index));
624 return CBF_NONE;
625}
626
627/* --- Goal button menu --- */
628
629static CallBackFunction ToolbarGoalClick(Window *w)
630{
632 return CBF_NONE;
633}
634
642{
643 ShowGoalsList(CompanyID(index));
644 return CBF_NONE;
645}
646
647/* --- Graphs and League Table button menu --- */
648
653static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
654static const int GRMN_INCOME_GRAPH = -2;
655static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
656static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
657static const int GRMN_COMPANY_VALUE_GRAPH = -5;
658static const int GRMN_CARGO_PAYMENT_RATES = -6;
659static const int LTMN_PERFORMANCE_LEAGUE = -7;
660static const int LTMN_PERFORMANCE_RATING = -8;
661static const int LTMN_HIGHSCORE = -9;
662
663static void AddDropDownLeagueTableOptions(DropDownList &list)
664{
665 if (LeagueTable::GetNumItems() > 0) {
666 for (LeagueTable *lt : LeagueTable::Iterate()) {
667 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
668 }
669 } else {
670 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
671 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
672 if (!_networking) {
673 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
674 }
675 }
676}
677
678static CallBackFunction ToolbarGraphsClick(Window *w)
679{
680 DropDownList list;
681
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
683 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
684 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
685 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
686 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
687 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
688
689 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
690
691 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, GetToolbarDropDownOptions());
692 return CBF_NONE;
693}
694
695static CallBackFunction ToolbarLeagueClick(Window *w)
696{
697 DropDownList list;
698
699 AddDropDownLeagueTableOptions(list);
700
701 int selected = list[0]->result;
702 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
703 return CBF_NONE;
704}
705
713{
714 switch (index) {
715 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
716 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
717 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
718 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
719 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
720 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
721 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
722 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
723 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
724 default: {
725 if (LeagueTable::IsValidID(index)) {
726 ShowScriptLeagueTable((LeagueTableID)index);
727 }
728 }
729 }
730 return CBF_NONE;
731}
732
733
734
735/* --- Industries button menu --- */
736
737static CallBackFunction ToolbarIndustryClick(Window *w)
738{
739 /* Disable build-industry menu if we are a spectator */
741 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
742 } else {
743 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
744 }
745 return CBF_NONE;
746}
747
755{
756 switch (index) {
757 case 0: ShowIndustryDirectory(); break;
758 case 1: ShowIndustryCargoesWindow(); break;
759 case 2: ShowBuildIndustryWindow(); break;
760 }
761 return CBF_NONE;
762}
763
764/* --- Trains button menu + 1 helper function for all vehicles. --- */
765
766static void ToolbarVehicleClick(Window *w, VehicleType veh)
767{
768 CompanyMask dis{};
769
770 for (const Company *c : Company::Iterate()) {
771 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
772 }
774}
775
776
777static CallBackFunction ToolbarTrainClick(Window *w)
778{
779 ToolbarVehicleClick(w, VEH_TRAIN);
780 return CBF_NONE;
781}
782
790{
791 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
792 return CBF_NONE;
793}
794
795/* --- Road vehicle button menu --- */
796
797static CallBackFunction ToolbarRoadClick(Window *w)
798{
799 ToolbarVehicleClick(w, VEH_ROAD);
800 return CBF_NONE;
801}
802
810{
811 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
812 return CBF_NONE;
813}
814
815/* --- Ship button menu --- */
816
817static CallBackFunction ToolbarShipClick(Window *w)
818{
819 ToolbarVehicleClick(w, VEH_SHIP);
820 return CBF_NONE;
821}
822
830{
831 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
832 return CBF_NONE;
833}
834
835/* --- Aircraft button menu --- */
836
837static CallBackFunction ToolbarAirClick(Window *w)
838{
839 ToolbarVehicleClick(w, VEH_AIRCRAFT);
840 return CBF_NONE;
841}
842
850{
851 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
852 return CBF_NONE;
853}
854
855/* --- Zoom in button --- */
856
857static CallBackFunction ToolbarZoomInClick(Window *w)
858{
860 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
861 }
862 return CBF_NONE;
863}
864
865/* --- Zoom out button --- */
866
867static CallBackFunction ToolbarZoomOutClick(Window *w)
868{
870 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
871 }
872 return CBF_NONE;
873}
874
875/* --- Rail button menu --- */
876
877static CallBackFunction ToolbarBuildRailClick(Window *w)
878{
879 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, GetToolbarDropDownOptions());
880 return CBF_NONE;
881}
882
890{
891 _last_built_railtype = (RailType)index;
892 ShowBuildRailToolbar(_last_built_railtype);
893 return CBF_NONE;
894}
895
896/* --- Road button menu --- */
897
898static CallBackFunction ToolbarBuildRoadClick(Window *w)
899{
900 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, GetToolbarDropDownOptions());
901 return CBF_NONE;
902}
903
911{
912 _last_built_roadtype = (RoadType)index;
913 ShowBuildRoadToolbar(_last_built_roadtype);
914 return CBF_NONE;
915}
916
917/* --- Tram button menu --- */
918
919static CallBackFunction ToolbarBuildTramClick(Window *w)
920{
921 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, GetToolbarDropDownOptions());
922 return CBF_NONE;
923}
924
932{
933 _last_built_tramtype = (RoadType)index;
934 ShowBuildRoadToolbar(_last_built_tramtype);
935 return CBF_NONE;
936}
937
938/* --- Water button menu --- */
939
940static CallBackFunction ToolbarBuildWaterClick(Window *w)
941{
942 DropDownList list;
943 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
944 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
945 return CBF_NONE;
946}
947
954{
956 return CBF_NONE;
957}
958
959/* --- Airport button menu --- */
960
961static CallBackFunction ToolbarBuildAirClick(Window *w)
962{
963 DropDownList list;
964 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
965 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
966 return CBF_NONE;
967}
968
975{
977 return CBF_NONE;
978}
979
980/* --- Forest button menu --- */
981
982static CallBackFunction ToolbarForestClick(Window *w)
983{
984 DropDownList list;
985 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
986 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
987 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
988 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
989 return CBF_NONE;
990}
991
999{
1000 switch (index) {
1001 case 0: ShowTerraformToolbar(); break;
1002 case 1: ShowBuildTreesToolbar(); break;
1003 case 2: return SelectSignTool();
1004 }
1005 return CBF_NONE;
1006}
1007
1008/* --- Music button menu --- */
1009
1010static CallBackFunction ToolbarMusicClick(Window *w)
1011{
1012 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1013 return CBF_NONE;
1014}
1015
1022{
1023 ShowMusicWindow();
1024 return CBF_NONE;
1025}
1026
1027/* --- Newspaper button menu --- */
1028
1029static CallBackFunction ToolbarNewspaperClick(Window *w)
1030{
1031 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1032 return CBF_NONE;
1033}
1034
1042{
1043 switch (index) {
1044 case 0: ShowLastNewsMessage(); break;
1045 case 1: ShowMessageHistory(); break;
1046 case 2: DeleteAllMessages(); break;
1047 }
1048 return CBF_NONE;
1049}
1050
1051/* --- Help button menu --- */
1052
1053static CallBackFunction PlaceLandBlockInfo()
1054{
1055 if (_last_started_action == CBF_PLACE_LANDINFO) {
1057 return CBF_NONE;
1058 } else {
1059 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1060 return CBF_PLACE_LANDINFO;
1061 }
1062}
1063
1064static CallBackFunction ToolbarHelpClick(Window *w)
1065{
1067 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1068 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1069 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1070 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1071 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1072 } else {
1073 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1074 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1075 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1076 }
1077 return CBF_NONE;
1078}
1079
1088{
1089 extern bool _draw_bounding_boxes;
1090 /* Always allow to toggle them off */
1091 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1092 _draw_bounding_boxes = !_draw_bounding_boxes;
1094 }
1095}
1096
1105{
1106 extern bool _draw_dirty_blocks;
1107 /* Always allow to toggle them off */
1108 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1109 _draw_dirty_blocks = !_draw_dirty_blocks;
1111 }
1112}
1113
1119{
1120 extern bool _draw_widget_outlines;
1121 /* Always allow to toggle them off */
1122 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1123 _draw_widget_outlines = !_draw_widget_outlines;
1125 }
1126}
1127
1133{
1136 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1137
1138 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1139 TimerGameCalendar::SetDate(new_calendar_date, 0);
1140
1141 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1143 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1144
1145 /* Only change the date after changing cached values above. */
1146 TimerGameEconomy::SetDate(new_economy_date, 0);
1147}
1148
1155{
1156 switch (index) {
1157 case 0: return PlaceLandBlockInfo();
1158 case 1: ShowHelpWindow(); break;
1159 case 2: IConsoleSwitch(); break;
1160 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1161 case 4: ShowScreenshotWindow(); break;
1162 case 5: ShowFramerateWindow(); break;
1163 case 6: ShowAboutWindow(); break;
1164 case 7: ShowSpriteAlignerWindow(); break;
1165 case 8: ToggleBoundingBoxes(); break;
1166 case 9: ToggleDirtyBlocks(); break;
1167 case 10: ToggleWidgetOutlines(); break;
1168 }
1169 return CBF_NONE;
1170}
1171
1172/* --- Switch toolbar button --- */
1173
1174static CallBackFunction ToolbarSwitchClick(Window *w)
1175{
1176 if (_toolbar_mode != TB_LOWER) {
1177 _toolbar_mode = TB_LOWER;
1178 } else {
1179 _toolbar_mode = TB_UPPER;
1180 }
1181
1182 w->ReInit();
1183 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1184 SndClickBeep();
1185 return CBF_NONE;
1186}
1187
1188/* --- Scenario editor specific handlers. */
1189
1194{
1195 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1196 return CBF_NONE;
1197}
1198
1199static CallBackFunction ToolbarScenDateBackward(Window *w)
1200{
1201 /* don't allow too fast scrolling */
1202 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1204 w->SetDirty();
1205
1207 }
1208 _left_button_clicked = false;
1209 return CBF_NONE;
1210}
1211
1212static CallBackFunction ToolbarScenDateForward(Window *w)
1213{
1214 /* don't allow too fast scrolling */
1215 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1217 w->SetDirty();
1218
1220 }
1221 _left_button_clicked = false;
1222 return CBF_NONE;
1223}
1224
1225static CallBackFunction ToolbarScenGenLand(Window *w)
1226{
1228
1230 return CBF_NONE;
1231}
1232
1233static CallBackFunction ToolbarScenGenTownClick(Window *w)
1234{
1235 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1236 return CBF_NONE;
1237}
1238
1239static CallBackFunction ToolbarScenGenTown(int index)
1240{
1241 switch (index) {
1242 case 0: ShowFoundTownWindow(); break;
1243 case 1: ShowBuildHousePicker(nullptr); break;
1244 }
1245 return CBF_NONE;
1246}
1247
1248static CallBackFunction ToolbarScenGenIndustry(Window *w)
1249{
1251 ShowBuildIndustryWindow();
1252 return CBF_NONE;
1253}
1254
1255static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1256{
1257 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, GetToolbarDropDownOptions());
1258 return CBF_NONE;
1259}
1260
1268{
1269 _last_built_roadtype = (RoadType)index;
1270 ShowBuildRoadScenToolbar(_last_built_roadtype);
1271 return CBF_NONE;
1272}
1273
1274static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1275{
1276 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, GetToolbarDropDownOptions());
1277 return CBF_NONE;
1278}
1279
1287{
1288 _last_built_tramtype = (RoadType)index;
1289 ShowBuildRoadScenToolbar(_last_built_tramtype);
1290 return CBF_NONE;
1291}
1292
1293static CallBackFunction ToolbarScenBuildDocks(Window *w)
1294{
1297 return CBF_NONE;
1298}
1299
1300static CallBackFunction ToolbarScenPlantTrees(Window *w)
1301{
1303 ShowBuildTreesToolbar();
1304 return CBF_NONE;
1305}
1306
1307static CallBackFunction ToolbarScenPlaceSign(Window *w)
1308{
1310 return SelectSignTool();
1311}
1312
1313static CallBackFunction ToolbarBtn_NULL(Window *)
1314{
1315 return CBF_NONE;
1316}
1317
1318typedef CallBackFunction MenuClickedProc(int index);
1319
1320static MenuClickedProc * const _menu_clicked_procs[] = {
1321 nullptr, // 0
1322 nullptr, // 1
1323 MenuClickSettings, // 2
1324 MenuClickSaveLoad, // 3
1325 MenuClickMap, // 4
1326 MenuClickTown, // 5
1327 MenuClickSubsidies, // 6
1328 MenuClickStations, // 7
1329 MenuClickFinances, // 8
1330 MenuClickCompany, // 9
1331 MenuClickStory, // 10
1332 MenuClickGoal, // 11
1335 MenuClickIndustry, // 14
1336 MenuClickShowTrains, // 15
1337 MenuClickShowRoad, // 16
1338 MenuClickShowShips, // 17
1339 MenuClickShowAir, // 18
1340 MenuClickMap, // 19
1341 nullptr, // 20
1342 MenuClickBuildRail, // 21
1343 MenuClickBuildRoad, // 22
1344 MenuClickBuildTram, // 23
1345 MenuClickBuildWater, // 24
1346 MenuClickBuildAir, // 25
1347 MenuClickForest, // 26
1349 MenuClickNewspaper, // 28
1350 MenuClickHelp, // 29
1351};
1352
1355protected:
1356 uint spacers = 0;
1357
1358public:
1360 {
1361 }
1362
1369 {
1370 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1371 }
1372
1373 void SetupSmallestSize(Window *w) override
1374 {
1375 this->smallest_x = 0; // Biggest child
1376 this->smallest_y = 0; // Biggest child
1377 this->fill_x = 1;
1378 this->fill_y = 0;
1379 this->resize_x = 1; // We only resize in this direction
1380 this->resize_y = 0; // We never resize in this direction
1381 this->spacers = 0;
1382
1383 uint nbuttons = 0;
1384 /* First initialise some variables... */
1385 for (const auto &child_wid : this->children) {
1386 child_wid->SetupSmallestSize(w);
1387 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1388 if (this->IsButton(child_wid->type)) {
1389 nbuttons++;
1390 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1391 } else if (child_wid->type == NWID_SPACER) {
1392 this->spacers++;
1393 }
1394 }
1395
1396 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1397 for (const auto &child_wid : this->children) {
1398 child_wid->current_y = this->smallest_y;
1399 if (!this->IsButton(child_wid->type)) {
1400 child_wid->current_x = child_wid->smallest_x;
1401 }
1402 }
1403
1404 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1405 * displayed there will be no spacers anyway. */
1406 --nbuttons;
1407
1408 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1409 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1410 }
1411
1412 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1413 {
1414 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1415
1416 this->pos_x = x;
1417 this->pos_y = y;
1418 this->current_x = given_width;
1419 this->current_y = given_height;
1420
1421 /* Figure out what are the visible buttons */
1422 uint arrangeable_count, button_count, spacer_count;
1423 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_count, button_count, spacer_count);
1424
1425 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1426 std::map<WidgetID, uint> lookup;
1427 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1428 NWidgetBase *nwid = it->get();
1429 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1430 if (nwid->type == NWID_SPACER) continue;
1431 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1432 assert(nwc != nullptr);
1433 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1434 }
1435
1436 /* Now assign the widgets to their rightful place */
1437 uint position = 0; // Place to put next child relative to origin of the container.
1438 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1439 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1440 uint spacer_i = 0;
1441 uint button_i = 0;
1442
1443 /* Index into the arrangement indices. */
1444 const WidgetID *slotp = rtl ? &arrangement[arrangeable_count - 1] : arrangement;
1445 for (uint i = 0; i < arrangeable_count; i++) {
1446 uint slot = lookup[*slotp];
1447 auto &child_wid = this->children[slot];
1448 /* If we have space to give to the spacers, do that. */
1449 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1450 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1451 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1452 uint add = spacer_space / (spacer_count - spacer_i);
1453 position += add;
1454 spacer_space -= add;
1455 spacer_i++;
1456 }
1457 }
1458
1459 /* Buttons can be scaled, the others not. */
1460 if (this->IsButton(child_wid->type)) {
1461 child_wid->current_x = button_space / (button_count - button_i);
1462 button_space -= child_wid->current_x;
1463 button_i++;
1464 } else {
1465 child_wid->current_x = child_wid->smallest_x;
1466 }
1467 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1468 position += child_wid->current_x;
1469
1470 if (rtl) {
1471 slotp--;
1472 } else {
1473 slotp++;
1474 }
1475 }
1476 }
1477
1478 void Draw(const Window *w) override
1479 {
1480 /* Draw brown-red toolbar bg. */
1481 const Rect r = this->GetCurrentRect();
1484
1485 this->NWidgetContainer::Draw(w);
1486 }
1487
1496 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1497};
1498
1501 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1502 {
1503 static const uint SMALLEST_ARRANGEMENT = 14;
1504 static const uint BIGGEST_ARRANGEMENT = 20;
1505
1506 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1507 * The total number of buttons should be equal to arrangeable_count * 2.
1508 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_count * 2) like a
1509 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1510 * enough space.
1511 */
1512 static const WidgetID arrange14[] = {
1524 WID_TN_AIR,
1527 /* lower toolbar */
1542 };
1543 static const WidgetID arrange15[] = {
1554 WID_TN_AIR,
1559 /* lower toolbar */
1575 };
1576 static const WidgetID arrange16[] = {
1588 WID_TN_AIR,
1593 /* lower toolbar */
1610 };
1611 static const WidgetID arrange17[] = {
1624 WID_TN_AIR,
1629 /* lower toolbar */
1647 };
1648 static const WidgetID arrange18[] = {
1662 WID_TN_AIR,
1667 /* lower toolbar */
1686 };
1687 static const WidgetID arrange19[] = {
1701 WID_TN_AIR,
1707 /* lower toolbar */
1721 WID_TN_AIR,
1727 };
1728 static const WidgetID arrange20[] = {
1742 WID_TN_AIR,
1749 /* lower toolbar */
1763 WID_TN_AIR,
1770 };
1771 static const WidgetID arrange_all[] = {
1797 WID_TN_AIR,
1802 };
1803
1804 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1805 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1806 if (full_buttons > BIGGEST_ARRANGEMENT) {
1807 button_count = arrangeable_count = lengthof(arrange_all);
1808 spacer_count = this->spacers;
1809 return arrange_all;
1810 }
1811
1812 /* Introduce the split toolbar */
1813 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1814
1815 button_count = arrangeable_count = full_buttons;
1816 spacer_count = this->spacers;
1817 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1818 }
1819};
1820
1823 std::array<uint, 2> panel_widths{};
1824
1825 void SetupSmallestSize(Window *w) override
1826 {
1828
1829 /* Find the size of panel_widths */
1830 auto it = this->panel_widths.begin();
1831 for (const auto &child_wid : this->children) {
1832 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1833
1834 assert(it != this->panel_widths.end());
1835 *it = child_wid->current_x;
1836 _toolbar_width += child_wid->current_x;
1837 ++it;
1838 }
1839 }
1840
1841 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1842 {
1843 static const WidgetID arrange_all[] = {
1863 };
1864 static const WidgetID arrange_nopanel[] = {
1883 };
1884 static const WidgetID arrange_switch[] = {
1896 /* lower toolbar */
1908 };
1909
1910 /* If we can place all buttons *and* the panels, show them. */
1911 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1912 if (width >= min_full_width) {
1913 width -= this->panel_widths[0] + this->panel_widths[1];
1914 arrangeable_count = lengthof(arrange_all);
1915 button_count = arrangeable_count - 2;
1916 spacer_count = this->spacers;
1917 return arrange_all;
1918 }
1919
1920 /* 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 */
1921 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1922 if (width > min_small_width) {
1923 width -= this->panel_widths[1];
1924 arrangeable_count = lengthof(arrange_nopanel);
1925 button_count = arrangeable_count - 1;
1926 spacer_count = this->spacers - 1;
1927 return arrange_nopanel;
1928 }
1929
1930 /* Split toolbar */
1931 width -= this->panel_widths[1];
1932 arrangeable_count = lengthof(arrange_switch) / 2;
1933 button_count = arrangeable_count - 1;
1934 spacer_count = 0;
1935 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangeable_count : 0);
1936 }
1937};
1938
1939/* --- Toolbar handling for the 'normal' case */
1940
1941typedef CallBackFunction ToolbarButtonProc(Window *w);
1942
1943static ToolbarButtonProc * const _toolbar_button_procs[] = {
1944 ToolbarPauseClick,
1948 ToolbarMapClick,
1949 ToolbarTownClick,
1950 ToolbarSubsidiesClick,
1951 ToolbarStationsClick,
1952 ToolbarFinancesClick,
1953 ToolbarCompaniesClick,
1954 ToolbarStoryClick,
1955 ToolbarGoalClick,
1956 ToolbarGraphsClick,
1957 ToolbarLeagueClick,
1958 ToolbarIndustryClick,
1959 ToolbarTrainClick,
1960 ToolbarRoadClick,
1961 ToolbarShipClick,
1962 ToolbarAirClick,
1963 ToolbarZoomInClick,
1964 ToolbarZoomOutClick,
1965 ToolbarBuildRailClick,
1966 ToolbarBuildRoadClick,
1967 ToolbarBuildTramClick,
1968 ToolbarBuildWaterClick,
1969 ToolbarBuildAirClick,
1970 ToolbarForestClick,
1971 ToolbarMusicClick,
1972 ToolbarNewspaperClick,
1973 ToolbarHelpClick,
1974 ToolbarSwitchClick,
1975};
1976
1979 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1980 {
1981 this->InitNested(0);
1982
1983 _last_started_action = CBF_NONE;
1985 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1986 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1987 PositionMainToolbar(this);
1989 }
1990
1991 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
1992 {
1993 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
1994 }
1995
1996 void OnPaint() override
1997 {
1998 /* If spectator, disable all construction buttons
1999 * ie : Build road, rail, ships, airports and landscaping
2000 * Since enabled state is the default, just disable when needed */
2002 /* disable company list drop downs, if there are no companies */
2004
2007
2008 this->DrawWidgets();
2009 }
2010
2011 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2012 {
2013 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2014 }
2015
2016 void OnDropdownSelect(WidgetID widget, int index, int) override
2017 {
2018 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2019 if (cbf != CBF_NONE) _last_started_action = cbf;
2020 }
2021
2022 EventState OnHotkey(int hotkey) override
2023 {
2024 CallBackFunction cbf = CBF_NONE;
2025 switch (hotkey) {
2026 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2027 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2028 case MTHK_SETTINGS: ShowGameOptions(); break;
2029 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2030 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2031 case MTHK_SMALLMAP: ShowSmallMap(); break;
2032 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2033 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2034 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2035 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2036 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2037 case MTHK_STORY: ShowStoryBook(_local_company); break;
2038 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2039 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2040 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2041 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2042 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2043 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2044 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2045 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2046 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2047 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2048 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2049 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2050 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2051 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2052 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2053 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2054 case MTHK_MUSIC: ShowMusicWindow(); break;
2055 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2056 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2057 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2058 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2059 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2060 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2061 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2062 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2063 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2064 case MTHK_SIGN_LIST: ShowSignList(); break;
2065 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2066 default: return ES_NOT_HANDLED;
2067 }
2068 if (cbf != CBF_NONE) _last_started_action = cbf;
2069 return ES_HANDLED;
2070 }
2071
2072 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2073 {
2074 switch (_last_started_action) {
2075 case CBF_PLACE_SIGN:
2076 PlaceProc_Sign(tile);
2077 break;
2078
2079 case CBF_PLACE_LANDINFO:
2080 ShowLandInfo(tile);
2081 break;
2082
2083 default: NOT_REACHED();
2084 }
2085 }
2086
2087 void OnPlaceObjectAbort() override
2088 {
2089 _last_started_action = CBF_NONE;
2090 }
2091
2093 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2094 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2097 }
2098
2099 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2102 }
2103 }};
2104
2110 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2111 {
2112 if (!gui_scope) return;
2114 }
2115
2116 static inline HotkeyList hotkeys{"maintoolbar", {
2117 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2118 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2119 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2120 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2121 Hotkey(0, "load_game", MTHK_LOADGAME),
2122 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2123 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2124 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2125 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2126 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2127 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2128 Hotkey(0, "story_book", MTHK_STORY),
2129 Hotkey(0, "goal_list", MTHK_GOAL),
2130 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2131 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2132 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2133 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2134 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2135 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2136 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2137 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2138 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2139 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2140 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2141 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2142 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2143 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2144 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2145 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2146 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2147 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2148 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2149 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2150 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2151 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2152 Hotkey('L', "terraform", MTHK_TERRAFORM),
2153 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2154 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2155 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2156 Hotkey(0, "land_info", MTHK_LANDINFO),
2157 }};
2158};
2159
2160static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2161{
2163 static const std::tuple<WidgetID, WidgetType, SpriteID> toolbar_button_sprites[] = {
2164 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2165 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2166 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2167 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2168 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2169 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2170 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2171 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2172 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2173 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2174 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2175 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2176 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2177 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2178 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2179 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2180 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2181 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2182 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2183 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2184 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2185 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2186 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2187 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2188 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2189 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2190 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2191 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2192 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2193 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2194 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2195 };
2196
2197 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2198 for (const auto &[widget, tp, sprite] : toolbar_button_sprites) {
2199 switch (widget) {
2200 case WID_TN_SMALL_MAP:
2201 case WID_TN_FINANCES:
2203 case WID_TN_ZOOM_IN:
2205 case WID_TN_MUSIC_SOUND:
2206 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2207 break;
2208 }
2209 auto leaf = std::make_unique<NWidgetLeaf>(tp, COLOUR_GREY, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2210 leaf->SetMinimalSize(20, 20);
2211 hor->Add(std::move(leaf));
2212 }
2213
2214 return hor;
2215}
2216
2217static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2219};
2220
2221static WindowDesc _toolb_normal_desc(
2222 WDP_MANUAL, {}, 0, 0,
2225 _nested_toolbar_normal_widgets,
2226 &MainToolbarWindow::hotkeys
2227);
2228
2229
2230/* --- Toolbar handling for the scenario editor */
2231
2232static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2233 nullptr, // 0
2234 nullptr, // 1
2235 MenuClickSettings, // 2
2236 MenuClickSaveLoad, // 3
2237 nullptr, // 4
2238 nullptr, // 5
2239 nullptr, // 6
2240 nullptr, // 7
2241 MenuClickMap, // 8
2242 nullptr, // 9
2243 nullptr, // 10
2244 nullptr, // 11
2245 ToolbarScenGenTown, // 12
2246 nullptr, // 13
2249 nullptr, // 16
2250 nullptr, // 17
2251 nullptr, // 18
2252 nullptr, // 19
2254 MenuClickHelp, // 21
2255 nullptr, // 22
2256};
2257
2258static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2259 ToolbarPauseClick,
2263 ToolbarBtn_NULL,
2265 ToolbarScenDateBackward,
2266 ToolbarScenDateForward,
2267 ToolbarScenMapTownDir,
2268 ToolbarZoomInClick,
2269 ToolbarZoomOutClick,
2270 ToolbarScenGenLand,
2271 ToolbarScenGenTownClick,
2272 ToolbarScenGenIndustry,
2273 ToolbarScenBuildRoadClick,
2274 ToolbarScenBuildTramClick,
2275 ToolbarScenBuildDocks,
2276 ToolbarScenPlantTrees,
2277 ToolbarScenPlaceSign,
2278 ToolbarBtn_NULL,
2279 ToolbarMusicClick,
2280 ToolbarHelpClick,
2281 ToolbarSwitchClick,
2282};
2283
2284enum MainToolbarEditorHotkeys : int32_t {
2285 MTEHK_PAUSE,
2286 MTEHK_FASTFORWARD,
2287 MTEHK_SETTINGS,
2288 MTEHK_SAVEGAME,
2289 MTEHK_GENLAND,
2290 MTEHK_GENTOWN,
2291 MTEHK_GENINDUSTRY,
2292 MTEHK_BUILD_ROAD,
2293 MTEHK_BUILD_TRAM,
2294 MTEHK_BUILD_DOCKS,
2295 MTEHK_BUILD_TREES,
2296 MTEHK_SIGN,
2297 MTEHK_MUSIC,
2298 MTEHK_LANDINFO,
2299 MTEHK_SMALL_SCREENSHOT,
2300 MTEHK_ZOOMEDIN_SCREENSHOT,
2301 MTEHK_DEFAULTZOOM_SCREENSHOT,
2302 MTEHK_GIANT_SCREENSHOT,
2303 MTEHK_ZOOM_IN,
2304 MTEHK_ZOOM_OUT,
2305 MTEHK_TERRAFORM,
2306 MTEHK_SMALLMAP,
2307 MTEHK_EXTRA_VIEWPORT,
2308};
2309
2312 {
2313 this->InitNested(0);
2314
2315 _last_started_action = CBF_NONE;
2317 PositionMainToolbar(this);
2319 }
2320
2321 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2322 {
2323 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2324 }
2325
2335
2336 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2337 {
2338 switch (widget) {
2339 case WID_TE_DATE:
2341
2342 default:
2343 return this->Window::GetWidgetString(widget, stringid);
2344 }
2345 }
2346
2347 void DrawWidget(const Rect &r, WidgetID widget) const override
2348 {
2349 switch (widget) {
2350 case WID_TE_SPACER: {
2351 int height = r.Height();
2352 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2353 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2354 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2355 } else {
2356 DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2357 }
2358 break;
2359 }
2360 }
2361 }
2362
2363 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2364 {
2365 switch (widget) {
2366 case WID_TE_SPACER:
2367 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2368 break;
2369
2370 case WID_TE_DATE:
2372 break;
2373 }
2374 }
2375
2376 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2377 {
2378 if (_game_mode == GM_MENU) return;
2379 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2380 if (cbf != CBF_NONE) _last_started_action = cbf;
2381 }
2382
2383 void OnDropdownSelect(WidgetID widget, int index, int) override
2384 {
2385 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2386 if (cbf != CBF_NONE) _last_started_action = cbf;
2387 SndClickBeep();
2388 }
2389
2390 EventState OnHotkey(int hotkey) override
2391 {
2392 CallBackFunction cbf = CBF_NONE;
2393 switch (hotkey) {
2394 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2395 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2396 case MTEHK_SETTINGS: ShowGameOptions(); break;
2397 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2398 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2399 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2400 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2401 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2402 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2403 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2404 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2405 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2406 case MTEHK_MUSIC: ShowMusicWindow(); break;
2407 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2408 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2409 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2410 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2411 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2412 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2413 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2414 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2415 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2416 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2417 default: return ES_NOT_HANDLED;
2418 }
2419 if (cbf != CBF_NONE) _last_started_action = cbf;
2420 return ES_HANDLED;
2421 }
2422
2423 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2424 {
2425 switch (_last_started_action) {
2426 case CBF_PLACE_SIGN:
2427 PlaceProc_Sign(tile);
2428 break;
2429
2430 case CBF_PLACE_LANDINFO:
2431 ShowLandInfo(tile);
2432 break;
2433
2434 default: NOT_REACHED();
2435 }
2436 }
2437
2438 void OnPlaceObjectAbort() override
2439 {
2440 _last_started_action = CBF_NONE;
2441 }
2442
2449
2451 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2452 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2454 this->SetDirty();
2455 }
2456
2457 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2459 this->SetDirty();
2460 }
2461 }};
2462
2468 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2469 {
2470 if (!gui_scope) return;
2472 }
2473
2474 void OnQueryTextFinished(std::optional<std::string> str) override
2475 {
2476 /* Was 'cancel' pressed? */
2477 if (!str.has_value()) return;
2478
2480 if (!str->empty()) {
2481 auto val = ParseInteger(*str, 10, true);
2482 if (!val.has_value()) return;
2483 value = static_cast<TimerGameCalendar::Year>(*val);
2484 } else {
2485 /* An empty string means revert to the default */
2487 }
2488 SetStartingYear(value);
2489
2490 this->SetDirty();
2491 }
2492
2493 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2494 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2495 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2496 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2497 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2498 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2499 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2500 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2501 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2502 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2503 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2504 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2505 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2506 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2507 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2508 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2509 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2510 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2511 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2512 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2513 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2514 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2515 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2516 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2517 }};
2518};
2519
2520static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2521 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2522 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2523 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2524 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2526 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2528 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2530 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1),
2531 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2532 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1),
2533 EndContainer(),
2534 EndContainer(),
2536 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2538 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2539 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2541 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2542 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2543 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2544 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2545 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2546 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2547 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2548 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2550 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2551 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2552 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2553};
2554
2555static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2556{
2557 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2558}
2559
2560static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2561 NWidgetFunction(MakeScenarioToolbar),
2562};
2563
2564static WindowDesc _toolb_scen_desc(
2565 WDP_MANUAL, {}, 0, 0,
2568 _nested_toolb_scen_widgets,
2569 &ScenarioEditorToolbarWindow::hotkeys
2570);
2571
2574{
2575 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2576 _last_built_roadtype = ROADTYPE_ROAD;
2577 _last_built_tramtype = ROADTYPE_TRAM;
2578
2579 if (_game_mode == GM_EDITOR) {
2580 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2581 } else {
2582 new MainToolbarWindow(_toolb_normal_desc);
2583 }
2584}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:334
Window for configuring the AIs.
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr bool None() const
Test if none of the values are set.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Flip(Tvalue_type value)
Flip the value-th bit.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
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:1307
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
std::array< uint, 2 > panel_widths
The width of the two panels (the text panel and date panel)
const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
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.
void Draw(const Window *w) override
Draw the widgets of the tree.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
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.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition dock_gui.cpp:415
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:374
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, DropDownOptions options)
Show a drop down list.
Definition dropdown.cpp:418
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
@ InstantClose
Set if releasing mouse button should close the list regardless of where the cursor is.
Base class for engines.
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:55
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:54
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:20
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:21
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:19
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:425
Window for configuring GS.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:897
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:668
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
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:50
void GfxFillRect(int left, int top, int right, int bottom, const std::variant< PixelColour, PaletteID > &colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:115
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:325
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:389
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:398
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:346
@ WKC_MINUS
Definition gfx_type.h:106
@ WKC_EQUALS
= Equals
Definition gfx_type.h:99
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:311
Graph GUI functions.
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
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:3374
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:968
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1549
GUI functions that shouldn't be here.
void ShowStoryBook(CompanyID company, StoryPageID page_id=StoryPageID::Invalid(), bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:321
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameOptions()
Open the game options window.
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.
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(std::string_view str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _networking
are we in networking mode?
Definition network.cpp:66
bool _network_server
network-server is active
Definition network.cpp:67
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:142
Basic functions/variables used all over the place.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Network functions used by other parts of OpenTTD.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
GUIs related to networking.
@ CLIENT_ID_SERVER
Servers always have this ID.
GRFConfigList _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
Functions/types related to NewGRF debugging.
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
void ShowLastNewsMessage()
Show previous news item.
void ShowMessageHistory()
Display window with news messages history.
GUI functions related to the news.
@ DO_SHOW_TOWN_NAMES
Display town names.
Definition openttd.h:46
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition openttd.h:52
@ DO_FULL_DETAIL
Also draw details of track and roads.
Definition openttd.h:50
@ DO_SHOW_SIGNS
Display signs.
Definition openttd.h:48
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
Definition openttd.h:51
@ DO_SHOW_STATION_NAMES
Display station names.
Definition openttd.h:47
@ DO_FULL_ANIMATION
Perform palette animation.
Definition openttd.h:49
@ Normal
A game normally paused.
static constexpr PixelColour PC_VERY_DARK_RED
Almost-black red palette colour.
static constexpr PixelColour PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:923
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:238
Road specific functions.
RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
Get the mask for road types of the given RoadTramType.
Definition road.h:183
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Functions/types related to the road GUIs.
@ RTT_ROAD
Road road type.
Definition road_type.h:38
@ RTT_TRAM
Tram road type.
Definition road_type.h:39
@ RTTB_ROAD
Road road type bit.
Definition road_type.h:43
@ RTTB_TRAM
Tram road type bit.
Definition road_type.h:44
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:26
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:25
A number of safeguards to prevent using unsafe methods.
void MakeScreenshotWithConfirm(ScreenshotType t)
Make a screenshot.
Functions to make screenshots.
@ SC_VIEWPORT
Screenshot of viewport.
Definition screenshot.h:17
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:19
@ SC_WORLD
World screenshot.
Definition screenshot.h:21
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:20
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
Window for configuring the scripts.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
void SndConfirmBeep()
Play a beep sound for a confirm event if enabled in settings.
Definition sound.cpp:261
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:253
Functions related to sound.
static constexpr StationFacility STATION_FACILITY_GHOST
Fake 'facility' to allow toggling display of recently-removed station signs.
@ Dock
Station with a dock.
@ TruckStop
Station with truck stops.
@ Train
Station with train station.
@ Airport
Station with an airport.
@ BusStop
Station with bus stops.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271
StoryPage base class.
Parse strings.
static std::optional< T > ParseInteger(std::string_view arg, int base=10, bool clamp=false)
Change a string into its number representation.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
PlaceHouses place_houses
players are allowed to place town houses.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool toolbar_dropdown_autoselect
should toolbar dropdown buttons autoselect when releasing the mouse button
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
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) 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.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnTimeout() override
Called when this window's timeout has been reached.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
const IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
Templated helper to make a type-safe 'typedef' representing a single POD value.
Container with the data associated to a single widget.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:980
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:766
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:558
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:307
std::unique_ptr< ViewportData > viewport
Pointer to viewport data, if present.
Definition window_gui.h:319
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:506
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:516
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:492
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:411
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:527
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:442
virtual void FindWindowPlacementAndResize(int def_width, int def_height, bool allow_resize)
Resize window towards the default size.
Definition window.cpp:1476
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:597
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1822
WindowFlags flags
Window flags.
Definition window_gui.h:301
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:313
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:451
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
Stuff related to the text buffer GUI.
@ EnableDefault
enable the 'Default' button ("\0" is returned)
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
@ HT_RECT
rectangle (stations, depots, ...)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the Window system.
static CallBackFunction MenuClickForest(int index)
Handle click on the entry in the landscaping menu.
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
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.
ToolbarMode
Toolbar modes.
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
static const int LTMN_PERFORMANCE_RATING
Show detailed performance rating.
CallBackFunction
Callback functions.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
SaveLoadNormalMenuEntries
SaveLoad entries 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
Indicates the "all connected players" entry.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
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.
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 CallBackFunction _last_started_action
Last started user action.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
static const int GRMN_OPERATING_PROFIT_GRAPH
Enum for the League Toolbar's and Graph Toolbar's related buttons.
static CallBackFunction MenuClickBuildRail(int index)
Handle click on the entry in the Build Rail menu.
static CallBackFunction MenuClickShowAir(int index)
Handle click on the entry in the Aircraft menu.
void AllocateToolbar()
Allocate the toolbar.
static const int GRMN_CARGO_PAYMENT_RATES
Show cargo payment rates graph.
static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
Handle click on SaveLoad button in toolbar in the scenario editor.
static CallBackFunction MenuClickBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static CallBackFunction ToolbarFastForwardClick(Window *)
Toggle fast forward mode.
OptionMenuEntries
Game Option button menu entries.
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey={})
Pop up a generic company list menu.
static CallBackFunction MenuClickBuildWater(int)
Handle click on the entry in the Build Waterways menu.
static const int CTMN_SPECTATE
Indicates the "become spectator" entry.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
static CallBackFunction MenuClickStory(int index)
Handle click on the entry in the Story menu.
void ToggleBoundingBoxes()
Toggle drawing of sprites' bounding boxes.
static CallBackFunction MenuClickBuildAir(int)
Handle click on the entry in the Build Air menu.
void ToggleWidgetOutlines()
Toggle drawing of widget outlines.
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Indicates that a window is being opened for the spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:105
StationFacilities _facility_display_opt
What station facilities to draw.
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren't in the game menu (there's never transpar...
uint8_t _display_opt
What do we want to draw/do?
@ TO_HOUSES
town buildings
@ TO_SIGNS
signs
void ShowTransparencyToolbar()
Show the transparency toolbar.
GUI functions related to transparency.
Base class for all vehicles.
Functions related to vehicles.
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void HandleZoomMessage(Window *w, const Viewport &vp, WidgetID widget_zoom_in, WidgetID widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
Definition viewport.cpp:486
Functions related to (drawing on) viewports.
@ ZOOM_IN
Zoom in (get more detailed view).
@ ZOOM_NONE
Hack, used to update the button status.
@ ZOOM_OUT
Zoom out (get helicopter view).
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:35
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:42
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1182
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3472
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3375
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:3318
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ NoClose
This window can't be interactively closed.
@ NoFocus
This window won't get focus/make any other window lose focus when click.
@ WhiteBorder
Window white border counter bit mask.
@ Timeout
Window timeout counter.
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition window_gui.h:143
int WidgetID
Widget ID.
Definition window_type.h:20
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_SIGN_LIST
Sign list; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:63