OpenTTD Source 20250205-master-gfd85ab1e2c
toolbar_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "gui.h"
12#include "window_gui.h"
13#include "window_func.h"
14#include "viewport_func.h"
15#include "command_func.h"
16#include "dropdown_type.h"
17#include "dropdown_func.h"
19#include "house.h"
20#include "vehicle_gui.h"
21#include "rail_gui.h"
22#include "road.h"
23#include "road_gui.h"
24#include "vehicle_func.h"
25#include "sound_func.h"
26#include "terraform_gui.h"
27#include "strings_func.h"
28#include "company_func.h"
29#include "company_gui.h"
30#include "vehicle_base.h"
31#include "cheat_func.h"
32#include "transparency_gui.h"
33#include "screenshot.h"
34#include "signs_func.h"
35#include "fios.h"
36#include "console_gui.h"
37#include "news_gui.h"
38#include "ai/ai_gui.hpp"
39#include "game/game_gui.hpp"
40#include "script/script_gui.h"
41#include "tilehighlight_func.h"
42#include "smallmap_gui.h"
43#include "graph_gui.h"
44#include "textbuf_gui.h"
46#include "newgrf_debug.h"
47#include "hotkeys.h"
48#include "engine_base.h"
49#include "highscore.h"
50#include "game/game.hpp"
51#include "goal_base.h"
52#include "story_base.h"
53#include "toolbar_gui.h"
54#include "framerate_type.h"
55#include "screenshot_gui.h"
56#include "misc_cmd.h"
57#include "league_gui.h"
58#include "league_base.h"
59#include "timer/timer.h"
60#include "timer/timer_window.h"
62#include "help_gui.h"
63
65
66#include "network/network.h"
67#include "network/network_gui.h"
69
70#include "safeguards.h"
71
72
75
76RailType _last_built_railtype;
77RoadType _last_built_roadtype;
78RoadType _last_built_tramtype;
79
81enum ToolbarMode : uint8_t {
82 TB_NORMAL,
83 TB_UPPER,
84 TB_LOWER
85};
86
88enum CallBackFunction : uint8_t {
89 CBF_NONE,
90 CBF_PLACE_SIGN,
91 CBF_PLACE_LANDINFO,
92};
93
95
99class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
100public:
101 DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, STR_NULL, company, false, shaded)
102 {
103 SetDParam(0, company);
104 SetDParam(1, company);
105 this->SetString(GetString(STR_COMPANY_NAME_COMPANY_NUM));
106 }
107};
108
116static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
117{
118 ShowDropDownList(w, std::move(list), def, widget, 0, true);
120}
121
128static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
129{
130 DropDownList list;
131 int i = 0;
132 for (StringID string : strings) {
133 if (string == STR_NULL) {
134 list.push_back(MakeDropDownListDividerItem());
135 } else {
136 list.push_back(MakeDropDownListStringItem(string, i));
137 i++;
138 }
139 }
140 PopupMainToolbarMenu(w, widget, std::move(list), 0);
141}
142
144static const int CTMN_CLIENT_LIST = -1;
145static const int CTMN_SPECTATE = -2;
146static const int CTMN_SPECTATOR = -3;
147
154static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = 0)
155{
156 DropDownList list;
157
158 switch (widget) {
159 case WID_TN_COMPANIES:
160 if (!_networking) break;
161
162 /* Add the client list button for the companies menu */
163 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
164
166 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
167 }
168 break;
169 case WID_TN_STORY:
170 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
171 break;
172
173 case WID_TN_GOAL:
174 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
175 break;
176 }
177
178 for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
179 if (!Company::IsValidID(c)) continue;
180 list.push_back(std::make_unique<DropDownListCompanyItem>(c, HasBit(grey, c)));
181 }
182
184}
185
186static ToolbarMode _toolbar_mode;
187
188static CallBackFunction SelectSignTool()
189{
190 if (_last_started_action == CBF_PLACE_SIGN) {
192 return CBF_NONE;
193 } else {
194 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
195 return CBF_PLACE_SIGN;
196 }
197}
198
199/* --- Pausing --- */
200
201static CallBackFunction ToolbarPauseClick(Window *)
202{
203 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
204
207 }
208 return CBF_NONE;
209}
210
217{
218 if (_networking) return CBF_NONE; // no fast forward in network game
219
220 ChangeGameSpeed(_game_speed == 100);
221
223 return CBF_NONE;
224}
225
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 & FACIL_TRAIN) != 0, STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
281 list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_TRUCK_STOP) != 0, STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
282 list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_BUS_STOP) != 0, STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
283 list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_DOCK) != 0, STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
284 list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_AIRPORT) != 0, STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
285 list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_GHOST) != 0, 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
303static void ToggleFacilityDisplay(const uint8_t facility)
304{
305 if ((_facility_display_opt & facility) == 0) {
307 } else {
309 }
310}
311
319{
320 switch (index) {
321 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
322 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
323 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
324 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
325 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
326 case OME_SANDBOX: ShowCheatWindow(); break;
327 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
328
329 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
330 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
331 case OME_SHOW_STATIONNAMES_TRAIN: ToggleFacilityDisplay(FACIL_TRAIN); break;
332 case OME_SHOW_STATIONNAMES_LORRY: ToggleFacilityDisplay(FACIL_TRUCK_STOP); break;
333 case OME_SHOW_STATIONNAMES_BUS: ToggleFacilityDisplay(FACIL_BUS_STOP); break;
334 case OME_SHOW_STATIONNAMES_SHIP: ToggleFacilityDisplay(FACIL_DOCK); break;
335 case OME_SHOW_STATIONNAMES_PLANE: ToggleFacilityDisplay(FACIL_AIRPORT); break;
336 case OME_SHOW_STATIONNAMES_GHOST: ToggleFacilityDisplay(FACIL_GHOST); break;
337 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
338 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
339 case OME_SHOW_COMPETITOR_SIGNS:
342 break;
343 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
344 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
345 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
346 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
347 }
349 return CBF_NONE;
350}
351
356 SLEME_SAVE_SCENARIO = 0,
357 SLEME_LOAD_SCENARIO,
358 SLEME_SAVE_HEIGHTMAP,
359 SLEME_LOAD_HEIGHTMAP,
360 SLEME_EXIT_TOINTRO,
361 SLEME_EXIT_GAME,
362};
363
368 SLNME_SAVE_GAME = 0,
369 SLNME_LOAD_GAME,
370 SLNME_EXIT_TOINTRO,
371 SLNME_EXIT_GAME,
372};
373
381{
382 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
383 STR_NULL, STR_FILE_MENU_EXIT});
384 return CBF_NONE;
385}
386
394{
395 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
396 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
397 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
398 return CBF_NONE;
399}
400
408{
409 if (_game_mode == GM_EDITOR) {
410 switch (index) {
411 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
412 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
413 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
414 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
415 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
416 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
417 }
418 } else {
419 switch (index) {
420 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
421 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
422 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
423 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
424 }
425 }
426 return CBF_NONE;
427}
428
429/* --- Map button menu --- */
430
431enum MapMenuEntries : uint8_t {
432 MME_SHOW_SMALLMAP = 0,
433 MME_SHOW_EXTRAVIEWPORTS,
434 MME_SHOW_LINKGRAPH,
435 MME_SHOW_SIGNLISTS,
436 MME_SHOW_TOWNDIRECTORY,
437 MME_SHOW_INDUSTRYDIRECTORY,
438};
439
440static CallBackFunction ToolbarMapClick(Window *w)
441{
442 DropDownList list;
443 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
444 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
445 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
446 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
447 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
448 return CBF_NONE;
449}
450
451static CallBackFunction ToolbarScenMapTownDir(Window *w)
452{
453 DropDownList list;
454 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
455 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
456 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
457 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
458 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
459 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
460 return CBF_NONE;
461}
462
470{
471 switch (index) {
472 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
473 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
474 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
475 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
476 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
477 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
478 }
479 return CBF_NONE;
480}
481
482/* --- Town button menu --- */
483
484static CallBackFunction ToolbarTownClick(Window *w)
485{
487 PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY});
488 } else {
489 PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY, STR_TOWN_MENU_FOUND_TOWN});
490 }
491 return CBF_NONE;
492}
493
501{
502 switch (index) {
503 case 0: ShowTownDirectory(); break;
504 case 1: // setting could be changed when the dropdown was open
505 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
506 break;
507 }
508 return CBF_NONE;
509}
510
511/* --- Subidies button menu --- */
512
513static CallBackFunction ToolbarSubsidiesClick(Window *w)
514{
515 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
516 return CBF_NONE;
517}
518
525{
526 ShowSubsidiesList();
527 return CBF_NONE;
528}
529
530/* --- Stations button menu --- */
531
532static CallBackFunction ToolbarStationsClick(Window *w)
533{
535 return CBF_NONE;
536}
537
545{
547 return CBF_NONE;
548}
549
550/* --- Finances button menu --- */
551
552static CallBackFunction ToolbarFinancesClick(Window *w)
553{
555 return CBF_NONE;
556}
557
565{
567 return CBF_NONE;
568}
569
570/* --- Company's button menu --- */
571
572static CallBackFunction ToolbarCompaniesClick(Window *w)
573{
575 return CBF_NONE;
576}
577
585{
586 if (_networking) {
587 switch (index) {
588 case CTMN_CLIENT_LIST:
589 ShowClientList();
590 return CBF_NONE;
591
592 case CTMN_SPECTATE:
593 if (_network_server) {
596 } else {
598 }
599 return CBF_NONE;
600 }
601 }
602 ShowCompany((CompanyID)index);
603 return CBF_NONE;
604}
605
606/* --- Story button menu --- */
607
608static CallBackFunction ToolbarStoryClick(Window *w)
609{
611 return CBF_NONE;
612}
613
621{
623 return CBF_NONE;
624}
625
626/* --- Goal button menu --- */
627
628static CallBackFunction ToolbarGoalClick(Window *w)
629{
631 return CBF_NONE;
632}
633
641{
643 return CBF_NONE;
644}
645
646/* --- Graphs and League Table button menu --- */
647
652static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
653static const int GRMN_INCOME_GRAPH = -2;
654static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
655static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
656static const int GRMN_COMPANY_VALUE_GRAPH = -5;
657static const int GRMN_CARGO_PAYMENT_RATES = -6;
658static const int LTMN_PERFORMANCE_LEAGUE = -7;
659static const int LTMN_PERFORMANCE_RATING = -8;
660static const int LTMN_HIGHSCORE = -9;
661
662static void AddDropDownLeagueTableOptions(DropDownList &list)
663{
664 if (LeagueTable::GetNumItems() > 0) {
665 for (LeagueTable *lt : LeagueTable::Iterate()) {
666 list.push_back(MakeDropDownListStringItem(lt->title, lt->index));
667 }
668 } else {
669 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
670 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
671 if (!_networking) {
672 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
673 }
674 }
675}
676
677static CallBackFunction ToolbarGraphsClick(Window *w)
678{
679 DropDownList list;
680
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
683 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
684 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
685 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
686 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
687
688 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
689
690 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
692
693 return CBF_NONE;
694}
695
696static CallBackFunction ToolbarLeagueClick(Window *w)
697{
698 DropDownList list;
699
700 AddDropDownLeagueTableOptions(list);
701
702 int selected = list[0]->result;
703 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true);
705
706 return CBF_NONE;
707}
708
716{
717 switch (index) {
718 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
719 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
720 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
721 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
722 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
723 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
724 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
725 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
726 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
727 default: {
728 if (LeagueTable::IsValidID(index)) {
729 ShowScriptLeagueTable((LeagueTableID)index);
730 }
731 }
732 }
733 return CBF_NONE;
734}
735
736
737
738/* --- Industries button menu --- */
739
740static CallBackFunction ToolbarIndustryClick(Window *w)
741{
742 /* Disable build-industry menu if we are a spectator */
744 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
745 } else {
746 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
747 }
748 return CBF_NONE;
749}
750
758{
759 switch (index) {
760 case 0: ShowIndustryDirectory(); break;
761 case 1: ShowIndustryCargoesWindow(); break;
762 case 2: ShowBuildIndustryWindow(); break;
763 }
764 return CBF_NONE;
765}
766
767/* --- Trains button menu + 1 helper function for all vehicles. --- */
768
769static void ToolbarVehicleClick(Window *w, VehicleType veh)
770{
771 CompanyMask dis = 0;
772
773 for (const Company *c : Company::Iterate()) {
774 if (c->group_all[veh].num_vehicle == 0) SetBit(dis, c->index);
775 }
777}
778
779
780static CallBackFunction ToolbarTrainClick(Window *w)
781{
782 ToolbarVehicleClick(w, VEH_TRAIN);
783 return CBF_NONE;
784}
785
793{
794 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
795 return CBF_NONE;
796}
797
798/* --- Road vehicle button menu --- */
799
800static CallBackFunction ToolbarRoadClick(Window *w)
801{
802 ToolbarVehicleClick(w, VEH_ROAD);
803 return CBF_NONE;
804}
805
813{
814 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
815 return CBF_NONE;
816}
817
818/* --- Ship button menu --- */
819
820static CallBackFunction ToolbarShipClick(Window *w)
821{
822 ToolbarVehicleClick(w, VEH_SHIP);
823 return CBF_NONE;
824}
825
833{
834 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
835 return CBF_NONE;
836}
837
838/* --- Aircraft button menu --- */
839
840static CallBackFunction ToolbarAirClick(Window *w)
841{
842 ToolbarVehicleClick(w, VEH_AIRCRAFT);
843 return CBF_NONE;
844}
845
853{
854 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
855 return CBF_NONE;
856}
857
858/* --- Zoom in button --- */
859
860static CallBackFunction ToolbarZoomInClick(Window *w)
861{
863 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
865 }
866 return CBF_NONE;
867}
868
869/* --- Zoom out button --- */
870
871static CallBackFunction ToolbarZoomOutClick(Window *w)
872{
874 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
876 }
877 return CBF_NONE;
878}
879
880/* --- Rail button menu --- */
881
882static CallBackFunction ToolbarBuildRailClick(Window *w)
883{
884 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
886 return CBF_NONE;
887}
888
896{
897 _last_built_railtype = (RailType)index;
898 ShowBuildRailToolbar(_last_built_railtype);
899 return CBF_NONE;
900}
901
902/* --- Road button menu --- */
903
904static CallBackFunction ToolbarBuildRoadClick(Window *w)
905{
906 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
908 return CBF_NONE;
909}
910
918{
919 _last_built_roadtype = (RoadType)index;
920 ShowBuildRoadToolbar(_last_built_roadtype);
921 return CBF_NONE;
922}
923
924/* --- Tram button menu --- */
925
926static CallBackFunction ToolbarBuildTramClick(Window *w)
927{
928 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
930 return CBF_NONE;
931}
932
940{
941 _last_built_tramtype = (RoadType)index;
942 ShowBuildRoadToolbar(_last_built_tramtype);
943 return CBF_NONE;
944}
945
946/* --- Water button menu --- */
947
948static CallBackFunction ToolbarBuildWaterClick(Window *w)
949{
950 DropDownList list;
951 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
952 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
954 return CBF_NONE;
955}
956
963{
965 return CBF_NONE;
966}
967
968/* --- Airport button menu --- */
969
970static CallBackFunction ToolbarBuildAirClick(Window *w)
971{
972 DropDownList list;
973 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
974 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
976 return CBF_NONE;
977}
978
985{
987 return CBF_NONE;
988}
989
990/* --- Forest button menu --- */
991
992static CallBackFunction ToolbarForestClick(Window *w)
993{
994 DropDownList list;
995 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
996 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
997 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
998 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
1000 return CBF_NONE;
1001}
1002
1010{
1011 switch (index) {
1012 case 0: ShowTerraformToolbar(); break;
1013 case 1: ShowBuildTreesToolbar(); break;
1014 case 2: return SelectSignTool();
1015 }
1016 return CBF_NONE;
1017}
1018
1019/* --- Music button menu --- */
1020
1021static CallBackFunction ToolbarMusicClick(Window *w)
1022{
1023 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1024 return CBF_NONE;
1025}
1026
1033{
1034 ShowMusicWindow();
1035 return CBF_NONE;
1036}
1037
1038/* --- Newspaper button menu --- */
1039
1040static CallBackFunction ToolbarNewspaperClick(Window *w)
1041{
1042 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1043 return CBF_NONE;
1044}
1045
1053{
1054 switch (index) {
1055 case 0: ShowLastNewsMessage(); break;
1056 case 1: ShowMessageHistory(); break;
1057 case 2: DeleteAllMessages(); break;
1058 }
1059 return CBF_NONE;
1060}
1061
1062/* --- Help button menu --- */
1063
1064static CallBackFunction PlaceLandBlockInfo()
1065{
1066 if (_last_started_action == CBF_PLACE_LANDINFO) {
1068 return CBF_NONE;
1069 } else {
1070 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1071 return CBF_PLACE_LANDINFO;
1072 }
1073}
1074
1075static CallBackFunction ToolbarHelpClick(Window *w)
1076{
1078 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1079 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1080 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1081 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1082 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1083 } else {
1084 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1085 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1086 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1087 }
1088 return CBF_NONE;
1089}
1090
1099{
1100 extern bool _draw_bounding_boxes;
1101 /* Always allow to toggle them off */
1102 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1103 _draw_bounding_boxes = !_draw_bounding_boxes;
1105 }
1106}
1107
1116{
1117 extern bool _draw_dirty_blocks;
1118 /* Always allow to toggle them off */
1119 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1120 _draw_dirty_blocks = !_draw_dirty_blocks;
1122 }
1123}
1124
1130{
1131 extern bool _draw_widget_outlines;
1132 /* Always allow to toggle them off */
1133 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1134 _draw_widget_outlines = !_draw_widget_outlines;
1136 }
1137}
1138
1144{
1146 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1147 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1148
1149 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1150 TimerGameCalendar::SetDate(new_calendar_date, 0);
1151
1152 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1154 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1155
1156 /* Only change the date after changing cached values above. */
1157 TimerGameEconomy::SetDate(new_economy_date, 0);
1158}
1159
1166{
1167 switch (index) {
1168 case 0: return PlaceLandBlockInfo();
1169 case 1: ShowHelpWindow(); break;
1170 case 2: IConsoleSwitch(); break;
1172 case 4: ShowScreenshotWindow(); break;
1173 case 5: ShowFramerateWindow(); break;
1174 case 6: ShowAboutWindow(); break;
1175 case 7: ShowSpriteAlignerWindow(); break;
1176 case 8: ToggleBoundingBoxes(); break;
1177 case 9: ToggleDirtyBlocks(); break;
1178 case 10: ToggleWidgetOutlines(); break;
1179 }
1180 return CBF_NONE;
1181}
1182
1183/* --- Switch toolbar button --- */
1184
1185static CallBackFunction ToolbarSwitchClick(Window *w)
1186{
1187 if (_toolbar_mode != TB_LOWER) {
1188 _toolbar_mode = TB_LOWER;
1189 } else {
1190 _toolbar_mode = TB_UPPER;
1191 }
1192
1193 w->ReInit();
1194 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1196 return CBF_NONE;
1197}
1198
1199/* --- Scenario editor specific handlers. */
1200
1205{
1207 ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
1208 return CBF_NONE;
1209}
1210
1211static CallBackFunction ToolbarScenDateBackward(Window *w)
1212{
1213 /* don't allow too fast scrolling */
1214 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1216 w->SetDirty();
1217
1219 }
1220 _left_button_clicked = false;
1221 return CBF_NONE;
1222}
1223
1224static CallBackFunction ToolbarScenDateForward(Window *w)
1225{
1226 /* don't allow too fast scrolling */
1227 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1229 w->SetDirty();
1230
1232 }
1233 _left_button_clicked = false;
1234 return CBF_NONE;
1235}
1236
1237static CallBackFunction ToolbarScenGenLand(Window *w)
1238{
1241
1243 return CBF_NONE;
1244}
1245
1246static CallBackFunction ToolbarScenGenTownClick(Window *w)
1247{
1248 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1249 return CBF_NONE;
1250}
1251
1252static CallBackFunction ToolbarScenGenTown(int index)
1253{
1254 switch (index) {
1255 case 0: ShowFoundTownWindow(); break;
1256 case 1: ShowBuildHousePicker(nullptr); break;
1257 }
1258 return CBF_NONE;
1259}
1260
1261static CallBackFunction ToolbarScenGenIndustry(Window *w)
1262{
1265 ShowBuildIndustryWindow();
1266 return CBF_NONE;
1267}
1268
1269static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1270{
1271 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1273 return CBF_NONE;
1274}
1275
1283{
1284 _last_built_roadtype = (RoadType)index;
1285 ShowBuildRoadScenToolbar(_last_built_roadtype);
1286 return CBF_NONE;
1287}
1288
1289static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1290{
1291 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1293 return CBF_NONE;
1294}
1295
1303{
1304 _last_built_tramtype = (RoadType)index;
1305 ShowBuildRoadScenToolbar(_last_built_tramtype);
1306 return CBF_NONE;
1307}
1308
1309static CallBackFunction ToolbarScenBuildDocks(Window *w)
1310{
1314 return CBF_NONE;
1315}
1316
1317static CallBackFunction ToolbarScenPlantTrees(Window *w)
1318{
1321 ShowBuildTreesToolbar();
1322 return CBF_NONE;
1323}
1324
1325static CallBackFunction ToolbarScenPlaceSign(Window *w)
1326{
1329 return SelectSignTool();
1330}
1331
1332static CallBackFunction ToolbarBtn_NULL(Window *)
1333{
1334 return CBF_NONE;
1335}
1336
1337typedef CallBackFunction MenuClickedProc(int index);
1338
1339static MenuClickedProc * const _menu_clicked_procs[] = {
1340 nullptr, // 0
1341 nullptr, // 1
1342 MenuClickSettings, // 2
1343 MenuClickSaveLoad, // 3
1344 MenuClickMap, // 4
1345 MenuClickTown, // 5
1346 MenuClickSubsidies, // 6
1347 MenuClickStations, // 7
1348 MenuClickFinances, // 8
1349 MenuClickCompany, // 9
1350 MenuClickStory, // 10
1351 MenuClickGoal, // 11
1354 MenuClickIndustry, // 14
1355 MenuClickShowTrains, // 15
1356 MenuClickShowRoad, // 16
1357 MenuClickShowShips, // 17
1358 MenuClickShowAir, // 18
1359 MenuClickMap, // 19
1360 nullptr, // 20
1361 MenuClickBuildRail, // 21
1362 MenuClickBuildRoad, // 22
1363 MenuClickBuildTram, // 23
1364 MenuClickBuildWater, // 24
1365 MenuClickBuildAir, // 25
1366 MenuClickForest, // 26
1368 MenuClickNewspaper, // 28
1369 MenuClickHelp, // 29
1370};
1371
1374protected:
1375 uint spacers;
1376
1377public:
1379 {
1380 }
1381
1388 {
1389 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1390 }
1391
1392 void SetupSmallestSize(Window *w) override
1393 {
1394 this->smallest_x = 0; // Biggest child
1395 this->smallest_y = 0; // Biggest child
1396 this->fill_x = 1;
1397 this->fill_y = 0;
1398 this->resize_x = 1; // We only resize in this direction
1399 this->resize_y = 0; // We never resize in this direction
1400 this->spacers = 0;
1401
1402 uint nbuttons = 0;
1403 /* First initialise some variables... */
1404 for (const auto &child_wid : this->children) {
1405 child_wid->SetupSmallestSize(w);
1406 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1407 if (this->IsButton(child_wid->type)) {
1408 nbuttons++;
1409 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1410 } else if (child_wid->type == NWID_SPACER) {
1411 this->spacers++;
1412 }
1413 }
1414
1415 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1416 for (const auto &child_wid : this->children) {
1417 child_wid->current_y = this->smallest_y;
1418 if (!this->IsButton(child_wid->type)) {
1419 child_wid->current_x = child_wid->smallest_x;
1420 }
1421 }
1422 _toolbar_width = nbuttons * this->smallest_x;
1423 }
1424
1425 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1426 {
1427 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1428
1429 this->pos_x = x;
1430 this->pos_y = y;
1431 this->current_x = given_width;
1432 this->current_y = given_height;
1433
1434 /* Figure out what are the visible buttons */
1435 uint arrangable_count, button_count, spacer_count;
1436 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1437
1438 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1439 std::map<WidgetID, uint> lookup;
1440 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1441 NWidgetBase *nwid = it->get();
1442 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1443 if (nwid->type == NWID_SPACER) continue;
1444 lookup[dynamic_cast<NWidgetCore *>(nwid)->GetIndex()] = std::distance(this->children.begin(), it);
1445 }
1446
1447 /* Now assign the widgets to their rightful place */
1448 uint position = 0; // Place to put next child relative to origin of the container.
1449 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1450 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1451 uint spacer_i = 0;
1452 uint button_i = 0;
1453
1454 /* Index into the arrangement indices. */
1455 const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1456 for (uint i = 0; i < arrangable_count; i++) {
1457 uint slot = lookup[*slotp];
1458 auto &child_wid = this->children[slot];
1459 /* If we have space to give to the spacers, do that. */
1460 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1461 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1462 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1463 uint add = spacer_space / (spacer_count - spacer_i);
1464 position += add;
1465 spacer_space -= add;
1466 spacer_i++;
1467 }
1468 }
1469
1470 /* Buttons can be scaled, the others not. */
1471 if (this->IsButton(child_wid->type)) {
1472 child_wid->current_x = button_space / (button_count - button_i);
1473 button_space -= child_wid->current_x;
1474 button_i++;
1475 } else {
1476 child_wid->current_x = child_wid->smallest_x;
1477 }
1478 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1479 position += child_wid->current_x;
1480
1481 if (rtl) {
1482 slotp--;
1483 } else {
1484 slotp++;
1485 }
1486 }
1487 }
1488
1489 void Draw(const Window *w) override
1490 {
1491 /* Draw brown-red toolbar bg. */
1492 const Rect r = this->GetCurrentRect();
1495
1496 this->NWidgetContainer::Draw(w);
1497 }
1498
1507 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1508};
1509
1512 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1513 {
1514 static const uint SMALLEST_ARRANGEMENT = 14;
1515 static const uint BIGGEST_ARRANGEMENT = 20;
1516
1517 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1518 * The total number of buttons should be equal to arrangable_count * 2.
1519 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1520 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1521 * enough space.
1522 */
1523 static const WidgetID arrange14[] = {
1535 WID_TN_AIR,
1538 // lower toolbar
1553 };
1554 static const WidgetID arrange15[] = {
1565 WID_TN_AIR,
1570 // lower toolbar
1586 };
1587 static const WidgetID arrange16[] = {
1599 WID_TN_AIR,
1604 // lower toolbar
1621 };
1622 static const WidgetID arrange17[] = {
1635 WID_TN_AIR,
1640 // lower toolbar
1658 };
1659 static const WidgetID arrange18[] = {
1673 WID_TN_AIR,
1678 // lower toolbar
1697 };
1698 static const WidgetID arrange19[] = {
1712 WID_TN_AIR,
1718 // lower toolbar
1732 WID_TN_AIR,
1738 };
1739 static const WidgetID arrange20[] = {
1753 WID_TN_AIR,
1760 // lower toolbar
1774 WID_TN_AIR,
1781 };
1782 static const WidgetID arrange_all[] = {
1808 WID_TN_AIR,
1813 };
1814
1815 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1816 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1817 if (full_buttons > BIGGEST_ARRANGEMENT) {
1818 button_count = arrangable_count = lengthof(arrange_all);
1819 spacer_count = this->spacers;
1820 return arrange_all;
1821 }
1822
1823 /* Introduce the split toolbar */
1824 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1825
1826 button_count = arrangable_count = full_buttons;
1827 spacer_count = this->spacers;
1828 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1829 }
1830};
1831
1835
1836 void SetupSmallestSize(Window *w) override
1837 {
1839
1840 /* Find the size of panel_widths */
1841 uint i = 0;
1842 for (const auto &child_wid : this->children) {
1843 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1844
1845 assert(i < lengthof(this->panel_widths));
1846 this->panel_widths[i++] = child_wid->current_x;
1847 _toolbar_width += child_wid->current_x;
1848 }
1849 }
1850
1851 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1852 {
1853 static const WidgetID arrange_all[] = {
1873 };
1874 static const WidgetID arrange_nopanel[] = {
1893 };
1894 static const WidgetID arrange_switch[] = {
1906 // lower toolbar
1918 };
1919
1920 /* If we can place all buttons *and* the panels, show them. */
1921 uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1922 if (width >= min_full_width) {
1923 width -= this->panel_widths[0] + this->panel_widths[1];
1924 arrangable_count = lengthof(arrange_all);
1925 button_count = arrangable_count - 2;
1926 spacer_count = this->spacers;
1927 return arrange_all;
1928 }
1929
1930 /* 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 */
1931 uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1932 if (width > min_small_width) {
1933 width -= this->panel_widths[1];
1934 arrangable_count = lengthof(arrange_nopanel);
1935 button_count = arrangable_count - 1;
1936 spacer_count = this->spacers - 1;
1937 return arrange_nopanel;
1938 }
1939
1940 /* Split toolbar */
1941 width -= this->panel_widths[1];
1942 arrangable_count = lengthof(arrange_switch) / 2;
1943 button_count = arrangable_count - 1;
1944 spacer_count = 0;
1945 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1946 }
1947};
1948
1949/* --- Toolbar handling for the 'normal' case */
1950
1951typedef CallBackFunction ToolbarButtonProc(Window *w);
1952
1953static ToolbarButtonProc * const _toolbar_button_procs[] = {
1954 ToolbarPauseClick,
1958 ToolbarMapClick,
1959 ToolbarTownClick,
1960 ToolbarSubsidiesClick,
1961 ToolbarStationsClick,
1962 ToolbarFinancesClick,
1963 ToolbarCompaniesClick,
1964 ToolbarStoryClick,
1965 ToolbarGoalClick,
1966 ToolbarGraphsClick,
1967 ToolbarLeagueClick,
1968 ToolbarIndustryClick,
1969 ToolbarTrainClick,
1970 ToolbarRoadClick,
1971 ToolbarShipClick,
1972 ToolbarAirClick,
1973 ToolbarZoomInClick,
1974 ToolbarZoomOutClick,
1975 ToolbarBuildRailClick,
1976 ToolbarBuildRoadClick,
1977 ToolbarBuildTramClick,
1978 ToolbarBuildWaterClick,
1979 ToolbarBuildAirClick,
1980 ToolbarForestClick,
1981 ToolbarMusicClick,
1982 ToolbarNewspaperClick,
1983 ToolbarHelpClick,
1984 ToolbarSwitchClick,
1985};
1986
1989 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1990 {
1991 this->InitNested(0);
1992
1993 _last_started_action = CBF_NONE;
1995 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1996 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1997 PositionMainToolbar(this);
1999 }
2000
2005
2006 void OnPaint() override
2007 {
2008 /* If spectator, disable all construction buttons
2009 * ie : Build road, rail, ships, airports and landscaping
2010 * Since enabled state is the default, just disable when needed */
2012 /* disable company list drop downs, if there are no companies */
2014
2017
2018 this->DrawWidgets();
2019 }
2020
2021 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2022 {
2023 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2024 }
2025
2026 void OnDropdownSelect(WidgetID widget, int index) override
2027 {
2028 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2029 if (cbf != CBF_NONE) _last_started_action = cbf;
2030 }
2031
2033 {
2034 CallBackFunction cbf = CBF_NONE;
2035 switch (hotkey) {
2036 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2037 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2038 case MTHK_SETTINGS: ShowGameOptions(); break;
2039 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2040 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2041 case MTHK_SMALLMAP: ShowSmallMap(); break;
2042 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2043 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2044 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2045 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2046 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2047 case MTHK_STORY: ShowStoryBook(_local_company); break;
2048 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2049 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2050 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2051 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2052 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2053 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2054 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2055 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2056 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2057 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2058 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2059 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2060 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2061 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2062 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2063 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2064 case MTHK_MUSIC: ShowMusicWindow(); break;
2065 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2066 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2067 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2068 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2069 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2070 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2071 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2072 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2073 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2074 case MTHK_SIGN_LIST: ShowSignList(); break;
2075 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2076 default: return ES_NOT_HANDLED;
2077 }
2078 if (cbf != CBF_NONE) _last_started_action = cbf;
2079 return ES_HANDLED;
2080 }
2081
2083 {
2084 switch (_last_started_action) {
2085 case CBF_PLACE_SIGN:
2086 PlaceProc_Sign(tile);
2087 break;
2088
2089 case CBF_PLACE_LANDINFO:
2090 ShowLandInfo(tile);
2091 break;
2092
2093 default: NOT_REACHED();
2094 }
2095 }
2096
2097 void OnPlaceObjectAbort() override
2098 {
2099 _last_started_action = CBF_NONE;
2100 }
2101
2103 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2104 if (this->IsWidgetLowered(WID_TN_PAUSE) != !!_pause_mode) {
2107 }
2108
2109 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2112 }
2113 }};
2114
2115 void OnTimeout() override
2116 {
2117 /* We do not want to automatically raise the pause, fast forward and
2118 * switchbar buttons; they have to stay down when pressed etc. */
2119 for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2120 this->RaiseWidgetWhenLowered(i);
2121 }
2122 }
2123
2129 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2130 {
2131 if (!gui_scope) return;
2133 }
2134
2135 static inline HotkeyList hotkeys{"maintoolbar", {
2136 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2137 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2138 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2139 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2140 Hotkey(0, "load_game", MTHK_LOADGAME),
2141 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2142 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2143 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2144 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2145 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2146 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2147 Hotkey(0, "story_book", MTHK_STORY),
2148 Hotkey(0, "goal_list", MTHK_GOAL),
2149 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2150 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2151 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2152 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2153 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2154 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2155 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2156 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2157 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2158 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2159 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2160 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2161 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2162 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2163 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2164 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2165 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2166 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2167 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2168 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2169 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2170 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2171 Hotkey('L', "terraform", MTHK_TERRAFORM),
2172 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2173 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2174 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2175 Hotkey(0, "land_info", MTHK_LANDINFO),
2176 }};
2177};
2178
2179static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2180{
2182 static const SpriteID toolbar_button_sprites[] = {
2183 SPR_IMG_PAUSE, // WID_TN_PAUSE
2184 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2185 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2186 SPR_IMG_SAVE, // WID_TN_SAVE
2187 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2188 SPR_IMG_TOWN, // WID_TN_TOWNS
2189 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2190 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2191 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2192 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2193 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2194 SPR_IMG_GOAL, // WID_TN_GOAL
2195 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2196 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2197 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2198 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2199 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2200 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2201 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2202 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2203 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2204 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2205 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2206 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2207 SPR_IMG_BUILDWATER, // WID_TN_WATER
2208 SPR_IMG_BUILDAIR, // WID_TN_AIR
2209 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2210 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2211 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2212 SPR_IMG_QUERY, // WID_TN_HELP
2213 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2214 };
2215
2216 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2217 for (WidgetID i = 0; i < WID_TN_END; i++) {
2218 switch (i) {
2219 case WID_TN_SMALL_MAP:
2220 case WID_TN_FINANCES:
2222 case WID_TN_ZOOM_IN:
2224 case WID_TN_MUSIC_SOUND:
2225 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2226 break;
2227 }
2228 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);
2229 leaf->SetMinimalSize(20, 20);
2230 hor->Add(std::move(leaf));
2231 }
2232
2233 return hor;
2234}
2235
2236static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2238};
2239
2240static WindowDesc _toolb_normal_desc(
2241 WDP_MANUAL, nullptr, 0, 0,
2244 _nested_toolbar_normal_widgets,
2245 &MainToolbarWindow::hotkeys
2246);
2247
2248
2249/* --- Toolbar handling for the scenario editor */
2250
2251static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2252 nullptr, // 0
2253 nullptr, // 1
2254 MenuClickSettings, // 2
2255 MenuClickSaveLoad, // 3
2256 nullptr, // 4
2257 nullptr, // 5
2258 nullptr, // 6
2259 nullptr, // 7
2260 MenuClickMap, // 8
2261 nullptr, // 9
2262 nullptr, // 10
2263 nullptr, // 11
2264 ToolbarScenGenTown, // 12
2265 nullptr, // 13
2268 nullptr, // 16
2269 nullptr, // 17
2270 nullptr, // 18
2271 nullptr, // 19
2273 MenuClickHelp, // 21
2274 nullptr, // 22
2275};
2276
2277static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2278 ToolbarPauseClick,
2282 ToolbarBtn_NULL,
2284 ToolbarScenDateBackward,
2285 ToolbarScenDateForward,
2286 ToolbarScenMapTownDir,
2287 ToolbarZoomInClick,
2288 ToolbarZoomOutClick,
2289 ToolbarScenGenLand,
2290 ToolbarScenGenTownClick,
2291 ToolbarScenGenIndustry,
2292 ToolbarScenBuildRoadClick,
2293 ToolbarScenBuildTramClick,
2294 ToolbarScenBuildDocks,
2295 ToolbarScenPlantTrees,
2296 ToolbarScenPlaceSign,
2297 ToolbarBtn_NULL,
2298 ToolbarMusicClick,
2299 ToolbarHelpClick,
2300 ToolbarSwitchClick,
2301};
2302
2303enum MainToolbarEditorHotkeys : int32_t {
2304 MTEHK_PAUSE,
2305 MTEHK_FASTFORWARD,
2306 MTEHK_SETTINGS,
2307 MTEHK_SAVEGAME,
2308 MTEHK_GENLAND,
2309 MTEHK_GENTOWN,
2310 MTEHK_GENINDUSTRY,
2311 MTEHK_BUILD_ROAD,
2312 MTEHK_BUILD_TRAM,
2313 MTEHK_BUILD_DOCKS,
2314 MTEHK_BUILD_TREES,
2315 MTEHK_SIGN,
2316 MTEHK_MUSIC,
2317 MTEHK_LANDINFO,
2318 MTEHK_SMALL_SCREENSHOT,
2319 MTEHK_ZOOMEDIN_SCREENSHOT,
2320 MTEHK_DEFAULTZOOM_SCREENSHOT,
2321 MTEHK_GIANT_SCREENSHOT,
2322 MTEHK_ZOOM_IN,
2323 MTEHK_ZOOM_OUT,
2324 MTEHK_TERRAFORM,
2325 MTEHK_SMALLMAP,
2326 MTEHK_EXTRA_VIEWPORT,
2327};
2328
2331 {
2332 this->InitNested(0);
2333
2334 _last_started_action = CBF_NONE;
2336 PositionMainToolbar(this);
2338 }
2339
2344
2354
2355 void SetStringParameters(WidgetID widget) const override
2356 {
2357 switch (widget) {
2358 case WID_TE_DATE:
2360 break;
2361 }
2362 }
2363
2364 void DrawWidget(const Rect &r, WidgetID widget) const override
2365 {
2366 switch (widget) {
2367 case WID_TE_SPACER: {
2368 int height = r.Height();
2369 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2371 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2372 } else {
2374 }
2375 break;
2376 }
2377 }
2378 }
2379
2381 {
2382 switch (widget) {
2383 case WID_TE_SPACER:
2385 break;
2386
2387 case WID_TE_DATE:
2390 break;
2391 }
2392 }
2393
2394 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2395 {
2396 if (_game_mode == GM_MENU) return;
2397 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2398 if (cbf != CBF_NONE) _last_started_action = cbf;
2399 }
2400
2401 void OnDropdownSelect(WidgetID widget, int index) override
2402 {
2403 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2404 if (cbf != CBF_NONE) _last_started_action = cbf;
2406 }
2407
2409 {
2410 CallBackFunction cbf = CBF_NONE;
2411 switch (hotkey) {
2412 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2413 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2414 case MTEHK_SETTINGS: ShowGameOptions(); break;
2415 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2416 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2417 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2418 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2419 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2420 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2421 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2422 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2423 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2424 case MTEHK_MUSIC: ShowMusicWindow(); break;
2425 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2426 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2427 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2428 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2429 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2430 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2431 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2432 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2433 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2434 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2435 default: return ES_NOT_HANDLED;
2436 }
2437 if (cbf != CBF_NONE) _last_started_action = cbf;
2438 return ES_HANDLED;
2439 }
2440
2442 {
2443 switch (_last_started_action) {
2444 case CBF_PLACE_SIGN:
2445 PlaceProc_Sign(tile);
2446 break;
2447
2448 case CBF_PLACE_LANDINFO:
2449 ShowLandInfo(tile);
2450 break;
2451
2452 default: NOT_REACHED();
2453 }
2454 }
2455
2456 void OnPlaceObjectAbort() override
2457 {
2458 _last_started_action = CBF_NONE;
2459 }
2460
2467
2469 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2470 if (this->IsWidgetLowered(WID_TE_PAUSE) != !!_pause_mode) {
2472 this->SetDirty();
2473 }
2474
2475 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2477 this->SetDirty();
2478 }
2479 }};
2480
2486 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2487 {
2488 if (!gui_scope) return;
2490 }
2491
2492 void OnQueryTextFinished(std::optional<std::string> str) override
2493 {
2494 /* Was 'cancel' pressed? */
2495 if (!str.has_value()) return;
2496
2498 if (!str->empty()) {
2499 value = TimerGameCalendar::Year{atoi(str->c_str())};
2500 } else {
2501 /* An empty string means revert to the default */
2503 }
2504 SetStartingYear(value);
2505
2506 this->SetDirty();
2507 }
2508
2509 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2510 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2511 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2512 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2513 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2514 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2515 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2516 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2517 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2518 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2519 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2520 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2521 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2522 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2523 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2524 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2525 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2526 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2527 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2528 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2529 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2530 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2531 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2532 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2533 }};
2534};
2535
2536static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2537 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2538 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2539 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2540 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2542 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2544 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2546 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),
2547 NWidget(WWT_TEXT, INVALID_COLOUR, WID_TE_DATE), SetStringTip(STR_JUST_DATE_LONG, STR_SCENEDIT_TOOLBAR_SET_DATE_TOOLTIP), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2548 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),
2549 EndContainer(),
2550 EndContainer(),
2552 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2554 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2555 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2557 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2558 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2559 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2560 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2561 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2562 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2563 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2564 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2566 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2567 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2568 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2569};
2570
2571static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2572{
2573 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2574}
2575
2576static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2577 NWidgetFunction(MakeScenarioToolbar),
2578};
2579
2580static WindowDesc _toolb_scen_desc(
2581 WDP_MANUAL, nullptr, 0, 0,
2584 _nested_toolb_scen_widgets,
2585 &ScenarioEditorToolbarWindow::hotkeys
2586);
2587
2590{
2591 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2592 _last_built_roadtype = ROADTYPE_ROAD;
2593 _last_built_tramtype = ROADTYPE_TRAM;
2594
2595 if (_game_mode == GM_EDITOR) {
2596 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2597 } else {
2598 new MainToolbarWindow(_toolb_normal_desc);
2599 }
2600}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:324
Window for configuring the AIs
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
#define CLRBITS(x, y)
Clears several bits in a variable.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
#define SETBITS(x, y)
Sets several bits in a variable.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
Drop down icon component.
Company name list item, with company-colour icon, name, and lock components.
constexpr EnumBitSet & Reset(Tenum value)
Reset the enum value to not set.
constexpr bool Test(Tenum value) const
Test if the enum value is set.
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:1295
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in contaier.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Container for the scenario editor's toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
uint panel_widths[2]
The width of the two panels (the text panel and date panel)
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
Full blown container to make it behave exactly as we want :)
uint spacers
Number of spacer widgets in this toolbar.
void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
Assign size and position to the widget.
void SetupSmallestSize(Window *w) override
Compute smallest size needed by the widget.
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
virtual const WidgetID * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
void Draw(const Window *w) override
Draw the widgets of the tree.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static void SetDate(Date date, DateFract fract)
Set the date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
The absolute minimum year in OTTD.
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
static Date date
Current date in days (day counter).
static void SetDate(Date date, DateFract fract)
Set the date.
Functions related to commands.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
Owner
Enum for all companies/owners.
@ INVALID_COMPANY
An invalid company.
@ COMPANY_SPECTATOR
The client is spectating.
@ COMPANY_FIRST
First company, same as owner.
@ MAX_COMPANIES
Maximum number of companies.
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition dock_gui.cpp:403
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:362
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:404
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
@ 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:986
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:445
Window for configuring the Games
PauseMode _pause_mode
The current pause mode.
Definition gfx.cpp:50
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition gfx.cpp:40
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:114
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp:326
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:243
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:376
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:385
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:333
@ WKC_MINUS
Definition gfx_type.h:104
@ WKC_EQUALS
= Equals
Definition gfx_type.h:97
Goal base class.
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition goal_gui.cpp:316
Graph GUI functions.
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart 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 SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
std::unique_ptr< NWidgetBase > MakeNWidgets(std::span< const NWidgetPart > nwid_parts, std::unique_ptr< NWidgetBase > &&container)
Construct a nested widget tree from an array of parts.
Definition widget.cpp:3381
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:937
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1529
GUI functions that shouldn't be here.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:359
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameSettings()
Open advanced settings window.
void ShowStoryBook(CompanyID company, StoryPageID page_id=INVALID_STORY_PAGE, bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
definition of HouseSpec and accessors
LeagueTable base class.
League table GUI functions.
uint8_t LeagueTableID
ID of a league table.
Definition league_type.h:32
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Miscellaneous command definitions.
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _networking
are we in networking mode?
Definition network.cpp:65
bool _network_server
network-server is active
Definition network.cpp:66
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
Definition network.cpp:141
Basic functions/variables used all over the place.
void NetworkClientRequestMove(CompanyID company_id)
Notify the server of this client wanting to be moved to another company.
Network functions used by other parts of OpenTTD.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
GUIs related to networking.
@ CLIENT_ID_SERVER
Servers always have this ID.
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
@ PM_UNPAUSED
A normal unpaused game.
Definition openttd.h:69
@ PM_PAUSED_NORMAL
A game normally paused.
Definition openttd.h:70
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
static const uint8_t PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:918
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Functions/types etc.
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:27
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition road.cpp:227
Road specific functions.
RoadTypes _roadtypes_type
Bitmap of road/tram types.
Definition road_cmd.cpp:62
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition road_gui.cpp:998
Functions/types related to the road GUIs.
@ ROADTYPES_NONE
No roadtypes.
Definition road_type.h:39
RoadType
The different roadtypes we support.
Definition road_type.h:25
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:28
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:27
A number of safeguards to prevent using unsafe methods.
void MakeScreenshotWithConfirm(ScreenshotType t)
Make a screenshot.
Functions to make screenshots.
@ SC_VIEWPORT
Screenshot of viewport.
Definition screenshot.h:19
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:21
@ SC_WORLD
World screenshot.
Definition screenshot.h:23
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:22
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:56
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
@ FACIL_DOCK
Station with a dock.
@ FACIL_BUS_STOP
Station with bus stops.
@ FACIL_AIRPORT
Station with an airport.
@ FACIL_TRUCK_STOP
Station with truck stops.
@ FACIL_TRAIN
Station with train station.
static constexpr StationFacility FACIL_GHOST
Fake 'facility' to allow toggling display of recently-removed station signs.
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
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:332
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
TimerGameCalendar::Year starting_year
starting date
EconomySettings economy
settings to change the economy
GameCreationSettings game_creation
settings used during the creation of a game (map)
List of hotkeys for a window.
Definition hotkeys.h:37
All data for a single hotkey.
Definition hotkeys.h:21
Struct about custom league tables.
Definition league_base.h:52
void OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPaint() override
The window must be repainted.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnTimeout() override
Called when this window's timeout has been reached.
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
Templated helper to make a type-safe 'typedef' representing a single POD value.
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:272
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:949
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:731
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:548
uint8_t timeout_timer
Timer value of the WindowFlag::Timeout for flags.
Definition window_gui.h:305
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition window_gui.h:477
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:514
ViewportData * viewport
Pointer to viewport data, if present.
Definition window_gui.h:317
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:490
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:409
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition window_gui.h:525
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:440
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:970
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:587
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1743
WindowFlags flags
Window flags.
Definition window_gui.h:299
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:380
int height
Height of the window (number of pixels down in y direction)
Definition window_gui.h:311
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:310
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:449
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
Definition window.cpp:1417
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
Stuff related to the text buffer GUI.
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:21
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
@ HT_RECT
rectangle (stations, depots, ...)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the Window system.
static CallBackFunction MenuClickForest(int index)
Handle click on the entry in the landscaping menu.
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 void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey=0)
Pop up a generic company list menu.
static CallBackFunction _last_started_action
Last started user action.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
static void ToggleFacilityDisplay(const uint8_t facility)
Toggle display station names for a facility.
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 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
uint8_t _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:494
Functions related to (drawing on) viewports.
@ ZOOM_IN
Zoom in (get more detailed view).
@ ZOOM_NONE
Hack, used to update the button status.
@ ZOOM_OUT
Zoom out (get helicopter view).
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition widget_type.h:37
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:43
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:44
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:41
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1124
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition window.cpp:3388
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition window.cpp:3291
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:3234
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