OpenTTD Source 20250328-master-gc3457cd4c0
toolbar_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
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"
62
64
65#include "network/network.h"
66#include "network/network_gui.h"
68
69#include "table/strings.h"
70
72
73#include "safeguards.h"
74
75
78
79RailType _last_built_railtype;
80RoadType _last_built_roadtype;
81RoadType _last_built_tramtype;
82
84enum ToolbarMode : uint8_t {
85 TB_NORMAL,
86 TB_UPPER,
87 TB_LOWER
88};
89
91enum CallBackFunction : uint8_t {
92 CBF_NONE,
93 CBF_PLACE_SIGN,
94 CBF_PLACE_LANDINFO,
95};
96
98
102class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
103public:
104 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, GetString(STR_COMPANY_NAME_COMPANY_NUM, company, company), company.base(), false, shaded)
105 {
106 }
107};
108
116static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
117{
118 ShowDropDownList(w, std::move(list), def, widget, 0, true);
120}
121
128static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
129{
130 DropDownList list;
131 int i = 0;
132 for (StringID string : strings) {
133 if (string == STR_NULL) {
134 list.push_back(MakeDropDownListDividerItem());
135 } else {
136 list.push_back(MakeDropDownListStringItem(string, i));
137 i++;
138 }
139 }
140 PopupMainToolbarMenu(w, widget, std::move(list), 0);
141}
142
144static const int CTMN_CLIENT_LIST = -1;
145static const int CTMN_SPECTATE = -2;
146static const int CTMN_SPECTATOR = -3;
147
154static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
155{
156 DropDownList list;
157
158 switch (widget) {
159 case WID_TN_COMPANIES:
160 if (!_networking) break;
161
162 /* Add the client list button for the companies menu */
163 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
164
166 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
167 }
168 break;
169 case WID_TN_STORY:
170 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
171 break;
172
173 case WID_TN_GOAL:
174 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
175 break;
176 }
177
178 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
179 if (!Company::IsValidID(c)) continue;
180 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
181 }
182
184}
185
186static ToolbarMode _toolbar_mode;
187
188static CallBackFunction SelectSignTool()
189{
190 if (_last_started_action == CBF_PLACE_SIGN) {
192 return CBF_NONE;
193 } else {
194 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
195 return CBF_PLACE_SIGN;
196 }
197}
198
199/* --- Pausing --- */
200
201static CallBackFunction ToolbarPauseClick(Window *)
202{
203 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
204
207 }
208 return CBF_NONE;
209}
210
217{
218 if (_networking) return CBF_NONE; // no fast forward in network game
219
220 ChangeGameSpeed(_game_speed == 100);
221
223 return CBF_NONE;
224}
225
229enum OptionMenuEntries : uint8_t {
230 OME_GAMEOPTIONS,
231 OME_SETTINGS,
232 OME_AI_SETTINGS,
233 OME_GAMESCRIPT_SETTINGS,
234 OME_NEWGRFSETTINGS,
235 OME_SANDBOX,
236 OME_TRANSPARENCIES,
237 OME_SHOW_TOWNNAMES,
238 OME_SHOW_STATIONNAMES,
239 OME_SHOW_STATIONNAMES_TRAIN,
240 OME_SHOW_STATIONNAMES_LORRY,
241 OME_SHOW_STATIONNAMES_BUS,
242 OME_SHOW_STATIONNAMES_SHIP,
243 OME_SHOW_STATIONNAMES_PLANE,
244 OME_SHOW_STATIONNAMES_GHOST,
245 OME_SHOW_WAYPOINTNAMES,
246 OME_SHOW_SIGNS,
247 OME_SHOW_COMPETITOR_SIGNS,
248 OME_FULL_ANIMATION,
249 OME_FULL_DETAILS,
250 OME_TRANSPARENTBUILDINGS,
251 OME_SHOW_STATIONSIGNS,
252};
253
261{
262 DropDownList list;
263 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
264 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS));
265 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
266 * the settings once they join but never update it. As such don't show the window at all
267 * to network clients. */
269 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
270 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
271 }
272 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
273 if (_game_mode != GM_EDITOR && !_networking) {
274 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
275 }
276 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
277 list.push_back(MakeDropDownListDividerItem());
278 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
279 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
280 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
281 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
282 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
283 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
284 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
285 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1));
286 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
287 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
288 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
289 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
290 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
291 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
292 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
293
294 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true);
296 return CBF_NONE;
297}
298
306{
307 switch (index) {
308 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
309 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
310 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
311 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
312 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
313 case OME_SANDBOX: ShowCheatWindow(); break;
314 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
315
316 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
317 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
318 case OME_SHOW_STATIONNAMES_TRAIN: _facility_display_opt.Flip(StationFacility::Train); break;
319 case OME_SHOW_STATIONNAMES_LORRY: _facility_display_opt.Flip(StationFacility::TruckStop); break;
320 case OME_SHOW_STATIONNAMES_BUS: _facility_display_opt.Flip(StationFacility::BusStop); break;
321 case OME_SHOW_STATIONNAMES_SHIP: _facility_display_opt.Flip(StationFacility::Dock); break;
322 case OME_SHOW_STATIONNAMES_PLANE: _facility_display_opt.Flip(StationFacility::Airport); break;
323 case OME_SHOW_STATIONNAMES_GHOST: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break;
324 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
325 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
326 case OME_SHOW_COMPETITOR_SIGNS:
329 break;
330 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
331 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
332 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
333 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
334 }
336 return CBF_NONE;
337}
338
343 SLEME_SAVE_SCENARIO = 0,
344 SLEME_LOAD_SCENARIO,
345 SLEME_SAVE_HEIGHTMAP,
346 SLEME_LOAD_HEIGHTMAP,
347 SLEME_EXIT_TOINTRO,
348 SLEME_EXIT_GAME,
349};
350
355 SLNME_SAVE_GAME = 0,
356 SLNME_LOAD_GAME,
357 SLNME_EXIT_TOINTRO,
358 SLNME_EXIT_GAME,
359};
360
368{
369 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
370 STR_NULL, STR_FILE_MENU_EXIT});
371 return CBF_NONE;
372}
373
381{
382 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
383 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
384 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
385 return CBF_NONE;
386}
387
395{
396 if (_game_mode == GM_EDITOR) {
397 switch (index) {
398 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
399 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
400 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
401 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
402 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
403 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
404 }
405 } else {
406 switch (index) {
407 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
408 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
409 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
410 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
411 }
412 }
413 return CBF_NONE;
414}
415
416/* --- Map button menu --- */
417
418enum MapMenuEntries : uint8_t {
419 MME_SHOW_SMALLMAP = 0,
420 MME_SHOW_EXTRAVIEWPORTS,
421 MME_SHOW_LINKGRAPH,
422 MME_SHOW_SIGNLISTS,
423 MME_SHOW_TOWNDIRECTORY,
424 MME_SHOW_INDUSTRYDIRECTORY,
425};
426
427static CallBackFunction ToolbarMapClick(Window *w)
428{
429 DropDownList list;
430 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
431 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
432 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
433 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
434 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
435 return CBF_NONE;
436}
437
438static CallBackFunction ToolbarScenMapTownDir(Window *w)
439{
440 DropDownList list;
441 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
442 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
443 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
444 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
445 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
446 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
447 return CBF_NONE;
448}
449
457{
458 switch (index) {
459 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
460 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
461 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
462 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
463 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
464 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
465 }
466 return CBF_NONE;
467}
468
469/* --- Town button menu --- */
470
471enum TownMenuEntries {
472 TME_SHOW_DIRECTORY = 0,
473 TME_SHOW_FOUND_TOWN,
474 TME_SHOW_PLACE_HOUSES,
475};
476
477static CallBackFunction ToolbarTownClick(Window *w)
478{
479 DropDownList list;
480 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TME_SHOW_DIRECTORY));
481 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TME_SHOW_FOUND_TOWN));
482 if (_settings_game.economy.place_houses != PH_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TME_SHOW_PLACE_HOUSES));
483
484 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
485
486 return CBF_NONE;
487}
488
496{
497 switch (index) {
498 case TME_SHOW_DIRECTORY: ShowTownDirectory(); break;
499 case TME_SHOW_FOUND_TOWN: // Setting could be changed when the dropdown was open
500 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
501 break;
502 case TME_SHOW_PLACE_HOUSES: // Setting could be changed when the dropdown was open
503 if (_settings_game.economy.place_houses != PH_FORBIDDEN) ShowBuildHousePicker(nullptr);
504 break;
505 }
506 return CBF_NONE;
507}
508
509/* --- Subidies button menu --- */
510
511static CallBackFunction ToolbarSubsidiesClick(Window *w)
512{
513 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
514 return CBF_NONE;
515}
516
523{
524 ShowSubsidiesList();
525 return CBF_NONE;
526}
527
528/* --- Stations button menu --- */
529
530static CallBackFunction ToolbarStationsClick(Window *w)
531{
533 return CBF_NONE;
534}
535
543{
545 return CBF_NONE;
546}
547
548/* --- Finances button menu --- */
549
550static CallBackFunction ToolbarFinancesClick(Window *w)
551{
553 return CBF_NONE;
554}
555
563{
565 return CBF_NONE;
566}
567
568/* --- Company's button menu --- */
569
570static CallBackFunction ToolbarCompaniesClick(Window *w)
571{
573 return CBF_NONE;
574}
575
583{
584 if (_networking) {
585 switch (index) {
586 case CTMN_CLIENT_LIST:
587 ShowClientList();
588 return CBF_NONE;
589
590 case CTMN_SPECTATE:
591 if (_network_server) {
594 } else {
596 }
597 return CBF_NONE;
598 }
599 }
600 ShowCompany((CompanyID)index);
601 return CBF_NONE;
602}
603
604/* --- Story button menu --- */
605
606static CallBackFunction ToolbarStoryClick(Window *w)
607{
609 return CBF_NONE;
610}
611
619{
620 ShowStoryBook(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
621 return CBF_NONE;
622}
623
624/* --- Goal button menu --- */
625
626static CallBackFunction ToolbarGoalClick(Window *w)
627{
629 return CBF_NONE;
630}
631
639{
640 ShowGoalsList(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
641 return CBF_NONE;
642}
643
644/* --- Graphs and League Table button menu --- */
645
650static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
651static const int GRMN_INCOME_GRAPH = -2;
652static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
653static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
654static const int GRMN_COMPANY_VALUE_GRAPH = -5;
655static const int GRMN_CARGO_PAYMENT_RATES = -6;
656static const int LTMN_PERFORMANCE_LEAGUE = -7;
657static const int LTMN_PERFORMANCE_RATING = -8;
658static const int LTMN_HIGHSCORE = -9;
659
660static void AddDropDownLeagueTableOptions(DropDownList &list)
661{
662 if (LeagueTable::GetNumItems() > 0) {
663 for (LeagueTable *lt : LeagueTable::Iterate()) {
664 list.push_back(MakeDropDownListStringItem(lt->title.GetDecodedString(), lt->index.base()));
665 }
666 } else {
667 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
668 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
669 if (!_networking) {
670 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
671 }
672 }
673}
674
675static CallBackFunction ToolbarGraphsClick(Window *w)
676{
677 DropDownList list;
678
679 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
680 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
683 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
684 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
685
686 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
687
688 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
690
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, true);
703
704 return CBF_NONE;
705}
706
714{
715 switch (index) {
716 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
717 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
718 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
719 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
720 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
721 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
722 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
723 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
724 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
725 default: {
726 if (LeagueTable::IsValidID(index)) {
727 ShowScriptLeagueTable((LeagueTableID)index);
728 }
729 }
730 }
731 return CBF_NONE;
732}
733
734
735
736/* --- Industries button menu --- */
737
738static CallBackFunction ToolbarIndustryClick(Window *w)
739{
740 /* Disable build-industry menu if we are a spectator */
742 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
743 } else {
744 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
745 }
746 return CBF_NONE;
747}
748
756{
757 switch (index) {
758 case 0: ShowIndustryDirectory(); break;
759 case 1: ShowIndustryCargoesWindow(); break;
760 case 2: ShowBuildIndustryWindow(); break;
761 }
762 return CBF_NONE;
763}
764
765/* --- Trains button menu + 1 helper function for all vehicles. --- */
766
767static void ToolbarVehicleClick(Window *w, VehicleType veh)
768{
769 CompanyMask dis{};
770
771 for (const Company *c : Company::Iterate()) {
772 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
773 }
775}
776
777
778static CallBackFunction ToolbarTrainClick(Window *w)
779{
780 ToolbarVehicleClick(w, VEH_TRAIN);
781 return CBF_NONE;
782}
783
791{
792 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
793 return CBF_NONE;
794}
795
796/* --- Road vehicle button menu --- */
797
798static CallBackFunction ToolbarRoadClick(Window *w)
799{
800 ToolbarVehicleClick(w, VEH_ROAD);
801 return CBF_NONE;
802}
803
811{
812 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
813 return CBF_NONE;
814}
815
816/* --- Ship button menu --- */
817
818static CallBackFunction ToolbarShipClick(Window *w)
819{
820 ToolbarVehicleClick(w, VEH_SHIP);
821 return CBF_NONE;
822}
823
831{
832 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
833 return CBF_NONE;
834}
835
836/* --- Aircraft button menu --- */
837
838static CallBackFunction ToolbarAirClick(Window *w)
839{
840 ToolbarVehicleClick(w, VEH_AIRCRAFT);
841 return CBF_NONE;
842}
843
851{
852 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
853 return CBF_NONE;
854}
855
856/* --- Zoom in button --- */
857
858static CallBackFunction ToolbarZoomInClick(Window *w)
859{
861 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
863 }
864 return CBF_NONE;
865}
866
867/* --- Zoom out button --- */
868
869static CallBackFunction ToolbarZoomOutClick(Window *w)
870{
872 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
874 }
875 return CBF_NONE;
876}
877
878/* --- Rail button menu --- */
879
880static CallBackFunction ToolbarBuildRailClick(Window *w)
881{
882 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
884 return CBF_NONE;
885}
886
894{
895 _last_built_railtype = (RailType)index;
896 ShowBuildRailToolbar(_last_built_railtype);
897 return CBF_NONE;
898}
899
900/* --- Road button menu --- */
901
902static CallBackFunction ToolbarBuildRoadClick(Window *w)
903{
904 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
906 return CBF_NONE;
907}
908
916{
917 _last_built_roadtype = (RoadType)index;
918 ShowBuildRoadToolbar(_last_built_roadtype);
919 return CBF_NONE;
920}
921
922/* --- Tram button menu --- */
923
924static CallBackFunction ToolbarBuildTramClick(Window *w)
925{
926 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
928 return CBF_NONE;
929}
930
938{
939 _last_built_tramtype = (RoadType)index;
940 ShowBuildRoadToolbar(_last_built_tramtype);
941 return CBF_NONE;
942}
943
944/* --- Water button menu --- */
945
946static CallBackFunction ToolbarBuildWaterClick(Window *w)
947{
948 DropDownList list;
949 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
950 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
952 return CBF_NONE;
953}
954
961{
963 return CBF_NONE;
964}
965
966/* --- Airport button menu --- */
967
968static CallBackFunction ToolbarBuildAirClick(Window *w)
969{
970 DropDownList list;
971 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
972 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
974 return CBF_NONE;
975}
976
983{
985 return CBF_NONE;
986}
987
988/* --- Forest button menu --- */
989
990static CallBackFunction ToolbarForestClick(Window *w)
991{
992 DropDownList list;
993 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
994 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
995 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
996 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
998 return CBF_NONE;
999}
1000
1008{
1009 switch (index) {
1010 case 0: ShowTerraformToolbar(); break;
1011 case 1: ShowBuildTreesToolbar(); break;
1012 case 2: return SelectSignTool();
1013 }
1014 return CBF_NONE;
1015}
1016
1017/* --- Music button menu --- */
1018
1019static CallBackFunction ToolbarMusicClick(Window *w)
1020{
1021 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1022 return CBF_NONE;
1023}
1024
1031{
1032 ShowMusicWindow();
1033 return CBF_NONE;
1034}
1035
1036/* --- Newspaper button menu --- */
1037
1038static CallBackFunction ToolbarNewspaperClick(Window *w)
1039{
1040 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1041 return CBF_NONE;
1042}
1043
1051{
1052 switch (index) {
1053 case 0: ShowLastNewsMessage(); break;
1054 case 1: ShowMessageHistory(); break;
1055 case 2: DeleteAllMessages(); break;
1056 }
1057 return CBF_NONE;
1058}
1059
1060/* --- Help button menu --- */
1061
1062static CallBackFunction PlaceLandBlockInfo()
1063{
1064 if (_last_started_action == CBF_PLACE_LANDINFO) {
1066 return CBF_NONE;
1067 } else {
1068 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1069 return CBF_PLACE_LANDINFO;
1070 }
1071}
1072
1073static CallBackFunction ToolbarHelpClick(Window *w)
1074{
1076 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1077 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1078 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1079 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1080 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1081 } else {
1082 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1083 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1084 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1085 }
1086 return CBF_NONE;
1087}
1088
1097{
1098 extern bool _draw_bounding_boxes;
1099 /* Always allow to toggle them off */
1100 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1101 _draw_bounding_boxes = !_draw_bounding_boxes;
1103 }
1104}
1105
1114{
1115 extern bool _draw_dirty_blocks;
1116 /* Always allow to toggle them off */
1117 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1118 _draw_dirty_blocks = !_draw_dirty_blocks;
1120 }
1121}
1122
1128{
1129 extern bool _draw_widget_outlines;
1130 /* Always allow to toggle them off */
1131 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1132 _draw_widget_outlines = !_draw_widget_outlines;
1134 }
1135}
1136
1142{
1144 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1145 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1146
1147 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1148 TimerGameCalendar::SetDate(new_calendar_date, 0);
1149
1150 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1152 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1153
1154 /* Only change the date after changing cached values above. */
1155 TimerGameEconomy::SetDate(new_economy_date, 0);
1156}
1157
1164{
1165 switch (index) {
1166 case 0: return PlaceLandBlockInfo();
1167 case 1: ShowHelpWindow(); break;
1168 case 2: IConsoleSwitch(); break;
1169 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1170 case 4: ShowScreenshotWindow(); break;
1171 case 5: ShowFramerateWindow(); break;
1172 case 6: ShowAboutWindow(); break;
1173 case 7: ShowSpriteAlignerWindow(); break;
1174 case 8: ToggleBoundingBoxes(); break;
1175 case 9: ToggleDirtyBlocks(); break;
1176 case 10: ToggleWidgetOutlines(); break;
1177 }
1178 return CBF_NONE;
1179}
1180
1181/* --- Switch toolbar button --- */
1182
1183static CallBackFunction ToolbarSwitchClick(Window *w)
1184{
1185 if (_toolbar_mode != TB_LOWER) {
1186 _toolbar_mode = TB_LOWER;
1187 } else {
1188 _toolbar_mode = TB_UPPER;
1189 }
1190
1191 w->ReInit();
1192 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1194 return CBF_NONE;
1195}
1196
1197/* --- Scenario editor specific handlers. */
1198
1203{
1204 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QueryStringFlag::EnableDefault);
1205 return CBF_NONE;
1206}
1207
1208static CallBackFunction ToolbarScenDateBackward(Window *w)
1209{
1210 /* don't allow too fast scrolling */
1211 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1213 w->SetDirty();
1214
1216 }
1217 _left_button_clicked = false;
1218 return CBF_NONE;
1219}
1220
1221static CallBackFunction ToolbarScenDateForward(Window *w)
1222{
1223 /* don't allow too fast scrolling */
1224 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1226 w->SetDirty();
1227
1229 }
1230 _left_button_clicked = false;
1231 return CBF_NONE;
1232}
1233
1234static CallBackFunction ToolbarScenGenLand(Window *w)
1235{
1238
1240 return CBF_NONE;
1241}
1242
1243static CallBackFunction ToolbarScenGenTownClick(Window *w)
1244{
1245 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1246 return CBF_NONE;
1247}
1248
1249static CallBackFunction ToolbarScenGenTown(int index)
1250{
1251 switch (index) {
1252 case 0: ShowFoundTownWindow(); break;
1253 case 1: ShowBuildHousePicker(nullptr); break;
1254 }
1255 return CBF_NONE;
1256}
1257
1258static CallBackFunction ToolbarScenGenIndustry(Window *w)
1259{
1262 ShowBuildIndustryWindow();
1263 return CBF_NONE;
1264}
1265
1266static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1267{
1268 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1270 return CBF_NONE;
1271}
1272
1280{
1281 _last_built_roadtype = (RoadType)index;
1282 ShowBuildRoadScenToolbar(_last_built_roadtype);
1283 return CBF_NONE;
1284}
1285
1286static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1287{
1288 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1290 return CBF_NONE;
1291}
1292
1300{
1301 _last_built_tramtype = (RoadType)index;
1302 ShowBuildRoadScenToolbar(_last_built_tramtype);
1303 return CBF_NONE;
1304}
1305
1306static CallBackFunction ToolbarScenBuildDocks(Window *w)
1307{
1311 return CBF_NONE;
1312}
1313
1314static CallBackFunction ToolbarScenPlantTrees(Window *w)
1315{
1318 ShowBuildTreesToolbar();
1319 return CBF_NONE;
1320}
1321
1322static CallBackFunction ToolbarScenPlaceSign(Window *w)
1323{
1326 return SelectSignTool();
1327}
1328
1329static CallBackFunction ToolbarBtn_NULL(Window *)
1330{
1331 return CBF_NONE;
1332}
1333
1334typedef CallBackFunction MenuClickedProc(int index);
1335
1336static MenuClickedProc * const _menu_clicked_procs[] = {
1337 nullptr, // 0
1338 nullptr, // 1
1339 MenuClickSettings, // 2
1340 MenuClickSaveLoad, // 3
1341 MenuClickMap, // 4
1342 MenuClickTown, // 5
1343 MenuClickSubsidies, // 6
1344 MenuClickStations, // 7
1345 MenuClickFinances, // 8
1346 MenuClickCompany, // 9
1347 MenuClickStory, // 10
1348 MenuClickGoal, // 11
1351 MenuClickIndustry, // 14
1352 MenuClickShowTrains, // 15
1353 MenuClickShowRoad, // 16
1354 MenuClickShowShips, // 17
1355 MenuClickShowAir, // 18
1356 MenuClickMap, // 19
1357 nullptr, // 20
1358 MenuClickBuildRail, // 21
1359 MenuClickBuildRoad, // 22
1360 MenuClickBuildTram, // 23
1361 MenuClickBuildWater, // 24
1362 MenuClickBuildAir, // 25
1363 MenuClickForest, // 26
1365 MenuClickNewspaper, // 28
1366 MenuClickHelp, // 29
1367};
1368
1371protected:
1372 uint spacers = 0;
1373
1374public:
1376 {
1377 }
1378
1385 {
1386 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1387 }
1388
1389 void SetupSmallestSize(Window *w) override
1390 {
1391 this->smallest_x = 0; // Biggest child
1392 this->smallest_y = 0; // Biggest child
1393 this->fill_x = 1;
1394 this->fill_y = 0;
1395 this->resize_x = 1; // We only resize in this direction
1396 this->resize_y = 0; // We never resize in this direction
1397 this->spacers = 0;
1398
1399 uint nbuttons = 0;
1400 /* First initialise some variables... */
1401 for (const auto &child_wid : this->children) {
1402 child_wid->SetupSmallestSize(w);
1403 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1404 if (this->IsButton(child_wid->type)) {
1405 nbuttons++;
1406 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1407 } else if (child_wid->type == NWID_SPACER) {
1408 this->spacers++;
1409 }
1410 }
1411
1412 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1413 for (const auto &child_wid : this->children) {
1414 child_wid->current_y = this->smallest_y;
1415 if (!this->IsButton(child_wid->type)) {
1416 child_wid->current_x = child_wid->smallest_x;
1417 }
1418 }
1419
1420 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1421 * displayed there will be no spacers anyway. */
1422 --nbuttons;
1423
1424 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1425 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1426 }
1427
1428 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1429 {
1430 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1431
1432 this->pos_x = x;
1433 this->pos_y = y;
1434 this->current_x = given_width;
1435 this->current_y = given_height;
1436
1437 /* Figure out what are the visible buttons */
1438 uint arrangable_count, button_count, spacer_count;
1439 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1440
1441 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1442 std::map<WidgetID, uint> lookup;
1443 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1444 NWidgetBase *nwid = it->get();
1445 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1446 if (nwid->type == NWID_SPACER) continue;
1447 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(nwid);
1448 assert(nwc != nullptr);
1449 lookup[nwc->GetIndex()] = std::distance(this->children.begin(), it);
1450 }
1451
1452 /* Now assign the widgets to their rightful place */
1453 uint position = 0; // Place to put next child relative to origin of the container.
1454 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1455 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1456 uint spacer_i = 0;
1457 uint button_i = 0;
1458
1459 /* Index into the arrangement indices. */
1460 const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1461 for (uint i = 0; i < arrangable_count; i++) {
1462 uint slot = lookup[*slotp];
1463 auto &child_wid = this->children[slot];
1464 /* If we have space to give to the spacers, do that. */
1465 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1466 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1467 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1468 uint add = spacer_space / (spacer_count - spacer_i);
1469 position += add;
1470 spacer_space -= add;
1471 spacer_i++;
1472 }
1473 }
1474
1475 /* Buttons can be scaled, the others not. */
1476 if (this->IsButton(child_wid->type)) {
1477 child_wid->current_x = button_space / (button_count - button_i);
1478 button_space -= child_wid->current_x;
1479 button_i++;
1480 } else {
1481 child_wid->current_x = child_wid->smallest_x;
1482 }
1483 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1484 position += child_wid->current_x;
1485
1486 if (rtl) {
1487 slotp--;
1488 } else {
1489 slotp++;
1490 }
1491 }
1492 }
1493
1494 void Draw(const Window *w) override
1495 {
1496 /* Draw brown-red toolbar bg. */
1497 const Rect r = this->GetCurrentRect();
1500
1501 this->NWidgetContainer::Draw(w);
1502 }
1503
1512 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1513};
1514
1517 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1518 {
1519 static const uint SMALLEST_ARRANGEMENT = 14;
1520 static const uint BIGGEST_ARRANGEMENT = 20;
1521
1522 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1523 * The total number of buttons should be equal to arrangable_count * 2.
1524 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1525 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1526 * enough space.
1527 */
1528 static const WidgetID arrange14[] = {
1540 WID_TN_AIR,
1543 // lower toolbar
1558 };
1559 static const WidgetID arrange15[] = {
1570 WID_TN_AIR,
1575 // lower toolbar
1591 };
1592 static const WidgetID arrange16[] = {
1604 WID_TN_AIR,
1609 // lower toolbar
1626 };
1627 static const WidgetID arrange17[] = {
1640 WID_TN_AIR,
1645 // lower toolbar
1663 };
1664 static const WidgetID arrange18[] = {
1678 WID_TN_AIR,
1683 // lower toolbar
1702 };
1703 static const WidgetID arrange19[] = {
1717 WID_TN_AIR,
1723 // lower toolbar
1737 WID_TN_AIR,
1743 };
1744 static const WidgetID arrange20[] = {
1758 WID_TN_AIR,
1765 // lower toolbar
1779 WID_TN_AIR,
1786 };
1787 static const WidgetID arrange_all[] = {
1813 WID_TN_AIR,
1818 };
1819
1820 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1821 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1822 if (full_buttons > BIGGEST_ARRANGEMENT) {
1823 button_count = arrangable_count = lengthof(arrange_all);
1824 spacer_count = this->spacers;
1825 return arrange_all;
1826 }
1827
1828 /* Introduce the split toolbar */
1829 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1830
1831 button_count = arrangable_count = full_buttons;
1832 spacer_count = this->spacers;
1833 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1834 }
1835};
1836
1839 std::array<uint, 2> panel_widths{};
1840
1841 void SetupSmallestSize(Window *w) override
1842 {
1844
1845 /* Find the size of panel_widths */
1846 auto it = this->panel_widths.begin();
1847 for (const auto &child_wid : this->children) {
1848 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1849
1850 assert(it != this->panel_widths.end());
1851 *it = child_wid->current_x;
1852 _toolbar_width += child_wid->current_x;
1853 ++it;
1854 }
1855 }
1856
1857 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1858 {
1859 static const WidgetID arrange_all[] = {
1879 };
1880 static const WidgetID arrange_nopanel[] = {
1899 };
1900 static const WidgetID arrange_switch[] = {
1912 // lower toolbar
1924 };
1925
1926 /* If we can place all buttons *and* the panels, show them. */
1927 size_t min_full_width = (lengthof(arrange_all) - std::size(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1928 if (width >= min_full_width) {
1929 width -= this->panel_widths[0] + this->panel_widths[1];
1930 arrangable_count = lengthof(arrange_all);
1931 button_count = arrangable_count - 2;
1932 spacer_count = this->spacers;
1933 return arrange_all;
1934 }
1935
1936 /* 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 */
1937 size_t min_small_width = (lengthof(arrange_switch) - std::size(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1938 if (width > min_small_width) {
1939 width -= this->panel_widths[1];
1940 arrangable_count = lengthof(arrange_nopanel);
1941 button_count = arrangable_count - 1;
1942 spacer_count = this->spacers - 1;
1943 return arrange_nopanel;
1944 }
1945
1946 /* Split toolbar */
1947 width -= this->panel_widths[1];
1948 arrangable_count = lengthof(arrange_switch) / 2;
1949 button_count = arrangable_count - 1;
1950 spacer_count = 0;
1951 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1952 }
1953};
1954
1955/* --- Toolbar handling for the 'normal' case */
1956
1957typedef CallBackFunction ToolbarButtonProc(Window *w);
1958
1959static ToolbarButtonProc * const _toolbar_button_procs[] = {
1960 ToolbarPauseClick,
1964 ToolbarMapClick,
1965 ToolbarTownClick,
1966 ToolbarSubsidiesClick,
1967 ToolbarStationsClick,
1968 ToolbarFinancesClick,
1969 ToolbarCompaniesClick,
1970 ToolbarStoryClick,
1971 ToolbarGoalClick,
1972 ToolbarGraphsClick,
1973 ToolbarLeagueClick,
1974 ToolbarIndustryClick,
1975 ToolbarTrainClick,
1976 ToolbarRoadClick,
1977 ToolbarShipClick,
1978 ToolbarAirClick,
1979 ToolbarZoomInClick,
1980 ToolbarZoomOutClick,
1981 ToolbarBuildRailClick,
1982 ToolbarBuildRoadClick,
1983 ToolbarBuildTramClick,
1984 ToolbarBuildWaterClick,
1985 ToolbarBuildAirClick,
1986 ToolbarForestClick,
1987 ToolbarMusicClick,
1988 ToolbarNewspaperClick,
1989 ToolbarHelpClick,
1990 ToolbarSwitchClick,
1991};
1992
1995 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1996 {
1997 this->InitNested(0);
1998
1999 _last_started_action = CBF_NONE;
2001 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
2002 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
2003 PositionMainToolbar(this);
2005 }
2006
2011
2012 void OnPaint() override
2013 {
2014 /* If spectator, disable all construction buttons
2015 * ie : Build road, rail, ships, airports and landscaping
2016 * Since enabled state is the default, just disable when needed */
2018 /* disable company list drop downs, if there are no companies */
2020
2023
2024 this->DrawWidgets();
2025 }
2026
2027 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2028 {
2029 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2030 }
2031
2032 void OnDropdownSelect(WidgetID widget, int index) override
2033 {
2034 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2035 if (cbf != CBF_NONE) _last_started_action = cbf;
2036 }
2037
2039 {
2040 CallBackFunction cbf = CBF_NONE;
2041 switch (hotkey) {
2042 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2043 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2044 case MTHK_SETTINGS: ShowGameOptions(); break;
2045 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2046 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2047 case MTHK_SMALLMAP: ShowSmallMap(); break;
2048 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2049 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2050 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2051 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2052 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2053 case MTHK_STORY: ShowStoryBook(_local_company); break;
2054 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2055 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2056 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2057 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2058 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2059 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2060 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2061 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2062 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2063 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2064 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2065 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2066 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2067 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2068 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2069 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2070 case MTHK_MUSIC: ShowMusicWindow(); break;
2071 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2072 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2073 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2074 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2075 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2076 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2077 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2078 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2079 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2080 case MTHK_SIGN_LIST: ShowSignList(); break;
2081 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2082 default: return ES_NOT_HANDLED;
2083 }
2084 if (cbf != CBF_NONE) _last_started_action = cbf;
2085 return ES_HANDLED;
2086 }
2087
2089 {
2090 switch (_last_started_action) {
2091 case CBF_PLACE_SIGN:
2092 PlaceProc_Sign(tile);
2093 break;
2094
2095 case CBF_PLACE_LANDINFO:
2096 ShowLandInfo(tile);
2097 break;
2098
2099 default: NOT_REACHED();
2100 }
2101 }
2102
2103 void OnPlaceObjectAbort() override
2104 {
2105 _last_started_action = CBF_NONE;
2106 }
2107
2109 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2110 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2113 }
2114
2115 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2118 }
2119 }};
2120
2121 void OnTimeout() override
2122 {
2123 /* We do not want to automatically raise the pause, fast forward and
2124 * switchbar buttons; they have to stay down when pressed etc. */
2125 for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2126 this->RaiseWidgetWhenLowered(i);
2127 }
2128 }
2129
2135 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2136 {
2137 if (!gui_scope) return;
2139 }
2140
2141 static inline HotkeyList hotkeys{"maintoolbar", {
2142 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2143 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2144 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2145 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2146 Hotkey(0, "load_game", MTHK_LOADGAME),
2147 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2148 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2149 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2150 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2151 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2152 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2153 Hotkey(0, "story_book", MTHK_STORY),
2154 Hotkey(0, "goal_list", MTHK_GOAL),
2155 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2156 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2157 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2158 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2159 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2160 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2161 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2162 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2163 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2164 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2165 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2166 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2167 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2168 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2169 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2170 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2171 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2172 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2173 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2174 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2175 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2176 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2177 Hotkey('L', "terraform", MTHK_TERRAFORM),
2178 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2179 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2180 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2181 Hotkey(0, "land_info", MTHK_LANDINFO),
2182 }};
2183};
2184
2185static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2186{
2188 static const SpriteID toolbar_button_sprites[] = {
2189 SPR_IMG_PAUSE, // WID_TN_PAUSE
2190 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2191 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2192 SPR_IMG_SAVE, // WID_TN_SAVE
2193 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2194 SPR_IMG_TOWN, // WID_TN_TOWNS
2195 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2196 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2197 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2198 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2199 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2200 SPR_IMG_GOAL, // WID_TN_GOAL
2201 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2202 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2203 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2204 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2205 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2206 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2207 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2208 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2209 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2210 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2211 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2212 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2213 SPR_IMG_BUILDWATER, // WID_TN_WATER
2214 SPR_IMG_BUILDAIR, // WID_TN_AIR
2215 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2216 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2217 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2218 SPR_IMG_QUERY, // WID_TN_HELP
2219 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2220 };
2221
2222 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2223 for (WidgetID i = 0; i < WID_TN_END; i++) {
2224 switch (i) {
2225 case WID_TN_SMALL_MAP:
2226 case WID_TN_FINANCES:
2228 case WID_TN_ZOOM_IN:
2230 case WID_TN_MUSIC_SOUND:
2231 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2232 break;
2233 }
2234 auto leaf = std::make_unique<NWidgetLeaf>(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, WidgetData{.sprite = toolbar_button_sprites[i]}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i);
2235 leaf->SetMinimalSize(20, 20);
2236 hor->Add(std::move(leaf));
2237 }
2238
2239 return hor;
2240}
2241
2242static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2244};
2245
2246static WindowDesc _toolb_normal_desc(
2247 WDP_MANUAL, nullptr, 0, 0,
2250 _nested_toolbar_normal_widgets,
2251 &MainToolbarWindow::hotkeys
2252);
2253
2254
2255/* --- Toolbar handling for the scenario editor */
2256
2257static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2258 nullptr, // 0
2259 nullptr, // 1
2260 MenuClickSettings, // 2
2261 MenuClickSaveLoad, // 3
2262 nullptr, // 4
2263 nullptr, // 5
2264 nullptr, // 6
2265 nullptr, // 7
2266 MenuClickMap, // 8
2267 nullptr, // 9
2268 nullptr, // 10
2269 nullptr, // 11
2270 ToolbarScenGenTown, // 12
2271 nullptr, // 13
2274 nullptr, // 16
2275 nullptr, // 17
2276 nullptr, // 18
2277 nullptr, // 19
2279 MenuClickHelp, // 21
2280 nullptr, // 22
2281};
2282
2283static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2284 ToolbarPauseClick,
2288 ToolbarBtn_NULL,
2290 ToolbarScenDateBackward,
2291 ToolbarScenDateForward,
2292 ToolbarScenMapTownDir,
2293 ToolbarZoomInClick,
2294 ToolbarZoomOutClick,
2295 ToolbarScenGenLand,
2296 ToolbarScenGenTownClick,
2297 ToolbarScenGenIndustry,
2298 ToolbarScenBuildRoadClick,
2299 ToolbarScenBuildTramClick,
2300 ToolbarScenBuildDocks,
2301 ToolbarScenPlantTrees,
2302 ToolbarScenPlaceSign,
2303 ToolbarBtn_NULL,
2304 ToolbarMusicClick,
2305 ToolbarHelpClick,
2306 ToolbarSwitchClick,
2307};
2308
2309enum MainToolbarEditorHotkeys : int32_t {
2310 MTEHK_PAUSE,
2311 MTEHK_FASTFORWARD,
2312 MTEHK_SETTINGS,
2313 MTEHK_SAVEGAME,
2314 MTEHK_GENLAND,
2315 MTEHK_GENTOWN,
2316 MTEHK_GENINDUSTRY,
2317 MTEHK_BUILD_ROAD,
2318 MTEHK_BUILD_TRAM,
2319 MTEHK_BUILD_DOCKS,
2320 MTEHK_BUILD_TREES,
2321 MTEHK_SIGN,
2322 MTEHK_MUSIC,
2323 MTEHK_LANDINFO,
2324 MTEHK_SMALL_SCREENSHOT,
2325 MTEHK_ZOOMEDIN_SCREENSHOT,
2326 MTEHK_DEFAULTZOOM_SCREENSHOT,
2327 MTEHK_GIANT_SCREENSHOT,
2328 MTEHK_ZOOM_IN,
2329 MTEHK_ZOOM_OUT,
2330 MTEHK_TERRAFORM,
2331 MTEHK_SMALLMAP,
2332 MTEHK_EXTRA_VIEWPORT,
2333};
2334
2337 {
2338 this->InitNested(0);
2339
2340 _last_started_action = CBF_NONE;
2342 PositionMainToolbar(this);
2344 }
2345
2350
2360
2361 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
2362 {
2363 switch (widget) {
2364 case WID_TE_DATE:
2366
2367 default:
2368 return this->Window::GetWidgetString(widget, stringid);
2369 }
2370 }
2371
2372 void DrawWidget(const Rect &r, WidgetID widget) const override
2373 {
2374 switch (widget) {
2375 case WID_TE_SPACER: {
2376 int height = r.Height();
2377 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2379 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2380 } else {
2382 }
2383 break;
2384 }
2385 }
2386 }
2387
2389 {
2390 switch (widget) {
2391 case WID_TE_SPACER:
2393 break;
2394
2395 case WID_TE_DATE:
2397 break;
2398 }
2399 }
2400
2401 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2402 {
2403 if (_game_mode == GM_MENU) return;
2404 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2405 if (cbf != CBF_NONE) _last_started_action = cbf;
2406 }
2407
2408 void OnDropdownSelect(WidgetID widget, int index) override
2409 {
2410 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2411 if (cbf != CBF_NONE) _last_started_action = cbf;
2413 }
2414
2416 {
2417 CallBackFunction cbf = CBF_NONE;
2418 switch (hotkey) {
2419 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2420 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2421 case MTEHK_SETTINGS: ShowGameOptions(); break;
2422 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2423 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2424 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2425 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2426 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2427 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2428 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2429 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2430 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2431 case MTEHK_MUSIC: ShowMusicWindow(); break;
2432 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2433 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2434 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2435 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2436 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2437 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2438 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2439 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2440 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2441 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2442 default: return ES_NOT_HANDLED;
2443 }
2444 if (cbf != CBF_NONE) _last_started_action = cbf;
2445 return ES_HANDLED;
2446 }
2447
2449 {
2450 switch (_last_started_action) {
2451 case CBF_PLACE_SIGN:
2452 PlaceProc_Sign(tile);
2453 break;
2454
2455 case CBF_PLACE_LANDINFO:
2456 ShowLandInfo(tile);
2457 break;
2458
2459 default: NOT_REACHED();
2460 }
2461 }
2462
2463 void OnPlaceObjectAbort() override
2464 {
2465 _last_started_action = CBF_NONE;
2466 }
2467
2474
2476 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2477 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2479 this->SetDirty();
2480 }
2481
2482 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2484 this->SetDirty();
2485 }
2486 }};
2487
2493 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2494 {
2495 if (!gui_scope) return;
2497 }
2498
2499 void OnQueryTextFinished(std::optional<std::string> str) override
2500 {
2501 /* Was 'cancel' pressed? */
2502 if (!str.has_value()) return;
2503
2505 if (!str->empty()) {
2506 value = TimerGameCalendar::Year{atoi(str->c_str())};
2507 } else {
2508 /* An empty string means revert to the default */
2510 }
2511 SetStartingYear(value);
2512
2513 this->SetDirty();
2514 }
2515
2516 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2517 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2518 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2519 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2520 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2521 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2522 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2523 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2524 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2525 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2526 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2527 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2528 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2529 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2530 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2531 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2532 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2533 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2534 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2535 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2536 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2537 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2538 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2539 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2540 }};
2541};
2542
2543static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2544 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2545 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2546 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2547 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2549 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2551 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2553 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),
2554 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetToolTip(STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2555 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),
2556 EndContainer(),
2557 EndContainer(),
2559 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2561 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2562 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2564 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2565 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2566 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2567 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2568 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2569 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2570 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2571 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2573 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2574 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2575 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2576};
2577
2578static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2579{
2580 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2581}
2582
2583static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2584 NWidgetFunction(MakeScenarioToolbar),
2585};
2586
2587static WindowDesc _toolb_scen_desc(
2588 WDP_MANUAL, nullptr, 0, 0,
2591 _nested_toolb_scen_widgets,
2592 &ScenarioEditorToolbarWindow::hotkeys
2593);
2594
2597{
2598 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2599 _last_built_roadtype = ROADTYPE_ROAD;
2600 _last_built_tramtype = ROADTYPE_TRAM;
2601
2602 if (_game_mode == GM_EDITOR) {
2603 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2604 } else {
2605 new MainToolbarWindow(_toolb_normal_desc);
2606 }
2607}
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.
debug_inline 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 & 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.
constexpr Timpl & Reset(Tvalue_type value)
Reset the value-th bit.
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:1294
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
WidgetID GetIndex() const
Get the WidgetID of this nested widget.
Definition widget.cpp:1234
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
std::array< uint, 2 > panel_widths
The width of the two panels (the text panel and date panel)
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Full blown container to make it behave exactly as we want :)
uint spacers
Number of spacer widgets in this toolbar.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
void Draw(const Window *w) override
Draw the widgets of the tree.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
The absolute minimum year in OTTD.
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
static Date date
Current date in days (day counter).
static void SetDate(Date date, DateFract fract)
Set the date.
Functions related to commands.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
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:410
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:369
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:407
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
@ SLO_SAVE
File is being saved.
Definition fileio_type.h:56
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:55
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:19
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:20
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:18
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition fios_gui.cpp:984
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:423
Window for configuring the Games
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:852
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:658
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:40
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:115
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:50
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:325
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:245
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:378
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:387
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:335
@ 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:3359
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
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 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:945
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1500
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:319
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameSettings()
Open advanced settings window.
void 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:67
bool _network_server
network-server is active
Definition network.cpp:68
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:143
Basic functions/variables used all over the place.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Network functions used by other parts of OpenTTD.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
GUIs related to networking.
@ CLIENT_ID_SERVER
Servers always have this ID.
GRFConfigList _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
Functions/types related to NewGRF debugging.
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
void ShowLastNewsMessage()
Show previous news item.
void ShowMessageHistory()
Display window with news messages history.
GUI functions related to the news.
@ DO_SHOW_TOWN_NAMES
Display town names.
Definition openttd.h:46
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition openttd.h:52
@ DO_FULL_DETAIL
Also draw details of track and roads.
Definition openttd.h:50
@ DO_SHOW_SIGNS
Display signs.
Definition openttd.h:48
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
Definition openttd.h:51
@ DO_SHOW_STATION_NAMES
Display station names.
Definition openttd.h:47
@ DO_FULL_ANIMATION
Perform palette animation.
Definition openttd.h:49
@ Normal
A game normally paused.
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
static const uint8_t PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:918
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:226
Road specific functions.
RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
Get the mask for road types of the given RoadTramType.
Definition road.h:198
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition road_gui.cpp:997
Functions/types related to the road GUIs.
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:59
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:58
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
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:277
StoryPage base class.
@ 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:426
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
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 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
void OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static 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.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnTimeout() override
Called when this window's timeout has been reached.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
Templated helper to make a type-safe 'typedef' representing a single POD value.
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:957
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:744
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
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:504
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition window_gui.h:479
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
ViewportData * viewport
Pointer to viewport data, if present.
Definition window_gui.h:319
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
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:973
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:1751
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
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
Definition window.cpp:1425
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
Toobar 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 outlihes.
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Show a company window as spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_END
Helper for knowing the amount of widgets.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:97
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:496
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:36
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:42
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:43
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:69
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:65
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:48
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1132
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3397
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3300
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:3243
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:144
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:47
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition window_type.h:60