OpenTTD Source  20241120-master-g6d3adc6169
toolbar_gui.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "gui.h"
12 #include "window_gui.h"
13 #include "window_func.h"
14 #include "viewport_func.h"
15 #include "command_func.h"
16 #include "dropdown_type.h"
17 #include "dropdown_func.h"
18 #include "dropdown_common_type.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 
64 #include "widgets/toolbar_widget.h"
65 
66 #include "network/network.h"
67 #include "network/network_gui.h"
68 #include "network/network_func.h"
69 
70 #include "safeguards.h"
71 
72 
74 uint _toolbar_width = 0;
75 
76 RailType _last_built_railtype;
77 RoadType _last_built_roadtype;
78 RoadType _last_built_tramtype;
79 
82  TB_NORMAL,
83  TB_UPPER,
84  TB_LOWER
85 };
86 
89  CBF_NONE,
90  CBF_PLACE_SIGN,
91  CBF_PLACE_LANDINFO,
92 };
93 
95 
99 class DropDownListCompanyItem : public DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>> {
100 public:
101  DropDownListCompanyItem(CompanyID company, bool shaded) : DropDownIcon<DropDownIcon<DropDownString<DropDownListItem>, true>>(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(company), NetworkCanJoinCompany(company) ? SPR_EMPTY : SPR_LOCK, PAL_NONE, STR_NULL, company, false, shaded)
102  {
103  SetDParam(0, company);
104  SetDParam(1, company);
105  this->SetString(GetString(STR_COMPANY_NAME_COMPANY_NUM));
106  }
107 };
108 
116 static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def)
117 {
118  ShowDropDownList(w, std::move(list), def, widget, 0, true);
120 }
121 
128 static void PopupMainToolbarMenu(Window *w, WidgetID widget, const std::initializer_list<StringID> &strings)
129 {
130  DropDownList list;
131  int i = 0;
132  for (StringID string : strings) {
133  if (string == STR_NULL) {
134  list.push_back(MakeDropDownListDividerItem());
135  } else {
136  list.push_back(MakeDropDownListStringItem(string, i));
137  i++;
138  }
139  }
140  PopupMainToolbarMenu(w, widget, std::move(list), 0);
141 }
142 
144 static const int CTMN_CLIENT_LIST = -1;
145 static const int CTMN_SPECTATE = -2;
146 static const int CTMN_SPECTATOR = -3;
147 
154 static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey = 0)
155 {
156  DropDownList list;
157 
158  switch (widget) {
159  case WID_TN_COMPANIES:
160  if (!_networking) break;
161 
162  /* Add the client list button for the companies menu */
163  list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST));
164 
166  list.push_back(MakeDropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE));
167  }
168  break;
169  case WID_TN_STORY:
170  list.push_back(MakeDropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR));
171  break;
172 
173  case WID_TN_GOAL:
174  list.push_back(MakeDropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR));
175  break;
176  }
177 
178  for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
179  if (!Company::IsValidID(c)) continue;
180  list.push_back(std::make_unique<DropDownListCompanyItem>(c, HasBit(grey, c)));
181  }
182 
184 }
185 
186 static ToolbarMode _toolbar_mode;
187 
188 static CallBackFunction SelectSignTool()
189 {
190  if (_last_started_action == CBF_PLACE_SIGN) {
192  return CBF_NONE;
193  } else {
194  SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
195  return CBF_PLACE_SIGN;
196  }
197 }
198 
199 /* --- Pausing --- */
200 
201 static CallBackFunction ToolbarPauseClick(Window *)
202 {
203  if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
204 
206  if (_settings_client.sound.confirm) SndPlayFx(SND_15_BEEP);
207  }
208  return CBF_NONE;
209 }
210 
217 {
218  if (_networking) return CBF_NONE; // no fast forward in network game
219 
220  ChangeGameSpeed(_game_speed == 100);
221 
223  return CBF_NONE;
224 }
225 
230  OME_GAMEOPTIONS,
231  OME_SETTINGS,
232  OME_AI_SETTINGS,
233  OME_GAMESCRIPT_SETTINGS,
234  OME_NEWGRFSETTINGS,
235  OME_SANDBOX,
236  OME_TRANSPARENCIES,
237  OME_SHOW_TOWNNAMES,
238  OME_SHOW_STATIONNAMES,
239  OME_SHOW_WAYPOINTNAMES,
240  OME_SHOW_SIGNS,
241  OME_SHOW_COMPETITOR_SIGNS,
242  OME_FULL_ANIMATION,
243  OME_FULL_DETAILS,
244  OME_TRANSPARENTBUILDINGS,
245  OME_SHOW_STATIONSIGNS,
246 };
247 
255 {
256  DropDownList list;
257  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS));
258  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS));
259  /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
260  * the settings once they join but never update it. As such don't show the window at all
261  * to network clients. */
262  if (!_networking || _network_server) {
263  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS));
264  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS, OME_GAMESCRIPT_SETTINGS));
265  }
266  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS));
267  if (_game_mode != GM_EDITOR && !_networking) {
268  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_SANDBOX_OPTIONS, OME_SANDBOX));
269  }
270  list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES));
271  list.push_back(MakeDropDownListDividerItem());
272  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES));
273  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES));
274  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES));
275  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS));
276  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS));
277  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION));
278  list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS));
279  list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS));
280  list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS));
281 
282  ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true);
284  return CBF_NONE;
285 }
286 
294 {
295  switch (index) {
296  case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
297  case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
298  case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
299  case OME_GAMESCRIPT_SETTINGS: ShowGSConfigWindow(); return CBF_NONE;
300  case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE;
301  case OME_SANDBOX: ShowCheatWindow(); break;
302  case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
303 
304  case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
305  case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
306  case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
307  case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
308  case OME_SHOW_COMPETITOR_SIGNS:
311  break;
312  case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
313  case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
314  case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
315  case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
316  }
318  return CBF_NONE;
319 }
320 
325  SLEME_SAVE_SCENARIO = 0,
326  SLEME_LOAD_SCENARIO,
327  SLEME_SAVE_HEIGHTMAP,
328  SLEME_LOAD_HEIGHTMAP,
329  SLEME_EXIT_TOINTRO,
330  SLEME_EXIT_GAME,
331 };
332 
337  SLNME_SAVE_GAME = 0,
338  SLNME_LOAD_GAME,
339  SLNME_EXIT_TOINTRO,
340  SLNME_EXIT_GAME,
341 };
342 
350 {
351  PopupMainToolbarMenu(w, WID_TN_SAVE, {STR_FILE_MENU_SAVE_GAME, STR_FILE_MENU_LOAD_GAME, STR_FILE_MENU_QUIT_GAME,
352  STR_NULL, STR_FILE_MENU_EXIT});
353  return CBF_NONE;
354 }
355 
363 {
364  PopupMainToolbarMenu(w, WID_TE_SAVE, {STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO,
365  STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP, STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP,
366  STR_SCENEDIT_FILE_MENU_QUIT_EDITOR, STR_NULL, STR_SCENEDIT_FILE_MENU_QUIT});
367  return CBF_NONE;
368 }
369 
376 static CallBackFunction MenuClickSaveLoad(int index = 0)
377 {
378  if (_game_mode == GM_EDITOR) {
379  switch (index) {
380  case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
381  case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
382  case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break;
383  case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break;
384  case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
385  case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
386  }
387  } else {
388  switch (index) {
389  case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
390  case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
391  case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
392  case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
393  }
394  }
395  return CBF_NONE;
396 }
397 
398 /* --- Map button menu --- */
399 
400 enum MapMenuEntries {
401  MME_SHOW_SMALLMAP = 0,
402  MME_SHOW_EXTRAVIEWPORTS,
403  MME_SHOW_LINKGRAPH,
404  MME_SHOW_SIGNLISTS,
405  MME_SHOW_TOWNDIRECTORY,
406  MME_SHOW_INDUSTRYDIRECTORY,
407 };
408 
409 static CallBackFunction ToolbarMapClick(Window *w)
410 {
411  DropDownList list;
412  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
413  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
414  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH));
415  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
416  PopupMainToolbarMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
417  return CBF_NONE;
418 }
419 
420 static CallBackFunction ToolbarScenMapTownDir(Window *w)
421 {
422  DropDownList list;
423  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP));
424  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS));
425  list.push_back(MakeDropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS));
426  list.push_back(MakeDropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY));
427  list.push_back(MakeDropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY));
428  PopupMainToolbarMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
429  return CBF_NONE;
430 }
431 
439 {
440  switch (index) {
441  case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
442  case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
443  case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
444  case MME_SHOW_SIGNLISTS: ShowSignList(); break;
445  case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
446  case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
447  }
448  return CBF_NONE;
449 }
450 
451 /* --- Town button menu --- */
452 
453 static CallBackFunction ToolbarTownClick(Window *w)
454 {
456  PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY});
457  } else {
458  PopupMainToolbarMenu(w, WID_TN_TOWNS, {STR_TOWN_MENU_TOWN_DIRECTORY, STR_TOWN_MENU_FOUND_TOWN});
459  }
460  return CBF_NONE;
461 }
462 
470 {
471  switch (index) {
472  case 0: ShowTownDirectory(); break;
473  case 1: // setting could be changed when the dropdown was open
474  if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
475  break;
476  }
477  return CBF_NONE;
478 }
479 
480 /* --- Subidies button menu --- */
481 
482 static CallBackFunction ToolbarSubsidiesClick(Window *w)
483 {
484  PopupMainToolbarMenu(w, WID_TN_SUBSIDIES, {STR_SUBSIDIES_MENU_SUBSIDIES});
485  return CBF_NONE;
486 }
487 
494 {
495  ShowSubsidiesList();
496  return CBF_NONE;
497 }
498 
499 /* --- Stations button menu --- */
500 
501 static CallBackFunction ToolbarStationsClick(Window *w)
502 {
504  return CBF_NONE;
505 }
506 
514 {
516  return CBF_NONE;
517 }
518 
519 /* --- Finances button menu --- */
520 
521 static CallBackFunction ToolbarFinancesClick(Window *w)
522 {
524  return CBF_NONE;
525 }
526 
534 {
536  return CBF_NONE;
537 }
538 
539 /* --- Company's button menu --- */
540 
541 static CallBackFunction ToolbarCompaniesClick(Window *w)
542 {
544  return CBF_NONE;
545 }
546 
554 {
555  if (_networking) {
556  switch (index) {
557  case CTMN_CLIENT_LIST:
558  ShowClientList();
559  return CBF_NONE;
560 
561  case CTMN_SPECTATE:
562  if (_network_server) {
565  } else {
567  }
568  return CBF_NONE;
569  }
570  }
571  ShowCompany((CompanyID)index);
572  return CBF_NONE;
573 }
574 
575 /* --- Story button menu --- */
576 
577 static CallBackFunction ToolbarStoryClick(Window *w)
578 {
580  return CBF_NONE;
581 }
582 
590 {
592  return CBF_NONE;
593 }
594 
595 /* --- Goal button menu --- */
596 
597 static CallBackFunction ToolbarGoalClick(Window *w)
598 {
600  return CBF_NONE;
601 }
602 
610 {
612  return CBF_NONE;
613 }
614 
615 /* --- Graphs and League Table button menu --- */
616 
621 static const int GRMN_OPERATING_PROFIT_GRAPH = -1;
622 static const int GRMN_INCOME_GRAPH = -2;
623 static const int GRMN_DELIVERED_CARGO_GRAPH = -3;
624 static const int GRMN_PERFORMANCE_HISTORY_GRAPH = -4;
625 static const int GRMN_COMPANY_VALUE_GRAPH = -5;
626 static const int GRMN_CARGO_PAYMENT_RATES = -6;
627 static const int LTMN_PERFORMANCE_LEAGUE = -7;
628 static const int LTMN_PERFORMANCE_RATING = -8;
629 static const int LTMN_HIGHSCORE = -9;
630 
631 static void AddDropDownLeagueTableOptions(DropDownList &list)
632 {
633  if (LeagueTable::GetNumItems() > 0) {
634  for (LeagueTable *lt : LeagueTable::Iterate()) {
635  list.push_back(MakeDropDownListStringItem(lt->title, lt->index));
636  }
637  } else {
638  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, LTMN_PERFORMANCE_LEAGUE));
639  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING, LTMN_PERFORMANCE_RATING));
640  if (!_networking) {
641  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_HIGHSCORE, LTMN_HIGHSCORE));
642  }
643  }
644 }
645 
646 static CallBackFunction ToolbarGraphsClick(Window *w)
647 {
648  DropDownList list;
649 
650  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, GRMN_OPERATING_PROFIT_GRAPH));
651  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_INCOME_GRAPH, GRMN_INCOME_GRAPH));
652  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH, GRMN_DELIVERED_CARGO_GRAPH));
653  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH, GRMN_PERFORMANCE_HISTORY_GRAPH));
654  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_COMPANY_VALUE_GRAPH, GRMN_COMPANY_VALUE_GRAPH));
655  list.push_back(MakeDropDownListStringItem(STR_GRAPH_MENU_CARGO_PAYMENT_RATES, GRMN_CARGO_PAYMENT_RATES));
656 
657  if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list);
658 
659  ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, true);
661 
662  return CBF_NONE;
663 }
664 
665 static CallBackFunction ToolbarLeagueClick(Window *w)
666 {
667  DropDownList list;
668 
669  AddDropDownLeagueTableOptions(list);
670 
671  int selected = list[0]->result;
672  ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, true);
674 
675  return CBF_NONE;
676 }
677 
685 {
686  switch (index) {
687  case GRMN_OPERATING_PROFIT_GRAPH: ShowOperatingProfitGraph(); break;
688  case GRMN_INCOME_GRAPH: ShowIncomeGraph(); break;
689  case GRMN_DELIVERED_CARGO_GRAPH: ShowDeliveredCargoGraph(); break;
690  case GRMN_PERFORMANCE_HISTORY_GRAPH: ShowPerformanceHistoryGraph(); break;
691  case GRMN_COMPANY_VALUE_GRAPH: ShowCompanyValueGraph(); break;
692  case GRMN_CARGO_PAYMENT_RATES: ShowCargoPaymentRates(); break;
693  case LTMN_PERFORMANCE_LEAGUE: ShowPerformanceLeagueTable(); break;
694  case LTMN_PERFORMANCE_RATING: ShowPerformanceRatingDetail(); break;
695  case LTMN_HIGHSCORE: ShowHighscoreTable(); break;
696  default: {
697  if (LeagueTable::IsValidID(index)) {
698  ShowScriptLeagueTable((LeagueTableID)index);
699  }
700  }
701  }
702  return CBF_NONE;
703 }
704 
705 
706 
707 /* --- Industries button menu --- */
708 
709 static CallBackFunction ToolbarIndustryClick(Window *w)
710 {
711  /* Disable build-industry menu if we are a spectator */
713  PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN});
714  } else {
715  PopupMainToolbarMenu(w, WID_TN_INDUSTRIES, {STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, STR_INDUSTRY_MENU_INDUSTRY_CHAIN, STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY});
716  }
717  return CBF_NONE;
718 }
719 
727 {
728  switch (index) {
729  case 0: ShowIndustryDirectory(); break;
730  case 1: ShowIndustryCargoesWindow(); break;
731  case 2: ShowBuildIndustryWindow(); break;
732  }
733  return CBF_NONE;
734 }
735 
736 /* --- Trains button menu + 1 helper function for all vehicles. --- */
737 
738 static void ToolbarVehicleClick(Window *w, VehicleType veh)
739 {
740  CompanyMask dis = 0;
741 
742  for (const Company *c : Company::Iterate()) {
743  if (c->group_all[veh].num_vehicle == 0) SetBit(dis, c->index);
744  }
746 }
747 
748 
749 static CallBackFunction ToolbarTrainClick(Window *w)
750 {
751  ToolbarVehicleClick(w, VEH_TRAIN);
752  return CBF_NONE;
753 }
754 
762 {
763  ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
764  return CBF_NONE;
765 }
766 
767 /* --- Road vehicle button menu --- */
768 
769 static CallBackFunction ToolbarRoadClick(Window *w)
770 {
771  ToolbarVehicleClick(w, VEH_ROAD);
772  return CBF_NONE;
773 }
774 
782 {
783  ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
784  return CBF_NONE;
785 }
786 
787 /* --- Ship button menu --- */
788 
789 static CallBackFunction ToolbarShipClick(Window *w)
790 {
791  ToolbarVehicleClick(w, VEH_SHIP);
792  return CBF_NONE;
793 }
794 
802 {
803  ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
804  return CBF_NONE;
805 }
806 
807 /* --- Aircraft button menu --- */
808 
809 static CallBackFunction ToolbarAirClick(Window *w)
810 {
811  ToolbarVehicleClick(w, VEH_AIRCRAFT);
812  return CBF_NONE;
813 }
814 
822 {
823  ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
824  return CBF_NONE;
825 }
826 
827 /* --- Zoom in button --- */
828 
829 static CallBackFunction ToolbarZoomInClick(Window *w)
830 {
832  w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_IN : (WidgetID)WID_TN_ZOOM_IN);
834  }
835  return CBF_NONE;
836 }
837 
838 /* --- Zoom out button --- */
839 
840 static CallBackFunction ToolbarZoomOutClick(Window *w)
841 {
843  w->HandleButtonClick((_game_mode == GM_EDITOR) ? (WidgetID)WID_TE_ZOOM_OUT : (WidgetID)WID_TN_ZOOM_OUT);
845  }
846  return CBF_NONE;
847 }
848 
849 /* --- Rail button menu --- */
850 
851 static CallBackFunction ToolbarBuildRailClick(Window *w)
852 {
853  ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true);
855  return CBF_NONE;
856 }
857 
865 {
866  _last_built_railtype = (RailType)index;
867  ShowBuildRailToolbar(_last_built_railtype);
868  return CBF_NONE;
869 }
870 
871 /* --- Road button menu --- */
872 
873 static CallBackFunction ToolbarBuildRoadClick(Window *w)
874 {
875  ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true);
877  return CBF_NONE;
878 }
879 
887 {
888  _last_built_roadtype = (RoadType)index;
889  ShowBuildRoadToolbar(_last_built_roadtype);
890  return CBF_NONE;
891 }
892 
893 /* --- Tram button menu --- */
894 
895 static CallBackFunction ToolbarBuildTramClick(Window *w)
896 {
897  ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true);
899  return CBF_NONE;
900 }
901 
909 {
910  _last_built_tramtype = (RoadType)index;
911  ShowBuildRoadToolbar(_last_built_tramtype);
912  return CBF_NONE;
913 }
914 
915 /* --- Water button menu --- */
916 
917 static CallBackFunction ToolbarBuildWaterClick(Window *w)
918 {
919  DropDownList list;
920  list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0));
921  ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true);
923  return CBF_NONE;
924 }
925 
932 {
934  return CBF_NONE;
935 }
936 
937 /* --- Airport button menu --- */
938 
939 static CallBackFunction ToolbarBuildAirClick(Window *w)
940 {
941  DropDownList list;
942  list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0));
943  ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true);
945  return CBF_NONE;
946 }
947 
954 {
956  return CBF_NONE;
957 }
958 
959 /* --- Forest button menu --- */
960 
961 static CallBackFunction ToolbarForestClick(Window *w)
962 {
963  DropDownList list;
964  list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0));
965  list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1));
966  list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2));
967  ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true);
969  return CBF_NONE;
970 }
971 
979 {
980  switch (index) {
981  case 0: ShowTerraformToolbar(); break;
982  case 1: ShowBuildTreesToolbar(); break;
983  case 2: return SelectSignTool();
984  }
985  return CBF_NONE;
986 }
987 
988 /* --- Music button menu --- */
989 
990 static CallBackFunction ToolbarMusicClick(Window *w)
991 {
992  PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_MUSIC_SOUND : (WidgetID)WID_TN_MUSIC_SOUND, {STR_TOOLBAR_SOUND_MUSIC});
993  return CBF_NONE;
994 }
995 
1002 {
1003  ShowMusicWindow();
1004  return CBF_NONE;
1005 }
1006 
1007 /* --- Newspaper button menu --- */
1008 
1009 static CallBackFunction ToolbarNewspaperClick(Window *w)
1010 {
1011  PopupMainToolbarMenu(w, WID_TN_MESSAGES, {STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, STR_NEWS_MENU_MESSAGE_HISTORY_MENU, STR_NEWS_MENU_DELETE_ALL_MESSAGES});
1012  return CBF_NONE;
1013 }
1014 
1022 {
1023  switch (index) {
1024  case 0: ShowLastNewsMessage(); break;
1025  case 1: ShowMessageHistory(); break;
1026  case 2: DeleteAllMessages(); break;
1027  }
1028  return CBF_NONE;
1029 }
1030 
1031 /* --- Help button menu --- */
1032 
1033 static CallBackFunction PlaceLandBlockInfo()
1034 {
1035  if (_last_started_action == CBF_PLACE_LANDINFO) {
1037  return CBF_NONE;
1038  } else {
1039  SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1040  return CBF_PLACE_LANDINFO;
1041  }
1042 }
1043 
1044 static CallBackFunction ToolbarHelpClick(Window *w)
1045 {
1047  PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1048  STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1049  STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD,
1050  STR_ABOUT_MENU_SPRITE_ALIGNER, STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES, STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS,
1051  STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES});
1052  } else {
1053  PopupMainToolbarMenu(w, _game_mode == GM_EDITOR ? (WidgetID)WID_TE_HELP : (WidgetID)WID_TN_HELP, {STR_ABOUT_MENU_LAND_BLOCK_INFO,
1054  STR_ABOUT_MENU_HELP, STR_NULL, STR_ABOUT_MENU_TOGGLE_CONSOLE, STR_ABOUT_MENU_AI_DEBUG,
1055  STR_ABOUT_MENU_SCREENSHOT, STR_ABOUT_MENU_SHOW_FRAMERATE, STR_ABOUT_MENU_ABOUT_OPENTTD});
1056  }
1057  return CBF_NONE;
1058 }
1059 
1068 {
1069  extern bool _draw_bounding_boxes;
1070  /* Always allow to toggle them off */
1071  if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1072  _draw_bounding_boxes = !_draw_bounding_boxes;
1074  }
1075 }
1076 
1085 {
1086  extern bool _draw_dirty_blocks;
1087  /* Always allow to toggle them off */
1088  if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1089  _draw_dirty_blocks = !_draw_dirty_blocks;
1091  }
1092 }
1093 
1099 {
1100  extern bool _draw_widget_outlines;
1101  /* Always allow to toggle them off */
1102  if (_settings_client.gui.newgrf_developer_tools || _draw_widget_outlines) {
1103  _draw_widget_outlines = !_draw_widget_outlines;
1105  }
1106 }
1107 
1113 {
1115  TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1116  TimerGameEconomy::Date new_economy_date = new_calendar_date.base();
1117 
1118  /* We must set both Calendar and Economy dates to keep them in sync. Calendar first. */
1119  TimerGameCalendar::SetDate(new_calendar_date, 0);
1120 
1121  /* If you open a savegame as a scenario, there may already be link graphs and/or vehicles. These use economy date. */
1123  for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
1124 
1125  /* Only change the date after changing cached values above. */
1126  TimerGameEconomy::SetDate(new_economy_date, 0);
1127 }
1128 
1135 {
1136  switch (index) {
1137  case 0: return PlaceLandBlockInfo();
1138  case 1: ShowHelpWindow(); break;
1139  case 2: IConsoleSwitch(); break;
1141  case 4: ShowScreenshotWindow(); break;
1142  case 5: ShowFramerateWindow(); break;
1143  case 6: ShowAboutWindow(); break;
1144  case 7: ShowSpriteAlignerWindow(); break;
1145  case 8: ToggleBoundingBoxes(); break;
1146  case 9: ToggleDirtyBlocks(); break;
1147  case 10: ToggleWidgetOutlines(); break;
1148  }
1149  return CBF_NONE;
1150 }
1151 
1152 /* --- Switch toolbar button --- */
1153 
1154 static CallBackFunction ToolbarSwitchClick(Window *w)
1155 {
1156  if (_toolbar_mode != TB_LOWER) {
1157  _toolbar_mode = TB_LOWER;
1158  } else {
1159  _toolbar_mode = TB_UPPER;
1160  }
1161 
1162  w->ReInit();
1163  w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (WidgetID)WID_TE_SWITCH_BAR : (WidgetID)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1164  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1165  return CBF_NONE;
1166 }
1167 
1168 /* --- Scenario editor specific handlers. */
1169 
1174 {
1176  ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
1177  return CBF_NONE;
1178 }
1179 
1180 static CallBackFunction ToolbarScenDateBackward(Window *w)
1181 {
1182  /* don't allow too fast scrolling */
1183  if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1185  w->SetDirty();
1186 
1188  }
1189  _left_button_clicked = false;
1190  return CBF_NONE;
1191 }
1192 
1193 static CallBackFunction ToolbarScenDateForward(Window *w)
1194 {
1195  /* don't allow too fast scrolling */
1196  if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1198  w->SetDirty();
1199 
1201  }
1202  _left_button_clicked = false;
1203  return CBF_NONE;
1204 }
1205 
1206 static CallBackFunction ToolbarScenGenLand(Window *w)
1207 {
1209  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1210 
1212  return CBF_NONE;
1213 }
1214 
1215 static CallBackFunction ToolbarScenGenTownClick(Window *w)
1216 {
1217  PopupMainToolbarMenu(w, WID_TE_TOWN_GENERATE, {STR_SCENEDIT_TOWN_MENU_BUILD_TOWN, STR_SCENEDIT_TOWN_MENU_PACE_HOUSE});
1218  return CBF_NONE;
1219 }
1220 
1221 static CallBackFunction ToolbarScenGenTown(int index)
1222 {
1223  switch (index) {
1224  case 0: ShowFoundTownWindow(); break;
1225  case 1: ShowBuildHousePicker(nullptr); break;
1226  }
1227  return CBF_NONE;
1228 }
1229 
1230 static CallBackFunction ToolbarScenGenIndustry(Window *w)
1231 {
1233  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1234  ShowBuildIndustryWindow();
1235  return CBF_NONE;
1236 }
1237 
1238 static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1239 {
1240  ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true);
1241  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1242  return CBF_NONE;
1243 }
1244 
1252 {
1253  _last_built_roadtype = (RoadType)index;
1254  ShowBuildRoadScenToolbar(_last_built_roadtype);
1255  return CBF_NONE;
1256 }
1257 
1258 static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1259 {
1260  ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true);
1261  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1262  return CBF_NONE;
1263 }
1264 
1272 {
1273  _last_built_tramtype = (RoadType)index;
1274  ShowBuildRoadScenToolbar(_last_built_tramtype);
1275  return CBF_NONE;
1276 }
1277 
1278 static CallBackFunction ToolbarScenBuildDocks(Window *w)
1279 {
1281  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1283  return CBF_NONE;
1284 }
1285 
1286 static CallBackFunction ToolbarScenPlantTrees(Window *w)
1287 {
1289  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1290  ShowBuildTreesToolbar();
1291  return CBF_NONE;
1292 }
1293 
1294 static CallBackFunction ToolbarScenPlaceSign(Window *w)
1295 {
1297  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1298  return SelectSignTool();
1299 }
1300 
1301 static CallBackFunction ToolbarBtn_NULL(Window *)
1302 {
1303  return CBF_NONE;
1304 }
1305 
1306 typedef CallBackFunction MenuClickedProc(int index);
1307 
1308 static MenuClickedProc * const _menu_clicked_procs[] = {
1309  nullptr, // 0
1310  nullptr, // 1
1311  MenuClickSettings, // 2
1312  MenuClickSaveLoad, // 3
1313  MenuClickMap, // 4
1314  MenuClickTown, // 5
1315  MenuClickSubsidies, // 6
1316  MenuClickStations, // 7
1317  MenuClickFinances, // 8
1318  MenuClickCompany, // 9
1319  MenuClickStory, // 10
1320  MenuClickGoal, // 11
1323  MenuClickIndustry, // 14
1324  MenuClickShowTrains, // 15
1325  MenuClickShowRoad, // 16
1326  MenuClickShowShips, // 17
1327  MenuClickShowAir, // 18
1328  MenuClickMap, // 19
1329  nullptr, // 20
1330  MenuClickBuildRail, // 21
1331  MenuClickBuildRoad, // 22
1332  MenuClickBuildTram, // 23
1333  MenuClickBuildWater, // 24
1334  MenuClickBuildAir, // 25
1335  MenuClickForest, // 26
1336  MenuClickMusicWindow, // 27
1337  MenuClickNewspaper, // 28
1338  MenuClickHelp, // 29
1339 };
1340 
1343 protected:
1344  uint spacers;
1345 
1346 public:
1348  {
1349  }
1350 
1357  {
1358  return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1359  }
1360 
1361  void SetupSmallestSize(Window *w) override
1362  {
1363  this->smallest_x = 0; // Biggest child
1364  this->smallest_y = 0; // Biggest child
1365  this->fill_x = 1;
1366  this->fill_y = 0;
1367  this->resize_x = 1; // We only resize in this direction
1368  this->resize_y = 0; // We never resize in this direction
1369  this->spacers = 0;
1370 
1371  uint nbuttons = 0;
1372  /* First initialise some variables... */
1373  for (const auto &child_wid : this->children) {
1374  child_wid->SetupSmallestSize(w);
1375  this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
1376  if (this->IsButton(child_wid->type)) {
1377  nbuttons++;
1378  this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding.Horizontal());
1379  } else if (child_wid->type == NWID_SPACER) {
1380  this->spacers++;
1381  }
1382  }
1383 
1384  /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1385  for (const auto &child_wid : this->children) {
1386  child_wid->current_y = this->smallest_y;
1387  if (!this->IsButton(child_wid->type)) {
1388  child_wid->current_x = child_wid->smallest_x;
1389  }
1390  }
1391  _toolbar_width = nbuttons * this->smallest_x;
1392  }
1393 
1394  void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override
1395  {
1396  assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1397 
1398  this->pos_x = x;
1399  this->pos_y = y;
1400  this->current_x = given_width;
1401  this->current_y = given_height;
1402 
1403  /* Figure out what are the visible buttons */
1404  uint arrangable_count, button_count, spacer_count;
1405  const WidgetID *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1406 
1407  /* Create us ourselves a quick lookup table from WidgetID to slot. */
1408  std::map<WidgetID, uint> lookup;
1409  for (auto it = std::begin(this->children); it != std::end(this->children); ++it) {
1410  NWidgetBase *nwid = it->get();
1411  nwid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
1412  if (nwid->type == NWID_SPACER) continue;
1413  lookup[dynamic_cast<NWidgetCore *>(nwid)->index] = std::distance(this->children.begin(), it);
1414  }
1415 
1416  /* Now assign the widgets to their rightful place */
1417  uint position = 0; // Place to put next child relative to origin of the container.
1418  uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1419  uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1420  uint spacer_i = 0;
1421  uint button_i = 0;
1422 
1423  /* Index into the arrangement indices. */
1424  const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1425  for (uint i = 0; i < arrangable_count; i++) {
1426  uint slot = lookup[*slotp];
1427  auto &child_wid = this->children[slot];
1428  /* If we have space to give to the spacers, do that. */
1429  if (spacer_space > 0 && slot > 0 && slot < this->children.size() - 1) {
1430  const auto &possible_spacer = this->children[slot + (rtl ? 1 : -1)];
1431  if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1432  uint add = spacer_space / (spacer_count - spacer_i);
1433  position += add;
1434  spacer_space -= add;
1435  spacer_i++;
1436  }
1437  }
1438 
1439  /* Buttons can be scaled, the others not. */
1440  if (this->IsButton(child_wid->type)) {
1441  child_wid->current_x = button_space / (button_count - button_i);
1442  button_space -= child_wid->current_x;
1443  button_i++;
1444  } else {
1445  child_wid->current_x = child_wid->smallest_x;
1446  }
1447  child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1448  position += child_wid->current_x;
1449 
1450  if (rtl) {
1451  slotp--;
1452  } else {
1453  slotp++;
1454  }
1455  }
1456  }
1457 
1458  void Draw(const Window *w) override
1459  {
1460  /* Draw brown-red toolbar bg. */
1461  const Rect r = this->GetCurrentRect();
1464 
1465  this->NWidgetContainer::Draw(w);
1466  }
1467 
1476  virtual const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1477 };
1478 
1481  const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1482  {
1483  static const uint SMALLEST_ARRANGEMENT = 14;
1484  static const uint BIGGEST_ARRANGEMENT = 20;
1485 
1486  /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1487  * The total number of buttons should be equal to arrangable_count * 2.
1488  * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1489  * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1490  * enough space.
1491  */
1492  static const WidgetID arrange14[] = {
1493  WID_TN_PAUSE,
1495  WID_TN_TRAINS,
1497  WID_TN_SHIPS,
1501  WID_TN_RAILS,
1502  WID_TN_ROADS,
1503  WID_TN_WATER,
1504  WID_TN_AIR,
1507  // lower toolbar
1509  WID_TN_SAVE,
1511  WID_TN_TOWNS,
1516  WID_TN_GRAPHS,
1520  WID_TN_HELP,
1522  };
1523  static const WidgetID arrange15[] = {
1524  WID_TN_PAUSE,
1527  WID_TN_TRAINS,
1529  WID_TN_SHIPS,
1531  WID_TN_RAILS,
1532  WID_TN_ROADS,
1533  WID_TN_WATER,
1534  WID_TN_AIR,
1539  // lower toolbar
1540  WID_TN_PAUSE,
1543  WID_TN_SAVE,
1544  WID_TN_TOWNS,
1549  WID_TN_GRAPHS,
1553  WID_TN_HELP,
1555  };
1556  static const WidgetID arrange16[] = {
1557  WID_TN_PAUSE,
1561  WID_TN_TRAINS,
1563  WID_TN_SHIPS,
1565  WID_TN_RAILS,
1566  WID_TN_ROADS,
1567  WID_TN_WATER,
1568  WID_TN_AIR,
1573  // lower toolbar
1574  WID_TN_PAUSE,
1576  WID_TN_SAVE,
1577  WID_TN_TOWNS,
1582  WID_TN_GRAPHS,
1586  WID_TN_HELP,
1590  };
1591  static const WidgetID arrange17[] = {
1592  WID_TN_PAUSE,
1597  WID_TN_TRAINS,
1599  WID_TN_SHIPS,
1601  WID_TN_RAILS,
1602  WID_TN_ROADS,
1603  WID_TN_WATER,
1604  WID_TN_AIR,
1609  // lower toolbar
1610  WID_TN_PAUSE,
1612  WID_TN_SAVE,
1615  WID_TN_TOWNS,
1619  WID_TN_GRAPHS,
1623  WID_TN_HELP,
1627  };
1628  static const WidgetID arrange18[] = {
1629  WID_TN_PAUSE,
1633  WID_TN_TOWNS,
1639  WID_TN_RAILS,
1640  WID_TN_ROADS,
1641  WID_TN_WATER,
1642  WID_TN_AIR,
1647  // lower toolbar
1648  WID_TN_PAUSE,
1650  WID_TN_SAVE,
1652  WID_TN_TOWNS,
1655  WID_TN_GRAPHS,
1656  WID_TN_TRAINS,
1658  WID_TN_SHIPS,
1662  WID_TN_HELP,
1666  };
1667  static const WidgetID arrange19[] = {
1668  WID_TN_PAUSE,
1672  WID_TN_TOWNS,
1674  WID_TN_TRAINS,
1676  WID_TN_SHIPS,
1678  WID_TN_RAILS,
1679  WID_TN_ROADS,
1680  WID_TN_WATER,
1681  WID_TN_AIR,
1687  // lower toolbar
1688  WID_TN_PAUSE,
1690  WID_TN_SAVE,
1695  WID_TN_GRAPHS,
1698  WID_TN_RAILS,
1699  WID_TN_ROADS,
1700  WID_TN_WATER,
1701  WID_TN_AIR,
1703  WID_TN_HELP,
1707  };
1708  static const WidgetID arrange20[] = {
1709  WID_TN_PAUSE,
1713  WID_TN_TOWNS,
1715  WID_TN_TRAINS,
1717  WID_TN_SHIPS,
1719  WID_TN_RAILS,
1720  WID_TN_ROADS,
1721  WID_TN_WATER,
1722  WID_TN_AIR,
1725  WID_TN_GOAL,
1729  // lower toolbar
1730  WID_TN_PAUSE,
1732  WID_TN_SAVE,
1737  WID_TN_GRAPHS,
1740  WID_TN_RAILS,
1741  WID_TN_ROADS,
1742  WID_TN_WATER,
1743  WID_TN_AIR,
1745  WID_TN_STORY,
1746  WID_TN_HELP,
1750  };
1751  static const WidgetID arrange_all[] = {
1752  WID_TN_PAUSE,
1755  WID_TN_SAVE,
1757  WID_TN_TOWNS,
1762  WID_TN_STORY,
1763  WID_TN_GOAL,
1764  WID_TN_GRAPHS,
1765  WID_TN_LEAGUE,
1767  WID_TN_TRAINS,
1769  WID_TN_SHIPS,
1773  WID_TN_RAILS,
1774  WID_TN_ROADS,
1775  WID_TN_TRAMS,
1776  WID_TN_WATER,
1777  WID_TN_AIR,
1781  WID_TN_HELP
1782  };
1783 
1784  /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1785  uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1786  if (full_buttons > BIGGEST_ARRANGEMENT) {
1787  button_count = arrangable_count = lengthof(arrange_all);
1788  spacer_count = this->spacers;
1789  return arrange_all;
1790  }
1791 
1792  /* Introduce the split toolbar */
1793  static const WidgetID * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1794 
1795  button_count = arrangable_count = full_buttons;
1796  spacer_count = this->spacers;
1797  return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1798  }
1799 };
1800 
1803  uint panel_widths[2];
1804 
1805  void SetupSmallestSize(Window *w) override
1806  {
1808 
1809  /* Find the size of panel_widths */
1810  uint i = 0;
1811  for (const auto &child_wid : this->children) {
1812  if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1813 
1814  assert(i < lengthof(this->panel_widths));
1815  this->panel_widths[i++] = child_wid->current_x;
1816  _toolbar_width += child_wid->current_x;
1817  }
1818  }
1819 
1820  const WidgetID *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1821  {
1822  static const WidgetID arrange_all[] = {
1823  WID_TE_PAUSE,
1826  WID_TE_SAVE,
1827  WID_TE_SPACER,
1835  WID_TE_ROADS,
1836  WID_TE_TRAMS,
1837  WID_TE_WATER,
1838  WID_TE_TREES,
1839  WID_TE_SIGNS,
1841  WID_TE_HELP,
1842  };
1843  static const WidgetID arrange_nopanel[] = {
1844  WID_TE_PAUSE,
1847  WID_TE_SAVE,
1855  WID_TE_ROADS,
1856  WID_TE_TRAMS,
1857  WID_TE_WATER,
1858  WID_TE_TREES,
1859  WID_TE_SIGNS,
1861  WID_TE_HELP,
1862  };
1863  static const WidgetID arrange_switch[] = {
1869  WID_TE_ROADS,
1870  WID_TE_TRAMS,
1871  WID_TE_WATER,
1872  WID_TE_TREES,
1873  WID_TE_SIGNS,
1875  // lower toolbar
1876  WID_TE_PAUSE,
1879  WID_TE_SAVE,
1885  WID_TE_HELP,
1887  };
1888 
1889  /* If we can place all buttons *and* the panels, show them. */
1890  uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1891  if (width >= min_full_width) {
1892  width -= this->panel_widths[0] + this->panel_widths[1];
1893  arrangable_count = lengthof(arrange_all);
1894  button_count = arrangable_count - 2;
1895  spacer_count = this->spacers;
1896  return arrange_all;
1897  }
1898 
1899  /* 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 */
1900  uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1901  if (width > min_small_width) {
1902  width -= this->panel_widths[1];
1903  arrangable_count = lengthof(arrange_nopanel);
1904  button_count = arrangable_count - 1;
1905  spacer_count = this->spacers - 1;
1906  return arrange_nopanel;
1907  }
1908 
1909  /* Split toolbar */
1910  width -= this->panel_widths[1];
1911  arrangable_count = lengthof(arrange_switch) / 2;
1912  button_count = arrangable_count - 1;
1913  spacer_count = 0;
1914  return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1915  }
1916 };
1917 
1918 /* --- Toolbar handling for the 'normal' case */
1919 
1920 typedef CallBackFunction ToolbarButtonProc(Window *w);
1921 
1922 static ToolbarButtonProc * const _toolbar_button_procs[] = {
1923  ToolbarPauseClick,
1927  ToolbarMapClick,
1928  ToolbarTownClick,
1929  ToolbarSubsidiesClick,
1930  ToolbarStationsClick,
1931  ToolbarFinancesClick,
1932  ToolbarCompaniesClick,
1933  ToolbarStoryClick,
1934  ToolbarGoalClick,
1935  ToolbarGraphsClick,
1936  ToolbarLeagueClick,
1937  ToolbarIndustryClick,
1938  ToolbarTrainClick,
1939  ToolbarRoadClick,
1940  ToolbarShipClick,
1941  ToolbarAirClick,
1942  ToolbarZoomInClick,
1943  ToolbarZoomOutClick,
1944  ToolbarBuildRailClick,
1945  ToolbarBuildRoadClick,
1946  ToolbarBuildTramClick,
1947  ToolbarBuildWaterClick,
1948  ToolbarBuildAirClick,
1949  ToolbarForestClick,
1950  ToolbarMusicClick,
1951  ToolbarNewspaperClick,
1952  ToolbarHelpClick,
1953  ToolbarSwitchClick,
1954 };
1955 
1958  MainToolbarWindow(WindowDesc &desc) : Window(desc)
1959  {
1960  this->InitNested(0);
1961 
1962  _last_started_action = CBF_NONE;
1963  CLRBITS(this->flags, WF_WHITE_BORDER);
1964  this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1965  this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1966  PositionMainToolbar(this);
1968  }
1969 
1970  void FindWindowPlacementAndResize([[maybe_unused]] int def_width, [[maybe_unused]] int def_height) override
1971  {
1973  }
1974 
1975  void OnPaint() override
1976  {
1977  /* If spectator, disable all construction buttons
1978  * ie : Build road, rail, ships, airports and landscaping
1979  * Since enabled state is the default, just disable when needed */
1981  /* disable company list drop downs, if there are no companies */
1983 
1986 
1987  this->DrawWidgets();
1988  }
1989 
1990  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1991  {
1992  if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
1993  }
1994 
1995  void OnDropdownSelect(WidgetID widget, int index) override
1996  {
1997  CallBackFunction cbf = _menu_clicked_procs[widget](index);
1998  if (cbf != CBF_NONE) _last_started_action = cbf;
1999  }
2000 
2001  EventState OnHotkey(int hotkey) override
2002  {
2003  CallBackFunction cbf = CBF_NONE;
2004  switch (hotkey) {
2005  case MTHK_PAUSE: ToolbarPauseClick(this); break;
2006  case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2007  case MTHK_SETTINGS: ShowGameOptions(); break;
2008  case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2009  case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2010  case MTHK_SMALLMAP: ShowSmallMap(); break;
2011  case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2012  case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2013  case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2014  case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2015  case MTHK_COMPANIES: ShowCompany(_local_company); break;
2016  case MTHK_STORY: ShowStoryBook(_local_company); break;
2017  case MTHK_GOAL: ShowGoalsList(_local_company); break;
2018  case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2019  case MTHK_LEAGUE: ShowFirstLeagueTable(); break;
2020  case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2021  case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2022  case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2023  case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2024  case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2025  case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2026  case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2027  case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2028  case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2029  case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2030  case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2031  case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2032  case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2033  case MTHK_MUSIC: ShowMusicWindow(); break;
2034  case MTHK_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
2035  case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2036  case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2037  case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2038  case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2039  case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2040  case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2041  case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2042  case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2043  case MTHK_SIGN_LIST: ShowSignList(); break;
2044  case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2045  default: return ES_NOT_HANDLED;
2046  }
2047  if (cbf != CBF_NONE) _last_started_action = cbf;
2048  return ES_HANDLED;
2049  }
2050 
2051  void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2052  {
2053  switch (_last_started_action) {
2054  case CBF_PLACE_SIGN:
2055  PlaceProc_Sign(tile);
2056  break;
2057 
2058  case CBF_PLACE_LANDINFO:
2059  ShowLandInfo(tile);
2060  break;
2061 
2062  default: NOT_REACHED();
2063  }
2064  }
2065 
2066  void OnPlaceObjectAbort() override
2067  {
2068  _last_started_action = CBF_NONE;
2069  }
2070 
2072  IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2073  if (this->IsWidgetLowered(WID_TN_PAUSE) != !!_pause_mode) {
2076  }
2077 
2078  if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2081  }
2082  }};
2083 
2084  void OnTimeout() override
2085  {
2086  /* We do not want to automatically raise the pause, fast forward and
2087  * switchbar buttons; they have to stay down when pressed etc. */
2088  for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2089  this->RaiseWidgetWhenLowered(i);
2090  }
2091  }
2092 
2098  void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2099  {
2100  if (!gui_scope) return;
2102  }
2103 
2104  static inline HotkeyList hotkeys{"maintoolbar", {
2105  Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTHK_PAUSE),
2106  Hotkey(0, "fastforward", MTHK_FASTFORWARD),
2107  Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2108  Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2109  Hotkey(0, "load_game", MTHK_LOADGAME),
2110  Hotkey({WKC_F4, 'M'}, "smallmap", MTHK_SMALLMAP),
2111  Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2112  Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2113  Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2114  Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2115  Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2116  Hotkey(0, "story_book", MTHK_STORY),
2117  Hotkey(0, "goal_list", MTHK_GOAL),
2118  Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2119  Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2120  Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2121  Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2122  Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2123  Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2124  Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2125  Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTHK_ZOOM_IN),
2126  Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTHK_ZOOM_OUT),
2127  Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2128  Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2129  Hotkey(0, "build_tram", MTHK_BUILD_TRAM),
2130  Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2131  Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2132  Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2133  Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2134  Hotkey(0, "ai_debug", MTHK_SCRIPT_DEBUG),
2135  Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2136  Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2137  Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2138  Hotkey(0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2139  Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2140  Hotkey('L', "terraform", MTHK_TERRAFORM),
2141  Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2142  Hotkey(0, "client_list", MTHK_CLIENT_LIST),
2143  Hotkey(0, "sign_list", MTHK_SIGN_LIST),
2144  Hotkey(0, "land_info", MTHK_LANDINFO),
2145  }};
2146 };
2147 
2148 static std::unique_ptr<NWidgetBase> MakeMainToolbar()
2149 {
2151  static const SpriteID toolbar_button_sprites[] = {
2152  SPR_IMG_PAUSE, // WID_TN_PAUSE
2153  SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2154  SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2155  SPR_IMG_SAVE, // WID_TN_SAVE
2156  SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2157  SPR_IMG_TOWN, // WID_TN_TOWNS
2158  SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2159  SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2160  SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2161  SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2162  SPR_IMG_STORY_BOOK, // WID_TN_STORY
2163  SPR_IMG_GOAL, // WID_TN_GOAL
2164  SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2165  SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2166  SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2167  SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2168  SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2169  SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2170  SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2171  SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2172  SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2173  SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2174  SPR_IMG_BUILDROAD, // WID_TN_ROADS
2175  SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2176  SPR_IMG_BUILDWATER, // WID_TN_WATER
2177  SPR_IMG_BUILDAIR, // WID_TN_AIR
2178  SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2179  SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2180  SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2181  SPR_IMG_QUERY, // WID_TN_HELP
2182  SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2183  };
2184 
2185  auto hor = std::make_unique<NWidgetMainToolbarContainer>();
2186  for (WidgetID i = 0; i < WID_TN_END; i++) {
2187  switch (i) {
2188  case WID_TN_SMALL_MAP:
2189  case WID_TN_FINANCES:
2190  case WID_TN_VEHICLE_START:
2191  case WID_TN_ZOOM_IN:
2193  case WID_TN_MUSIC_SOUND:
2194  hor->Add(std::make_unique<NWidgetSpacer>(0, 0));
2195  break;
2196  }
2197  auto leaf = std::make_unique<NWidgetLeaf>(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i);
2198  leaf->SetMinimalSize(20, 20);
2199  hor->Add(std::move(leaf));
2200  }
2201 
2202  return hor;
2203 }
2204 
2205 static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = {
2207 };
2208 
2209 static WindowDesc _toolb_normal_desc(
2210  WDP_MANUAL, nullptr, 0, 0,
2213  _nested_toolbar_normal_widgets,
2214  &MainToolbarWindow::hotkeys
2215 );
2216 
2217 
2218 /* --- Toolbar handling for the scenario editor */
2219 
2220 static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2221  nullptr, // 0
2222  nullptr, // 1
2223  MenuClickSettings, // 2
2224  MenuClickSaveLoad, // 3
2225  nullptr, // 4
2226  nullptr, // 5
2227  nullptr, // 6
2228  nullptr, // 7
2229  MenuClickMap, // 8
2230  nullptr, // 9
2231  nullptr, // 10
2232  nullptr, // 11
2233  ToolbarScenGenTown, // 12
2234  nullptr, // 13
2235  ToolbarScenBuildRoad, // 14
2236  ToolbarScenBuildTram, // 15
2237  nullptr, // 16
2238  nullptr, // 17
2239  nullptr, // 18
2240  nullptr, // 19
2241  MenuClickMusicWindow, // 20
2242  MenuClickHelp, // 21
2243  nullptr, // 22
2244 };
2245 
2246 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2247  ToolbarPauseClick,
2251  ToolbarBtn_NULL,
2253  ToolbarScenDateBackward,
2254  ToolbarScenDateForward,
2255  ToolbarScenMapTownDir,
2256  ToolbarZoomInClick,
2257  ToolbarZoomOutClick,
2258  ToolbarScenGenLand,
2259  ToolbarScenGenTownClick,
2260  ToolbarScenGenIndustry,
2261  ToolbarScenBuildRoadClick,
2262  ToolbarScenBuildTramClick,
2263  ToolbarScenBuildDocks,
2264  ToolbarScenPlantTrees,
2265  ToolbarScenPlaceSign,
2266  ToolbarBtn_NULL,
2267  ToolbarMusicClick,
2268  ToolbarHelpClick,
2269  ToolbarSwitchClick,
2270 };
2271 
2272 enum MainToolbarEditorHotkeys {
2273  MTEHK_PAUSE,
2274  MTEHK_FASTFORWARD,
2275  MTEHK_SETTINGS,
2276  MTEHK_SAVEGAME,
2277  MTEHK_GENLAND,
2278  MTEHK_GENTOWN,
2279  MTEHK_GENINDUSTRY,
2280  MTEHK_BUILD_ROAD,
2281  MTEHK_BUILD_TRAM,
2282  MTEHK_BUILD_DOCKS,
2283  MTEHK_BUILD_TREES,
2284  MTEHK_SIGN,
2285  MTEHK_MUSIC,
2286  MTEHK_LANDINFO,
2287  MTEHK_SMALL_SCREENSHOT,
2288  MTEHK_ZOOMEDIN_SCREENSHOT,
2289  MTEHK_DEFAULTZOOM_SCREENSHOT,
2290  MTEHK_GIANT_SCREENSHOT,
2291  MTEHK_ZOOM_IN,
2292  MTEHK_ZOOM_OUT,
2293  MTEHK_TERRAFORM,
2294  MTEHK_SMALLMAP,
2295  MTEHK_EXTRA_VIEWPORT,
2296 };
2297 
2300  {
2301  this->InitNested(0);
2302 
2303  _last_started_action = CBF_NONE;
2304  CLRBITS(this->flags, WF_WHITE_BORDER);
2305  PositionMainToolbar(this);
2307  }
2308 
2309  void FindWindowPlacementAndResize([[maybe_unused]] int def_width, [[maybe_unused]] int def_height) override
2310  {
2312  }
2313 
2314  void OnPaint() override
2315  {
2320 
2321  this->DrawWidgets();
2322  }
2323 
2324  void SetStringParameters(WidgetID widget) const override
2325  {
2326  switch (widget) {
2327  case WID_TE_DATE:
2329  break;
2330  }
2331  }
2332 
2333  void DrawWidget(const Rect &r, WidgetID widget) const override
2334  {
2335  switch (widget) {
2336  case WID_TE_SPACER: {
2337  int height = r.Height();
2338  if (height > 2 * GetCharacterHeight(FS_NORMAL)) {
2339  DrawString(r.left, r.right, height / 2 - GetCharacterHeight(FS_NORMAL), STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2340  DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2341  } else {
2342  DrawString(r.left, r.right, (height - GetCharacterHeight(FS_NORMAL)) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2343  }
2344  break;
2345  }
2346  }
2347  }
2348 
2349  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
2350  {
2351  switch (widget) {
2352  case WID_TE_SPACER:
2353  size.width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
2354  break;
2355 
2356  case WID_TE_DATE:
2358  size = GetStringBoundingBox(STR_JUST_DATE_LONG);
2359  break;
2360  }
2361  }
2362 
2363  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
2364  {
2365  if (_game_mode == GM_MENU) return;
2366  CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2367  if (cbf != CBF_NONE) _last_started_action = cbf;
2368  }
2369 
2370  void OnDropdownSelect(WidgetID widget, int index) override
2371  {
2372  CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2373  if (cbf != CBF_NONE) _last_started_action = cbf;
2374  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
2375  }
2376 
2377  EventState OnHotkey(int hotkey) override
2378  {
2379  CallBackFunction cbf = CBF_NONE;
2380  switch (hotkey) {
2381  case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2382  case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2383  case MTEHK_SETTINGS: ShowGameOptions(); break;
2384  case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2385  case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2386  case MTEHK_GENTOWN: ToolbarScenGenTownClick(this); break;
2387  case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2388  case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2389  case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2390  case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2391  case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2392  case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2393  case MTEHK_MUSIC: ShowMusicWindow(); break;
2394  case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2395  case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2396  case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2397  case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2398  case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2399  case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2400  case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2401  case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2402  case MTEHK_SMALLMAP: ShowSmallMap(); break;
2403  case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2404  default: return ES_NOT_HANDLED;
2405  }
2406  if (cbf != CBF_NONE) _last_started_action = cbf;
2407  return ES_HANDLED;
2408  }
2409 
2410  void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
2411  {
2412  switch (_last_started_action) {
2413  case CBF_PLACE_SIGN:
2414  PlaceProc_Sign(tile);
2415  break;
2416 
2417  case CBF_PLACE_LANDINFO:
2418  ShowLandInfo(tile);
2419  break;
2420 
2421  default: NOT_REACHED();
2422  }
2423  }
2424 
2425  void OnPlaceObjectAbort() override
2426  {
2427  _last_started_action = CBF_NONE;
2428  }
2429 
2430  void OnTimeout() override
2431  {
2435  }
2436 
2438  IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
2439  if (this->IsWidgetLowered(WID_TE_PAUSE) != !!_pause_mode) {
2441  this->SetDirty();
2442  }
2443 
2444  if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2446  this->SetDirty();
2447  }
2448  }};
2449 
2455  void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
2456  {
2457  if (!gui_scope) return;
2459  }
2460 
2461  void OnQueryTextFinished(std::optional<std::string> str) override
2462  {
2463  /* Was 'cancel' pressed? */
2464  if (!str.has_value()) return;
2465 
2467  if (!str->empty()) {
2468  value = atoi(str->c_str());
2469  } else {
2470  /* An empty string means revert to the default */
2471  value = CalendarTime::DEF_START_YEAR.base();
2472  }
2473  SetStartingYear(value);
2474 
2475  this->SetDirty();
2476  }
2477 
2478  static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
2479  Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
2480  Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
2481  Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2482  Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2483  Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2484  Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2485  Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2486  Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2487  Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
2488  Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2489  Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2490  Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2491  Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2492  Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2493  Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2494  Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2495  Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2496  Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2497  Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
2498  Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
2499  Hotkey('L', "terraform", MTEHK_TERRAFORM),
2500  Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2501  Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2502  }};
2503 };
2504 
2505 static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2506  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2507  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2508  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2509  NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
2511  NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2513  NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2514  NWidget(NWID_HORIZONTAL), SetPIP(2, 2, 2), SetPadding(1),
2515  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1),
2516  NWidget(WWT_TEXT, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_JUST_DATE_LONG, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
2517  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
2518  EndContainer(),
2519  EndContainer(),
2521  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
2523  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2524  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2526  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
2527  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
2528  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
2529  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
2530  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetDataTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION),
2531  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2532  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
2533  NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
2535  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2536  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2537  NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2538 };
2539 
2540 static std::unique_ptr<NWidgetBase> MakeScenarioToolbar()
2541 {
2542  return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique<NWidgetScenarioToolbarContainer>());
2543 }
2544 
2545 static constexpr NWidgetPart _nested_toolb_scen_widgets[] = {
2546  NWidgetFunction(MakeScenarioToolbar),
2547 };
2548 
2549 static WindowDesc _toolb_scen_desc(
2550  WDP_MANUAL, nullptr, 0, 0,
2553  _nested_toolb_scen_widgets,
2554  &ScenarioEditorToolbarWindow::hotkeys
2555 );
2556 
2559 {
2560  /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2561  _last_built_roadtype = ROADTYPE_ROAD;
2562  _last_built_tramtype = ROADTYPE_TRAM;
2563 
2564  if (_game_mode == GM_EDITOR) {
2565  new ScenarioEditorToolbarWindow(_toolb_scen_desc);
2566  } else {
2567  new MainToolbarWindow(_toolb_normal_desc);
2568  }
2569 }
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.
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
#define CLRBITS(x, y)
Clears several bits in a variable.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Functions related to cheating.
void ShowCheatWindow()
Open cheat window.
Definition: cheat_gui.cpp:436
Drop down icon component.
Company name list item, with company-colour icon, name, and lock components.
Definition: toolbar_gui.cpp:99
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.
Definition: widget_type.h:144
WidgetType type
Type of the widget / nested widget.
Definition: widget_type.h:232
uint resize_x
Horizontal resize step (0 means not resizable).
Definition: widget_type.h:235
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
Definition: widget_type.h:233
uint smallest_x
Smallest horizontal size of the widget in a filled window.
Definition: widget_type.h:240
uint current_x
Current horizontal size (after resizing).
Definition: widget_type.h:243
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition: widget_type.h:249
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:248
uint smallest_y
Smallest vertical size of the widget in a filled window.
Definition: widget_type.h:241
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
Definition: widget_type.h:234
uint resize_y
Vertical resize step (0 means not resizable).
Definition: widget_type.h:236
uint current_y
Current vertical size (after resizing).
Definition: widget_type.h:244
Baseclass for container widgets.
Definition: widget_type.h:459
void Draw(const Window *w) override
Draw the widgets of the tree.
Definition: widget.cpp:1211
std::vector< std::unique_ptr< NWidgetBase > > children
Child widgets in contaier.
Definition: widget_type.h:476
Base class for a 'real' widget.
Definition: widget_type.h:370
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.
uint panel_widths[2]
The width of the two panels (the text panel and date panel)
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.
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.
Definition: company_cmd.cpp:52
Functions related to companies.
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
Owner
Enum for all companies/owners.
Definition: company_type.h:18
@ INVALID_COMPANY
An invalid company.
Definition: company_type.h:30
@ COMPANY_SPECTATOR
The client is spectating.
Definition: company_type.h:35
@ COMPANY_FIRST
First company, same as owner.
Definition: company_type.h:22
@ MAX_COMPANIES
Maximum number of companies.
Definition: company_type.h:23
void ShowFramerateWindow()
Open the general framerate window.
void IConsoleSwitch()
Toggle in-game console between opened and closed.
GUI related functions in the console.
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition: dock_gui.cpp:403
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition: dock_gui.cpp:362
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition: dropdown.cpp:404
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Definition: dropdown_type.h:50
Base class for engines.
@ 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
@ SLO_SAVE
File is being saved.
Definition: fileio_type.h:56
@ SLO_LOAD
File is being loaded.
Definition: fileio_type.h:55
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition: fios_gui.cpp:986
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition: fontcache.cpp:77
Types for recording game performance data.
Base functions for all Games.
void ShowGSConfigWindow()
Open the GS config window.
Definition: game_gui.cpp:445
Window for configuring the Games
PauseMode _pause_mode
The current pause mode.
Definition: gfx.cpp:50
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:851
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition: gfx.cpp:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:38
bool _left_button_clicked
Is left mouse button clicked?
Definition: gfx.cpp:42
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition: gfx.cpp:40
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition: gfx.cpp:114
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition: gfxinit.cpp:313
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition: gfx_type.h:18
@ SA_HOR_CENTER
Horizontally center the text.
Definition: gfx_type.h:344
@ SA_CENTER
Center both horizontally and vertically.
Definition: gfx_type.h:353
@ FS_NORMAL
Index of the normal font in the font tables.
Definition: gfx_type.h:209
@ WKC_MINUS
Definition: gfx_type.h:105
@ WKC_EQUALS
= Equals
Definition: gfx_type.h:98
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition: gfx_type.h:299
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.
Definition: widget_type.h:1330
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition: widget_type.h:1181
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1260
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.
Definition: widget_type.h:1228
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1202
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:3239
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
Definition: widget_type.h:1160
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1309
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1191
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
Definition: widget_type.h:1170
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:940
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition: gfx.cpp:1529
GUI functions that shouldn't be here.
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition: misc_gui.cpp:379
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowGameSettings()
Open advanced settings window.
void ShowStoryBook(CompanyID company, uint16_t page_id=INVALID_STORY_PAGE, bool centered=false)
Raise or create the story book window for company, at page page_id.
Definition: story_gui.cpp:1051
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Hotkey related functions.
definition of HouseSpec and accessors
LeagueTable base class.
League table GUI functions.
uint8_t LeagueTableID
ID of a league table.
Definition: league_type.h:32
void ShowLinkGraphLegend()
Open a link graph legend window.
Declaration of linkgraph overlay GUI.
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition: main_gui.cpp:93
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
Definition: math_func.hpp:320
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:79
Miscellaneous command definitions.
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
Definition: misc_gui.cpp:1079
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.
Definition: network_type.h:51
GRFConfig * _grfconfig
First item in list of current GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **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.
Definition: news_gui.cpp:1039
void ShowMessageHistory()
Display window with news messages history.
Definition: news_gui.cpp:1208
GUI functions related to the news.
@ PM_UNPAUSED
A normal unpaused game.
Definition: openttd.h:69
@ PM_PAUSED_NORMAL
A game normally paused.
Definition: openttd.h:70
@ 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
static const uint8_t PC_VERY_DARK_RED
Almost-black red palette colour.
Definition: palette_func.h:72
static const uint8_t PC_DARK_RED
Dark red palette colour.
Definition: palette_func.h:73
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition: rail_gui.cpp:918
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
Definition: rail_gui.cpp:2011
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 * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition: road_gui.cpp:994
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Definition: road_gui.cpp:1081
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.
Definition: screenshot.cpp:847
Functions to make screenshots.
@ SC_VIEWPORT
Screenshot of viewport.
Definition: screenshot.h:19
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition: screenshot.h:21
@ SC_WORLD
World screenshot.
Definition: screenshot.h:23
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition: screenshot.h:22
GUI functions related to screenshots.
Window * ShowScriptDebugWindow(CompanyID show_company, bool new_window)
Open the Script debug window and select the given company.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:56
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Definition: signs_cmd.cpp:122
Functions related to signs.
Window * ShowSignList()
Open the sign list window.
Definition: signs_gui.cpp:392
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:58
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:280
StoryPage base class.
@ CS_NUMERAL
Only numeric ones.
Definition: string_type.h:26
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings.cpp:104
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition: strings.cpp:319
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
TownFounding found_town
town founding.
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
TimerGameCalendar::Year starting_year
starting date
EconomySettings economy
settings to change the economy
GameCreationSettings game_creation
settings used during the creation of a game (map)
List of hotkeys for a window.
Definition: hotkeys.h:37
All data for a single hotkey.
Definition: hotkeys.h:21
Struct about custom league tables.
Definition: league_base.h:52
Main toolbar.
void OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
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.
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:1075
Coordinates of a point in 2D.
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:369
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:328
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:388
Specification of a rectangle with absolute coordinates of all edges.
int Height() const
Get height of Rect.
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 OnTimeout() override
Called when this window's timeout has been reached.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
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.
High level window description.
Definition: window_gui.h:159
Data structure for an opened window.
Definition: window_gui.h:273
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition: window.cpp:952
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:551
uint8_t timeout_timer
Timer value of the WF_TIMEOUT for flags.
Definition: window_gui.h:306
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition: window_gui.h:484
ResizeInfo resize
Resize information.
Definition: window_gui.h:314
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition: window_gui.h:521
ViewportData * viewport
Pointer to viewport data, if present.
Definition: window_gui.h:318
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition: window_gui.h:497
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition: window_gui.h:416
void SetWidgetsLoweredState(bool lowered_stat, Args... widgets)
Sets the lowered/raised status of a list of widgets.
Definition: window_gui.h:532
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:447
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition: window.cpp:1756
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:590
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1746
WindowFlags flags
Window flags.
Definition: window_gui.h:300
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition: window_gui.h:387
int height
Height of the window (number of pixels down in y direction)
Definition: window_gui.h:312
int width
width of the window (number of pixels to the right in x direction)
Definition: window_gui.h:311
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition: window_gui.h:456
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
Definition: window.cpp:1420
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
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).
Definition: viewport.cpp:3498
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...
Definition: viewport.cpp:3450
@ 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.
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.
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
static const int LTMN_PERFORMANCE_RATING
Show detailed performance rating.
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
static std::unique_ptr< NWidgetBase > MakeMainToolbar()
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.
Definition: toolbar_gui.cpp:74
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 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.
OptionMenuEntries
Game Option button menu entries.
void ToggleDirtyBlocks()
Toggle drawing of the dirty blocks.
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
static CallBackFunction ToolbarScenBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static CallBackFunction MenuClickBuildRoad(int index)
Handle click on the entry in the Build Road menu.
static void PopupMainCompanyToolbMenu(Window *w, WidgetID widget, CompanyMask grey=0)
Pop up a generic company list menu.
static CallBackFunction _last_started_action
Last started user action.
Definition: toolbar_gui.cpp:94
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
ToolbarMode
Toobar modes.
Definition: toolbar_gui.cpp:81
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.
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
static CallBackFunction MenuClickBuildWater(int)
Handle click on the entry in the Build Waterways menu.
static const int CTMN_SPECTATE
Become spectator.
static CallBackFunction MenuClickSubsidies(int)
Handle click on the entry in the Subsidies menu.
void SetStartingYear(TimerGameCalendar::Year year)
Set the starting year for a scenario.
static const int LTMN_HIGHSCORE
Show highscrore table.
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
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.
CallBackFunction
Callback functions.
Definition: toolbar_gui.cpp:88
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:95
void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
Definition: transparency.h:69
@ TO_HOUSES
town buildings
Definition: transparency.h:25
@ TO_SIGNS
signs
Definition: transparency.h:23
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...
Definition: transparency.h:48
uint8_t _display_opt
What do we want to draw/do?
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.
Definition: vehicle_type.h:21
@ VEH_ROAD
Road vehicle type.
Definition: vehicle_type.h:25
@ VEH_AIRCRAFT
Aircraft vehicle type.
Definition: vehicle_type.h:27
@ VEH_SHIP
Ship vehicle type.
Definition: vehicle_type.h:26
@ VEH_TRAIN
Train vehicle type.
Definition: vehicle_type.h:24
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).
Definition: viewport_type.h:77
@ ZOOM_NONE
Hack, used to update the button status.
Definition: viewport_type.h:79
@ ZOOM_OUT
Zoom out (get helicopter view).
Definition: viewport_type.h:78
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition: widget_type.h:46
@ WWT_IMGBTN
(Toggle) Button with image
Definition: widget_type.h:52
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition: widget_type.h:53
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
Definition: widget_type.h:113
@ NWID_SPACER
Invisible widget that takes some space.
Definition: widget_type.h:79
@ NWID_HORIZONTAL
Horizontal container.
Definition: widget_type.h:75
@ WWT_PANEL
Simple depressed panel.
Definition: widget_type.h:50
@ WWT_TEXT
Pure simple text.
Definition: widget_type.h:58
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Definition: widget_type.h:119
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition: window.cpp:3382
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition: window.cpp:3285
Window * GetMainWindow()
Get the main window, i.e.
Definition: window.cpp:1127
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:3228
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WF_WHITE_BORDER
Window white border counter bit mask.
Definition: window_gui.h:236
@ WF_TIMEOUT
Window timeout counter.
Definition: window_gui.h:228
@ WDF_NO_CLOSE
This window can't be interactively closed.
Definition: window_gui.h:206
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
Definition: window_gui.h:205
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition: window_gui.h:146
int WidgetID
Widget ID.
Definition: window_type.h:18
EventState
State of handling an event.
Definition: window_type.h:743
@ ES_HANDLED
The passed event is handled.
Definition: window_type.h:744
@ ES_NOT_HANDLED
The passed event is not handled.
Definition: window_type.h:745
@ WC_SIGN_LIST
Sign list; Window numbers:
Definition: window_type.h:278
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:45
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition: window_type.h:58