OpenTTD Source 20251213-master-g1091fa6071
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
150static const int CTMN_CLIENT_LIST = -1;
151static const int CTMN_SPECTATE = -2;
152static const int CTMN_SPECTATOR = -3;
153
160static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
161{
162 DropDownList list;
163
164 switch (widget) {
165 case WID_TN_COMPANIES:
166 if (!_networking) break;
167
168 /* Add the client list button for the companies menu */
169 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
170
172 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
173 }
174 break;
175 case WID_TN_STORY:
176 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
177 break;
178
179 case WID_TN_GOAL:
180 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
181 break;
182 }
183
184 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
185 if (!Company::IsValidID(c)) continue;
186 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
187 }
188
190}
191
192static ToolbarMode _toolbar_mode;
193
194static CallBackFunction SelectSignTool()
195{
196 if (_last_started_action == CBF_PLACE_SIGN) {
198 return CBF_NONE;
199 } else {
200 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
201 return CBF_PLACE_SIGN;
202 }
203}
204
205/* --- Pausing --- */
206
207static CallBackFunction ToolbarPauseClick(Window *)
208{
209 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
210
213 }
214 return CBF_NONE;
215}
216
223{
224 if (_networking) return CBF_NONE; // no fast forward in network game
225
226 ChangeGameSpeed(_game_speed == 100);
227
228 SndClickBeep();
229 return CBF_NONE;
230}
231
235enum OptionMenuEntries : uint8_t {
236 OME_GAMEOPTIONS,
237 OME_AI_SETTINGS,
238 OME_GAMESCRIPT_SETTINGS,
239 OME_NEWGRFSETTINGS,
240 OME_SANDBOX,
241 OME_TRANSPARENCIES,
242 OME_SHOW_TOWNNAMES,
243 OME_SHOW_STATIONNAMES,
244 OME_SHOW_STATIONNAMES_TRAIN,
245 OME_SHOW_STATIONNAMES_LORRY,
246 OME_SHOW_STATIONNAMES_BUS,
247 OME_SHOW_STATIONNAMES_SHIP,
248 OME_SHOW_STATIONNAMES_PLANE,
249 OME_SHOW_STATIONNAMES_GHOST,
250 OME_SHOW_WAYPOINTNAMES,
251 OME_SHOW_SIGNS,
252 OME_SHOW_COMPETITOR_SIGNS,
253 OME_FULL_ANIMATION,
254 OME_FULL_DETAILS,
255 OME_TRANSPARENTBUILDINGS,
256 OME_SHOW_STATIONSIGNS,
257};
258
266{
267 DropDownList list;
268 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
269 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
270 * the settings once they join but never update it. As such don't show the window at all
271 * to network clients. */
273 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
274 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
275 }
276 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
277 if (_game_mode != GM_EDITOR && !_networking) {
278 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
279 }
280 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
281 list.push_back(MakeDropDownListDividerItem());
282 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
283 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
284 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
285 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
286 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
287 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
288 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
289 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1));
290 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
291 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
292 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
293 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
294 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
295 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
296 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
297
298 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions());
299 return CBF_NONE;
300}
301
309{
310 switch (index) {
311 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
312 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
313 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
314 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
315 case OME_SANDBOX: ShowCheatWindow(); break;
316 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
317
318 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
319 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
320 case OME_SHOW_STATIONNAMES_TRAIN: _facility_display_opt.Flip(StationFacility::Train); break;
321 case OME_SHOW_STATIONNAMES_LORRY: _facility_display_opt.Flip(StationFacility::TruckStop); break;
322 case OME_SHOW_STATIONNAMES_BUS: _facility_display_opt.Flip(StationFacility::BusStop); break;
323 case OME_SHOW_STATIONNAMES_SHIP: _facility_display_opt.Flip(StationFacility::Dock); break;
324 case OME_SHOW_STATIONNAMES_PLANE: _facility_display_opt.Flip(StationFacility::Airport); break;
325 case OME_SHOW_STATIONNAMES_GHOST: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break;
326 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
327 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
328 case OME_SHOW_COMPETITOR_SIGNS:
331 break;
332 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
333 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
334 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
335 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
336 }
338 return CBF_NONE;
339}
340
345 SLEME_SAVE_SCENARIO = 0,
346 SLEME_LOAD_SCENARIO,
347 SLEME_SAVE_HEIGHTMAP,
348 SLEME_LOAD_HEIGHTMAP,
349 SLEME_EXIT_TOINTRO,
350 SLEME_EXIT_GAME,
351};
352
357 SLNME_SAVE_GAME = 0,
358 SLNME_LOAD_GAME,
359 SLNME_EXIT_TOINTRO,
360 SLNME_EXIT_GAME,
361};
362
370{
371 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
372 STR_NULL, STR_FILE_MENU_EXIT});
373 return CBF_NONE;
374}
375
383{
384 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
385 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
386 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
387 return CBF_NONE;
388}
389
397{
398 if (_game_mode == GM_EDITOR) {
399 switch (index) {
400 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
401 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
402 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
403 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
404 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
405 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
406 }
407 } else {
408 switch (index) {
409 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
410 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
411 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
412 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
413 }
414 }
415 return CBF_NONE;
416}
417
418/* --- Map button menu --- */
419
420enum MapMenuEntries : uint8_t {
421 MME_SHOW_SMALLMAP = 0,
422 MME_SHOW_EXTRAVIEWPORTS,
423 MME_SHOW_LINKGRAPH,
424 MME_SHOW_SIGNLISTS,
425 MME_SHOW_TOWNDIRECTORY,
426 MME_SHOW_INDUSTRYDIRECTORY,
427};
428
429static CallBackFunction ToolbarMapClick(Window *w)
430{
431 DropDownList list;
432 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
433 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
434 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
435 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
436 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
437 return CBF_NONE;
438}
439
440static CallBackFunction ToolbarScenMapTownDir(Window *w)
441{
442 DropDownList list;
443 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
445 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
446 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
447 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
448 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
449 return CBF_NONE;
450}
451
459{
460 switch (index) {
461 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
462 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
463 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
464 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
465 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
466 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
467 }
468 return CBF_NONE;
469}
470
471/* --- Town button menu --- */
472
473enum TownMenuEntries {
474 TME_SHOW_DIRECTORY = 0,
475 TME_SHOW_FOUND_TOWN,
476 TME_SHOW_PLACE_HOUSES,
477};
478
479static CallBackFunction ToolbarTownClick(Window *w)
480{
481 DropDownList list;
482 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TME_SHOW_DIRECTORY));
483 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TME_SHOW_FOUND_TOWN));
484 if (_settings_game.economy.place_houses != PH_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TME_SHOW_PLACE_HOUSES));
485
486 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
487
488 return CBF_NONE;
489}
490
498{
499 switch (index) {
500 case TME_SHOW_DIRECTORY: ShowTownDirectory(); break;
501 case TME_SHOW_FOUND_TOWN: // Setting could be changed when the dropdown was open
502 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
503 break;
504 case TME_SHOW_PLACE_HOUSES: // Setting could be changed when the dropdown was open
505 if (_settings_game.economy.place_houses != PH_FORBIDDEN) ShowBuildHousePicker(nullptr);
506 break;
507 }
508 return CBF_NONE;
509}
510
511/* --- Subidies button menu --- */
512
513static CallBackFunction ToolbarSubsidiesClick(Window *w)
514{
515 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
516 return CBF_NONE;
517}
518
525{
526 ShowSubsidiesList();
527 return CBF_NONE;
528}
529
530/* --- Stations button menu --- */
531
532static CallBackFunction ToolbarStationsClick(Window *w)
533{
535 return CBF_NONE;
536}
537
545{
547 return CBF_NONE;
548}
549
550/* --- Finances button menu --- */
551
552static CallBackFunction ToolbarFinancesClick(Window *w)
553{
555 return CBF_NONE;
556}
557
565{
567 return CBF_NONE;
568}
569
570/* --- Company's button menu --- */
571
572static CallBackFunction ToolbarCompaniesClick(Window *w)
573{
575 return CBF_NONE;
576}
577
585{
586 if (_networking) {
587 switch (index) {
588 case CTMN_CLIENT_LIST:
589 ShowClientList();
590 return CBF_NONE;
591
592 case CTMN_SPECTATE:
593 if (_network_server) {
596 } else {
598 }
599 return CBF_NONE;
600 }
601 }
602 ShowCompany((CompanyID)index);
603 return CBF_NONE;
604}
605
606/* --- Story button menu --- */
607
608static CallBackFunction ToolbarStoryClick(Window *w)
609{
611 return CBF_NONE;
612}
613
621{
622 ShowStoryBook(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
623 return CBF_NONE;
624}
625
626/* --- Goal button menu --- */
627
628static CallBackFunction ToolbarGoalClick(Window *w)
629{
631 return CBF_NONE;
632}
633
641{
642 ShowGoalsList(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
643 return CBF_NONE;
644}
645
646/* --- Graphs and League Table button menu --- */
647
652static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
653static const int GRMN_INCOME_GRAPH = -2;
654static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
655static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
656static const int GRMN_COMPANY_VALUE_GRAPH = -5;
657static const int GRMN_CARGO_PAYMENT_RATES = -6;
658static const int LTMN_PERFORMANCE_LEAGUE = -7;
659static const int LTMN_PERFORMANCE_RATING = -8;
660static const int LTMN_HIGHSCORE = -9;
661
662static void AddDropDownLeagueTableOptions(DropDownList &list)
663{
664 if (LeagueTable::GetNumItems() > 0) {
665 for (LeagueTable *lt : LeagueTable::Iterate()) {
666 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
667 }
668 } else {
669 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
670 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
671 if (!_networking) {
672 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
673 }
674 }
675}
676
677static CallBackFunction ToolbarGraphsClick(Window *w)
678{
679 DropDownList list;
680
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
683 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
684 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
685 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
686 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
687
688 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
689
690 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, GetToolbarDropDownOptions());
691 return CBF_NONE;
692}
693
694static CallBackFunction ToolbarLeagueClick(Window *w)
695{
696 DropDownList list;
697
698 AddDropDownLeagueTableOptions(list);
699
700 int selected = list[0]->result;
701 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions());
702 return CBF_NONE;
703}
704
712{
713 switch (index) {
714 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
715 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
716 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
717 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
718 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
719 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
720 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
721 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
722 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
723 default: {
724 if (LeagueTable::IsValidID(index)) {
725 ShowScriptLeagueTable((LeagueTableID)index);
726 }
727 }
728 }
729 return CBF_NONE;
730}
731
732
733
734/* --- Industries button menu --- */
735
736static CallBackFunction ToolbarIndustryClick(Window *w)
737{
738 /* Disable build-industry menu if we are a spectator */
740 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
741 } else {
742 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
743 }
744 return CBF_NONE;
745}
746
754{
755 switch (index) {
756 case 0: ShowIndustryDirectory(); break;
757 case 1: ShowIndustryCargoesWindow(); break;
758 case 2: ShowBuildIndustryWindow(); break;
759 }
760 return CBF_NONE;
761}
762
763/* --- Trains button menu + 1 helper function for all vehicles. --- */
764
765static void ToolbarVehicleClick(Window *w, VehicleType veh)
766{
767 CompanyMask dis{};
768
769 for (const Company *c : Company::Iterate()) {
770 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
771 }
773}
774
775
776static CallBackFunction ToolbarTrainClick(Window *w)
777{
778 ToolbarVehicleClick(w, VEH_TRAIN);
779 return CBF_NONE;
780}
781
789{
790 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
791 return CBF_NONE;
792}
793
794/* --- Road vehicle button menu --- */
795
796static CallBackFunction ToolbarRoadClick(Window *w)
797{
798 ToolbarVehicleClick(w, VEH_ROAD);
799 return CBF_NONE;
800}
801
809{
810 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
811 return CBF_NONE;
812}
813
814/* --- Ship button menu --- */
815
816static CallBackFunction ToolbarShipClick(Window *w)
817{
818 ToolbarVehicleClick(w, VEH_SHIP);
819 return CBF_NONE;
820}
821
829{
830 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
831 return CBF_NONE;
832}
833
834/* --- Aircraft button menu --- */
835
836static CallBackFunction ToolbarAirClick(Window *w)
837{
838 ToolbarVehicleClick(w, VEH_AIRCRAFT);
839 return CBF_NONE;
840}
841
849{
850 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
851 return CBF_NONE;
852}
853
854/* --- Zoom in button --- */
855
856static CallBackFunction ToolbarZoomInClick(Window *w)
857{
859 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
860 }
861 return CBF_NONE;
862}
863
864/* --- Zoom out button --- */
865
866static CallBackFunction ToolbarZoomOutClick(Window *w)
867{
869 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
870 }
871 return CBF_NONE;
872}
873
874/* --- Rail button menu --- */
875
876static CallBackFunction ToolbarBuildRailClick(Window *w)
877{
878 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, GetToolbarDropDownOptions());
879 return CBF_NONE;
880}
881
889{
890 _last_built_railtype = (RailType)index;
891 ShowBuildRailToolbar(_last_built_railtype);
892 return CBF_NONE;
893}
894
895/* --- Road button menu --- */
896
897static CallBackFunction ToolbarBuildRoadClick(Window *w)
898{
899 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, GetToolbarDropDownOptions());
900 return CBF_NONE;
901}
902
910{
911 _last_built_roadtype = (RoadType)index;
912 ShowBuildRoadToolbar(_last_built_roadtype);
913 return CBF_NONE;
914}
915
916/* --- Tram button menu --- */
917
918static CallBackFunction ToolbarBuildTramClick(Window *w)
919{
920 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, GetToolbarDropDownOptions());
921 return CBF_NONE;
922}
923
931{
932 _last_built_tramtype = (RoadType)index;
933 ShowBuildRoadToolbar(_last_built_tramtype);
934 return CBF_NONE;
935}
936
937/* --- Water button menu --- */
938
939static CallBackFunction ToolbarBuildWaterClick(Window *w)
940{
941 DropDownList list;
942 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
943 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions());
944 return CBF_NONE;
945}
946
953{
955 return CBF_NONE;
956}
957
958/* --- Airport button menu --- */
959
960static CallBackFunction ToolbarBuildAirClick(Window *w)
961{
962 DropDownList list;
963 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
964 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions());
965 return CBF_NONE;
966}
967
974{
976 return CBF_NONE;
977}
978
979/* --- Forest button menu --- */
980
981static CallBackFunction ToolbarForestClick(Window *w)
982{
983 DropDownList list;
984 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
985 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
986 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
987 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions());
988 return CBF_NONE;
989}
990
998{
999 switch (index) {
1000 case 0: ShowTerraformToolbar(); break;
1001 case 1: ShowBuildTreesToolbar(); break;
1002 case 2: return SelectSignTool();
1003 }
1004 return CBF_NONE;
1005}
1006
1007/* --- Music button menu --- */
1008
1009static CallBackFunction ToolbarMusicClick(Window *w)
1010{
1011 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1012 return CBF_NONE;
1013}
1014
1021{
1022 ShowMusicWindow();
1023 return CBF_NONE;
1024}
1025
1026/* --- Newspaper button menu --- */
1027
1028static CallBackFunction ToolbarNewspaperClick(Window *w)
1029{
1030 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1031 return CBF_NONE;
1032}
1033
1041{
1042 switch (index) {
1043 case 0: ShowLastNewsMessage(); break;
1044 case 1: ShowMessageHistory(); break;
1045 case 2: DeleteAllMessages(); break;
1046 }
1047 return CBF_NONE;
1048}
1049
1050/* --- Help button menu --- */
1051
1052static CallBackFunction PlaceLandBlockInfo()
1053{
1054 if (_last_started_action == CBF_PLACE_LANDINFO) {
1056 return CBF_NONE;
1057 } else {
1058 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1059 return CBF_PLACE_LANDINFO;
1060 }
1061}
1062
1063static CallBackFunction ToolbarHelpClick(Window *w)
1064{
1066 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1067 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1068 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1069 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1070 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1071 } else {
1072 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1073 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1074 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1075 }
1076 return CBF_NONE;
1077}
1078
1087{
1088 extern bool _draw_bounding_boxes;
1089 /* Always allow to toggle them off */
1090 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1091 _draw_bounding_boxes = !_draw_bounding_boxes;
1093 }
1094}
1095
1104{
1105 extern bool _draw_dirty_blocks;
1106 /* Always allow to toggle them off */
1107 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1108 _draw_dirty_blocks = !_draw_dirty_blocks;
1110 }
1111}
1112
1118{
1119 extern bool _draw_widget_outlines;
1120 /* Always allow to toggle them off */
1121 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1122 _draw_widget_outlines = !_draw_widget_outlines;
1124 }
1125}
1126
1132{
1135 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1136
1137 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1138 TimerGameCalendar::SetDate(new_calendar_date, 0);
1139
1140 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1142 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1143
1144 /* Only change the date after changing cached values above. */
1145 TimerGameEconomy::SetDate(new_economy_date, 0);
1146}
1147
1154{
1155 switch (index) {
1156 case 0: return PlaceLandBlockInfo();
1157 case 1: ShowHelpWindow(); break;
1158 case 2: IConsoleSwitch(); break;
1159 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1160 case 4: ShowScreenshotWindow(); break;
1161 case 5: ShowFramerateWindow(); break;
1162 case 6: ShowAboutWindow(); break;
1163 case 7: ShowSpriteAlignerWindow(); break;
1164 case 8: ToggleBoundingBoxes(); break;
1165 case 9: ToggleDirtyBlocks(); break;
1166 case 10: ToggleWidgetOutlines(); break;
1167 }
1168 return CBF_NONE;
1169}
1170
1171/* --- Switch toolbar button --- */
1172
1173static CallBackFunction ToolbarSwitchClick(Window *w)
1174{
1175 if (_toolbar_mode != TB_LOWER) {
1176 _toolbar_mode = TB_LOWER;
1177 } else {
1178 _toolbar_mode = TB_UPPER;
1179 }
1180
1181 w->ReInit();
1182 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1183 SndClickBeep();
1184 return CBF_NONE;
1185}
1186
1187/* --- Scenario editor specific handlers. */
1188
1193{
1194 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1195 return CBF_NONE;
1196}
1197
1198static CallBackFunction ToolbarScenDateBackward(Window *w)
1199{
1200 /* don't allow too fast scrolling */
1201 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1203 w->SetDirty();
1204
1206 }
1207 _left_button_clicked = false;
1208 return CBF_NONE;
1209}
1210
1211static CallBackFunction ToolbarScenDateForward(Window *w)
1212{
1213 /* don't allow too fast scrolling */
1214 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1216 w->SetDirty();
1217
1219 }
1220 _left_button_clicked = false;
1221 return CBF_NONE;
1222}
1223
1224static CallBackFunction ToolbarScenGenLand(Window *w)
1225{
1227
1229 return CBF_NONE;
1230}
1231
1232static CallBackFunction ToolbarScenGenTownClick(Window *w)
1233{
1234 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1235 return CBF_NONE;
1236}
1237
1238static CallBackFunction ToolbarScenGenTown(int index)
1239{
1240 switch (index) {
1241 case 0: ShowFoundTownWindow(); break;
1242 case 1: ShowBuildHousePicker(nullptr); break;
1243 }
1244 return CBF_NONE;
1245}
1246
1247static CallBackFunction ToolbarScenGenIndustry(Window *w)
1248{
1250 ShowBuildIndustryWindow();
1251 return CBF_NONE;
1252}
1253
1254static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1255{
1256 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, GetToolbarDropDownOptions());
1257 return CBF_NONE;
1258}
1259
1267{
1268 _last_built_roadtype = (RoadType)index;
1269 ShowBuildRoadScenToolbar(_last_built_roadtype);
1270 return CBF_NONE;
1271}
1272
1273static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1274{
1275 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, GetToolbarDropDownOptions());
1276 return CBF_NONE;
1277}
1278
1286{
1287 _last_built_tramtype = (RoadType)index;
1288 ShowBuildRoadScenToolbar(_last_built_tramtype);
1289 return CBF_NONE;
1290}
1291
1292static CallBackFunction ToolbarScenBuildDocks(Window *w)
1293{
1296 return CBF_NONE;
1297}
1298
1299static CallBackFunction ToolbarScenPlantTrees(Window *w)
1300{
1302 ShowBuildTreesToolbar();
1303 return CBF_NONE;
1304}
1305
1306static CallBackFunction ToolbarScenPlaceSign(Window *w)
1307{
1309 return SelectSignTool();
1310}
1311
1312static CallBackFunction ToolbarBtn_NULL(Window *)
1313{
1314 return CBF_NONE;
1315}
1316
1317typedef CallBackFunction MenuClickedProc(int index);
1318
1319static MenuClickedProc * const _menu_clicked_procs[] = {
1320 nullptr, // 0
1321 nullptr, // 1
1322 MenuClickSettings, // 2
1323 MenuClickSaveLoad, // 3
1324 MenuClickMap, // 4
1325 MenuClickTown, // 5
1326 MenuClickSubsidies, // 6
1327 MenuClickStations, // 7
1328 MenuClickFinances, // 8
1329 MenuClickCompany, // 9
1330 MenuClickStory, // 10
1331 MenuClickGoal, // 11
1334 MenuClickIndustry, // 14
1335 MenuClickShowTrains, // 15
1336 MenuClickShowRoad, // 16
1337 MenuClickShowShips, // 17
1338 MenuClickShowAir, // 18
1339 MenuClickMap, // 19
1340 nullptr, // 20
1341 MenuClickBuildRail, // 21
1342 MenuClickBuildRoad, // 22
1343 MenuClickBuildTram, // 23
1344 MenuClickBuildWater, // 24
1345 MenuClickBuildAir, // 25
1346 MenuClickForest, // 26
1348 MenuClickNewspaper, // 28
1349 MenuClickHelp, // 29
1350};
1351
1354protected:
1355 uint spacers = 0;
1356
1357public:
1359 {
1360 }
1361
1368 {
1369 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1370 }
1371
1372 void SetupSmallestSize(Window *w) override
1373 {
1374 this->smallest_x = 0; // Biggest child
1375 this->smallest_y = 0; // Biggest child
1376 this->fill_x = 1;
1377 this->fill_y = 0;
1378 this->resize_x = 1; // We only resize in this direction
1379 this->resize_y = 0; // We never resize in this direction
1380 this->spacers = 0;
1381
1382 uint nbuttons = 0;
1383 /* First initialise some variables... */
1384 for (const auto &child_wid : this->children) {
1385 child_wid->SetupSmallestSize(w);
1386 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1387 if (this->IsButton(child_wid->type)) {
1388 nbuttons++;
1389 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1390 } else if (child_wid->type == NWID_SPACER) {
1391 this->spacers++;
1392 }
1393 }
1394
1395 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1396 for (const auto &child_wid : this->children) {
1397 child_wid->current_y = this->smallest_y;
1398 if (!this->IsButton(child_wid->type)) {
1399 child_wid->current_x = child_wid->smallest_x;
1400 }
1401 }
1402
1403 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1404 * displayed there will be no spacers anyway. */
1405 --nbuttons;
1406
1407 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1408 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1409 }
1410
1411 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1412 {
1413 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1414
1415 this->pos_x = x;
1416 this->pos_y = y;
1417 this->current_x = given_width;
1418 this->current_y = given_height;
1419
1420 /* Figure out what are the visible buttons */
1421 uint arrangeable_count, button_count, spacer_count;
1422 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangeable_count, button_count, spacer_count);
1423
1424 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1425 std::map<WidgetID, uint> lookup;
1426 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1427 NWidgetBase *nwid = it->get();
1428 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1429 if (nwid->type == NWID_SPACER) continue;
1430 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1431 assert(nwc != nullptr);
1432 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1433 }
1434
1435 /* Now assign the widgets to their rightful place */
1436 uint position = 0; // Place to put next child relative to origin of the container.
1437 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1438 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1439 uint spacer_i = 0;
1440 uint button_i = 0;
1441
1442 /* Index into the arrangement indices. */
1443 const WidgetID *slotp = rtl ? &arrangement[arrangeable_count - 1] : arrangement;
1444 for (uint i = 0; i < arrangeable_count; i++) {
1445 uint slot = lookup[*slotp];
1446 auto &child_wid = this->children[slot];
1447 /* If we have space to give to the spacers, do that. */
1448 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1449 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1450 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1451 uint add = spacer_space / (spacer_count - spacer_i);
1452 position += add;
1453 spacer_space -= add;
1454 spacer_i++;
1455 }
1456 }
1457
1458 /* Buttons can be scaled, the others not. */
1459 if (this->IsButton(child_wid->type)) {
1460 child_wid->current_x = button_space / (button_count - button_i);
1461 button_space -= child_wid->current_x;
1462 button_i++;
1463 } else {
1464 child_wid->current_x = child_wid->smallest_x;
1465 }
1466 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1467 position += child_wid->current_x;
1468
1469 if (rtl) {
1470 slotp--;
1471 } else {
1472 slotp++;
1473 }
1474 }
1475 }
1476
1477 void Draw(const Window *w) override
1478 {
1479 /* Draw brown-red toolbar bg. */
1480 const Rect r = this->GetCurrentRect();
1483
1484 this->NWidgetContainer::Draw(w);
1485 }
1486
1495 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const = 0;
1496};
1497
1500 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1501 {
1502 static const uint SMALLEST_ARRANGEMENT = 14;
1503 static const uint BIGGEST_ARRANGEMENT = 20;
1504
1505 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1506 * The total number of buttons should be equal to arrangeable_count * 2.
1507 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangeable_count * 2) like a
1508 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1509 * enough space.
1510 */
1511 static const WidgetID arrange14[] = {
1523 WID_TN_AIR,
1526 /* lower toolbar */
1541 };
1542 static const WidgetID arrange15[] = {
1553 WID_TN_AIR,
1558 /* lower toolbar */
1574 };
1575 static const WidgetID arrange16[] = {
1587 WID_TN_AIR,
1592 /* lower toolbar */
1609 };
1610 static const WidgetID arrange17[] = {
1623 WID_TN_AIR,
1628 /* lower toolbar */
1646 };
1647 static const WidgetID arrange18[] = {
1661 WID_TN_AIR,
1666 /* lower toolbar */
1685 };
1686 static const WidgetID arrange19[] = {
1700 WID_TN_AIR,
1706 /* lower toolbar */
1720 WID_TN_AIR,
1726 };
1727 static const WidgetID arrange20[] = {
1741 WID_TN_AIR,
1748 /* lower toolbar */
1762 WID_TN_AIR,
1769 };
1770 static const WidgetID arrange_all[] = {
1796 WID_TN_AIR,
1801 };
1802
1803 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1804 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1805 if (full_buttons > BIGGEST_ARRANGEMENT) {
1806 button_count = arrangeable_count = lengthof(arrange_all);
1807 spacer_count = this->spacers;
1808 return arrange_all;
1809 }
1810
1811 /* Introduce the split toolbar */
1812 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1813
1814 button_count = arrangeable_count = full_buttons;
1815 spacer_count = this->spacers;
1816 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1817 }
1818};
1819
1822 std::array<uint, 2> panel_widths{};
1823
1824 void SetupSmallestSize(Window *w) override
1825 {
1827
1828 /* Find the size of panel_widths */
1829 auto it = this->panel_widths.begin();
1830 for (const auto &child_wid : this->children) {
1831 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1832
1833 assert(it != this->panel_widths.end());
1834 *it = child_wid->current_x;
1835 _toolbar_width += child_wid->current_x;
1836 ++it;
1837 }
1838 }
1839
1840 const WidgetID *GetButtonArrangement(uint &width, uint &arrangeable_count, uint &button_count, uint &spacer_count) const override
1841 {
1842 static const WidgetID arrange_all[] = {
1862 };
1863 static const WidgetID arrange_nopanel[] = {
1882 };
1883 static const WidgetID arrange_switch[] = {
1895 /* lower toolbar */
1907 };
1908
1909 /* If we can place all buttons *and* the panels, show them. */
1910 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1911 if (width >= min_full_width) {
1912 width -= this->panel_widths[0] + this->panel_widths[1];
1913 arrangeable_count = lengthof(arrange_all);
1914 button_count = arrangeable_count - 2;
1915 spacer_count = this->spacers;
1916 return arrange_all;
1917 }
1918
1919 /* 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 */
1920 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1921 if (width > min_small_width) {
1922 width -= this->panel_widths[1];
1923 arrangeable_count = lengthof(arrange_nopanel);
1924 button_count = arrangeable_count - 1;
1925 spacer_count = this->spacers - 1;
1926 return arrange_nopanel;
1927 }
1928
1929 /* Split toolbar */
1930 width -= this->panel_widths[1];
1931 arrangeable_count = lengthof(arrange_switch) / 2;
1932 button_count = arrangeable_count - 1;
1933 spacer_count = 0;
1934 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangeable_count : 0);
1935 }
1936};
1937
1938/* --- Toolbar handling for the 'normal' case */
1939
1940typedef CallBackFunction ToolbarButtonProc(Window *w);
1941
1942static ToolbarButtonProc * const _toolbar_button_procs[] = {
1943 ToolbarPauseClick,
1947 ToolbarMapClick,
1948 ToolbarTownClick,
1949 ToolbarSubsidiesClick,
1950 ToolbarStationsClick,
1951 ToolbarFinancesClick,
1952 ToolbarCompaniesClick,
1953 ToolbarStoryClick,
1954 ToolbarGoalClick,
1955 ToolbarGraphsClick,
1956 ToolbarLeagueClick,
1957 ToolbarIndustryClick,
1958 ToolbarTrainClick,
1959 ToolbarRoadClick,
1960 ToolbarShipClick,
1961 ToolbarAirClick,
1962 ToolbarZoomInClick,
1963 ToolbarZoomOutClick,
1964 ToolbarBuildRailClick,
1965 ToolbarBuildRoadClick,
1966 ToolbarBuildTramClick,
1967 ToolbarBuildWaterClick,
1968 ToolbarBuildAirClick,
1969 ToolbarForestClick,
1970 ToolbarMusicClick,
1971 ToolbarNewspaperClick,
1972 ToolbarHelpClick,
1973 ToolbarSwitchClick,
1974};
1975
1978 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1979 {
1980 this->InitNested(0);
1981
1982 _last_started_action = CBF_NONE;
1984 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1985 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1986 PositionMainToolbar(this);
1988 }
1989
1990 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
1991 {
1992 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
1993 }
1994
1995 void OnPaint() override
1996 {
1997 /* If spectator, disable all construction buttons
1998 * ie : Build road, rail, ships, airports and landscaping
1999 * Since enabled state is the default, just disable when needed */
2001 /* disable company list drop downs, if there are no companies */
2003
2006
2007 this->DrawWidgets();
2008 }
2009
2010 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2011 {
2012 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2013 }
2014
2015 void OnDropdownSelect(WidgetID widget, int index, int) override
2016 {
2017 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2018 if (cbf != CBF_NONE) _last_started_action = cbf;
2019 }
2020
2021 EventState OnHotkey(int hotkey) override
2022 {
2023 CallBackFunction cbf = CBF_NONE;
2024 switch (hotkey) {
2025 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2026 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2027 case MTHK_SETTINGS: ShowGameOptions(); break;
2028 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2029 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2030 case MTHK_SMALLMAP: ShowSmallMap(); break;
2031 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2032 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2033 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2034 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2035 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2036 case MTHK_STORY: ShowStoryBook(_local_company); break;
2037 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2038 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2039 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2040 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2041 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2042 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2043 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2044 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2045 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2046 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2047 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2048 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2049 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2050 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2051 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2052 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2053 case MTHK_MUSIC: ShowMusicWindow(); break;
2054 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2055 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2056 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2057 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2058 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2059 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2060 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2061 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2062 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2063 case MTHK_SIGN_LIST: ShowSignList(); break;
2064 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2065 default: return ES_NOT_HANDLED;
2066 }
2067 if (cbf != CBF_NONE) _last_started_action = cbf;
2068 return ES_HANDLED;
2069 }
2070
2071 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2072 {
2073 switch (_last_started_action) {
2074 case CBF_PLACE_SIGN:
2075 PlaceProc_Sign(tile);
2076 break;
2077
2078 case CBF_PLACE_LANDINFO:
2079 ShowLandInfo(tile);
2080 break;
2081
2082 default: NOT_REACHED();
2083 }
2084 }
2085
2086 void OnPlaceObjectAbort() override
2087 {
2088 _last_started_action = CBF_NONE;
2089 }
2090
2092 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2093 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2096 }
2097
2098 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2101 }
2102 }};
2103
2109 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2110 {
2111 if (!gui_scope) return;
2113 }
2114
2115 static inline HotkeyList hotkeys{"maintoolbar", {
2116 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2117 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2118 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2119 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2120 Hotkey(0, "load_game", MTHK_LOADGAME),
2121 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2122 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2123 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2124 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2125 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2126 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2127 Hotkey(0, "story_book", MTHK_STORY),
2128 Hotkey(0, "goal_list", MTHK_GOAL),
2129 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2130 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2131 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2132 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2133 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2134 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2135 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2136 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2137 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2138 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2139 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2140 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2141 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2142 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2143 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2144 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2145 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2146 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2147 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2148 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2149 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2150 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2151 Hotkey('L', "terraform", MTHK_TERRAFORM),
2152 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2153 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2154 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2155 Hotkey(0, "land_info", MTHK_LANDINFO),
2156 }};
2157};
2158
2159static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2160{
2162 static const std::tuple<WidgetID, WidgetType, SpriteID> toolbar_button_sprites[] = {
2163 {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE},
2164 {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD},
2165 {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS},
2166 {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE},
2167 {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP},
2168 {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN},
2169 {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES},
2170 {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST},
2171 {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE},
2172 {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL},
2173 {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK},
2174 {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL},
2175 {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS},
2176 {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE},
2177 {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY},
2178 {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST},
2179 {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST},
2180 {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST},
2181 {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST},
2182 {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN},
2183 {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT},
2184 {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL},
2185 {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD},
2186 {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS},
2187 {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER},
2188 {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR},
2189 {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING},
2190 {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC},
2191 {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES},
2192 {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY},
2193 {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR},
2194 };
2195
2196 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2197 for (const auto &[widget, tp, sprite] : toolbar_button_sprites) {
2198 switch (widget) {
2199 case WID_TN_SMALL_MAP:
2200 case WID_TN_FINANCES:
2202 case WID_TN_ZOOM_IN:
2204 case WID_TN_MUSIC_SOUND:
2205 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2206 break;
2207 }
2208 auto leaf = std::make_unique<NWidgetLeaf>(tp, COLOUR_GREY, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget);
2209 leaf->SetMinimalSize(20, 20);
2210 hor->Add(std::move(leaf));
2211 }
2212
2213 return hor;
2214}
2215
2216static constexpr std::initializer_list<NWidgetPart> _nested_toolbar_normal_widgets = {
2218};
2219
2220static WindowDesc _toolb_normal_desc(
2221 WDP_MANUAL, {}, 0, 0,
2224 _nested_toolbar_normal_widgets,
2225 &MainToolbarWindow::hotkeys
2226);
2227
2228
2229/* --- Toolbar handling for the scenario editor */
2230
2231static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2232 nullptr, // 0
2233 nullptr, // 1
2234 MenuClickSettings, // 2
2235 MenuClickSaveLoad, // 3
2236 nullptr, // 4
2237 nullptr, // 5
2238 nullptr, // 6
2239 nullptr, // 7
2240 MenuClickMap, // 8
2241 nullptr, // 9
2242 nullptr, // 10
2243 nullptr, // 11
2244 ToolbarScenGenTown, // 12
2245 nullptr, // 13
2248 nullptr, // 16
2249 nullptr, // 17
2250 nullptr, // 18
2251 nullptr, // 19
2253 MenuClickHelp, // 21
2254 nullptr, // 22
2255};
2256
2257static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2258 ToolbarPauseClick,
2262 ToolbarBtn_NULL,
2264 ToolbarScenDateBackward,
2265 ToolbarScenDateForward,
2266 ToolbarScenMapTownDir,
2267 ToolbarZoomInClick,
2268 ToolbarZoomOutClick,
2269 ToolbarScenGenLand,
2270 ToolbarScenGenTownClick,
2271 ToolbarScenGenIndustry,
2272 ToolbarScenBuildRoadClick,
2273 ToolbarScenBuildTramClick,
2274 ToolbarScenBuildDocks,
2275 ToolbarScenPlantTrees,
2276 ToolbarScenPlaceSign,
2277 ToolbarBtn_NULL,
2278 ToolbarMusicClick,
2279 ToolbarHelpClick,
2280 ToolbarSwitchClick,
2281};
2282
2283enum MainToolbarEditorHotkeys : int32_t {
2284 MTEHK_PAUSE,
2285 MTEHK_FASTFORWARD,
2286 MTEHK_SETTINGS,
2287 MTEHK_SAVEGAME,
2288 MTEHK_GENLAND,
2289 MTEHK_GENTOWN,
2290 MTEHK_GENINDUSTRY,
2291 MTEHK_BUILD_ROAD,
2292 MTEHK_BUILD_TRAM,
2293 MTEHK_BUILD_DOCKS,
2294 MTEHK_BUILD_TREES,
2295 MTEHK_SIGN,
2296 MTEHK_MUSIC,
2297 MTEHK_LANDINFO,
2298 MTEHK_SMALL_SCREENSHOT,
2299 MTEHK_ZOOMEDIN_SCREENSHOT,
2300 MTEHK_DEFAULTZOOM_SCREENSHOT,
2301 MTEHK_GIANT_SCREENSHOT,
2302 MTEHK_ZOOM_IN,
2303 MTEHK_ZOOM_OUT,
2304 MTEHK_TERRAFORM,
2305 MTEHK_SMALLMAP,
2306 MTEHK_EXTRA_VIEWPORT,
2307};
2308
2311 {
2312 this->InitNested(0);
2313
2314 _last_started_action = CBF_NONE;
2316 PositionMainToolbar(this);
2318 }
2319
2320 void FindWindowPlacementAndResize(int, int def_height, bool allow_resize) override
2321 {
2322 Window::FindWindowPlacementAndResize(_toolbar_width, def_height, allow_resize);
2323 }
2324
2334
2335 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2336 {
2337 switch (widget) {
2338 case WID_TE_DATE:
2340
2341 default:
2342 return this->Window::GetWidgetString(widget, stringid);
2343 }
2344 }
2345
2346 void DrawWidget(const Rect &r, WidgetID widget) const override
2347 {
2348 switch (widget) {
2349 case WID_TE_SPACER: {
2350 int height = r.Height();
2351 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2352 DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2353 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2354 } else {
2355 DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2356 }
2357 break;
2358 }
2359 }
2360 }
2361
2362 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2363 {
2364 switch (widget) {
2365 case WID_TE_SPACER:
2366 size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2367 break;
2368
2369 case WID_TE_DATE:
2371 break;
2372 }
2373 }
2374
2375 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2376 {
2377 if (_game_mode == GM_MENU) return;
2378 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2379 if (cbf != CBF_NONE) _last_started_action = cbf;
2380 }
2381
2382 void OnDropdownSelect(WidgetID widget, int index, int) override
2383 {
2384 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2385 if (cbf != CBF_NONE) _last_started_action = cbf;
2386 SndClickBeep();
2387 }
2388
2389 EventState OnHotkey(int hotkey) override
2390 {
2391 CallBackFunction cbf = CBF_NONE;
2392 switch (hotkey) {
2393 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2394 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2395 case MTEHK_SETTINGS: ShowGameOptions(); break;
2396 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2397 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2398 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2399 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2400 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2401 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2402 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2403 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2404 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2405 case MTEHK_MUSIC: ShowMusicWindow(); break;
2406 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2407 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2408 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2409 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2410 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2411 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2412 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2413 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2414 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2415 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2416 default: return ES_NOT_HANDLED;
2417 }
2418 if (cbf != CBF_NONE) _last_started_action = cbf;
2419 return ES_HANDLED;
2420 }
2421
2422 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2423 {
2424 switch (_last_started_action) {
2425 case CBF_PLACE_SIGN:
2426 PlaceProc_Sign(tile);
2427 break;
2428
2429 case CBF_PLACE_LANDINFO:
2430 ShowLandInfo(tile);
2431 break;
2432
2433 default: NOT_REACHED();
2434 }
2435 }
2436
2437 void OnPlaceObjectAbort() override
2438 {
2439 _last_started_action = CBF_NONE;
2440 }
2441
2448
2450 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2451 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2453 this->SetDirty();
2454 }
2455
2456 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2458 this->SetDirty();
2459 }
2460 }};
2461
2467 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2468 {
2469 if (!gui_scope) return;
2471 }
2472
2473 void OnQueryTextFinished(std::optional<std::string> str) override
2474 {
2475 /* Was 'cancel' pressed? */
2476 if (!str.has_value()) return;
2477
2479 if (!str->empty()) {
2480 auto val = ParseInteger(*str, 10, true);
2481 if (!val.has_value()) return;
2482 value = static_cast<TimerGameCalendar::Year>(*val);
2483 } else {
2484 /* An empty string means revert to the default */
2486 }
2487 SetStartingYear(value);
2488
2489 this->SetDirty();
2490 }
2491
2492 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2493 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2494 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2495 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2496 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2497 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2498 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2499 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2500 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2501 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2502 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2503 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2504 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2505 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2506 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2507 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2508 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2509 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2510 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2511 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2512 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2513 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2514 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2515 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2516 }};
2517};
2518
2519static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_inner_widgets = {
2520 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2521 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2522 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2523 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2525 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2527 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2529 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),
2530 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2531 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),
2532 EndContainer(),
2533 EndContainer(),
2535 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2537 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2538 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2540 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2541 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2542 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2543 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2544 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2545 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2546 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2547 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2549 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2550 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2551 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2552};
2553
2554static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2555{
2556 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2557}
2558
2559static constexpr std::initializer_list<NWidgetPart> _nested_toolb_scen_widgets = {
2560 NWidgetFunction(MakeScenarioToolbar),
2561};
2562
2563static WindowDesc _toolb_scen_desc(
2564 WDP_MANUAL, {}, 0, 0,
2567 _nested_toolb_scen_widgets,
2568 &ScenarioEditorToolbarWindow::hotkeys
2569);
2570
2573{
2574 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2575 _last_built_roadtype = ROADTYPE_ROAD;
2576 _last_built_tramtype = ROADTYPE_TRAM;
2577
2578 if (_game_mode == GM_EDITOR) {
2579 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2580 } else {
2581 new MainToolbarWindow(_toolb_normal_desc);
2582 }
2583}
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.
Definition fios_gui.cpp:999
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
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 the Games
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:891
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:662
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:966
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1543
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.
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:55
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:978
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:556
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:504
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:1474
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:595
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1820
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
Enum for the Company Toolbar's network related buttons.
static const int GRMN_INCOME_GRAPH
Show income graph.
static CallBackFunction MenuClickMusicWindow(int)
Handle click on the entry in the Music menu.
static CallBackFunction ToolbarScenBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static const int GRMN_COMPANY_VALUE_GRAPH
Show company value graph.
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
Become spectator.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
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
Show a company window as spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_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:1180
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3465
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3368
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:3311
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