OpenTTD Source 20250218-master-g53dd1258a7
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.base(), false, shaded)
102 {
103 this->SetString(GetString(STR_COMPANY_NAME_COMPANY_NUM, company, company));
104 }
105};
106
114static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
115{
116 ShowDropDownList(w, std::move(list), def, widget, 0, true);
118}
119
126static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
127{
128 DropDownList list;
129 int i = 0;
130 for (StringID string : strings) {
131 if (string == STR_NULL) {
132 list.push_back(MakeDropDownListDividerItem());
133 } else {
134 list.push_back(MakeDropDownListStringItem(string, i));
135 i++;
136 }
137 }
138 PopupMainToolbarMenu(w, widget, std::move(list), 0);
139}
140
142static const int CTMN_CLIENT_LIST = -1;
143static const int CTMN_SPECTATE = -2;
144static const int CTMN_SPECTATOR = -3;
145
152static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = {})
153{
154 DropDownList list;
155
156 switch (widget) {
157 case WID_TN_COMPANIES:
158 if (!_networking) break;
159
160 /* Add the client list button for the companies menu */
161 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
162
164 list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
165 }
166 break;
167 case WID_TN_STORY:
168 list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
169 break;
170
171 case WID_TN_GOAL:
172 list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
173 break;
174 }
175
176 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
177 if (!Company::IsValidID(c)) continue;
178 list.push_back(std::make_unique<DropDownListCompanyItem>(c, grey.Test(c)));
179 }
180
182}
183
184static ToolbarMode _toolbar_mode;
185
186static CallBackFunction SelectSignTool()
187{
188 if (_last_started_action == CBF_PLACE_SIGN) {
190 return CBF_NONE;
191 } else {
192 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
193 return CBF_PLACE_SIGN;
194 }
195}
196
197/* --- Pausing --- */
198
199static CallBackFunction ToolbarPauseClick(Window *)
200{
201 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
202
205 }
206 return CBF_NONE;
207}
208
215{
216 if (_networking) return CBF_NONE; // no fast forward in network game
217
218 ChangeGameSpeed(_game_speed == 100);
219
221 return CBF_NONE;
222}
223
227enum OptionMenuEntries : uint8_t {
228 OME_GAMEOPTIONS,
229 OME_SETTINGS,
230 OME_AI_SETTINGS,
231 OME_GAMESCRIPT_SETTINGS,
232 OME_NEWGRFSETTINGS,
233 OME_SANDBOX,
234 OME_TRANSPARENCIES,
235 OME_SHOW_TOWNNAMES,
236 OME_SHOW_STATIONNAMES,
237 OME_SHOW_STATIONNAMES_TRAIN,
238 OME_SHOW_STATIONNAMES_LORRY,
239 OME_SHOW_STATIONNAMES_BUS,
240 OME_SHOW_STATIONNAMES_SHIP,
241 OME_SHOW_STATIONNAMES_PLANE,
242 OME_SHOW_STATIONNAMES_GHOST,
243 OME_SHOW_WAYPOINTNAMES,
244 OME_SHOW_SIGNS,
245 OME_SHOW_COMPETITOR_SIGNS,
246 OME_FULL_ANIMATION,
247 OME_FULL_DETAILS,
248 OME_TRANSPARENTBUILDINGS,
249 OME_SHOW_STATIONSIGNS,
250};
251
259{
260 DropDownList list;
261 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
262 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS));
263 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
264 * the settings once they join but never update it. As such don't show the window at all
265 * to network clients. */
267 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
268 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
269 }
270 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
271 if (_game_mode != GM_EDITOR && !_networking) {
272 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
273 }
274 list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
275 list.push_back(MakeDropDownListDividerItem());
276 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
277 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
278 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OME_SHOW_STATIONNAMES_TRAIN, false, false, 1));
279 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OME_SHOW_STATIONNAMES_LORRY, false, false, 1));
280 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1));
281 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1));
282 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1));
283 list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1));
284 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
285 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
286 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
287 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
288 list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
289 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
290 list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
291
292 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true);
294 return CBF_NONE;
295}
296
304{
305 switch (index) {
306 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
307 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
308 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
309 case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
310 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, _grfconfig); return CBF_NONE;
311 case OME_SANDBOX: ShowCheatWindow(); break;
312 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
313
314 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
315 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
316 case OME_SHOW_STATIONNAMES_TRAIN: _facility_display_opt.Flip(StationFacility::Train); break;
317 case OME_SHOW_STATIONNAMES_LORRY: _facility_display_opt.Flip(StationFacility::TruckStop); break;
318 case OME_SHOW_STATIONNAMES_BUS: _facility_display_opt.Flip(StationFacility::BusStop); break;
319 case OME_SHOW_STATIONNAMES_SHIP: _facility_display_opt.Flip(StationFacility::Dock); break;
320 case OME_SHOW_STATIONNAMES_PLANE: _facility_display_opt.Flip(StationFacility::Airport); break;
321 case OME_SHOW_STATIONNAMES_GHOST: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break;
322 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
323 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
324 case OME_SHOW_COMPETITOR_SIGNS:
327 break;
328 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
329 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
330 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
331 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
332 }
334 return CBF_NONE;
335}
336
341 SLEME_SAVE_SCENARIO = 0,
342 SLEME_LOAD_SCENARIO,
343 SLEME_SAVE_HEIGHTMAP,
344 SLEME_LOAD_HEIGHTMAP,
345 SLEME_EXIT_TOINTRO,
346 SLEME_EXIT_GAME,
347};
348
353 SLNME_SAVE_GAME = 0,
354 SLNME_LOAD_GAME,
355 SLNME_EXIT_TOINTRO,
356 SLNME_EXIT_GAME,
357};
358
366{
367 PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
368 STR_NULL, STR_FILE_MENU_EXIT});
369 return CBF_NONE;
370}
371
379{
380 PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
381 STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
382 STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
383 return CBF_NONE;
384}
385
393{
394 if (_game_mode == GM_EDITOR) {
395 switch (index) {
396 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
397 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
398 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
399 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
400 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
401 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
402 }
403 } else {
404 switch (index) {
405 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
406 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
407 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
408 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
409 }
410 }
411 return CBF_NONE;
412}
413
414/* --- Map button menu --- */
415
416enum MapMenuEntries : uint8_t {
417 MME_SHOW_SMALLMAP = 0,
418 MME_SHOW_EXTRAVIEWPORTS,
419 MME_SHOW_LINKGRAPH,
420 MME_SHOW_SIGNLISTS,
421 MME_SHOW_TOWNDIRECTORY,
422 MME_SHOW_INDUSTRYDIRECTORY,
423};
424
425static CallBackFunction ToolbarMapClick(Window *w)
426{
427 DropDownList list;
428 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
429 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
430 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
431 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
432 PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
433 return CBF_NONE;
434}
435
436static CallBackFunction ToolbarScenMapTownDir(Window *w)
437{
438 DropDownList list;
439 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
440 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
441 list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
442 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
443 list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
444 PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
445 return CBF_NONE;
446}
447
455{
456 switch (index) {
457 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
458 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
459 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
460 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
461 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
462 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
463 }
464 return CBF_NONE;
465}
466
467/* --- Town button menu --- */
468
469enum TownMenuEntries {
470 TME_SHOW_DIRECTORY = 0,
471 TME_SHOW_FOUND_TOWN,
472 TME_SHOW_PLACE_HOUSES,
473};
474
475static CallBackFunction ToolbarTownClick(Window *w)
476{
477 DropDownList list;
478 list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, TME_SHOW_DIRECTORY));
479 if (_settings_game.economy.found_town != TF_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_FOUND_TOWN, TME_SHOW_FOUND_TOWN));
480 if (_settings_game.economy.place_houses != PH_FORBIDDEN) list.push_back(MakeDropDownListStringItem(STR_SCENEDIT_TOWN_MENU_PACE_HOUSE, TME_SHOW_PLACE_HOUSES));
481
482 PopupMainToolbarMenu(w, WID_TN_TOWNS, std::move(list), 0);
483
484 return CBF_NONE;
485}
486
494{
495 switch (index) {
496 case TME_SHOW_DIRECTORY: ShowTownDirectory(); break;
497 case TME_SHOW_FOUND_TOWN: // Setting could be changed when the dropdown was open
498 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
499 break;
500 case TME_SHOW_PLACE_HOUSES: // Setting could be changed when the dropdown was open
501 if (_settings_game.economy.place_houses != PH_FORBIDDEN) ShowBuildHousePicker(nullptr);
502 break;
503 }
504 return CBF_NONE;
505}
506
507/* --- Subidies button menu --- */
508
509static CallBackFunction ToolbarSubsidiesClick(Window *w)
510{
511 PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
512 return CBF_NONE;
513}
514
521{
522 ShowSubsidiesList();
523 return CBF_NONE;
524}
525
526/* --- Stations button menu --- */
527
528static CallBackFunction ToolbarStationsClick(Window *w)
529{
531 return CBF_NONE;
532}
533
541{
543 return CBF_NONE;
544}
545
546/* --- Finances button menu --- */
547
548static CallBackFunction ToolbarFinancesClick(Window *w)
549{
551 return CBF_NONE;
552}
553
561{
563 return CBF_NONE;
564}
565
566/* --- Company's button menu --- */
567
568static CallBackFunction ToolbarCompaniesClick(Window *w)
569{
571 return CBF_NONE;
572}
573
581{
582 if (_networking) {
583 switch (index) {
584 case CTMN_CLIENT_LIST:
585 ShowClientList();
586 return CBF_NONE;
587
588 case CTMN_SPECTATE:
589 if (_network_server) {
592 } else {
594 }
595 return CBF_NONE;
596 }
597 }
598 ShowCompany((CompanyID)index);
599 return CBF_NONE;
600}
601
602/* --- Story button menu --- */
603
604static CallBackFunction ToolbarStoryClick(Window *w)
605{
607 return CBF_NONE;
608}
609
617{
618 ShowStoryBook(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
619 return CBF_NONE;
620}
621
622/* --- Goal button menu --- */
623
624static CallBackFunction ToolbarGoalClick(Window *w)
625{
627 return CBF_NONE;
628}
629
637{
638 ShowGoalsList(index == CTMN_SPECTATOR ? CompanyID::Invalid() : (CompanyID)index);
639 return CBF_NONE;
640}
641
642/* --- Graphs and League Table button menu --- */
643
648static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
649static const int GRMN_INCOME_GRAPH = -2;
650static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
651static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
652static const int GRMN_COMPANY_VALUE_GRAPH = -5;
653static const int GRMN_CARGO_PAYMENT_RATES = -6;
654static const int LTMN_PERFORMANCE_LEAGUE = -7;
655static const int LTMN_PERFORMANCE_RATING = -8;
656static const int LTMN_HIGHSCORE = -9;
657
658static void AddDropDownLeagueTableOptions(DropDownList &list)
659{
660 if (LeagueTable::GetNumItems() > 0) {
661 for (LeagueTable *lt : LeagueTable::Iterate()) {
662 list.push_back(MakeDropDownListStringItem(lt->title, lt->index.base()));
663 }
664 } else {
665 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
666 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
667 if (!_networking) {
668 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
669 }
670 }
671}
672
673static CallBackFunction ToolbarGraphsClick(Window *w)
674{
675 DropDownList list;
676
677 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
678 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
679 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
680 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
681 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
682 list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
683
684 if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
685
686 ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
688
689 return CBF_NONE;
690}
691
692static CallBackFunction ToolbarLeagueClick(Window *w)
693{
694 DropDownList list;
695
696 AddDropDownLeagueTableOptions(list);
697
698 int selected = list[0]->result;
699 ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true);
701
702 return CBF_NONE;
703}
704
712{
713 switch (index) {
714 case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
715 case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
716 case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
717 case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
718 case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
719 case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
720 case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
721 case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
722 case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
723 default: {
724 if (LeagueTable::IsValidID(index)) {
725 ShowScriptLeagueTable((LeagueTableID)index);
726 }
727 }
728 }
729 return CBF_NONE;
730}
731
732
733
734/* --- Industries button menu --- */
735
736static CallBackFunction ToolbarIndustryClick(Window *w)
737{
738 /* Disable build-industry menu if we are a spectator */
740 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
741 } else {
742 PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
743 }
744 return CBF_NONE;
745}
746
754{
755 switch (index) {
756 case 0: ShowIndustryDirectory(); break;
757 case 1: ShowIndustryCargoesWindow(); break;
758 case 2: ShowBuildIndustryWindow(); break;
759 }
760 return CBF_NONE;
761}
762
763/* --- Trains button menu + 1 helper function for all vehicles. --- */
764
765static void ToolbarVehicleClick(Window *w, VehicleType veh)
766{
767 CompanyMask dis{};
768
769 for (const Company *c : Company::Iterate()) {
770 if (c->group_all[veh].num_vehicle == 0) dis.Set(c->index);
771 }
773}
774
775
776static CallBackFunction ToolbarTrainClick(Window *w)
777{
778 ToolbarVehicleClick(w, VEH_TRAIN);
779 return CBF_NONE;
780}
781
789{
790 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
791 return CBF_NONE;
792}
793
794/* --- Road vehicle button menu --- */
795
796static CallBackFunction ToolbarRoadClick(Window *w)
797{
798 ToolbarVehicleClick(w, VEH_ROAD);
799 return CBF_NONE;
800}
801
809{
810 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
811 return CBF_NONE;
812}
813
814/* --- Ship button menu --- */
815
816static CallBackFunction ToolbarShipClick(Window *w)
817{
818 ToolbarVehicleClick(w, VEH_SHIP);
819 return CBF_NONE;
820}
821
829{
830 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
831 return CBF_NONE;
832}
833
834/* --- Aircraft button menu --- */
835
836static CallBackFunction ToolbarAirClick(Window *w)
837{
838 ToolbarVehicleClick(w, VEH_AIRCRAFT);
839 return CBF_NONE;
840}
841
849{
850 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
851 return CBF_NONE;
852}
853
854/* --- Zoom in button --- */
855
856static CallBackFunction ToolbarZoomInClick(Window *w)
857{
859 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
861 }
862 return CBF_NONE;
863}
864
865/* --- Zoom out button --- */
866
867static CallBackFunction ToolbarZoomOutClick(Window *w)
868{
870 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
872 }
873 return CBF_NONE;
874}
875
876/* --- Rail button menu --- */
877
878static CallBackFunction ToolbarBuildRailClick(Window *w)
879{
880 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
882 return CBF_NONE;
883}
884
892{
893 _last_built_railtype = (RailType)index;
894 ShowBuildRailToolbar(_last_built_railtype);
895 return CBF_NONE;
896}
897
898/* --- Road button menu --- */
899
900static CallBackFunction ToolbarBuildRoadClick(Window *w)
901{
902 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
904 return CBF_NONE;
905}
906
914{
915 _last_built_roadtype = (RoadType)index;
916 ShowBuildRoadToolbar(_last_built_roadtype);
917 return CBF_NONE;
918}
919
920/* --- Tram button menu --- */
921
922static CallBackFunction ToolbarBuildTramClick(Window *w)
923{
924 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
926 return CBF_NONE;
927}
928
936{
937 _last_built_tramtype = (RoadType)index;
938 ShowBuildRoadToolbar(_last_built_tramtype);
939 return CBF_NONE;
940}
941
942/* --- Water button menu --- */
943
944static CallBackFunction ToolbarBuildWaterClick(Window *w)
945{
946 DropDownList list;
947 list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
948 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
950 return CBF_NONE;
951}
952
959{
961 return CBF_NONE;
962}
963
964/* --- Airport button menu --- */
965
966static CallBackFunction ToolbarBuildAirClick(Window *w)
967{
968 DropDownList list;
969 list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
970 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
972 return CBF_NONE;
973}
974
981{
983 return CBF_NONE;
984}
985
986/* --- Forest button menu --- */
987
988static CallBackFunction ToolbarForestClick(Window *w)
989{
990 DropDownList list;
991 list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
992 list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
993 list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
994 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
996 return CBF_NONE;
997}
998
1006{
1007 switch (index) {
1008 case 0: ShowTerraformToolbar(); break;
1009 case 1: ShowBuildTreesToolbar(); break;
1010 case 2: return SelectSignTool();
1011 }
1012 return CBF_NONE;
1013}
1014
1015/* --- Music button menu --- */
1016
1017static CallBackFunction ToolbarMusicClick(Window *w)
1018{
1019 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
1020 return CBF_NONE;
1021}
1022
1029{
1030 ShowMusicWindow();
1031 return CBF_NONE;
1032}
1033
1034/* --- Newspaper button menu --- */
1035
1036static CallBackFunction ToolbarNewspaperClick(Window *w)
1037{
1038 PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1039 return CBF_NONE;
1040}
1041
1049{
1050 switch (index) {
1051 case 0: ShowLastNewsMessage(); break;
1052 case 1: ShowMessageHistory(); break;
1053 case 2: DeleteAllMessages(); break;
1054 }
1055 return CBF_NONE;
1056}
1057
1058/* --- Help button menu --- */
1059
1060static CallBackFunction PlaceLandBlockInfo()
1061{
1062 if (_last_started_action == CBF_PLACE_LANDINFO) {
1064 return CBF_NONE;
1065 } else {
1066 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1067 return CBF_PLACE_LANDINFO;
1068 }
1069}
1070
1071static CallBackFunction ToolbarHelpClick(Window *w)
1072{
1074 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1075 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1076 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1077 STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1078 STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1079 } else {
1080 PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1081 STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1082 STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1083 }
1084 return CBF_NONE;
1085}
1086
1095{
1096 extern bool _draw_bounding_boxes;
1097 /* Always allow to toggle them off */
1098 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1099 _draw_bounding_boxes = !_draw_bounding_boxes;
1101 }
1102}
1103
1112{
1113 extern bool _draw_dirty_blocks;
1114 /* Always allow to toggle them off */
1115 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1116 _draw_dirty_blocks = !_draw_dirty_blocks;
1118 }
1119}
1120
1126{
1127 extern bool _draw_widget_outlines;
1128 /* Always allow to toggle them off */
1129 if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1130 _draw_widget_outlines = !_draw_widget_outlines;
1132 }
1133}
1134
1140{
1142 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1143 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
1144
1145 /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1146 TimerGameCalendar::SetDate(new_calendar_date, 0);
1147
1148 /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1150 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1151
1152 /* Only change the date after changing cached values above. */
1153 TimerGameEconomy::SetDate(new_economy_date, 0);
1154}
1155
1162{
1163 switch (index) {
1164 case 0: return PlaceLandBlockInfo();
1165 case 1: ShowHelpWindow(); break;
1166 case 2: IConsoleSwitch(); break;
1167 case 3: ShowScriptDebugWindow(CompanyID::Invalid(), _ctrl_pressed); break;
1168 case 4: ShowScreenshotWindow(); break;
1169 case 5: ShowFramerateWindow(); break;
1170 case 6: ShowAboutWindow(); break;
1171 case 7: ShowSpriteAlignerWindow(); break;
1172 case 8: ToggleBoundingBoxes(); break;
1173 case 9: ToggleDirtyBlocks(); break;
1174 case 10: ToggleWidgetOutlines(); break;
1175 }
1176 return CBF_NONE;
1177}
1178
1179/* --- Switch toolbar button --- */
1180
1181static CallBackFunction ToolbarSwitchClick(Window *w)
1182{
1183 if (_toolbar_mode != TB_LOWER) {
1184 _toolbar_mode = TB_LOWER;
1185 } else {
1186 _toolbar_mode = TB_UPPER;
1187 }
1188
1189 w->ReInit();
1190 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1192 return CBF_NONE;
1193}
1194
1195/* --- Scenario editor specific handlers. */
1196
1201{
1202 ShowQueryString(GetString(STR_JUST_INT, _settings_game.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
1203 return CBF_NONE;
1204}
1205
1206static CallBackFunction ToolbarScenDateBackward(Window *w)
1207{
1208 /* don't allow too fast scrolling */
1209 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1211 w->SetDirty();
1212
1214 }
1215 _left_button_clicked = false;
1216 return CBF_NONE;
1217}
1218
1219static CallBackFunction ToolbarScenDateForward(Window *w)
1220{
1221 /* don't allow too fast scrolling */
1222 if (!w->flags.Test(WindowFlag::Timeout) || w->timeout_timer <= 1) {
1224 w->SetDirty();
1225
1227 }
1228 _left_button_clicked = false;
1229 return CBF_NONE;
1230}
1231
1232static CallBackFunction ToolbarScenGenLand(Window *w)
1233{
1236
1238 return CBF_NONE;
1239}
1240
1241static CallBackFunction ToolbarScenGenTownClick(Window *w)
1242{
1243 PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1244 return CBF_NONE;
1245}
1246
1247static CallBackFunction ToolbarScenGenTown(int index)
1248{
1249 switch (index) {
1250 case 0: ShowFoundTownWindow(); break;
1251 case 1: ShowBuildHousePicker(nullptr); break;
1252 }
1253 return CBF_NONE;
1254}
1255
1256static CallBackFunction ToolbarScenGenIndustry(Window *w)
1257{
1260 ShowBuildIndustryWindow();
1261 return CBF_NONE;
1262}
1263
1264static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1265{
1266 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1268 return CBF_NONE;
1269}
1270
1278{
1279 _last_built_roadtype = (RoadType)index;
1280 ShowBuildRoadScenToolbar(_last_built_roadtype);
1281 return CBF_NONE;
1282}
1283
1284static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1285{
1286 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1288 return CBF_NONE;
1289}
1290
1298{
1299 _last_built_tramtype = (RoadType)index;
1300 ShowBuildRoadScenToolbar(_last_built_tramtype);
1301 return CBF_NONE;
1302}
1303
1304static CallBackFunction ToolbarScenBuildDocks(Window *w)
1305{
1309 return CBF_NONE;
1310}
1311
1312static CallBackFunction ToolbarScenPlantTrees(Window *w)
1313{
1316 ShowBuildTreesToolbar();
1317 return CBF_NONE;
1318}
1319
1320static CallBackFunction ToolbarScenPlaceSign(Window *w)
1321{
1324 return SelectSignTool();
1325}
1326
1327static CallBackFunction ToolbarBtn_NULL(Window *)
1328{
1329 return CBF_NONE;
1330}
1331
1332typedef CallBackFunction MenuClickedProc(int index);
1333
1334static MenuClickedProc * const _menu_clicked_procs[] = {
1335 nullptr, // 0
1336 nullptr, // 1
1337 MenuClickSettings, // 2
1338 MenuClickSaveLoad, // 3
1339 MenuClickMap, // 4
1340 MenuClickTown, // 5
1341 MenuClickSubsidies, // 6
1342 MenuClickStations, // 7
1343 MenuClickFinances, // 8
1344 MenuClickCompany, // 9
1345 MenuClickStory, // 10
1346 MenuClickGoal, // 11
1349 MenuClickIndustry, // 14
1350 MenuClickShowTrains, // 15
1351 MenuClickShowRoad, // 16
1352 MenuClickShowShips, // 17
1353 MenuClickShowAir, // 18
1354 MenuClickMap, // 19
1355 nullptr, // 20
1356 MenuClickBuildRail, // 21
1357 MenuClickBuildRoad, // 22
1358 MenuClickBuildTram, // 23
1359 MenuClickBuildWater, // 24
1360 MenuClickBuildAir, // 25
1361 MenuClickForest, // 26
1363 MenuClickNewspaper, // 28
1364 MenuClickHelp, // 29
1365};
1366
1369protected:
1370 uint spacers;
1371
1372public:
1374 {
1375 }
1376
1383 {
1384 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1385 }
1386
1387 void SetupSmallestSize(Window *w) override
1388 {
1389 this->smallest_x = 0; // Biggest child
1390 this->smallest_y = 0; // Biggest child
1391 this->fill_x = 1;
1392 this->fill_y = 0;
1393 this->resize_x = 1; // We only resize in this direction
1394 this->resize_y = 0; // We never resize in this direction
1395 this->spacers = 0;
1396
1397 uint nbuttons = 0;
1398 /* First initialise some variables... */
1399 for (const auto &child_wid : this->children) {
1400 child_wid->SetupSmallestSize(w);
1401 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1402 if (this->IsButton(child_wid->type)) {
1403 nbuttons++;
1404 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1405 } else if (child_wid->type == NWID_SPACER) {
1406 this->spacers++;
1407 }
1408 }
1409
1410 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1411 for (const auto &child_wid : this->children) {
1412 child_wid->current_y = this->smallest_y;
1413 if (!this->IsButton(child_wid->type)) {
1414 child_wid->current_x = child_wid->smallest_x;
1415 }
1416 }
1417
1418 /* Exclude the switcher button which is not displayed when the toolbar fits the screen. When the switch is
1419 * displayed there will be no spacers anyway. */
1420 --nbuttons;
1421
1422 /* Allow space for all buttons, and include spacers at quarter the width of buttons. */
1423 _toolbar_width = nbuttons * this->smallest_x + this->spacers * this->smallest_x / 4;
1424 }
1425
1426 void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1427 {
1428 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1429
1430 this->pos_x = x;
1431 this->pos_y = y;
1432 this->current_x = given_width;
1433 this->current_y = given_height;
1434
1435 /* Figure out what are the visible buttons */
1436 uint arrangable_count, button_count, spacer_count;
1437 const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1438
1439 /* Create us ourselves a quick lookup table from WidgetID to slot. */
1440 std::map<WidgetID, uint> lookup;
1441 for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1442 NWidgetBase *nwid = it->get();
1443 nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1444 if (nwid->type == NWID_SPACER) continue;
1445 lookup[dynamic_cast<NWidgetCore *>(nwid)->GetIndex()] = std::distance(this->children.begin(), it);
1446 }
1447
1448 /* Now assign the widgets to their rightful place */
1449 uint position = 0; // Place to put next child relative to origin of the container.
1450 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1451 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1452 uint spacer_i = 0;
1453 uint button_i = 0;
1454
1455 /* Index into the arrangement indices. */
1456 const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1457 for (uint i = 0; i < arrangable_count; i++) {
1458 uint slot = lookup[*slotp];
1459 auto &child_wid = this->children[slot];
1460 /* If we have space to give to the spacers, do that. */
1461 if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1462 const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1463 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1464 uint add = spacer_space / (spacer_count - spacer_i);
1465 position += add;
1466 spacer_space -= add;
1467 spacer_i++;
1468 }
1469 }
1470
1471 /* Buttons can be scaled, the others not. */
1472 if (this->IsButton(child_wid->type)) {
1473 child_wid->current_x = button_space / (button_count - button_i);
1474 button_space -= child_wid->current_x;
1475 button_i++;
1476 } else {
1477 child_wid->current_x = child_wid->smallest_x;
1478 }
1479 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1480 position += child_wid->current_x;
1481
1482 if (rtl) {
1483 slotp--;
1484 } else {
1485 slotp++;
1486 }
1487 }
1488 }
1489
1490 void Draw(const Window *w) override
1491 {
1492 /* Draw brown-red toolbar bg. */
1493 const Rect r = this->GetCurrentRect();
1496
1497 this->NWidgetContainer::Draw(w);
1498 }
1499
1508 virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1509};
1510
1513 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1514 {
1515 static const uint SMALLEST_ARRANGEMENT = 14;
1516 static const uint BIGGEST_ARRANGEMENT = 20;
1517
1518 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1519 * The total number of buttons should be equal to arrangable_count * 2.
1520 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1521 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1522 * enough space.
1523 */
1524 static const WidgetID arrange14[] = {
1536 WID_TN_AIR,
1539 // lower toolbar
1554 };
1555 static const WidgetID arrange15[] = {
1566 WID_TN_AIR,
1571 // lower toolbar
1587 };
1588 static const WidgetID arrange16[] = {
1600 WID_TN_AIR,
1605 // lower toolbar
1622 };
1623 static const WidgetID arrange17[] = {
1636 WID_TN_AIR,
1641 // lower toolbar
1659 };
1660 static const WidgetID arrange18[] = {
1674 WID_TN_AIR,
1679 // lower toolbar
1698 };
1699 static const WidgetID arrange19[] = {
1713 WID_TN_AIR,
1719 // lower toolbar
1733 WID_TN_AIR,
1739 };
1740 static const WidgetID arrange20[] = {
1754 WID_TN_AIR,
1761 // lower toolbar
1775 WID_TN_AIR,
1782 };
1783 static const WidgetID arrange_all[] = {
1809 WID_TN_AIR,
1814 };
1815
1816 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1817 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1818 if (full_buttons > BIGGEST_ARRANGEMENT) {
1819 button_count = arrangable_count = lengthof(arrange_all);
1820 spacer_count = this->spacers;
1821 return arrange_all;
1822 }
1823
1824 /* Introduce the split toolbar */
1825 static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1826
1827 button_count = arrangable_count = full_buttons;
1828 spacer_count = this->spacers;
1829 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1830 }
1831};
1832
1836
1837 void SetupSmallestSize(Window *w) override
1838 {
1840
1841 /* Find the size of panel_widths */
1842 uint i = 0;
1843 for (const auto &child_wid : this->children) {
1844 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1845
1846 assert(i < lengthof(this->panel_widths));
1847 this->panel_widths[i++] = child_wid->current_x;
1848 _toolbar_width += child_wid->current_x;
1849 }
1850 }
1851
1852 const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1853 {
1854 static const WidgetID arrange_all[] = {
1874 };
1875 static const WidgetID arrange_nopanel[] = {
1894 };
1895 static const WidgetID arrange_switch[] = {
1907 // lower toolbar
1919 };
1920
1921 /* If we can place all buttons *and* the panels, show them. */
1922 uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1923 if (width >= min_full_width) {
1924 width -= this->panel_widths[0] + this->panel_widths[1];
1925 arrangable_count = lengthof(arrange_all);
1926 button_count = arrangable_count - 2;
1927 spacer_count = this->spacers;
1928 return arrange_all;
1929 }
1930
1931 /* 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 */
1932 uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1933 if (width > min_small_width) {
1934 width -= this->panel_widths[1];
1935 arrangable_count = lengthof(arrange_nopanel);
1936 button_count = arrangable_count - 1;
1937 spacer_count = this->spacers - 1;
1938 return arrange_nopanel;
1939 }
1940
1941 /* Split toolbar */
1942 width -= this->panel_widths[1];
1943 arrangable_count = lengthof(arrange_switch) / 2;
1944 button_count = arrangable_count - 1;
1945 spacer_count = 0;
1946 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1947 }
1948};
1949
1950/* --- Toolbar handling for the 'normal' case */
1951
1952typedef CallBackFunction ToolbarButtonProc(Window *w);
1953
1954static ToolbarButtonProc * const _toolbar_button_procs[] = {
1955 ToolbarPauseClick,
1959 ToolbarMapClick,
1960 ToolbarTownClick,
1961 ToolbarSubsidiesClick,
1962 ToolbarStationsClick,
1963 ToolbarFinancesClick,
1964 ToolbarCompaniesClick,
1965 ToolbarStoryClick,
1966 ToolbarGoalClick,
1967 ToolbarGraphsClick,
1968 ToolbarLeagueClick,
1969 ToolbarIndustryClick,
1970 ToolbarTrainClick,
1971 ToolbarRoadClick,
1972 ToolbarShipClick,
1973 ToolbarAirClick,
1974 ToolbarZoomInClick,
1975 ToolbarZoomOutClick,
1976 ToolbarBuildRailClick,
1977 ToolbarBuildRoadClick,
1978 ToolbarBuildTramClick,
1979 ToolbarBuildWaterClick,
1980 ToolbarBuildAirClick,
1981 ToolbarForestClick,
1982 ToolbarMusicClick,
1983 ToolbarNewspaperClick,
1984 ToolbarHelpClick,
1985 ToolbarSwitchClick,
1986};
1987
1990 MainToolbarWindow(WindowDesc &desc) : Window(desc)
1991 {
1992 this->InitNested(0);
1993
1994 _last_started_action = CBF_NONE;
1996 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1997 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1998 PositionMainToolbar(this);
2000 }
2001
2006
2007 void OnPaint() override
2008 {
2009 /* If spectator, disable all construction buttons
2010 * ie : Build road, rail, ships, airports and landscaping
2011 * Since enabled state is the default, just disable when needed */
2013 /* disable company list drop downs, if there are no companies */
2015
2018
2019 this->DrawWidgets();
2020 }
2021
2022 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2023 {
2024 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
2025 }
2026
2027 void OnDropdownSelect(WidgetID widget, int index) override
2028 {
2029 CallBackFunction cbf = _menu_clicked_procs[widget](index);
2030 if (cbf != CBF_NONE) _last_started_action = cbf;
2031 }
2032
2034 {
2035 CallBackFunction cbf = CBF_NONE;
2036 switch (hotkey) {
2037 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2038 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2039 case MTHK_SETTINGS: ShowGameOptions(); break;
2040 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2041 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2042 case MTHK_SMALLMAP: ShowSmallMap(); break;
2043 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2044 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2045 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2046 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2047 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2048 case MTHK_STORY: ShowStoryBook(_local_company); break;
2049 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2050 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2051 case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2052 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2053 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2054 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2055 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2056 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2057 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2058 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2059 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2060 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2061 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2062 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2063 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2064 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2065 case MTHK_MUSIC: ShowMusicWindow(); break;
2066 case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2067 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2068 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2069 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2070 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2071 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2072 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2073 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2074 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2075 case MTHK_SIGN_LIST: ShowSignList(); break;
2076 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2077 default: return ES_NOT_HANDLED;
2078 }
2079 if (cbf != CBF_NONE) _last_started_action = cbf;
2080 return ES_HANDLED;
2081 }
2082
2084 {
2085 switch (_last_started_action) {
2086 case CBF_PLACE_SIGN:
2087 PlaceProc_Sign(tile);
2088 break;
2089
2090 case CBF_PLACE_LANDINFO:
2091 ShowLandInfo(tile);
2092 break;
2093
2094 default: NOT_REACHED();
2095 }
2096 }
2097
2098 void OnPlaceObjectAbort() override
2099 {
2100 _last_started_action = CBF_NONE;
2101 }
2102
2104 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2105 if (this->IsWidgetLowered(WID_TN_PAUSE) != _pause_mode.Any()) {
2108 }
2109
2110 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2113 }
2114 }};
2115
2116 void OnTimeout() override
2117 {
2118 /* We do not want to automatically raise the pause, fast forward and
2119 * switchbar buttons; they have to stay down when pressed etc. */
2120 for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2121 this->RaiseWidgetWhenLowered(i);
2122 }
2123 }
2124
2130 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2131 {
2132 if (!gui_scope) return;
2134 }
2135
2136 static inline HotkeyList hotkeys{"maintoolbar", {
2137 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2138 Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2139 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2140 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2141 Hotkey(0, "load_game", MTHK_LOADGAME),
2142 Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2143 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2144 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2145 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2146 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2147 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2148 Hotkey(0, "story_book", MTHK_STORY),
2149 Hotkey(0, "goal_list", MTHK_GOAL),
2150 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2151 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2152 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2153 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2154 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2155 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2156 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2157 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2158 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2159 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2160 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2161 Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2162 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2163 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2164 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2165 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2166 Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2167 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2168 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2169 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2170 Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2171 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2172 Hotkey('L', "terraform", MTHK_TERRAFORM),
2173 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2174 Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2175 Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2176 Hotkey(0, "land_info", MTHK_LANDINFO),
2177 }};
2178};
2179
2180static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2181{
2183 static const SpriteID toolbar_button_sprites[] = {
2184 SPR_IMG_PAUSE, // WID_TN_PAUSE
2185 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2186 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2187 SPR_IMG_SAVE, // WID_TN_SAVE
2188 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2189 SPR_IMG_TOWN, // WID_TN_TOWNS
2190 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2191 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2192 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2193 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2194 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2195 SPR_IMG_GOAL, // WID_TN_GOAL
2196 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2197 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2198 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2199 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2200 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2201 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2202 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2203 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2204 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2205 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2206 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2207 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2208 SPR_IMG_BUILDWATER, // WID_TN_WATER
2209 SPR_IMG_BUILDAIR, // WID_TN_AIR
2210 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2211 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2212 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2213 SPR_IMG_QUERY, // WID_TN_HELP
2214 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2215 };
2216
2217 auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2218 for (WidgetID i = 0; i < WID_TN_END; i++) {
2219 switch (i) {
2220 case WID_TN_SMALL_MAP:
2221 case WID_TN_FINANCES:
2223 case WID_TN_ZOOM_IN:
2225 case WID_TN_MUSIC_SOUND:
2226 hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2227 break;
2228 }
2229 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);
2230 leaf->SetMinimalSize(20, 20);
2231 hor->Add(std::move(leaf));
2232 }
2233
2234 return hor;
2235}
2236
2237static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2239};
2240
2241static WindowDesc _toolb_normal_desc(
2242 WDP_MANUAL, nullptr, 0, 0,
2245 _nested_toolbar_normal_widgets,
2246 &MainToolbarWindow::hotkeys
2247);
2248
2249
2250/* --- Toolbar handling for the scenario editor */
2251
2252static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2253 nullptr, // 0
2254 nullptr, // 1
2255 MenuClickSettings, // 2
2256 MenuClickSaveLoad, // 3
2257 nullptr, // 4
2258 nullptr, // 5
2259 nullptr, // 6
2260 nullptr, // 7
2261 MenuClickMap, // 8
2262 nullptr, // 9
2263 nullptr, // 10
2264 nullptr, // 11
2265 ToolbarScenGenTown, // 12
2266 nullptr, // 13
2269 nullptr, // 16
2270 nullptr, // 17
2271 nullptr, // 18
2272 nullptr, // 19
2274 MenuClickHelp, // 21
2275 nullptr, // 22
2276};
2277
2278static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2279 ToolbarPauseClick,
2283 ToolbarBtn_NULL,
2285 ToolbarScenDateBackward,
2286 ToolbarScenDateForward,
2287 ToolbarScenMapTownDir,
2288 ToolbarZoomInClick,
2289 ToolbarZoomOutClick,
2290 ToolbarScenGenLand,
2291 ToolbarScenGenTownClick,
2292 ToolbarScenGenIndustry,
2293 ToolbarScenBuildRoadClick,
2294 ToolbarScenBuildTramClick,
2295 ToolbarScenBuildDocks,
2296 ToolbarScenPlantTrees,
2297 ToolbarScenPlaceSign,
2298 ToolbarBtn_NULL,
2299 ToolbarMusicClick,
2300 ToolbarHelpClick,
2301 ToolbarSwitchClick,
2302};
2303
2304enum MainToolbarEditorHotkeys : int32_t {
2305 MTEHK_PAUSE,
2306 MTEHK_FASTFORWARD,
2307 MTEHK_SETTINGS,
2308 MTEHK_SAVEGAME,
2309 MTEHK_GENLAND,
2310 MTEHK_GENTOWN,
2311 MTEHK_GENINDUSTRY,
2312 MTEHK_BUILD_ROAD,
2313 MTEHK_BUILD_TRAM,
2314 MTEHK_BUILD_DOCKS,
2315 MTEHK_BUILD_TREES,
2316 MTEHK_SIGN,
2317 MTEHK_MUSIC,
2318 MTEHK_LANDINFO,
2319 MTEHK_SMALL_SCREENSHOT,
2320 MTEHK_ZOOMEDIN_SCREENSHOT,
2321 MTEHK_DEFAULTZOOM_SCREENSHOT,
2322 MTEHK_GIANT_SCREENSHOT,
2323 MTEHK_ZOOM_IN,
2324 MTEHK_ZOOM_OUT,
2325 MTEHK_TERRAFORM,
2326 MTEHK_SMALLMAP,
2327 MTEHK_EXTRA_VIEWPORT,
2328};
2329
2332 {
2333 this->InitNested(0);
2334
2335 _last_started_action = CBF_NONE;
2337 PositionMainToolbar(this);
2339 }
2340
2345
2355
2356 void SetStringParameters(WidgetID widget) const override
2357 {
2358 switch (widget) {
2359 case WID_TE_DATE:
2361 break;
2362 }
2363 }
2364
2365 void DrawWidget(const Rect &r, WidgetID widget) const override
2366 {
2367 switch (widget) {
2368 case WID_TE_SPACER: {
2369 int height = r.Height();
2370 if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2372 DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2373 } else {
2375 }
2376 break;
2377 }
2378 }
2379 }
2380
2382 {
2383 switch (widget) {
2384 case WID_TE_SPACER:
2386 break;
2387
2388 case WID_TE_DATE:
2391 break;
2392 }
2393 }
2394
2395 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2396 {
2397 if (_game_mode == GM_MENU) return;
2398 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2399 if (cbf != CBF_NONE) _last_started_action = cbf;
2400 }
2401
2402 void OnDropdownSelect(WidgetID widget, int index) override
2403 {
2404 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2405 if (cbf != CBF_NONE) _last_started_action = cbf;
2407 }
2408
2410 {
2411 CallBackFunction cbf = CBF_NONE;
2412 switch (hotkey) {
2413 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2414 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2415 case MTEHK_SETTINGS: ShowGameOptions(); break;
2416 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2417 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2418 case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2419 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2420 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2421 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2422 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2423 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2424 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2425 case MTEHK_MUSIC: ShowMusicWindow(); break;
2426 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2427 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2428 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2429 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2430 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2431 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2432 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2433 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2434 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2435 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2436 default: return ES_NOT_HANDLED;
2437 }
2438 if (cbf != CBF_NONE) _last_started_action = cbf;
2439 return ES_HANDLED;
2440 }
2441
2443 {
2444 switch (_last_started_action) {
2445 case CBF_PLACE_SIGN:
2446 PlaceProc_Sign(tile);
2447 break;
2448
2449 case CBF_PLACE_LANDINFO:
2450 ShowLandInfo(tile);
2451 break;
2452
2453 default: NOT_REACHED();
2454 }
2455 }
2456
2457 void OnPlaceObjectAbort() override
2458 {
2459 _last_started_action = CBF_NONE;
2460 }
2461
2468
2470 IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2471 if (this->IsWidgetLowered(WID_TE_PAUSE) != _pause_mode.Any()) {
2473 this->SetDirty();
2474 }
2475
2476 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2478 this->SetDirty();
2479 }
2480 }};
2481
2487 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2488 {
2489 if (!gui_scope) return;
2491 }
2492
2493 void OnQueryTextFinished(std::optional<std::string> str) override
2494 {
2495 /* Was 'cancel' pressed? */
2496 if (!str.has_value()) return;
2497
2499 if (!str->empty()) {
2500 value = TimerGameCalendar::Year{atoi(str->c_str())};
2501 } else {
2502 /* An empty string means revert to the default */
2504 }
2505 SetStartingYear(value);
2506
2507 this->SetDirty();
2508 }
2509
2510 static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2511 Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2512 Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2513 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2514 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2515 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2516 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2517 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2518 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2519 Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2520 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2521 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2522 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2523 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2524 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2525 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2526 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2527 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2528 Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2529 Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2530 Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2531 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2532 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2533 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2534 }};
2535};
2536
2537static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2538 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2539 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2540 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2541 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetSpriteTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_SAVE_SCENARIO_LOAD_SCENARIO_TOOLTIP),
2543 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2545 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2547 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),
2548 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),
2549 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),
2550 EndContainer(),
2551 EndContainer(),
2553 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetSpriteTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_DISPLAY_MAP_TOWN_DIRECTORY_TOOLTIP),
2555 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetSpriteTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2556 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2558 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP),
2559 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP),
2560 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP),
2561 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP),
2562 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP),
2563 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetSpriteTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2564 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
2565 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
2567 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetSpriteTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2568 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetSpriteTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2569 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetSpriteTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2570};
2571
2572static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2573{
2574 return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2575}
2576
2577static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2578 NWidgetFunction(MakeScenarioToolbar),
2579};
2580
2581static WindowDesc _toolb_scen_desc(
2582 WDP_MANUAL, nullptr, 0, 0,
2585 _nested_toolb_scen_widgets,
2586 &ScenarioEditorToolbarWindow::hotkeys
2587);
2588
2591{
2592 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2593 _last_built_roadtype = ROADTYPE_ROAD;
2594 _last_built_tramtype = ROADTYPE_TRAM;
2595
2596 if (_game_mode == GM_EDITOR) {
2597 new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2598 } else {
2599 new MainToolbarWindow(_toolb_normal_desc);
2600 }
2601}
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.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr bool None() const
Test if none of the values are set.
constexpr Timpl & Flip(Tvalue_type value)
Flip the value-th bit.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
constexpr Timpl & Reset(Tvalue_type value)
Reset the value-th bit.
Drop down icon component.
Company name list item, with company-colour icon, name, and lock components.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
void ShiftDates(TimerGameEconomy::Date interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
Baseclass for nested widgets.
WidgetType type
Type of the widget / nested widget.
uint resize_x
Horizontal resize step (0 means not resizable).
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
uint smallest_x
Smallest horizontal size of the widget in a filled window.
uint current_x
Current horizontal size (after resizing).
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
uint smallest_y
Smallest vertical size of the widget in a filled window.
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
uint resize_y
Vertical resize step (0 means not resizable).
uint current_y
Current vertical size (after resizing).
Baseclass for container widgets.
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition widget.cpp:1295
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in container.
Base class for a 'real' widget.
Container for the 'normal' main toolbar.
const WidgetID * GetButtonArrangement(uint &width, uint &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.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition dock_gui.cpp:411
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:370
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:992
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:444
Window for configuring the Games
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
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:50
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition gfxinit.cpp: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 ShowStoryBook(CompanyID company, StoryPageID page_id=StoryPageID::Invalid(), bool centered=false)
Raise or create the story book window for company, at page page_id.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition misc_gui.cpp:348
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameSettings()
Open advanced settings window.
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
definition of HouseSpec and accessors
LeagueTable base class.
League table GUI functions.
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Miscellaneous command definitions.
void ShowQueryString(std::string_view str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
bool _networking
are we in networking mode?
Definition network.cpp: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
@ Normal
A game normally paused.
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
static const uint8_t PC_DARK_RED
Dark red palette colour.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:919
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:999
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:17
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition screenshot.h:19
@ SC_WORLD
World screenshot.
Definition screenshot.h:21
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition screenshot.h:20
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:58
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:57
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
void ShowSmallMap()
Show the smallmap window.
Smallmap GUI functions.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
static constexpr StationFacility STATION_FACILITY_GHOST
Fake 'facility' to allow toggling display of recently-removed station signs.
@ Dock
Station with a dock.
@ TruckStop
Station with truck stops.
@ Train
Station with train station.
@ Airport
Station with an airport.
@ BusStop
Station with bus stops.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:277
StoryPage base class.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
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:163
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:420
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
PlaceHouses place_houses
players are allowed to place town houses.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
TimerGameCalendar::Year starting_year
starting date
EconomySettings economy
settings to change the economy
GameCreationSettings game_creation
settings used during the creation of a game (map)
List of hotkeys for a window.
Definition hotkeys.h:37
All data for a single hotkey.
Definition hotkeys.h:21
Struct about custom league tables.
Definition league_base.h: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 Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPaint() override
The window must be repainted.
IntervalTimer< TimerWindow > refresh_interval
Refresh the state of pause / game-speed on a regular interval.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
void OnTimeout() override
Called when this window's timeout has been reached.
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:969
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 CallBackFunction _last_started_action
Last started user action.
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
static const int GRMN_OPERATING_PROFIT_GRAPH
Enum for the League Toolbar's and Graph Toolbar's related buttons.
static CallBackFunction MenuClickBuildRail(int index)
Handle click on the entry in the Build Rail menu.
static CallBackFunction MenuClickShowAir(int index)
Handle click on the entry in the Aircraft menu.
void AllocateToolbar()
Allocate the toolbar.
static const int GRMN_CARGO_PAYMENT_RATES
Show cargo payment rates graph.
static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
Handle click on SaveLoad button in toolbar in the scenario editor.
static CallBackFunction MenuClickBuildTram(int index)
Handle click on the entry in the Build Tram menu.
static CallBackFunction ToolbarFastForwardClick(Window *)
Toggle fast forward mode.
OptionMenuEntries
Game Option button menu entries.
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey={})
Pop up a generic company list menu.
static CallBackFunction MenuClickBuildWater(int)
Handle click on the entry in the Build Waterways menu.
static const int CTMN_SPECTATE
Become spectator.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
static CallBackFunction MenuClickStory(int index)
Handle click on the entry in the Story menu.
void ToggleBoundingBoxes()
Toggle drawing of sprites' bounding boxes.
static CallBackFunction MenuClickBuildAir(int)
Handle click on the entry in the Build Air menu.
void ToggleWidgetOutlines()
Toggle drawing of widget outlihes.
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
static const int CTMN_SPECTATOR
Show a company window as spectator.
Stuff related to the (main) toolbar.
Types related to the toolbar widgets.
@ WID_TE_SMALL_MAP
Small map menu.
@ WID_TE_TREES
Tree building toolbar.
@ WID_TE_TRAMS
Tram building menu.
@ WID_TE_DATE
The date of the scenario.
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
@ WID_TE_DATE_PANEL
Container for the date widgets.
@ WID_TE_HELP
Help menu.
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
@ WID_TE_INDUSTRY
Industry building window.
@ WID_TE_PAUSE
Pause the game.
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
@ WID_TE_SPACER
Spacer with "scenario editor" text.
@ WID_TE_WATER
Water building toolbar.
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TE_SAVE
Save menu.
@ WID_TE_LAND_GENERATE
Land generation.
@ WID_TE_TOWN_GENERATE
Town building window.
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TE_ROADS
Road building menu.
@ WID_TE_FAST_FORWARD
Fast forward the game.
@ WID_TE_SIGNS
Sign building.
@ WID_TE_SETTINGS
Settings menu.
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
@ WID_TN_LANDSCAPE
Landscaping toolbar.
@ WID_TN_AIR
Airport building toolbar.
@ WID_TN_SHIPS
Ship menu.
@ WID_TN_SETTINGS
Settings menu.
@ WID_TN_GOAL
Goal menu.
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
@ WID_TN_RAILS
Rail building menu.
@ WID_TN_SUBSIDIES
Subsidy menu.
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
@ WID_TN_TRAMS
Tram building menu.
@ WID_TN_HELP
Help menu.
@ WID_TN_SAVE
Save menu.
@ WID_TN_END
Helper for knowing the amount of widgets.
@ WID_TN_STORY
Story menu.
@ WID_TN_MESSAGES
Messages menu.
@ WID_TN_ROADVEHS
Road vehicle menu.
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
@ WID_TN_FINANCES
Finance menu.
@ WID_TN_GRAPHS
Graph menu.
@ WID_TN_LEAGUE
Company league menu.
@ WID_TN_STATIONS
Station menu.
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
@ WID_TN_COMPANIES
Company menu.
@ WID_TN_INDUSTRIES
Industry menu.
@ WID_TN_AIRCRAFT
Aircraft menu.
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
@ WID_TN_FAST_FORWARD
Fast forward the game.
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
@ WID_TN_PAUSE
Pause the game.
@ WID_TN_WATER
Water building toolbar.
@ WID_TN_ROADS
Road building menu.
@ WID_TN_TRAINS
Train menu.
@ WID_TN_TOWNS
Town menu.
@ WID_TN_SMALL_MAP
Small map menu.
@ TF_FORBIDDEN
Forbidden.
Definition town_type.h:97
StationFacilities _facility_display_opt
What station facilities to draw.
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren't in the game menu (there's never transpar...
uint8_t _display_opt
What do we want to draw/do?
@ TO_HOUSES
town buildings
@ TO_SIGNS
signs
void ShowTransparencyToolbar()
Show the transparency toolbar.
GUI functions related to transparency.
Base class for all vehicles.
Functions related to vehicles.
Functions related to the vehicle's GUIs.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void HandleZoomMessage(Window *w, const Viewport *vp, WidgetID widget_zoom_in, WidgetID widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
Definition viewport.cpp: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