OpenTTD Source: src/toolbar_gui.cpp Source File

OpenTTD Source 12.2

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 "vehicle_gui.h"
17 #include "rail_gui.h"
18 #include "road.h"
19 #include "road_gui.h"
20 #include "date_func.h"
21 #include "vehicle_func.h"
22 #include "sound_func.h"
23 #include "terraform_gui.h"
24 #include "strings_func.h"
25 #include "company_func.h"
26 #include "company_gui.h"
27 #include "vehicle_base.h"
28 #include "cheat_func.h"
29 #include "transparency_gui.h"
30 #include "screenshot.h"
31 #include "signs_func.h"
32 #include "fios.h"
33 #include "console_gui.h"
34 #include "news_gui.h"
35 #include "ai/ai_gui.hpp"
36 #include "tilehighlight_func.h"
37 #include "smallmap_gui.h"
38 #include "graph_gui.h"
39 #include "textbuf_gui.h"
40 #include "linkgraph/linkgraph_gui.h"
41 #include "newgrf_debug.h"
42 #include "hotkeys.h"
43 #include "engine_base.h"
44 #include "highscore.h"
45 #include "game/game.hpp"
46 #include "goal_base.h"
47 #include "story_base.h"
48 #include "toolbar_gui.h"
49 #include "framerate_type.h"
50 #include "guitimer_func.h"
51 #include "screenshot_gui.h"
52
53 #include "widgets/toolbar_widget.h"
54
55 #include "network/network.h"
56 #include "network/network_gui.h"
57 #include "network/network_func.h"
58
59 #include "safeguards.h"
60
61
63 uint _toolbar_width = 0;
64
65 RailType _last_built_railtype;
66 RoadType _last_built_roadtype;
67 RoadType _last_built_tramtype;
68
70 enum ToolbarMode {
71 TB_NORMAL,
72 TB_UPPER,
73 TB_LOWER
74 };
75
77 enum CallBackFunction {
78 CBF_NONE,
79 CBF_PLACE_SIGN,
80 CBF_PLACE_LANDINFO,
81 };
82
83 static CallBackFunction _last_started_action = CBF_NONE;
84
85
89 class DropDownListCheckedItem : public DropDownListStringItem {
90 uint checkmark_width;
91 public:
92 bool checked;
93
94 DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked)
95 {
96 this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + 3;
97 }
98
99 uint Width() const
100 {
101 return DropDownListStringItem::Width() + this->checkmark_width;
102 }
103
104 void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const
105 {
106 bool rtl = _current_text_dir == TD_RTL;
107 if (this->checked) {
108 DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK);
109 }
110 DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : this->checkmark_width), right - WD_FRAMERECT_RIGHT - (rtl ? this->checkmark_width : 0), top, this->String(), sel ? TC_WHITE : TC_BLACK);
111 }
112 };
113
117 class DropDownListCompanyItem : public DropDownListItem {
118 Dimension icon_size;
119 Dimension lock_size;
120 public:
121 bool greyed;
122
123 DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed)
124 {
125 this->icon_size = GetSpriteSize(SPR_COMPANY_ICON);
126 this->lock_size = GetSpriteSize(SPR_LOCK);
127 }
128
129 bool Selectable() const override
130 {
131 return true;
132 }
133
134 uint Width() const override
135 {
136 CompanyID company = (CompanyID)this->result;
137 SetDParam(0, company);
138 SetDParam(1, company);
139 return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_size.width + this->lock_size.width + 6;
140 }
141
142 uint Height(uint width) const override
143 {
144 return std::max(std::max(this->icon_size.height, this->lock_size.height) + 2U, (uint)FONT_HEIGHT_NORMAL);
145 }
146
147 void Draw(int left, int right, int top, int bottom, bool sel, Colours bg_colour) const override
148 {
149 CompanyID company = (CompanyID)this->result;
150 bool rtl = _current_text_dir == TD_RTL;
151
152 /* It's possible the company is deleted while the dropdown is open */
153 if (!Company::IsValidID(company)) return;
154
155 int icon_offset = (bottom - top - icon_size.height) / 2;
156 int text_offset = (bottom - top - FONT_HEIGHT_NORMAL) / 2;
157 int lock_offset = (bottom - top - lock_size.height) / 2;
158
159 DrawCompanyIcon(company, rtl ? right - this->icon_size.width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, top + icon_offset);
160 if (NetworkCompanyIsPassworded(company)) {
161 DrawSprite(SPR_LOCK, PAL_NONE, rtl ? left + WD_FRAMERECT_LEFT : right - this->lock_size.width - WD_FRAMERECT_RIGHT, top + lock_offset);
162 }
163
164 SetDParam(0, company);
165 SetDParam(1, company);
166 TextColour col;
167 if (this->greyed) {
168 col = (sel ? TC_SILVER : TC_GREY) | TC_NO_SHADE;
169 } else {
170 col = sel ? TC_WHITE : TC_BLACK;
171 }
172 DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 3 + this->lock_size.width : 3 + this->icon_size.width), right - WD_FRAMERECT_RIGHT - (rtl ? 3 + this->icon_size.width : 3 + this->lock_size.width), top + text_offset, STR_COMPANY_NAME_COMPANY_NUM, col);
173 }
174 };
175
183 static void PopupMainToolbMenu(Window *w, int widget, DropDownList &&list, int def)
184 {
185 ShowDropDownList(w, std::move(list), def, widget, 0, true, true);
186 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
187 }
188
196 static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count)
197 {
198 DropDownList list;
199 for (int i = 0; i < count; i++) {
200 list.emplace_back(new DropDownListStringItem(string + i, i, false));
201 }
202 PopupMainToolbMenu(w, widget, std::move(list), 0);
203 }
204
206 static const int CTMN_CLIENT_LIST = -1;
207 static const int CTMN_SPECTATE = -2;
208 static const int CTMN_SPECTATOR = -3;
209
216 static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0)
217 {
218 DropDownList list;
219
220 switch (widget) {
221 case WID_TN_COMPANIES:
222 if (!_networking) break;
223
224 /* Add the client list button for the companies menu */
225 list.emplace_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST, false));
226
227 if (_local_company != COMPANY_SPECTATOR) {
228 list.emplace_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, false));
229 }
230 break;
231 case WID_TN_STORY:
232 list.emplace_back(new DropDownListStringItem(STR_STORY_BOOK_SPECTATOR, CTMN_SPECTATOR, false));
233 break;
234
235 case WID_TN_GOAL:
236 list.emplace_back(new DropDownListStringItem(STR_GOALS_SPECTATOR, CTMN_SPECTATOR, false));
237 break;
238 }
239
240 for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
241 if (!Company::IsValidID(c)) continue;
242 list.emplace_back(new DropDownListCompanyItem(c, false, HasBit(grey, c)));
243 }
244
245 PopupMainToolbMenu(w, widget, std::move(list), _local_company == COMPANY_SPECTATOR ? (widget == WID_TN_COMPANIES ? CTMN_CLIENT_LIST : CTMN_SPECTATOR) : (int)_local_company);
246 }
247
248
249 static ToolbarMode _toolbar_mode;
250
251 static CallBackFunction SelectSignTool()
252 {
253 if (_last_started_action == CBF_PLACE_SIGN) {
254 ResetObjectToPlace();
255 return CBF_NONE;
256 } else {
257 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
258 return CBF_PLACE_SIGN;
259 }
260 }
261
262 /* --- Pausing --- */
263
264 static CallBackFunction ToolbarPauseClick(Window *w)
265 {
266 if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
267
268 if (DoCommandP(0, PM_PAUSED_NORMAL, _pause_mode == PM_UNPAUSED, CMD_PAUSE)) {
269 if (_settings_client.sound.confirm) SndPlayFx(SND_15_BEEP);
270 }
271 return CBF_NONE;
272 }
273
280 static CallBackFunction ToolbarFastForwardClick(Window *w)
281 {
282 ChangeGameSpeed(_game_speed == 100);
283
284 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
285 return CBF_NONE;
286 }
287
291 enum OptionMenuEntries {
292 OME_GAMEOPTIONS,
293 OME_SETTINGS,
294 OME_SCRIPT_SETTINGS,
295 OME_NEWGRFSETTINGS,
296 OME_TRANSPARENCIES,
297 OME_SHOW_TOWNNAMES,
298 OME_SHOW_STATIONNAMES,
299 OME_SHOW_WAYPOINTNAMES,
300 OME_SHOW_SIGNS,
301 OME_SHOW_COMPETITOR_SIGNS,
302 OME_FULL_ANIMATION,
303 OME_FULL_DETAILS,
304 OME_TRANSPARENTBUILDINGS,
305 OME_SHOW_STATIONSIGNS,
306 };
307
314 static CallBackFunction ToolbarOptionsClick(Window *w)
315 {
316 DropDownList list;
317 list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS, false));
318 list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE, OME_SETTINGS, false));
319 /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
320 * the settings once they join but never update it. As such don't show the window at all
321 * to network clients. */
322 if (!_networking || _network_server) list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_SCRIPT_SETTINGS, OME_SCRIPT_SETTINGS, false));
323 list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false));
324 list.emplace_back(new DropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false));
325 list.emplace_back(new DropDownListItem(-1, false));
326 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES)));
327 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES)));
328 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES)));
329 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS)));
330 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS, false, HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS)));
331 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION)));
332 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL)));
333 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES)));
334 list.emplace_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS)));
335
336 ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, true, true);
337 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
338 return CBF_NONE;
339 }
340
347 static CallBackFunction MenuClickSettings(int index)
348 {
349 switch (index) {
350 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
351 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
352 case OME_SCRIPT_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
353 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE;
354 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
355
356 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
357 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
358 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
359 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
360 case OME_SHOW_COMPETITOR_SIGNS:
361 ToggleBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS);
362 InvalidateWindowClassesData(WC_SIGN_LIST, -1);
363 break;
364 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break;
365 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
366 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
367 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
368 }
369 MarkWholeScreenDirty();
370 return CBF_NONE;
371 }
372
376 enum SaveLoadEditorMenuEntries {
377 SLEME_SAVE_SCENARIO = 0,
378 SLEME_LOAD_SCENARIO,
379 SLEME_SAVE_HEIGHTMAP,
380 SLEME_LOAD_HEIGHTMAP,
381 SLEME_EXIT_TOINTRO,
382 SLEME_EXIT_GAME = 6,
383 SLEME_MENUCOUNT,
384 };
385
389 enum SaveLoadNormalMenuEntries {
390 SLNME_SAVE_GAME = 0,
391 SLNME_LOAD_GAME,
392 SLNME_EXIT_TOINTRO,
393 SLNME_EXIT_GAME = 4,
394 SLNME_MENUCOUNT,
395 };
396
403 static CallBackFunction ToolbarSaveClick(Window *w)
404 {
405 PopupMainToolbMenu(w, WID_TN_SAVE, STR_FILE_MENU_SAVE_GAME, SLNME_MENUCOUNT);
406 return CBF_NONE;
407 }
408
415 static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
416 {
417 PopupMainToolbMenu(w, WID_TE_SAVE, STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, SLEME_MENUCOUNT);
418 return CBF_NONE;
419 }
420
427 static CallBackFunction MenuClickSaveLoad(int index = 0)
428 {
429 if (_game_mode == GM_EDITOR) {
430 switch (index) {
431 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break;
432 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break;
433 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_SAVE); break;
434 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break;
435 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
436 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
437 }
438 } else {
439 switch (index) {
440 case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break;
441 case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
442 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
443 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
444 }
445 }
446 return CBF_NONE;
447 }
448
449 /* --- Map button menu --- */
450
451 enum MapMenuEntries {
452 MME_SHOW_SMALLMAP = 0,
453 MME_SHOW_EXTRAVIEWPORTS,
454 MME_SHOW_LINKGRAPH,
455 MME_SHOW_SIGNLISTS,
456 MME_SHOW_TOWNDIRECTORY,
457 MME_SHOW_INDUSTRYDIRECTORY,
458 };
459
460 static CallBackFunction ToolbarMapClick(Window *w)
461 {
462 DropDownList list;
463 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false));
464 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false));
465 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_LINGRAPH_LEGEND, MME_SHOW_LINKGRAPH, false));
466 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false));
467 PopupMainToolbMenu(w, WID_TN_SMALL_MAP, std::move(list), 0);
468 return CBF_NONE;
469 }
470
471 static CallBackFunction ToolbarScenMapTownDir(Window *w)
472 {
473 DropDownList list;
474 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_MAP_OF_WORLD, MME_SHOW_SMALLMAP, false));
475 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_EXTRA_VIEWPORT, MME_SHOW_EXTRAVIEWPORTS, false));
476 list.emplace_back(new DropDownListStringItem(STR_MAP_MENU_SIGN_LIST, MME_SHOW_SIGNLISTS, false));
477 list.emplace_back(new DropDownListStringItem(STR_TOWN_MENU_TOWN_DIRECTORY, MME_SHOW_TOWNDIRECTORY, false));
478 list.emplace_back(new DropDownListStringItem(STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, MME_SHOW_INDUSTRYDIRECTORY, false));
479 PopupMainToolbMenu(w, WID_TE_SMALL_MAP, std::move(list), 0);
480 return CBF_NONE;
481 }
482
489 static CallBackFunction MenuClickMap(int index)
490 {
491 switch (index) {
492 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
493 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewportWindow(); break;
494 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
495 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
496 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory(); break;
497 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); break;
498 }
499 return CBF_NONE;
500 }
501
502 /* --- Town button menu --- */
503
504 static CallBackFunction ToolbarTownClick(Window *w)
505 {
506 PopupMainToolbMenu(w, WID_TN_TOWNS, STR_TOWN_MENU_TOWN_DIRECTORY, (_settings_game.economy.found_town == TF_FORBIDDEN) ? 1 : 2);
507 return CBF_NONE;
508 }
509
516 static CallBackFunction MenuClickTown(int index)
517 {
518 switch (index) {
519 case 0: ShowTownDirectory(); break;
520 case 1: // setting could be changed when the dropdown was open
521 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
522 break;
523 }
524 return CBF_NONE;
525 }
526
527 /* --- Subidies button menu --- */
528
529 static CallBackFunction ToolbarSubsidiesClick(Window *w)
530 {
531 PopupMainToolbMenu(w, WID_TN_SUBSIDIES, STR_SUBSIDIES_MENU_SUBSIDIES, 1);
532 return CBF_NONE;
533 }
534
541 static CallBackFunction MenuClickSubsidies(int index)
542 {
543 switch (index) {
544 case 0: ShowSubsidiesList(); break;
545 }
546 return CBF_NONE;
547 }
548
549 /* --- Stations button menu --- */
550
551 static CallBackFunction ToolbarStationsClick(Window *w)
552 {
553 PopupMainCompanyToolbMenu(w, WID_TN_STATIONS);
554 return CBF_NONE;
555 }
556
563 static CallBackFunction MenuClickStations(int index)
564 {
565 ShowCompanyStations((CompanyID)index);
566 return CBF_NONE;
567 }
568
569 /* --- Finances button menu --- */
570
571 static CallBackFunction ToolbarFinancesClick(Window *w)
572 {
573 PopupMainCompanyToolbMenu(w, WID_TN_FINANCES);
574 return CBF_NONE;
575 }
576
583 static CallBackFunction MenuClickFinances(int index)
584 {
585 ShowCompanyFinances((CompanyID)index);
586 return CBF_NONE;
587 }
588
589 /* --- Company's button menu --- */
590
591 static CallBackFunction ToolbarCompaniesClick(Window *w)
592 {
593 PopupMainCompanyToolbMenu(w, WID_TN_COMPANIES, 0);
594 return CBF_NONE;
595 }
596
603 static CallBackFunction MenuClickCompany(int index)
604 {
605 if (_networking) {
606 switch (index) {
607 case CTMN_CLIENT_LIST:
608 ShowClientList();
609 return CBF_NONE;
610
611 case CTMN_SPECTATE:
612 if (_network_server) {
613 NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR);
614 MarkWholeScreenDirty();
615 } else {
616 NetworkClientRequestMove(COMPANY_SPECTATOR);
617 }
618 return CBF_NONE;
619 }
620 }
621 ShowCompany((CompanyID)index);
622 return CBF_NONE;
623 }
624
625 /* --- Story button menu --- */
626
627 static CallBackFunction ToolbarStoryClick(Window *w)
628 {
629 PopupMainCompanyToolbMenu(w, WID_TN_STORY, 0);
630 return CBF_NONE;
631 }
632
639 static CallBackFunction MenuClickStory(int index)
640 {
641 ShowStoryBook(index == CTMN_SPECTATOR ? INVALID_COMPANY : (CompanyID)index);
642 return CBF_NONE;
643 }
644
645 /* --- Goal button menu --- */
646
647 static CallBackFunction ToolbarGoalClick(Window *w)
648 {
649 PopupMainCompanyToolbMenu(w, WID_TN_GOAL, 0);
650 return CBF_NONE;
651 }
652
659 static CallBackFunction MenuClickGoal(int index)
660 {
661 ShowGoalsList(index == CTMN_SPECTATOR ? INVALID_COMPANY : (CompanyID)index);
662 return CBF_NONE;
663 }
664
665 /* --- Graphs button menu --- */
666
667 static CallBackFunction ToolbarGraphsClick(Window *w)
668 {
669 PopupMainToolbMenu(w, WID_TN_GRAPHS, STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8);
670 return CBF_NONE;
671 }
672
679 static CallBackFunction MenuClickGraphs(int index)
680 {
681 switch (index) {
682 case 0: ShowOperatingProfitGraph(); break;
683 case 1: ShowIncomeGraph(); break;
684 case 2: ShowDeliveredCargoGraph(); break;
685 case 3: ShowPerformanceHistoryGraph(); break;
686 case 4: ShowCompanyValueGraph(); break;
687 case 5: ShowCargoPaymentRates(); break;
688 /* functions for combined graphs/league button */
689 case 6: ShowCompanyLeagueTable(); break;
690 case 7: ShowPerformanceRatingDetail(); break;
691 }
692 return CBF_NONE;
693 }
694
695 /* --- League button menu --- */
696
697 static CallBackFunction ToolbarLeagueClick(Window *w)
698 {
699 PopupMainToolbMenu(w, WID_TN_LEAGUE, STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, _networking ? 2 : 3);
700 return CBF_NONE;
701 }
702
709 static CallBackFunction MenuClickLeague(int index)
710 {
711 switch (index) {
712 case 0: ShowCompanyLeagueTable(); break;
713 case 1: ShowPerformanceRatingDetail(); break;
714 case 2: ShowHighscoreTable(); break;
715 }
716 return CBF_NONE;
717 }
718
719 /* --- Industries button menu --- */
720
721 static CallBackFunction ToolbarIndustryClick(Window *w)
722 {
723 /* Disable build-industry menu if we are a spectator */
724 PopupMainToolbMenu(w, WID_TN_INDUSTRIES, STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, (_local_company == COMPANY_SPECTATOR) ? 2 : 3);
725 return CBF_NONE;
726 }
727
734 static CallBackFunction MenuClickIndustry(int index)
735 {
736 switch (index) {
737 case 0: ShowIndustryDirectory(); break;
738 case 1: ShowIndustryCargoesWindow(); break;
739 case 2: ShowBuildIndustryWindow(); break;
740 }
741 return CBF_NONE;
742 }
743
744 /* --- Trains button menu + 1 helper function for all vehicles. --- */
745
746 static void ToolbarVehicleClick(Window *w, VehicleType veh)
747 {
748 int dis = ~0;
749
750 for (const Vehicle *v : Vehicle::Iterate()) {
751 if (v->type == veh && v->IsPrimaryVehicle()) ClrBit(dis, v->owner);
752 }
753 PopupMainCompanyToolbMenu(w, WID_TN_VEHICLE_START + veh, dis);
754 }
755
756
757 static CallBackFunction ToolbarTrainClick(Window *w)
758 {
759 ToolbarVehicleClick(w, VEH_TRAIN);
760 return CBF_NONE;
761 }
762
769 static CallBackFunction MenuClickShowTrains(int index)
770 {
771 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
772 return CBF_NONE;
773 }
774
775 /* --- Road vehicle button menu --- */
776
777 static CallBackFunction ToolbarRoadClick(Window *w)
778 {
779 ToolbarVehicleClick(w, VEH_ROAD);
780 return CBF_NONE;
781 }
782
789 static CallBackFunction MenuClickShowRoad(int index)
790 {
791 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
792 return CBF_NONE;
793 }
794
795 /* --- Ship button menu --- */
796
797 static CallBackFunction ToolbarShipClick(Window *w)
798 {
799 ToolbarVehicleClick(w, VEH_SHIP);
800 return CBF_NONE;
801 }
802
809 static CallBackFunction MenuClickShowShips(int index)
810 {
811 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
812 return CBF_NONE;
813 }
814
815 /* --- Aircraft button menu --- */
816
817 static CallBackFunction ToolbarAirClick(Window *w)
818 {
819 ToolbarVehicleClick(w, VEH_AIRCRAFT);
820 return CBF_NONE;
821 }
822
829 static CallBackFunction MenuClickShowAir(int index)
830 {
831 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
832 return CBF_NONE;
833 }
834
835 /* --- Zoom in button --- */
836
837 static CallBackFunction ToolbarZoomInClick(Window *w)
838 {
839 if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
840 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)WID_TE_ZOOM_IN : (byte)WID_TN_ZOOM_IN);
841 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
842 }
843 return CBF_NONE;
844 }
845
846 /* --- Zoom out button --- */
847
848 static CallBackFunction ToolbarZoomOutClick(Window *w)
849 {
850 if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
851 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)WID_TE_ZOOM_OUT : (byte)WID_TN_ZOOM_OUT);
852 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
853 }
854 return CBF_NONE;
855 }
856
857 /* --- Rail button menu --- */
858
859 static CallBackFunction ToolbarBuildRailClick(Window *w)
860 {
861 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, true, true);
862 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
863 return CBF_NONE;
864 }
865
872 static CallBackFunction MenuClickBuildRail(int index)
873 {
874 _last_built_railtype = (RailType)index;
875 ShowBuildRailToolbar(_last_built_railtype);
876 return CBF_NONE;
877 }
878
879 /* --- Road button menu --- */
880
881 static CallBackFunction ToolbarBuildRoadClick(Window *w)
882 {
883 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, true, true);
884 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
885 return CBF_NONE;
886 }
887
894 static CallBackFunction MenuClickBuildRoad(int index)
895 {
896 _last_built_roadtype = (RoadType)index;
897 ShowBuildRoadToolbar(_last_built_roadtype);
898 return CBF_NONE;
899 }
900
901 /* --- Tram button menu --- */
902
903 static CallBackFunction ToolbarBuildTramClick(Window *w)
904 {
905 ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, true, true);
906 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
907 return CBF_NONE;
908 }
909
916 static CallBackFunction MenuClickBuildTram(int index)
917 {
918 _last_built_tramtype = (RoadType)index;
919 ShowBuildRoadToolbar(_last_built_tramtype);
920 return CBF_NONE;
921 }
922
923 /* --- Water button menu --- */
924
925 static CallBackFunction ToolbarBuildWaterClick(Window *w)
926 {
927 DropDownList list;
928 list.emplace_back(new DropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0, false));
929 ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, true, true);
930 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
931 return CBF_NONE;
932 }
933
940 static CallBackFunction MenuClickBuildWater(int index)
941 {
942 ShowBuildDocksToolbar();
943 return CBF_NONE;
944 }
945
946 /* --- Airport button menu --- */
947
948 static CallBackFunction ToolbarBuildAirClick(Window *w)
949 {
950 DropDownList list;
951 list.emplace_back(new DropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0, false));
952 ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, true, true);
953 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
954 return CBF_NONE;
955 }
956
963 static CallBackFunction MenuClickBuildAir(int index)
964 {
965 ShowBuildAirToolbar();
966 return CBF_NONE;
967 }
968
969 /* --- Forest button menu --- */
970
971 static CallBackFunction ToolbarForestClick(Window *w)
972 {
973 DropDownList list;
974 list.emplace_back(new DropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0, false));
975 list.emplace_back(new DropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1, false));
976 list.emplace_back(new DropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2, false));
977 ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, true, true);
978 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
979 return CBF_NONE;
980 }
981
988 static CallBackFunction MenuClickForest(int index)
989 {
990 switch (index) {
991 case 0: ShowTerraformToolbar(); break;
992 case 1: ShowBuildTreesToolbar(); break;
993 case 2: return SelectSignTool();
994 }
995 return CBF_NONE;
996 }
997
998 /* --- Music button menu --- */
999
1000 static CallBackFunction ToolbarMusicClick(Window *w)
1001 {
1002 PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_MUSIC_SOUND : (int)WID_TN_MUSIC_SOUND, STR_TOOLBAR_SOUND_MUSIC, 1);
1003 return CBF_NONE;
1004 }
1005
1012 static CallBackFunction MenuClickMusicWindow(int index)
1013 {
1014 ShowMusicWindow();
1015 return CBF_NONE;
1016 }
1017
1018 /* --- Newspaper button menu --- */
1019
1020 static CallBackFunction ToolbarNewspaperClick(Window *w)
1021 {
1022 PopupMainToolbMenu(w, WID_TN_MESSAGES, STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, 3);
1023 return CBF_NONE;
1024 }
1025
1032 static CallBackFunction MenuClickNewspaper(int index)
1033 {
1034 switch (index) {
1035 case 0: ShowLastNewsMessage(); break;
1036 case 1: ShowMessageHistory(); break;
1037 case 2: DeleteAllMessages(); break;
1038 }
1039 return CBF_NONE;
1040 }
1041
1042 /* --- Help button menu --- */
1043
1044 static CallBackFunction PlaceLandBlockInfo()
1045 {
1046 if (_last_started_action == CBF_PLACE_LANDINFO) {
1047 ResetObjectToPlace();
1048 return CBF_NONE;
1049 } else {
1050 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
1051 return CBF_PLACE_LANDINFO;
1052 }
1053 }
1054
1055 static CallBackFunction ToolbarHelpClick(Window *w)
1056 {
1057 PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 10 : 7);
1058 return CBF_NONE;
1059 }
1060
1068 void ToggleBoundingBoxes()
1069 {
1070 extern bool _draw_bounding_boxes;
1071 /* Always allow to toggle them off */
1072 if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
1073 _draw_bounding_boxes = !_draw_bounding_boxes;
1074 MarkWholeScreenDirty();
1075 }
1076 }
1077
1085 void ToggleDirtyBlocks()
1086 {
1087 extern bool _draw_dirty_blocks;
1088 /* Always allow to toggle them off */
1089 if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
1090 _draw_dirty_blocks = !_draw_dirty_blocks;
1091 MarkWholeScreenDirty();
1092 }
1093 }
1094
1099 void SetStartingYear(Year year)
1100 {
1101 _settings_game.game_creation.starting_year = Clamp(year, MIN_YEAR, MAX_YEAR);
1102 Date new_date = ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
1103 /* If you open a savegame as scenario there may already be link graphs.*/
1104 LinkGraphSchedule::instance.ShiftDates(new_date - _date);
1105 SetDate(new_date, 0);
1106 }
1107
1113 static CallBackFunction MenuClickHelp(int index)
1114 {
1115 switch (index) {
1116 case 0: return PlaceLandBlockInfo();
1117 case 2: IConsoleSwitch(); break;
1118 case 3: ShowAIDebugWindow(); break;
1119 case 4: ShowScreenshotWindow(); break;
1120 case 5: ShowFramerateWindow(); break;
1121 case 6: ShowAboutWindow(); break;
1122 case 7: ShowSpriteAlignerWindow(); break;
1123 case 8: ToggleBoundingBoxes(); break;
1124 case 9: ToggleDirtyBlocks(); break;
1125 }
1126 return CBF_NONE;
1127 }
1128
1129 /* --- Switch toolbar button --- */
1130
1131 static CallBackFunction ToolbarSwitchClick(Window *w)
1132 {
1133 if (_toolbar_mode != TB_LOWER) {
1134 _toolbar_mode = TB_LOWER;
1135 } else {
1136 _toolbar_mode = TB_UPPER;
1137 }
1138
1139 w->ReInit();
1140 w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (uint)WID_TE_SWITCH_BAR : (uint)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
1141 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1142 return CBF_NONE;
1143 }
1144
1145 /* --- Scenario editor specific handlers. */
1146
1150 static CallBackFunction ToolbarScenDatePanel(Window *w)
1151 {
1152 SetDParam(0, _settings_game.game_creation.starting_year);
1153 ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
1154 _left_button_clicked = false;
1155 return CBF_NONE;
1156 }
1157
1158 static CallBackFunction ToolbarScenDateBackward(Window *w)
1159 {
1160 /* don't allow too fast scrolling */
1161 if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1162 w->HandleButtonClick(WID_TE_DATE_BACKWARD);
1163 w->SetDirty();
1164
1165 SetStartingYear(_settings_game.game_creation.starting_year - 1);
1166 }
1167 _left_button_clicked = false;
1168 return CBF_NONE;
1169 }
1170
1171 static CallBackFunction ToolbarScenDateForward(Window *w)
1172 {
1173 /* don't allow too fast scrolling */
1174 if (!(w->flags & WF_TIMEOUT) || w->timeout_timer <= 1) {
1175 w->HandleButtonClick(WID_TE_DATE_FORWARD);
1176 w->SetDirty();
1177
1178 SetStartingYear(_settings_game.game_creation.starting_year + 1);
1179 }
1180 _left_button_clicked = false;
1181 return CBF_NONE;
1182 }
1183
1184 static CallBackFunction ToolbarScenGenLand(Window *w)
1185 {
1186 w->HandleButtonClick(WID_TE_LAND_GENERATE);
1187 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1188
1189 ShowEditorTerraformToolbar();
1190 return CBF_NONE;
1191 }
1192
1193
1194 static CallBackFunction ToolbarScenGenTown(Window *w)
1195 {
1196 w->HandleButtonClick(WID_TE_TOWN_GENERATE);
1197 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1198 ShowFoundTownWindow();
1199 return CBF_NONE;
1200 }
1201
1202 static CallBackFunction ToolbarScenGenIndustry(Window *w)
1203 {
1204 w->HandleButtonClick(WID_TE_INDUSTRY);
1205 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1206 ShowBuildIndustryWindow();
1207 return CBF_NONE;
1208 }
1209
1210 static CallBackFunction ToolbarScenBuildRoadClick(Window *w)
1211 {
1212 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, true, true);
1213 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1214 return CBF_NONE;
1215 }
1216
1223 static CallBackFunction ToolbarScenBuildRoad(int index)
1224 {
1225 _last_built_roadtype = (RoadType)index;
1226 ShowBuildRoadScenToolbar(_last_built_roadtype);
1227 return CBF_NONE;
1228 }
1229
1230 static CallBackFunction ToolbarScenBuildTramClick(Window *w)
1231 {
1232 ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, true, true);
1233 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1234 return CBF_NONE;
1235 }
1236
1243 static CallBackFunction ToolbarScenBuildTram(int index)
1244 {
1245 _last_built_tramtype = (RoadType)index;
1246 ShowBuildRoadScenToolbar(_last_built_tramtype);
1247 return CBF_NONE;
1248 }
1249
1250 static CallBackFunction ToolbarScenBuildDocks(Window *w)
1251 {
1252 w->HandleButtonClick(WID_TE_WATER);
1253 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1254 ShowBuildDocksScenToolbar();
1255 return CBF_NONE;
1256 }
1257
1258 static CallBackFunction ToolbarScenPlantTrees(Window *w)
1259 {
1260 w->HandleButtonClick(WID_TE_TREES);
1261 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1262 ShowBuildTreesToolbar();
1263 return CBF_NONE;
1264 }
1265
1266 static CallBackFunction ToolbarScenPlaceSign(Window *w)
1267 {
1268 w->HandleButtonClick(WID_TE_SIGNS);
1269 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1270 return SelectSignTool();
1271 }
1272
1273 static CallBackFunction ToolbarBtn_NULL(Window *w)
1274 {
1275 return CBF_NONE;
1276 }
1277
1278 typedef CallBackFunction MenuClickedProc(int index);
1279
1280 static MenuClickedProc * const _menu_clicked_procs[] = {
1281 nullptr, // 0
1282 nullptr, // 1
1283 MenuClickSettings, // 2
1284 MenuClickSaveLoad, // 3
1285 MenuClickMap, // 4
1286 MenuClickTown, // 5
1287 MenuClickSubsidies, // 6
1288 MenuClickStations, // 7
1289 MenuClickFinances, // 8
1290 MenuClickCompany, // 9
1291 MenuClickStory, // 10
1292 MenuClickGoal, // 11
1293 MenuClickGraphs, // 12
1294 MenuClickLeague, // 13
1295 MenuClickIndustry, // 14
1296 MenuClickShowTrains, // 15
1297 MenuClickShowRoad, // 16
1298 MenuClickShowShips, // 17
1299 MenuClickShowAir, // 18
1300 MenuClickMap, // 19
1301 nullptr, // 20
1302 MenuClickBuildRail, // 21
1303 MenuClickBuildRoad, // 22
1304 MenuClickBuildTram, // 23
1305 MenuClickBuildWater, // 24
1306 MenuClickBuildAir, // 25
1307 MenuClickForest, // 26
1308 MenuClickMusicWindow, // 27
1309 MenuClickNewspaper, // 28
1310 MenuClickHelp, // 29
1311 };
1312
1314 class NWidgetToolbarContainer : public NWidgetContainer {
1315 bool visible[WID_TN_END];
1316 protected:
1317 uint spacers;
1318
1319 public:
1320 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
1321 {
1322 }
1323
1329 bool IsButton(WidgetType type) const
1330 {
1331 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
1332 }
1333
1334 void SetupSmallestSize(Window *w, bool init_array) override
1335 {
1336 this->smallest_x = 0; // Biggest child
1337 this->smallest_y = 0; // Biggest child
1338 this->fill_x = 1;
1339 this->fill_y = 0;
1340 this->resize_x = 1; // We only resize in this direction
1341 this->resize_y = 0; // We never resize in this direction
1342 this->spacers = 0;
1343
1344 uint nbuttons = 0;
1345 /* First initialise some variables... */
1346 for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
1347 child_wid->SetupSmallestSize(w, init_array);
1348 this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
1349 if (this->IsButton(child_wid->type)) {
1350 nbuttons++;
1351 this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
1352 } else if (child_wid->type == NWID_SPACER) {
1353 this->spacers++;
1354 }
1355 }
1356
1357 /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
1358 for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
1359 child_wid->current_y = this->smallest_y;
1360 if (!this->IsButton(child_wid->type)) {
1361 child_wid->current_x = child_wid->smallest_x;
1362 }
1363 }
1364 _toolbar_width = nbuttons * this->smallest_x;
1365 }
1366
1367 void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl) override
1368 {
1369 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
1370
1371 this->pos_x = x;
1372 this->pos_y = y;
1373 this->current_x = given_width;
1374 this->current_y = given_height;
1375
1376 /* Figure out what are the visible buttons */
1377 memset(this->visible, 0, sizeof(this->visible));
1378 uint arrangable_count, button_count, spacer_count;
1379 const byte *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1380 for (uint i = 0; i < arrangable_count; i++) {
1381 this->visible[arrangement[i]] = true;
1382 }
1383
1384 /* Create us ourselves a quick lookup table */
1385 NWidgetBase *widgets[WID_TN_END];
1386 for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
1387 if (child_wid->type == NWID_SPACER) continue;
1388 widgets[((NWidgetCore*)child_wid)->index] = child_wid;
1389 }
1390
1391 /* Now assign the widgets to their rightful place */
1392 uint position = 0; // Place to put next child relative to origin of the container.
1393 uint spacer_space = std::max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
1394 uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
1395 uint spacer_i = 0;
1396 uint button_i = 0;
1397
1398 /* Index into the arrangement indices. The macro lastof cannot be used here! */
1399 const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1400 for (uint i = 0; i < arrangable_count; i++) {
1401 NWidgetBase *child_wid = widgets[*cur_wid];
1402 /* If we have to give space to the spacers, do that */
1403 if (spacer_space != 0) {
1404 NWidgetBase *possible_spacer = rtl ? child_wid->next : child_wid->prev;
1405 if (possible_spacer != nullptr && possible_spacer->type == NWID_SPACER) {
1406 uint add = spacer_space / (spacer_count - spacer_i);
1407 position += add;
1408 spacer_space -= add;
1409 spacer_i++;
1410 }
1411 }
1412
1413 /* Buttons can be scaled, the others not. */
1414 if (this->IsButton(child_wid->type)) {
1415 child_wid->current_x = button_space / (button_count - button_i);
1416 button_space -= child_wid->current_x;
1417 button_i++;
1418 }
1419 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
1420 position += child_wid->current_x;
1421
1422 if (rtl) {
1423 cur_wid--;
1424 } else {
1425 cur_wid++;
1426 }
1427 }
1428 }
1429
1430 void Draw(const Window *w) override
1431 {
1432 /* Draw brown-red toolbar bg. */
1433 GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_VERY_DARK_RED);
1434 GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_DARK_RED, FILLRECT_CHECKER);
1435
1436 bool rtl = _current_text_dir == TD_RTL;
1437 for (NWidgetBase *child_wid = rtl ? this->tail : this->head; child_wid != nullptr; child_wid = rtl ? child_wid->prev : child_wid->next) {
1438 if (child_wid->type == NWID_SPACER) continue;
1439 if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
1440
1441 child_wid->Draw(w);
1442 }
1443 }
1444
1445 NWidgetCore *GetWidgetFromPos(int x, int y) override
1446 {
1447 if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr;
1448
1449 for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
1450 if (child_wid->type == NWID_SPACER) continue;
1451 if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
1452
1453 NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
1454 if (nwid != nullptr) return nwid;
1455 }
1456 return nullptr;
1457 }
1458
1467 virtual const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
1468 };
1469
1471 class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
1472 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1473 {
1474 static const uint SMALLEST_ARRANGEMENT = 14;
1475 static const uint BIGGEST_ARRANGEMENT = 20;
1476
1477 /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
1478 * The total number of buttons should be equal to arrangable_count * 2.
1479 * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a
1480 * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is
1481 * enough space.
1482 */
1483 static const byte arrange14[] = {
1484 WID_TN_PAUSE,
1485 WID_TN_FAST_FORWARD,
1486 WID_TN_TRAINS,
1487 WID_TN_ROADVEHS,
1488 WID_TN_SHIPS,
1489 WID_TN_AIRCRAFT,
1490 WID_TN_ZOOM_IN,
1491 WID_TN_ZOOM_OUT,
1492 WID_TN_RAILS,
1493 WID_TN_ROADS,
1494 WID_TN_WATER,
1495 WID_TN_AIR,
1496 WID_TN_LANDSCAPE,
1497 WID_TN_SWITCH_BAR,
1498 // lower toolbar
1499 WID_TN_SETTINGS,
1500 WID_TN_SAVE,
1501 WID_TN_SMALL_MAP,
1502 WID_TN_TOWNS,
1503 WID_TN_SUBSIDIES,
1504 WID_TN_STATIONS,
1505 WID_TN_FINANCES,
1506 WID_TN_COMPANIES,
1507 WID_TN_GRAPHS,
1508 WID_TN_INDUSTRIES,
1509 WID_TN_MUSIC_SOUND,
1510 WID_TN_MESSAGES,
1511 WID_TN_HELP,
1512 WID_TN_SWITCH_BAR,
1513 };
1514 static const byte arrange15[] = {
1515 WID_TN_PAUSE,
1516 WID_TN_FAST_FORWARD,
1517 WID_TN_SMALL_MAP,
1518 WID_TN_TRAINS,
1519 WID_TN_ROADVEHS,
1520 WID_TN_SHIPS,
1521 WID_TN_AIRCRAFT,
1522 WID_TN_RAILS,
1523 WID_TN_ROADS,
1524 WID_TN_WATER,
1525 WID_TN_AIR,
1526 WID_TN_LANDSCAPE,
1527 WID_TN_ZOOM_IN,
1528 WID_TN_ZOOM_OUT,
1529 WID_TN_SWITCH_BAR,
1530 // lower toolbar
1531 WID_TN_PAUSE,
1532 WID_TN_SETTINGS,
1533 WID_TN_SMALL_MAP,
1534 WID_TN_SAVE,
1535 WID_TN_TOWNS,
1536 WID_TN_SUBSIDIES,
1537 WID_TN_STATIONS,
1538 WID_TN_FINANCES,
1539 WID_TN_COMPANIES,
1540 WID_TN_GRAPHS,
1541 WID_TN_INDUSTRIES,
1542 WID_TN_MUSIC_SOUND,
1543 WID_TN_MESSAGES,
1544 WID_TN_HELP,
1545 WID_TN_SWITCH_BAR,
1546 };
1547 static const byte arrange16[] = {
1548 WID_TN_PAUSE,
1549 WID_TN_FAST_FORWARD,
1550 WID_TN_SETTINGS,
1551 WID_TN_SMALL_MAP,
1552 WID_TN_TRAINS,
1553 WID_TN_ROADVEHS,
1554 WID_TN_SHIPS,
1555 WID_TN_AIRCRAFT,
1556 WID_TN_RAILS,
1557 WID_TN_ROADS,
1558 WID_TN_WATER,
1559 WID_TN_AIR,
1560 WID_TN_LANDSCAPE,
1561 WID_TN_ZOOM_IN,
1562 WID_TN_ZOOM_OUT,
1563 WID_TN_SWITCH_BAR,
1564 // lower toolbar
1565 WID_TN_PAUSE,
1566 WID_TN_FAST_FORWARD,
1567 WID_TN_SAVE,
1568 WID_TN_TOWNS,
1569 WID_TN_SUBSIDIES,
1570 WID_TN_STATIONS,
1571 WID_TN_FINANCES,
1572 WID_TN_COMPANIES,
1573 WID_TN_GRAPHS,
1574 WID_TN_INDUSTRIES,
1575 WID_TN_MUSIC_SOUND,
1576 WID_TN_MESSAGES,
1577 WID_TN_HELP,
1578 WID_TN_ZOOM_IN,
1579 WID_TN_ZOOM_OUT,
1580 WID_TN_SWITCH_BAR,
1581 };
1582 static const byte arrange17[] = {
1583 WID_TN_PAUSE,
1584 WID_TN_FAST_FORWARD,
1585 WID_TN_SETTINGS,
1586 WID_TN_SMALL_MAP,
1587 WID_TN_SUBSIDIES,
1588 WID_TN_TRAINS,
1589 WID_TN_ROADVEHS,
1590 WID_TN_SHIPS,
1591 WID_TN_AIRCRAFT,
1592 WID_TN_RAILS,
1593 WID_TN_ROADS,
1594 WID_TN_WATER,
1595 WID_TN_AIR,
1596 WID_TN_LANDSCAPE,
1597 WID_TN_ZOOM_IN,
1598 WID_TN_ZOOM_OUT,
1599 WID_TN_SWITCH_BAR,
1600 // lower toolbar
1601 WID_TN_PAUSE,
1602 WID_TN_FAST_FORWARD,
1603 WID_TN_SAVE,
1604 WID_TN_SMALL_MAP,
1605 WID_TN_SUBSIDIES,
1606 WID_TN_TOWNS,
1607 WID_TN_STATIONS,
1608 WID_TN_FINANCES,
1609 WID_TN_COMPANIES,
1610 WID_TN_GRAPHS,
1611 WID_TN_INDUSTRIES,
1612 WID_TN_MUSIC_SOUND,
1613 WID_TN_MESSAGES,
1614 WID_TN_HELP,
1615 WID_TN_ZOOM_IN,
1616 WID_TN_ZOOM_OUT,
1617 WID_TN_SWITCH_BAR,
1618 };
1619 static const byte arrange18[] = {
1620 WID_TN_PAUSE,
1621 WID_TN_FAST_FORWARD,
1622 WID_TN_SETTINGS,
1623 WID_TN_SMALL_MAP,
1624 WID_TN_TOWNS,
1625 WID_TN_SUBSIDIES,
1626 WID_TN_STATIONS,
1627 WID_TN_FINANCES,
1628 WID_TN_COMPANIES,
1629 WID_TN_INDUSTRIES,
1630 WID_TN_RAILS,
1631 WID_TN_ROADS,
1632 WID_TN_WATER,
1633 WID_TN_AIR,
1634 WID_TN_LANDSCAPE,
1635 WID_TN_ZOOM_IN,
1636 WID_TN_ZOOM_OUT,
1637 WID_TN_SWITCH_BAR,
1638 // lower toolbar
1639 WID_TN_PAUSE,
1640 WID_TN_FAST_FORWARD,
1641 WID_TN_SAVE,
1642 WID_TN_SMALL_MAP,
1643 WID_TN_TOWNS,
1644 WID_TN_SUBSIDIES,
1645 WID_TN_STATIONS,
1646 WID_TN_GRAPHS,
1647 WID_TN_TRAINS,
1648 WID_TN_ROADVEHS,
1649 WID_TN_SHIPS,
1650 WID_TN_AIRCRAFT,
1651 WID_TN_MUSIC_SOUND,
1652 WID_TN_MESSAGES,
1653 WID_TN_HELP,
1654 WID_TN_ZOOM_IN,
1655 WID_TN_ZOOM_OUT,
1656 WID_TN_SWITCH_BAR,
1657 };
1658 static const byte arrange19[] = {
1659 WID_TN_PAUSE,
1660 WID_TN_FAST_FORWARD,
1661 WID_TN_SETTINGS,
1662 WID_TN_SMALL_MAP,
1663 WID_TN_TOWNS,
1664 WID_TN_SUBSIDIES,
1665 WID_TN_TRAINS,
1666 WID_TN_ROADVEHS,
1667 WID_TN_SHIPS,
1668 WID_TN_AIRCRAFT,
1669 WID_TN_RAILS,
1670 WID_TN_ROADS,
1671 WID_TN_WATER,
1672 WID_TN_AIR,
1673 WID_TN_LANDSCAPE,
1674 WID_TN_MUSIC_SOUND,
1675 WID_TN_ZOOM_IN,
1676 WID_TN_ZOOM_OUT,
1677 WID_TN_SWITCH_BAR,
1678 // lower toolbar
1679 WID_TN_PAUSE,
1680 WID_TN_FAST_FORWARD,
1681 WID_TN_SAVE,
1682 WID_TN_SMALL_MAP,
1683 WID_TN_STATIONS,
1684 WID_TN_FINANCES,
1685 WID_TN_COMPANIES,
1686 WID_TN_GRAPHS,
1687 WID_TN_INDUSTRIES,
1688 WID_TN_MESSAGES,
1689 WID_TN_RAILS,
1690 WID_TN_ROADS,
1691 WID_TN_WATER,
1692 WID_TN_AIR,
1693 WID_TN_LANDSCAPE,
1694 WID_TN_HELP,
1695 WID_TN_ZOOM_IN,
1696 WID_TN_ZOOM_OUT,
1697 WID_TN_SWITCH_BAR,
1698 };
1699 static const byte arrange20[] = {
1700 WID_TN_PAUSE,
1701 WID_TN_FAST_FORWARD,
1702 WID_TN_SETTINGS,
1703 WID_TN_SMALL_MAP,
1704 WID_TN_TOWNS,
1705 WID_TN_SUBSIDIES,
1706 WID_TN_TRAINS,
1707 WID_TN_ROADVEHS,
1708 WID_TN_SHIPS,
1709 WID_TN_AIRCRAFT,
1710 WID_TN_RAILS,
1711 WID_TN_ROADS,
1712 WID_TN_WATER,
1713 WID_TN_AIR,
1714 WID_TN_LANDSCAPE,
1715 WID_TN_MUSIC_SOUND,
1716 WID_TN_GOAL,
1717 WID_TN_ZOOM_IN,
1718 WID_TN_ZOOM_OUT,
1719 WID_TN_SWITCH_BAR,
1720 // lower toolbar
1721 WID_TN_PAUSE,
1722 WID_TN_FAST_FORWARD,
1723 WID_TN_SAVE,
1724 WID_TN_SMALL_MAP,
1725 WID_TN_STATIONS,
1726 WID_TN_FINANCES,
1727 WID_TN_COMPANIES,
1728 WID_TN_GRAPHS,
1729 WID_TN_INDUSTRIES,
1730 WID_TN_MESSAGES,
1731 WID_TN_RAILS,
1732 WID_TN_ROADS,
1733 WID_TN_WATER,
1734 WID_TN_AIR,
1735 WID_TN_LANDSCAPE,
1736 WID_TN_STORY,
1737 WID_TN_HELP,
1738 WID_TN_ZOOM_IN,
1739 WID_TN_ZOOM_OUT,
1740 WID_TN_SWITCH_BAR,
1741 };
1742 static const byte arrange_all[] = {
1743 WID_TN_PAUSE,
1744 WID_TN_FAST_FORWARD,
1745 WID_TN_SETTINGS,
1746 WID_TN_SAVE,
1747 WID_TN_SMALL_MAP,
1748 WID_TN_TOWNS,
1749 WID_TN_SUBSIDIES,
1750 WID_TN_STATIONS,
1751 WID_TN_FINANCES,
1752 WID_TN_COMPANIES,
1753 WID_TN_STORY,
1754 WID_TN_GOAL,
1755 WID_TN_GRAPHS,
1756 WID_TN_LEAGUE,
1757 WID_TN_INDUSTRIES,
1758 WID_TN_TRAINS,
1759 WID_TN_ROADVEHS,
1760 WID_TN_SHIPS,
1761 WID_TN_AIRCRAFT,
1762 WID_TN_ZOOM_IN,
1763 WID_TN_ZOOM_OUT,
1764 WID_TN_RAILS,
1765 WID_TN_ROADS,
1766 WID_TN_TRAMS,
1767 WID_TN_WATER,
1768 WID_TN_AIR,
1769 WID_TN_LANDSCAPE,
1770 WID_TN_MUSIC_SOUND,
1771 WID_TN_MESSAGES,
1772 WID_TN_HELP
1773 };
1774
1775 /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
1776 uint full_buttons = std::max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
1777 if (full_buttons > BIGGEST_ARRANGEMENT) {
1778 button_count = arrangable_count = lengthof(arrange_all);
1779 spacer_count = this->spacers;
1780 return arrange_all;
1781 }
1782
1783 /* Introduce the split toolbar */
1784 static const byte * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1785
1786 button_count = arrangable_count = full_buttons;
1787 spacer_count = this->spacers;
1788 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1789 }
1790 };
1791
1793 class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
1794 uint panel_widths[2];
1795
1796 void SetupSmallestSize(Window *w, bool init_array) override
1797 {
1798 this->NWidgetToolbarContainer::SetupSmallestSize(w, init_array);
1799
1800 /* Find the size of panel_widths */
1801 uint i = 0;
1802 for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
1803 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
1804
1805 assert(i < lengthof(this->panel_widths));
1806 this->panel_widths[i++] = child_wid->current_x;
1807 _toolbar_width += child_wid->current_x;
1808 }
1809 }
1810
1811 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
1812 {
1813 static const byte arrange_all[] = {
1814 WID_TE_PAUSE,
1815 WID_TE_FAST_FORWARD,
1816 WID_TE_SETTINGS,
1817 WID_TE_SAVE,
1818 WID_TE_SPACER,
1819 WID_TE_DATE_PANEL,
1820 WID_TE_SMALL_MAP,
1821 WID_TE_ZOOM_IN,
1822 WID_TE_ZOOM_OUT,
1823 WID_TE_LAND_GENERATE,
1824 WID_TE_TOWN_GENERATE,
1825 WID_TE_INDUSTRY,
1826 WID_TE_ROADS,
1827 WID_TE_TRAMS,
1828 WID_TE_WATER,
1829 WID_TE_TREES,
1830 WID_TE_SIGNS,
1831 WID_TE_MUSIC_SOUND,
1832 WID_TE_HELP,
1833 };
1834 static const byte arrange_nopanel[] = {
1835 WID_TE_PAUSE,
1836 WID_TE_FAST_FORWARD,
1837 WID_TE_SETTINGS,
1838 WID_TE_SAVE,
1839 WID_TE_DATE_PANEL,
1840 WID_TE_SMALL_MAP,
1841 WID_TE_ZOOM_IN,
1842 WID_TE_ZOOM_OUT,
1843 WID_TE_LAND_GENERATE,
1844 WID_TE_TOWN_GENERATE,
1845 WID_TE_INDUSTRY,
1846 WID_TE_ROADS,
1847 WID_TE_TRAMS,
1848 WID_TE_WATER,
1849 WID_TE_TREES,
1850 WID_TE_SIGNS,
1851 WID_TE_MUSIC_SOUND,
1852 WID_TE_HELP,
1853 };
1854 static const byte arrange_switch[] = {
1855 WID_TE_DATE_PANEL,
1856 WID_TE_SMALL_MAP,
1857 WID_TE_LAND_GENERATE,
1858 WID_TE_TOWN_GENERATE,
1859 WID_TE_INDUSTRY,
1860 WID_TE_ROADS,
1861 WID_TE_TRAMS,
1862 WID_TE_WATER,
1863 WID_TE_TREES,
1864 WID_TE_SIGNS,
1865 WID_TE_SWITCH_BAR,
1866 // lower toolbar
1867 WID_TE_PAUSE,
1868 WID_TE_FAST_FORWARD,
1869 WID_TE_SETTINGS,
1870 WID_TE_SAVE,
1871 WID_TE_DATE_PANEL,
1872 WID_TE_SMALL_MAP,
1873 WID_TE_ZOOM_IN,
1874 WID_TE_ZOOM_OUT,
1875 WID_TE_MUSIC_SOUND,
1876 WID_TE_HELP,
1877 WID_TE_SWITCH_BAR,
1878 };
1879
1880 /* If we can place all buttons *and* the panels, show them. */
1881 uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
1882 if (width >= min_full_width) {
1883 width -= this->panel_widths[0] + this->panel_widths[1];
1884 arrangable_count = lengthof(arrange_all);
1885 button_count = arrangable_count - 2;
1886 spacer_count = this->spacers;
1887 return arrange_all;
1888 }
1889
1890 /* 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 */
1891 uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
1892 if (width > min_small_width) {
1893 width -= this->panel_widths[1];
1894 arrangable_count = lengthof(arrange_nopanel);
1895 button_count = arrangable_count - 1;
1896 spacer_count = this->spacers - 1;
1897 return arrange_nopanel;
1898 }
1899
1900 /* Split toolbar */
1901 width -= this->panel_widths[1];
1902 arrangable_count = lengthof(arrange_switch) / 2;
1903 button_count = arrangable_count - 1;
1904 spacer_count = 0;
1905 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1906 }
1907 };
1908
1909 /* --- Toolbar handling for the 'normal' case */
1910
1911 typedef CallBackFunction ToolbarButtonProc(Window *w);
1912
1913 static ToolbarButtonProc * const _toolbar_button_procs[] = {
1914 ToolbarPauseClick,
1915 ToolbarFastForwardClick,
1916 ToolbarOptionsClick,
1917 ToolbarSaveClick,
1918 ToolbarMapClick,
1919 ToolbarTownClick,
1920 ToolbarSubsidiesClick,
1921 ToolbarStationsClick,
1922 ToolbarFinancesClick,
1923 ToolbarCompaniesClick,
1924 ToolbarStoryClick,
1925 ToolbarGoalClick,
1926 ToolbarGraphsClick,
1927 ToolbarLeagueClick,
1928 ToolbarIndustryClick,
1929 ToolbarTrainClick,
1930 ToolbarRoadClick,
1931 ToolbarShipClick,
1932 ToolbarAirClick,
1933 ToolbarZoomInClick,
1934 ToolbarZoomOutClick,
1935 ToolbarBuildRailClick,
1936 ToolbarBuildRoadClick,
1937 ToolbarBuildTramClick,
1938 ToolbarBuildWaterClick,
1939 ToolbarBuildAirClick,
1940 ToolbarForestClick,
1941 ToolbarMusicClick,
1942 ToolbarNewspaperClick,
1943 ToolbarHelpClick,
1944 ToolbarSwitchClick,
1945 };
1946
1948 struct MainToolbarWindow : Window {
1949 GUITimer timer;
1950
1951 MainToolbarWindow(WindowDesc *desc) : Window(desc)
1952 {
1953 this->InitNested(0);
1954
1955 _last_started_action = CBF_NONE;
1956 CLRBITS(this->flags, WF_WHITE_BORDER);
1957 this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button
1958 this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button
1959 PositionMainToolbar(this);
1960 DoZoomInOutWindow(ZOOM_NONE, this);
1961
1962 this->timer.SetInterval(MILLISECONDS_PER_TICK);
1963 }
1964
1965 void FindWindowPlacementAndResize(int def_width, int def_height) override
1966 {
1967 Window::FindWindowPlacementAndResize(_toolbar_width, def_height);
1968 }
1969
1970 void OnPaint() override
1971 {
1972 /* If spectator, disable all construction buttons
1973 * ie : Build road, rail, ships, airports and landscaping
1974 * Since enabled state is the default, just disable when needed */
1975 this->SetWidgetsDisabledState(_local_company == COMPANY_SPECTATOR, WID_TN_RAILS, WID_TN_ROADS, WID_TN_TRAMS, WID_TN_WATER, WID_TN_AIR, WID_TN_LANDSCAPE, WIDGET_LIST_END);
1976 /* disable company list drop downs, if there are no companies */
1977 this->SetWidgetsDisabledState(Company::GetNumItems() == 0, WID_TN_STATIONS, WID_TN_FINANCES, WID_TN_TRAINS, WID_TN_ROADVEHS, WID_TN_SHIPS, WID_TN_AIRCRAFT, WIDGET_LIST_END);
1978
1979 this->SetWidgetDisabledState(WID_TN_GOAL, Goal::GetNumItems() == 0);
1980 this->SetWidgetDisabledState(WID_TN_STORY, StoryPage::GetNumItems() == 0);
1981
1982 this->DrawWidgets();
1983 }
1984
1985 void OnClick(Point pt, int widget, int click_count) override
1986 {
1987 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
1988 }
1989
1990 void OnDropdownSelect(int widget, int index) override
1991 {
1992 CallBackFunction cbf = _menu_clicked_procs[widget](index);
1993 if (cbf != CBF_NONE) _last_started_action = cbf;
1994 }
1995
1996 EventState OnHotkey(int hotkey) override
1997 {
1998 CallBackFunction cbf = CBF_NONE;
1999 switch (hotkey) {
2000 case MTHK_PAUSE: ToolbarPauseClick(this); break;
2001 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2002 case MTHK_SETTINGS: ShowGameOptions(); break;
2003 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
2004 case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break;
2005 case MTHK_SMALLMAP: ShowSmallMap(); break;
2006 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
2007 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
2008 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
2009 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
2010 case MTHK_COMPANIES: ShowCompany(_local_company); break;
2011 case MTHK_STORY: ShowStoryBook(_local_company); break;
2012 case MTHK_GOAL: ShowGoalsList(_local_company); break;
2013 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
2014 case MTHK_LEAGUE: ShowCompanyLeagueTable(); break;
2015 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
2016 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
2017 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
2018 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
2019 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
2020 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2021 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2022 case MTHK_BUILD_RAIL: ShowBuildRailToolbar(_last_built_railtype); break;
2023 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
2024 case MTHK_BUILD_TRAM: ShowBuildRoadToolbar(_last_built_tramtype); break;
2025 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
2026 case MTHK_BUILD_AIRPORT: ShowBuildAirToolbar(); break;
2027 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
2028 case MTHK_MUSIC: ShowMusicWindow(); break;
2029 case MTHK_AI_DEBUG: ShowAIDebugWindow(); break;
2030 case MTHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2031 case MTHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2032 case MTHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2033 case MTHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2034 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
2035 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
2036 case MTHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2037 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
2038 case MTHK_SIGN_LIST: ShowSignList(); break;
2039 case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2040 default: return ES_NOT_HANDLED;
2041 }
2042 if (cbf != CBF_NONE) _last_started_action = cbf;
2043 return ES_HANDLED;
2044 }
2045
2046 void OnPlaceObject(Point pt, TileIndex tile) override
2047 {
2048 switch (_last_started_action) {
2049 case CBF_PLACE_SIGN:
2050 PlaceProc_Sign(tile);
2051 break;
2052
2053 case CBF_PLACE_LANDINFO:
2054 ShowLandInfo(tile);
2055 break;
2056
2057 default: NOT_REACHED();
2058 }
2059 }
2060
2061 void OnPlaceObjectAbort() override
2062 {
2063 _last_started_action = CBF_NONE;
2064 }
2065
2066 void OnRealtimeTick(uint delta_ms) override
2067 {
2068 if (!this->timer.Elapsed(delta_ms)) return;
2069 this->timer.SetInterval(MILLISECONDS_PER_TICK);
2070
2071 if (this->IsWidgetLowered(WID_TN_PAUSE) != !!_pause_mode) {
2072 this->ToggleWidgetLoweredState(WID_TN_PAUSE);
2073 this->SetWidgetDirty(WID_TN_PAUSE);
2074 }
2075
2076 if (this->IsWidgetLowered(WID_TN_FAST_FORWARD) != (_game_speed != 100)) {
2077 this->ToggleWidgetLoweredState(WID_TN_FAST_FORWARD);
2078 this->SetWidgetDirty(WID_TN_FAST_FORWARD);
2079 }
2080 }
2081
2082 void OnTimeout() override
2083 {
2084 /* We do not want to automatically raise the pause, fast forward and
2085 * switchbar buttons; they have to stay down when pressed etc. */
2086 for (uint i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) {
2087 if (this->IsWidgetLowered(i)) {
2088 this->RaiseWidget(i);
2089 this->SetWidgetDirty(i);
2090 }
2091 }
2092 }
2093
2099 void OnInvalidateData(int data = 0, bool gui_scope = true) override
2100 {
2101 if (!gui_scope) return;
2102 if (FindWindowById(WC_MAIN_WINDOW, 0) != nullptr) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, WID_TN_ZOOM_IN, WID_TN_ZOOM_OUT);
2103 }
2104
2105 static HotkeyList hotkeys;
2106 };
2107
2108 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
2109 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
2110 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
2111 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4, 'M', 0};
2112
2113 static Hotkey maintoolbar_hotkeys[] = {
2114 Hotkey(_maintoolbar_pause_keys, "pause", MTHK_PAUSE),
2115 Hotkey((uint16)0, "fastforward", MTHK_FASTFORWARD),
2116 Hotkey(WKC_F2, "settings", MTHK_SETTINGS),
2117 Hotkey(WKC_F3, "saveload", MTHK_SAVEGAME),
2118 Hotkey((uint16)0, "load_game", MTHK_LOADGAME),
2119 Hotkey(_maintoolbar_smallmap_keys, "smallmap", MTHK_SMALLMAP),
2120 Hotkey(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
2121 Hotkey(WKC_F6, "subsidies", MTHK_SUBSIDIES),
2122 Hotkey(WKC_F7, "station_list", MTHK_STATIONS),
2123 Hotkey(WKC_F8, "finances", MTHK_FINANCES),
2124 Hotkey(WKC_F9, "companies", MTHK_COMPANIES),
2125 Hotkey((uint16)0, "story_book", MTHK_STORY),
2126 Hotkey((uint16)0, "goal_list", MTHK_GOAL),
2127 Hotkey(WKC_F10, "graphs", MTHK_GRAPHS),
2128 Hotkey(WKC_F11, "league", MTHK_LEAGUE),
2129 Hotkey(WKC_F12, "industry_list", MTHK_INDUSTRIES),
2130 Hotkey(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
2131 Hotkey(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
2132 Hotkey(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
2133 Hotkey(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
2134 Hotkey(_maintoolbar_zoomin_keys, "zoomin", MTHK_ZOOM_IN),
2135 Hotkey(_maintoolbar_zoomout_keys, "zoomout", MTHK_ZOOM_OUT),
2136 Hotkey(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
2137 Hotkey(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
2138 Hotkey((uint16)0, "build_tram", MTHK_BUILD_TRAM),
2139 Hotkey(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
2140 Hotkey(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
2141 Hotkey(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
2142 Hotkey(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
2143 Hotkey((uint16)0, "ai_debug", MTHK_AI_DEBUG),
2144 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
2145 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2146 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2147 Hotkey((uint16)0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
2148 Hotkey(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
2149 Hotkey('L', "terraform", MTHK_TERRAFORM),
2150 Hotkey('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
2151 Hotkey((uint16)0, "client_list", MTHK_CLIENT_LIST),
2152 Hotkey((uint16)0, "sign_list", MTHK_SIGN_LIST),
2153 Hotkey((uint16)0, "land_info", MTHK_LANDINFO),
2154 HOTKEY_LIST_END
2155 };
2156 HotkeyList MainToolbarWindow::hotkeys("maintoolbar", maintoolbar_hotkeys);
2157
2158 static NWidgetBase *MakeMainToolbar(int *biggest_index)
2159 {
2161 static const SpriteID toolbar_button_sprites[] = {
2162 SPR_IMG_PAUSE, // WID_TN_PAUSE
2163 SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD
2164 SPR_IMG_SETTINGS, // WID_TN_SETTINGS
2165 SPR_IMG_SAVE, // WID_TN_SAVE
2166 SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP
2167 SPR_IMG_TOWN, // WID_TN_TOWNS
2168 SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES
2169 SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS
2170 SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES
2171 SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES
2172 SPR_IMG_STORY_BOOK, // WID_TN_STORY
2173 SPR_IMG_GOAL, // WID_TN_GOAL
2174 SPR_IMG_GRAPHS, // WID_TN_GRAPHS
2175 SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE
2176 SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES
2177 SPR_IMG_TRAINLIST, // WID_TN_TRAINS
2178 SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS
2179 SPR_IMG_SHIPLIST, // WID_TN_SHIPS
2180 SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT
2181 SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN
2182 SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT
2183 SPR_IMG_BUILDRAIL, // WID_TN_RAILS
2184 SPR_IMG_BUILDROAD, // WID_TN_ROADS
2185 SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS
2186 SPR_IMG_BUILDWATER, // WID_TN_WATER
2187 SPR_IMG_BUILDAIR, // WID_TN_AIR
2188 SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
2189 SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND
2190 SPR_IMG_MESSAGES, // WID_TN_MESSAGES
2191 SPR_IMG_QUERY, // WID_TN_HELP
2192 SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR
2193 };
2194
2195 NWidgetMainToolbarContainer *hor = new NWidgetMainToolbarContainer();
2196 for (uint i = 0; i < WID_TN_END; i++) {
2197 switch (i) {
2198 case WID_TN_SMALL_MAP:
2199 case WID_TN_FINANCES:
2200 case WID_TN_VEHICLE_START:
2201 case WID_TN_ZOOM_IN:
2202 case WID_TN_BUILDING_TOOLS_START:
2203 case WID_TN_MUSIC_SOUND:
2204 hor->Add(new NWidgetSpacer(0, 0));
2205 break;
2206 }
2207 NWidgetLeaf *leaf = new NWidgetLeaf(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i);
2208 leaf->SetMinimalSize(20, 20);
2209 hor->Add(leaf);
2210 }
2211
2212 *biggest_index = std::max<int>(*biggest_index, WID_TN_SWITCH_BAR);
2213 return hor;
2214 }
2215
2216 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
2217 NWidgetFunction(MakeMainToolbar),
2218 };
2219
2220 static WindowDesc _toolb_normal_desc(
2221 WDP_MANUAL, nullptr, 0, 0,
2222 WC_MAIN_TOOLBAR, WC_NONE,
2223 WDF_NO_FOCUS,
2224 _nested_toolbar_normal_widgets, lengthof(_nested_toolbar_normal_widgets),
2225 &MainToolbarWindow::hotkeys
2226 );
2227
2228
2229 /* --- Toolbar handling for the scenario editor */
2230
2231 static MenuClickedProc * const _scen_toolbar_dropdown_procs[] = {
2232 nullptr, // 0
2233 nullptr, // 1
2234 MenuClickSettings, // 2
2235 MenuClickSaveLoad, // 3
2236 nullptr, // 4
2237 nullptr, // 5
2238 nullptr, // 6
2239 nullptr, // 7
2240 MenuClickMap, // 8
2241 nullptr, // 9
2242 nullptr, // 10
2243 nullptr, // 11
2244 nullptr, // 12
2245 nullptr, // 13
2246 ToolbarScenBuildRoad, // 14
2247 ToolbarScenBuildTram, // 15
2248 nullptr, // 16
2249 nullptr, // 17
2250 nullptr, // 18
2251 nullptr, // 19
2252 MenuClickMusicWindow, // 20
2253 MenuClickHelp, // 21
2254 nullptr, // 22
2255 };
2256
2257 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
2258 ToolbarPauseClick,
2259 ToolbarFastForwardClick,
2260 ToolbarOptionsClick,
2261 ToolbarScenSaveOrLoad,
2262 ToolbarBtn_NULL,
2263 ToolbarScenDatePanel,
2264 ToolbarScenDateBackward,
2265 ToolbarScenDateForward,
2266 ToolbarScenMapTownDir,
2267 ToolbarZoomInClick,
2268 ToolbarZoomOutClick,
2269 ToolbarScenGenLand,
2270 ToolbarScenGenTown,
2271 ToolbarScenGenIndustry,
2272 ToolbarScenBuildRoadClick,
2273 ToolbarScenBuildTramClick,
2274 ToolbarScenBuildDocks,
2275 ToolbarScenPlantTrees,
2276 ToolbarScenPlaceSign,
2277 ToolbarBtn_NULL,
2278 ToolbarMusicClick,
2279 ToolbarHelpClick,
2280 ToolbarSwitchClick,
2281 };
2282
2283 enum MainToolbarEditorHotkeys {
2284 MTEHK_PAUSE,
2285 MTEHK_FASTFORWARD,
2286 MTEHK_SETTINGS,
2287 MTEHK_SAVEGAME,
2288 MTEHK_GENLAND,
2289 MTEHK_GENTOWN,
2290 MTEHK_GENINDUSTRY,
2291 MTEHK_BUILD_ROAD,
2292 MTEHK_BUILD_TRAM,
2293 MTEHK_BUILD_DOCKS,
2294 MTEHK_BUILD_TREES,
2295 MTEHK_SIGN,
2296 MTEHK_MUSIC,
2297 MTEHK_LANDINFO,
2298 MTEHK_SMALL_SCREENSHOT,
2299 MTEHK_ZOOMEDIN_SCREENSHOT,
2300 MTEHK_DEFAULTZOOM_SCREENSHOT,
2301 MTEHK_GIANT_SCREENSHOT,
2302 MTEHK_ZOOM_IN,
2303 MTEHK_ZOOM_OUT,
2304 MTEHK_TERRAFORM,
2305 MTEHK_SMALLMAP,
2306 MTEHK_EXTRA_VIEWPORT,
2307 };
2308
2309 struct ScenarioEditorToolbarWindow : Window {
2310 GUITimer timer;
2311
2312 ScenarioEditorToolbarWindow(WindowDesc *desc) : Window(desc)
2313 {
2314 this->InitNested(0);
2315
2316 _last_started_action = CBF_NONE;
2317 CLRBITS(this->flags, WF_WHITE_BORDER);
2318 PositionMainToolbar(this);
2319 DoZoomInOutWindow(ZOOM_NONE, this);
2320
2321 this->timer.SetInterval(MILLISECONDS_PER_TICK);
2322 }
2323
2324 void FindWindowPlacementAndResize(int def_width, int def_height) override
2325 {
2326 Window::FindWindowPlacementAndResize(_toolbar_width, def_height);
2327 }
2328
2329 void OnPaint() override
2330 {
2331 this->SetWidgetDisabledState(WID_TE_DATE_BACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
2332 this->SetWidgetDisabledState(WID_TE_DATE_FORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
2333 this->SetWidgetDisabledState(WID_TE_ROADS, (GetRoadTypes(true) & ~_roadtypes_type) == ROADTYPES_NONE);
2334 this->SetWidgetDisabledState(WID_TE_TRAMS, (GetRoadTypes(true) & _roadtypes_type) == ROADTYPES_NONE);
2335
2336 this->DrawWidgets();
2337 }
2338
2339 void DrawWidget(const Rect &r, int widget) const override
2340 {
2341 switch (widget) {
2342 case WID_TE_DATE:
2343 SetDParam(0, ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
2344 DrawString(r.left, r.right, (this->height - FONT_HEIGHT_NORMAL) / 2, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER);
2345 break;
2346
2347 case WID_TE_SPACER: {
2348 int height = r.bottom - r.top;
2349 if (height > 2 * FONT_HEIGHT_NORMAL) {
2350 DrawString(r.left, r.right, (height + 1) / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
2351 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2352 } else {
2353 DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
2354 }
2355 break;
2356 }
2357 }
2358 }
2359
2360 void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
2361 {
2362 switch (widget) {
2363 case WID_TE_SPACER:
2364 size->width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
2365 break;
2366
2367 case WID_TE_DATE:
2368 SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1));
2369 *size = GetStringBoundingBox(STR_WHITE_DATE_LONG);
2370 size->height = std::max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
2371 break;
2372 }
2373 }
2374
2375 void OnClick(Point pt, int widget, int click_count) override
2376 {
2377 if (_game_mode == GM_MENU) return;
2378 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
2379 if (cbf != CBF_NONE) _last_started_action = cbf;
2380 }
2381
2382 void OnDropdownSelect(int widget, int index) override
2383 {
2384 CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
2385 if (cbf != CBF_NONE) _last_started_action = cbf;
2386 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
2387 }
2388
2389 EventState OnHotkey(int hotkey) override
2390 {
2391 CallBackFunction cbf = CBF_NONE;
2392 switch (hotkey) {
2393 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
2394 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
2395 case MTEHK_SETTINGS: ShowGameOptions(); break;
2396 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
2397 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
2398 case MTEHK_GENTOWN: ToolbarScenGenTown(this); break;
2399 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
2400 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoadClick(this); break;
2401 case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
2402 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
2403 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
2404 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
2405 case MTEHK_MUSIC: ShowMusicWindow(); break;
2406 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
2407 case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
2408 case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
2409 case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
2410 case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); break;
2411 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
2412 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
2413 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
2414 case MTEHK_SMALLMAP: ShowSmallMap(); break;
2415 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewportWindowForTileUnderCursor(); break;
2416 default: return ES_NOT_HANDLED;
2417 }
2418 if (cbf != CBF_NONE) _last_started_action = cbf;
2419 return ES_HANDLED;
2420 }
2421
2422 void OnPlaceObject(Point pt, TileIndex tile) override
2423 {
2424 switch (_last_started_action) {
2425 case CBF_PLACE_SIGN:
2426 PlaceProc_Sign(tile);
2427 break;
2428
2429 case CBF_PLACE_LANDINFO:
2430 ShowLandInfo(tile);
2431 break;
2432
2433 default: NOT_REACHED();
2434 }
2435 }
2436
2437 void OnPlaceObjectAbort() override
2438 {
2439 _last_started_action = CBF_NONE;
2440 }
2441
2442 void OnTimeout() override
2443 {
2444 this->SetWidgetsLoweredState(false, WID_TE_DATE_BACKWARD, WID_TE_DATE_FORWARD, WIDGET_LIST_END);
2445 this->SetWidgetDirty(WID_TE_DATE_BACKWARD);
2446 this->SetWidgetDirty(WID_TE_DATE_FORWARD);
2447 }
2448
2449 void OnRealtimeTick(uint delta_ms) override
2450 {
2451 if (!this->timer.Elapsed(delta_ms)) return;
2452 this->timer.SetInterval(MILLISECONDS_PER_TICK);
2453
2454 if (this->IsWidgetLowered(WID_TE_PAUSE) != !!_pause_mode) {
2455 this->ToggleWidgetLoweredState(WID_TE_PAUSE);
2456 this->SetDirty();
2457 }
2458
2459 if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
2460 this->ToggleWidgetLoweredState(WID_TE_FAST_FORWARD);
2461 this->SetDirty();
2462 }
2463 }
2464
2470 void OnInvalidateData(int data = 0, bool gui_scope = true) override
2471 {
2472 if (!gui_scope) return;
2473 if (FindWindowById(WC_MAIN_WINDOW, 0) != nullptr) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, WID_TE_ZOOM_IN, WID_TE_ZOOM_OUT);
2474 }
2475
2476 void OnQueryTextFinished(char *str) override
2477 {
2478 /* Was 'cancel' pressed? */
2479 if (str == nullptr) return;
2480
2481 int32 value;
2482 if (!StrEmpty(str)) {
2483 value = atoi(str);
2484 } else {
2485 /* An empty string means revert to the default */
2486 value = DEF_START_YEAR;
2487 }
2488 SetStartingYear(value);
2489
2490 this->SetDirty();
2491 }
2492
2493 static HotkeyList hotkeys;
2494 };
2495
2496 static Hotkey scenedit_maintoolbar_hotkeys[] = {
2497 Hotkey(_maintoolbar_pause_keys, "pause", MTEHK_PAUSE),
2498 Hotkey((uint16)0, "fastforward", MTEHK_FASTFORWARD),
2499 Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
2500 Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
2501 Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
2502 Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
2503 Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
2504 Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
2505 Hotkey((uint16)0, "build_tram", MTEHK_BUILD_TRAM),
2506 Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
2507 Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
2508 Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
2509 Hotkey(WKC_F11, "music", MTEHK_MUSIC),
2510 Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
2511 Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
2512 Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2513 Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2514 Hotkey((uint16)0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2515 Hotkey(_maintoolbar_zoomin_keys, "zoomin", MTEHK_ZOOM_IN),
2516 Hotkey(_maintoolbar_zoomout_keys, "zoomout", MTEHK_ZOOM_OUT),
2517 Hotkey('L', "terraform", MTEHK_TERRAFORM),
2518 Hotkey('M', "smallmap", MTEHK_SMALLMAP),
2519 Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
2520 HOTKEY_LIST_END
2521 };
2522 HotkeyList ScenarioEditorToolbarWindow::hotkeys("scenedit_maintoolbar", scenedit_maintoolbar_hotkeys);
2523
2524 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2525 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
2526 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
2527 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
2528 NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
2529 NWidget(NWID_SPACER),
2530 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
2531 NWidget(NWID_SPACER),
2532 NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
2533 NWidget(NWID_HORIZONTAL), SetPIP(3, 2, 3),
2534 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD),
2535 NWidget(WWT_EMPTY, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_NULL, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE),
2536 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD),
2537 EndContainer(),
2538 EndContainer(),
2539 NWidget(NWID_SPACER),
2540 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SMALL_MAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
2541 NWidget(NWID_SPACER),
2542 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_IN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
2543 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
2544 NWidget(NWID_SPACER),
2545 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
2546 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
2547 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
2548 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
2549 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetDataTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION),
2550 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_WATER), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
2551 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
2552 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_SIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
2553 NWidget(NWID_SPACER),
2554 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_MUSIC_SOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
2555 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
2556 NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SWITCH_BAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
2557 };
2558
2559 static NWidgetBase *MakeScenarioToolbar(int *biggest_index)
2560 {
2561 return MakeNWidgets(_nested_toolb_scen_inner_widgets, lengthof(_nested_toolb_scen_inner_widgets), biggest_index, new NWidgetScenarioToolbarContainer());
2562 }
2563
2564 static const NWidgetPart _nested_toolb_scen_widgets[] = {
2565 NWidgetFunction(MakeScenarioToolbar),
2566 };
2567
2568 static WindowDesc _toolb_scen_desc(
2569 WDP_MANUAL, nullptr, 0, 0,
2570 WC_MAIN_TOOLBAR, WC_NONE,
2571 WDF_NO_FOCUS,
2572 _nested_toolb_scen_widgets, lengthof(_nested_toolb_scen_widgets),
2573 &ScenarioEditorToolbarWindow::hotkeys
2574 );
2575
2577 void AllocateToolbar()
2578 {
2579 /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
2580 _last_built_roadtype = ROADTYPE_ROAD;
2581 _last_built_tramtype = ROADTYPE_TRAM;
2582
2583 if (_game_mode == GM_EDITOR) {
2584 new ScenarioEditorToolbarWindow(&_toolb_scen_desc);
2585 } else {
2586 new MainToolbarWindow(&_toolb_normal_desc);
2587 }
2588 }
VEH_AIRCRAFT
@ VEH_AIRCRAFT
Aircraft vehicle type.
Definition: vehicle_type.h:27
SaveLoadEditorMenuEntries
SaveLoadEditorMenuEntries
SaveLoad entries in scenario editor mode.
Definition: toolbar_gui.cpp:376
WID_TE_LAND_GENERATE
@ WID_TE_LAND_GENERATE
Land generation.
Definition: toolbar_widget.h:64
DO_SHOW_COMPETITOR_SIGNS
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
Definition: openttd.h:51
ShowNewGRFSettings
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config)
Setup the NewGRF gui.
Definition: newgrf_gui.cpp:1995
game.hpp
ES_HANDLED
@ ES_HANDLED
The passed event is handled.
Definition: window_type.h:718
MenuClickFinances
static CallBackFunction MenuClickFinances(int index)
Handle click on the entry in the finances overview menu.
Definition: toolbar_gui.cpp:583
ShowSpriteAlignerWindow
void ShowSpriteAlignerWindow()
Show the window for aligning sprites.
Definition: newgrf_debug_gui.cpp:1101
ShowIndustryCargoesWindow
void ShowIndustryCargoesWindow()
Open the industry and cargoes window with an industry.
Definition: industry_gui.cpp:3170
ScenarioEditorToolbarWindow::OnDropdownSelect
void OnDropdownSelect(int widget, int index) override
A dropdown option associated to this window has been selected.
Definition: toolbar_gui.cpp:2382
PopupMainToolbMenu
static void PopupMainToolbMenu(Window *w, int widget, DropDownList &&list, int def)
Pop up a generic text only menu.
Definition: toolbar_gui.cpp:183
TileIndex
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:83
WID_TN_BUILDING_TOOLS_START
@ WID_TN_BUILDING_TOOLS_START
Helper for the offset of the building tools.
Definition: toolbar_widget.h:37
WID_TN_SAVE
@ WID_TN_SAVE
Save menu.
Definition: toolbar_widget.h:18
sound_func.h
_last_started_action
static CallBackFunction _last_started_action
Last started user action.
Definition: toolbar_gui.cpp:83
WID_TN_COMPANIES
@ WID_TN_COMPANIES
Company menu.
Definition: toolbar_widget.h:24
WID_TN_FINANCES
@ WID_TN_FINANCES
Finance menu.
Definition: toolbar_widget.h:23
WWT_IMGBTN_2
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition: widget_type.h:51
NWidgetFunction
static NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
Definition: widget_type.h:1239
FT_SCENARIO
@ FT_SCENARIO
old or new scenario
Definition: fileio_type.h:19
MenuClickTown
static CallBackFunction MenuClickTown(int index)
Handle click on one of the entries in the Town menu.
Definition: toolbar_gui.cpp:516
DropDownListItem::result
int result
Result code to return to window on selection.
Definition: dropdown_type.h:24
vehicle_gui.h
WID_TN_ROADS
@ WID_TN_ROADS
Road building menu.
Definition: toolbar_widget.h:39
TO_HOUSES
@ TO_HOUSES
town buildings
Definition: transparency.h:25
Window::timeout_timer
uint8 timeout_timer
Timer value of the WF_TIMEOUT for flags.
Definition: window_gui.h:309
WID_TN_WATER
@ WID_TN_WATER
Water building toolbar.
Definition: toolbar_widget.h:41
ShowGoalsList
void ShowGoalsList(CompanyID company)
Open a goal list window.
Definition: goal_gui.cpp:320
GetRailTypeDropDownList
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:2220
ShowExtraViewportWindow
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
Definition: viewport_gui.cpp:168
HotkeyList
List of hotkeys for a window.
Definition: hotkeys.h:40
GUISettings::newgrf_developer_tools
bool newgrf_developer_tools
activate NewGRF developer tools and allow modifying NewGRFs in an existing game
Definition: settings_type.h:188
MenuClickIndustry
static CallBackFunction MenuClickIndustry(int index)
Handle click on the entry in the Industry menu.
Definition: toolbar_gui.cpp:734
LinkGraphSchedule::ShiftDates
void ShiftDates(int interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
Definition: linkgraphschedule.cpp:134
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition: geometry_type.hpp:27
ZOOM_OUT
@ ZOOM_OUT
Zoom out (get helicopter view).
Definition: viewport_type.h:82
command_func.h
MenuClickGraphs
static CallBackFunction MenuClickGraphs(int index)
Handle click on the entry in the Graphs menu.
Definition: toolbar_gui.cpp:679
PositionMainToolbar
int PositionMainToolbar(Window *w)
(Re)position main toolbar window at the screen.
Definition: window.cpp:3398
ShowBuildAirToolbar
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
Definition: airport_gui.cpp:217
WID_TE_ROADS
@ WID_TE_ROADS
Road building menu.
Definition: toolbar_widget.h:67
PC_DARK_RED
static const uint8 PC_DARK_RED
Dark red palette colour.
Definition: gfx_func.h:198
toolbar_gui.h
smallmap_gui.h
ShowStoryBook
void ShowStoryBook(CompanyID company, uint16 page_id=INVALID_STORY_PAGE)
Raise or create the story book window for company, at page page_id.
Definition: story_gui.cpp:1062
guitimer_func.h
Window::ReInit
void ReInit(int rx=0, int ry=0)
Re-initialize a window, and optionally change its size.
Definition: window.cpp:1004
IsTransparencySet
static 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
NWidgetContainer::Add
void Add(NWidgetBase *wid)
Append widget wid to container.
Definition: widget.cpp:1047
WID_TE_SAVE
@ WID_TE_SAVE
Save menu.
Definition: toolbar_widget.h:56
ToolbarFastForwardClick
static CallBackFunction ToolbarFastForwardClick(Window *w)
Toggle fast forward mode.
Definition: toolbar_gui.cpp:280
NWidgetToolbarContainer::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Definition: toolbar_gui.cpp:1445
signs_func.h
WID_TN_AIR
@ WID_TN_AIR
Airport building toolbar.
Definition: toolbar_widget.h:42
company_gui.h
TF_FORBIDDEN
@ TF_FORBIDDEN
Forbidden.
Definition: town_type.h:94
NetworkClientRequestMove
void NetworkClientRequestMove(CompanyID company_id, const std::string &pass)
Notify the server of this client wanting to be moved to another company.
Definition: network_client.cpp:1187
WID_TN_STORY
@ WID_TN_STORY
Story menu.
Definition: toolbar_widget.h:25
WWT_IMGBTN
@ WWT_IMGBTN
(Toggle) Button with image
Definition: widget_type.h:50
Window::viewport
ViewportData * viewport
Pointer to viewport data, if present.
Definition: window_gui.h:321
_network_server
bool _network_server
network-server is active
Definition: network.cpp:58
NWidgetToolbarContainer::Draw
void Draw(const Window *w) override
Definition: toolbar_gui.cpp:1430
DropDownList
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Definition: dropdown_type.h:99
WID_TE_ZOOM_IN
@ WID_TE_ZOOM_IN
Zoom in the main viewport.
Definition: toolbar_widget.h:62
LinkGraphSchedule::instance
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
Definition: linkgraphschedule.h:52
ToolbarSaveClick
static CallBackFunction ToolbarSaveClick(Window *w)
Handle click on Save button in toolbar in normal game mode.
Definition: toolbar_gui.cpp:403
MainToolbarWindow::OnRealtimeTick
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Definition: toolbar_gui.cpp:2066
WID_TE_WATER
@ WID_TE_WATER
Water building toolbar.
Definition: toolbar_widget.h:69
NWID_HORIZONTAL
@ NWID_HORIZONTAL
Horizontal container.
Definition: widget_type.h:73
WID_TE_PAUSE
@ WID_TE_PAUSE
Pause the game.
Definition: toolbar_widget.h:53
WID_TE_DATE
@ WID_TE_DATE
The date of the scenario.
Definition: toolbar_widget.h:58
ZOOM_NONE
@ ZOOM_NONE
Hack, used to update the button status.
Definition: viewport_type.h:83
WID_TN_STATIONS
@ WID_TN_STATIONS
Station menu.
Definition: toolbar_widget.h:22
SetDate
void SetDate(Date date, DateFract fract)
Set the date.
Definition: date.cpp:37
FindWindowById
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition: window.cpp:1146
HasBit
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Definition: bitmath_func.hpp:103
ai_gui.hpp
NWidgetSpacer
Spacer widget.
Definition: widget_type.h:568
WC_SIGN_LIST
@ WC_SIGN_LIST
Sign list; Window numbers:
Definition: window_type.h:270
ClrBit
static T ClrBit(T &x, const uint8 y)
Clears a bit in a variable.
Definition: bitmath_func.hpp:151
NetworkServerDoMove
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
Definition: network_server.cpp:1912
WID_TN_GOAL
@ WID_TN_GOAL
Goal menu.
Definition: toolbar_widget.h:26
WDF_NO_FOCUS
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
Definition: window_gui.h:212
ToolbarScenSaveOrLoad
static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
Handle click on SaveLoad button in toolbar in the scenario editor.
Definition: toolbar_gui.cpp:415
NWidgetScenarioToolbarContainer::SetupSmallestSize
void SetupSmallestSize(Window *w, bool init_array) override
Definition: toolbar_gui.cpp:1796
FILLRECT_CHECKER
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition: gfx_type.h:288
SND_15_BEEP
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition: sound_type.h:58
WID_TE_ZOOM_OUT
@ WID_TE_ZOOM_OUT
Zoom out the main viewport.
Definition: toolbar_widget.h:63
Year
int32 Year
Type for the year, note: 0 based, i.e. starts at the year 0.
Definition: date_type.h:18
ShowMessageHistory
void ShowMessageHistory()
Display window with news messages history.
Definition: news_gui.cpp:1256
TextColour
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition: gfx_type.h:250
vehicle_base.h
DoZoomInOutWindow
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
Definition: main_gui.cpp:91
screenshot_gui.h
ShowGameOptions
void ShowGameOptions()
Open the game options window.
Definition: settings_gui.cpp:748
NWidgetLeaf
Leaf widget.
Definition: widget_type.h:815
WID_TN_PAUSE
@ WID_TN_PAUSE
Pause the game.
Definition: toolbar_widget.h:15
ShowLandInfo
void ShowLandInfo(TileIndex tile)
Show land information window.
Definition: misc_gui.cpp:377
goal_base.h
DropDownListItem
Base list item class from which others are derived.
Definition: dropdown_type.h:22
ShowGameSettings
void ShowGameSettings()
Open advanced settings window.
Definition: settings_gui.cpp:2487
_settings_client
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:52
DrawString
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition: gfx.cpp:643
SC_ZOOMEDIN
@ SC_ZOOMEDIN
Fully zoomed in screenshot of the visible area.
Definition: screenshot.h:21
ShowBuildRailToolbar
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition: rail_gui.cpp:866
WWT_EMPTY
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget array.
Definition: widget_type.h:46
CallBackFunction
CallBackFunction
Callback functions.
Definition: toolbar_gui.cpp:77
newgrf_debug.h
network_gui.h
MainToolbarWindow::OnHotkey
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
Definition: toolbar_gui.cpp:1996
NWidgetScenarioToolbarContainer
Container for the scenario editor's toolbar.
Definition: toolbar_gui.cpp:1793
_display_opt
byte _display_opt
What do we want to draw/do?
Definition: transparency_gui.cpp:26
ScenarioEditorToolbarWindow::OnHotkey
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
Definition: toolbar_gui.cpp:2389
VEH_ROAD
@ VEH_ROAD
Road vehicle type.
Definition: vehicle_type.h:25
Vehicle
Vehicle data structure.
Definition: vehicle_base.h:221
WID_TE_DATE_FORWARD
@ WID_TE_DATE_FORWARD
Increase the date of the scenario.
Definition: toolbar_widget.h:60
WID_TN_END
@ WID_TN_END
Helper for knowing the amount of widgets.
Definition: toolbar_widget.h:48
Window::HandleButtonClick
void HandleButtonClick(byte widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition: window.cpp:646
ROADTYPE_ROAD
@ ROADTYPE_ROAD
Basic road type.
Definition: road_type.h:24
MenuClickMap
static CallBackFunction MenuClickMap(int index)
Handle click on one of the entries in the Map menu.
Definition: toolbar_gui.cpp:489
fios.h
Owner
Owner
Enum for all companies/owners.
Definition: company_type.h:18
NWidgetBase::smallest_y
uint smallest_y
Smallest vertical size of the widget in a filled window.
Definition: widget_type.h:184
MakeNWidgets
NWidgetContainer * MakeNWidgets(const NWidgetPart *parts, int count, int *biggest_index, NWidgetContainer *container)
Construct a nested widget tree from an array of parts.
Definition: widget.cpp:3015
MenuClickBuildTram
static CallBackFunction MenuClickBuildTram(int index)
Handle click on the entry in the Build Tram menu.
Definition: toolbar_gui.cpp:916
Window::Window
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition: window.cpp:1799
SetDParam
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:196
NWidgetPart
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:971
ShowExtraViewportWindowForTileUnderCursor
void ShowExtraViewportWindowForTileUnderCursor()
Show a new Extra Viewport window.
Definition: viewport_gui.cpp:183
WID_TE_TOWN_GENERATE
@ WID_TE_TOWN_GENERATE
Town building window.
Definition: toolbar_widget.h:65
SetDataTip
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1107
WID_TE_DATE_PANEL
@ WID_TE_DATE_PANEL
Container for the date widgets.
Definition: toolbar_widget.h:72
toolbar_widget.h
WD_IMGBTN_BOTTOM
@ WD_IMGBTN_BOTTOM
Bottom offset of image in the button.
Definition: window_gui.h:43
GetStringBoundingBox
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:889
DropDownListCompanyItem
Drop down list entry for showing a company entry, with companies 'blob'.
Definition: toolbar_gui.cpp:117
WID_TN_ZOOM_OUT
@ WID_TN_ZOOM_OUT
Zoom out the main viewport.
Definition: toolbar_widget.h:36
textbuf_gui.h
GameSettings::game_creation
GameCreationSettings game_creation
settings used during the creation of a game (map)
Definition: settings_type.h:577
WID_TN_TRAMS
@ WID_TN_TRAMS
Tram building menu.
Definition: toolbar_widget.h:40
OptionMenuEntries
OptionMenuEntries
Game Option button menu entries.
Definition: toolbar_gui.cpp:291
MainToolbarWindow::OnTimeout
void OnTimeout() override
Called when this window's timeout has been reached.
Definition: toolbar_gui.cpp:2082
screenshot.h
PM_UNPAUSED
@ PM_UNPAUSED
A normal unpaused game.
Definition: openttd.h:61
SpriteID
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition: gfx_type.h:17
NWidgetBase::Draw
virtual void Draw(const Window *w)=0
NWidgetBase::prev
NWidgetBase * prev
Pointer to previous widget in container. Managed by parent container widget.
Definition: widget_type.h:193
WindowDesc
High level window description.
Definition: window_gui.h:168
WID_TN_LEAGUE
@ WID_TN_LEAGUE
Company league menu.
Definition: toolbar_widget.h:28
COMPANY_FIRST
@ COMPANY_FIRST
First company, same as owner.
Definition: company_type.h:22
CTMN_SPECTATE
static const int CTMN_SPECTATE
Become spectator.
Definition: toolbar_gui.cpp:207
MainToolbarWindow::OnPlaceObject
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Definition: toolbar_gui.cpp:2046
window_gui.h
DO_FULL_ANIMATION
@ DO_FULL_ANIMATION
Perform palette animation.
Definition: openttd.h:48
ShowCompanyFinances
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
Definition: company_gui.cpp:477
ZOOM_IN
@ ZOOM_IN
Zoom in (get more detailed view).
Definition: viewport_type.h:81
WID_TE_SPACER
@ WID_TE_SPACER
Spacer with "scenario editor" text.
Definition: toolbar_widget.h:57
ScenarioEditorToolbarWindow::UpdateWidgetSize
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
Definition: toolbar_gui.cpp:2360
ScenarioEditorToolbarWindow::FindWindowPlacementAndResize
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
Definition: toolbar_gui.cpp:2324
WID_TN_MUSIC_SOUND
@ WID_TN_MUSIC_SOUND
Music/sound configuration menu.
Definition: toolbar_widget.h:44
ScenarioEditorToolbarWindow::OnPlaceObjectAbort
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition: toolbar_gui.cpp:2437
WID_TN_HELP
@ WID_TN_HELP
Help menu.
Definition: toolbar_widget.h:46
GUITimer
Definition: guitimer_func.h:13
_roadtypes_type
RoadTypes _roadtypes_type
Bitmap of road/tram types.
Definition: road_cmd.cpp:57
NWidgetToolbarContainer::GetButtonArrangement
virtual const byte * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const =0
Get the arrangement of the buttons for the toolbar.
WID_TN_SHIPS
@ WID_TN_SHIPS
Ship menu.
Definition: toolbar_widget.h:33
SLO_LOAD
@ SLO_LOAD
File is being loaded.
Definition: fileio_type.h:49
ShowSignList
Window * ShowSignList()
Open the sign list window.
Definition: signs_gui.cpp:402
RailType
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:27
NWidgetScenarioToolbarContainer::GetButtonArrangement
const byte * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Definition: toolbar_gui.cpp:1811
Window::resize
ResizeInfo resize
Resize information.
Definition: window_gui.h:317
WKC_EQUALS
@ WKC_EQUALS
= Equals
Definition: gfx_type.h:97
_date
Date _date
Current date in days (day counter)
Definition: date.cpp:28
SLO_SAVE
@ SLO_SAVE
File is being saved.
Definition: fileio_type.h:50
CTMN_CLIENT_LIST
static const int CTMN_CLIENT_LIST
Enum for the Company Toolbar's network related buttons.
Definition: toolbar_gui.cpp:206
tilehighlight_func.h
ClientSettings::sound
SoundSettings sound
sound effect settings
Definition: settings_type.h:597
ToolbarScenBuildTram
static CallBackFunction ToolbarScenBuildTram(int index)
Handle click on the entry in the Build Tram menu.
Definition: toolbar_gui.cpp:1243
DoCommandP
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
Definition: command.cpp:541
NWidgetContainer::tail
NWidgetBase * tail
Pointer to last widget in container.
Definition: widget_type.h:416
Window::InitNested
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1789
CMD_PAUSE
@ CMD_PAUSE
pause the game
Definition: command_type.h:256
NWidgetBase::type
WidgetType type
Type of the widget / nested widget.
Definition: widget_type.h:175
WID_TE_DATE_BACKWARD
@ WID_TE_DATE_BACKWARD
Reduce the date of the scenario.
Definition: toolbar_widget.h:59
MIN_YEAR
static const Year MIN_YEAR
The absolute minimum & maximum years in OTTD.
Definition: date_type.h:84
Window::height
int height
Height of the window (number of pixels down in y direction)
Definition: window_gui.h:315
_toolbar_width
uint _toolbar_width
Width of the toolbar, shared by statusbar.
Definition: toolbar_gui.cpp:63
WF_WHITE_BORDER
@ WF_WHITE_BORDER
Window white border counter bit mask.
Definition: window_gui.h:242
ShowCompanyStations
void ShowCompanyStations(CompanyID company)
Opens window with list of company's stations.
Definition: station_gui.cpp:784
SaveLoadNormalMenuEntries
SaveLoadNormalMenuEntries
SaveLoad entries in normal game mode.
Definition: toolbar_gui.cpp:389
Window::SetDirty
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:993
highscore.h
NWidgetBase::smallest_x
uint smallest_x
Smallest horizontal size of the widget in a filled window.
Definition: widget_type.h:183
WD_FRAMERECT_LEFT
@ WD_FRAMERECT_LEFT
Offset at left to draw the frame rectangular area.
Definition: window_gui.h:62
WID_TN_SETTINGS
@ WID_TN_SETTINGS
Settings menu.
Definition: toolbar_widget.h:17
NWidgetBase::AssignSizePosition
virtual void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)=0
ConvertYMDToDate
Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
Definition: date.cpp:149
IsInsideBS
static bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
Definition: math_func.hpp:188
WID_TN_LANDSCAPE
@ WID_TN_LANDSCAPE
Landscaping toolbar.
Definition: toolbar_widget.h:43
ROADTYPE_TRAM
@ ROADTYPE_TRAM
Trams.
Definition: road_type.h:25
WD_FRAMERECT_RIGHT
@ WD_FRAMERECT_RIGHT
Offset at right to draw the frame rectangular area.
Definition: window_gui.h:63
ES_NOT_HANDLED
@ ES_NOT_HANDLED
The passed event is not handled.
Definition: window_type.h:719
MenuClickShowShips
static CallBackFunction MenuClickShowShips(int index)
Handle click on the entry in the Ships menu.
Definition: toolbar_gui.cpp:809
NWidgetBase
Baseclass for nested widgets.
Definition: widget_type.h:126
AllocateToolbar
void AllocateToolbar()
Allocate the toolbar.
Definition: toolbar_gui.cpp:2577
ShowFramerateWindow
void ShowFramerateWindow()
Open the general framerate window.
Definition: framerate_gui.cpp:1007
MenuClickBuildAir
static CallBackFunction MenuClickBuildAir(int index)
Handle click on the entry in the Build Air menu.
Definition: toolbar_gui.cpp:963
ToolbarOptionsClick
static CallBackFunction ToolbarOptionsClick(Window *w)
Handle click on Options button in toolbar.
Definition: toolbar_gui.cpp:314
Date
int32 Date
The type to store our dates in.
Definition: date_type.h:14
ShowDropDownList
void ShowDropDownList(Window *w, DropDownList &&list, int selected, int button, uint width, bool auto_width, bool instant_close)
Show a drop down list.
Definition: dropdown.cpp:443
_pause_mode
PauseMode _pause_mode
The current pause mode.
Definition: gfx.cpp:48
MenuClickShowRoad
static CallBackFunction MenuClickShowRoad(int index)
Handle click on the entry in the Road Vehicles menu.
Definition: toolbar_gui.cpp:789
MenuClickBuildRail
static CallBackFunction MenuClickBuildRail(int index)
Handle click on the entry in the Build Rail menu.
Definition: toolbar_gui.cpp:872
road_gui.h
_settings_game
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:53
linkgraph_gui.h
NWidgetToolbarContainer::IsButton
bool IsButton(WidgetType type) const
Check whether the given widget type is a button for us.
Definition: toolbar_gui.cpp:1329
GameSettings::economy
EconomySettings economy
settings to change the economy
Definition: settings_type.h:586
Window::SetWidgetDisabledState
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition: window_gui.h:386
MAX_COMPANIES
@ MAX_COMPANIES
Maximum number of companies.
Definition: company_type.h:23
_local_company
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition: company_cmd.cpp:46
DropDownListStringItem
Common string list item.
Definition: dropdown_type.h:39
DO_SHOW_STATION_NAMES
@ DO_SHOW_STATION_NAMES
Display station names.
Definition: openttd.h:46
safeguards.h
ShowQueryString
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:1119
Window::flags
WindowFlags flags
Window flags.
Definition: window_gui.h:305
WF_TIMEOUT
@ WF_TIMEOUT
Window timeout counter.
Definition: window_gui.h:234
CLIENT_ID_SERVER
@ CLIENT_ID_SERVER
Servers always have this ID.
Definition: network_type.h:49
MenuClickSubsidies
static CallBackFunction MenuClickSubsidies(int index)
Handle click on the entry in the Subsidies menu.
Definition: toolbar_gui.cpp:541
MenuClickShowAir
static CallBackFunction MenuClickShowAir(int index)
Handle click on the entry in the Aircraft menu.
Definition: toolbar_gui.cpp:829
MenuClickSaveLoad
static CallBackFunction MenuClickSaveLoad(int index=0)
Handle click on one of the entries in the SaveLoad menu.
Definition: toolbar_gui.cpp:427
ToggleDirtyBlocks
void ToggleDirtyBlocks()
Toggle drawing of the dirty blocks.
Definition: toolbar_gui.cpp:1085
StrEmpty
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
Definition: string_func.h:64
TC_NO_SHADE
@ TC_NO_SHADE
Do not add shading to this text colour.
Definition: gfx_type.h:274
_networking
bool _networking
are we in networking mode?
Definition: network.cpp:57
DrawSprite
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition: gfx.cpp:1042
ToolbarScenDatePanel
static CallBackFunction ToolbarScenDatePanel(Window *w)
Called when clicking at the date panel of the scenario editor toolbar.
Definition: toolbar_gui.cpp:1150
road.h
MainToolbarWindow::FindWindowPlacementAndResize
void FindWindowPlacementAndResize(int def_width, int def_height) override
Resize window towards the default size.
Definition: toolbar_gui.cpp:1965
Point
Coordinates of a point in 2D.
Definition: geometry_type.hpp:21
EconomySettings::found_town
TownFounding found_town
town founding.
Definition: settings_type.h:519
WID_TN_SUBSIDIES
@ WID_TN_SUBSIDIES
Subsidy menu.
Definition: toolbar_widget.h:21
CheckBlitter
void CheckBlitter()
Check whether we still use the right blitter, or use another (better) one.
Definition: gfxinit.cpp:334
NWidgetContainer::head
NWidgetBase * head
Pointer to first widget in container.
Definition: widget_type.h:415
NWidgetToolbarContainer::SetupSmallestSize
void SetupSmallestSize(Window *w, bool init_array) override
Definition: toolbar_gui.cpp:1334
date_func.h
ShowCheatWindow
void ShowCheatWindow()
Open cheat window.
Definition: cheat_gui.cpp:418
stdafx.h
ShowSaveLoadDialog
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition: fios_gui.cpp:921
FT_SAVEGAME
@ FT_SAVEGAME
old or new savegame
Definition: fileio_type.h:18
MainToolbarWindow::OnInvalidateData
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition: toolbar_gui.cpp:2099
DO_FULL_DETAIL
@ DO_FULL_DETAIL
Also draw details of track and roads.
Definition: openttd.h:49
RoadType
RoadType
The different roadtypes we support.
Definition: road_type.h:22
VehicleType
VehicleType
Available vehicle types.
Definition: vehicle_type.h:21
GfxFillRect
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:117
ToggleBoundingBoxes
void ToggleBoundingBoxes()
Toggle drawing of sprites' bounding boxes.
Definition: toolbar_gui.cpp:1068
ScenarioEditorToolbarWindow::OnClick
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: toolbar_gui.cpp:2375
MenuClickCompany
static CallBackFunction MenuClickCompany(int index)
Handle click on the entry in the Company menu.
Definition: toolbar_gui.cpp:603
MainToolbarWindow
Main toolbar.
Definition: toolbar_gui.cpp:1948
WID_TN_ROADVEHS
@ WID_TN_ROADVEHS
Road vehicle menu.
Definition: toolbar_widget.h:32
viewport_func.h
NetworkCompanyIsPassworded
bool NetworkCompanyIsPassworded(CompanyID company_id)
Check if the company we want to join requires a password.
Definition: network.cpp:212
NWidgetBase::current_y
uint current_y
Current vertical size (after resizing).
Definition: widget_type.h:187
ToolbarScenBuildRoad
static CallBackFunction ToolbarScenBuildRoad(int index)
Handle click on the entry in the Build Road menu.
Definition: toolbar_gui.cpp:1223
WC_NONE
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:37
SA_HOR_CENTER
@ SA_HOR_CENTER
Horizontally center the text.
Definition: gfx_type.h:329
WID_TE_SETTINGS
@ WID_TE_SETTINGS
Settings menu.
Definition: toolbar_widget.h:55
NWidgetBase::next
NWidgetBase * next
Pointer to next widget in container. Managed by parent container widget.
Definition: widget_type.h:192
WID_TN_AIRCRAFT
@ WID_TN_AIRCRAFT
Aircraft menu.
Definition: toolbar_widget.h:34
WidgetType
WidgetType
Window widget types, nested widget types, and nested widget part types.
Definition: widget_type.h:44
DrawCompanyIcon
void DrawCompanyIcon(CompanyID c, int x, int y)
Draw the icon of a company.
Definition: company_cmd.cpp:143
GetSpriteSize
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition: gfx.cpp:977
ShowHighscoreTable
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8 rank=-1)
Show the highscore table for a given difficulty.
Definition: highscore_gui.cpp:233
WID_TE_SIGNS
@ WID_TE_SIGNS
Sign building.
Definition: toolbar_widget.h:71
MenuClickStory
static CallBackFunction MenuClickStory(int index)
Handle click on the entry in the Story menu.
Definition: toolbar_gui.cpp:639
ScenarioEditorToolbarWindow::OnQueryTextFinished
void OnQueryTextFinished(char *str) override
The query window opened from this window has closed.
Definition: toolbar_gui.cpp:2476
NWidgetMainToolbarContainer
Container for the 'normal' main toolbar.
Definition: toolbar_gui.cpp:1471
rail_gui.h
StringID
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
WWT_PUSHIMGBTN
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
Definition: widget_type.h:105
NWidgetBase::fill_y
uint fill_y
Vertical fill stepsize (from initial size, 0 means not resizable).
Definition: widget_type.h:177
MakeMainToolbar
static NWidgetBase * MakeMainToolbar(int *biggest_index)
Definition: toolbar_gui.cpp:2158
SoundSettings::confirm
bool confirm
Play sound effect on successful constructions or other actions.
Definition: settings_type.h:210
vehicle_func.h
WID_TE_HELP
@ WID_TE_HELP
Help menu.
Definition: toolbar_widget.h:74
EndContainer
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1092
Clamp
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:77
Pool::PoolItem<&_vehicle_pool >::Iterate
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:386
strings_func.h
WID_TE_TREES
@ WID_TE_TREES
Tree building toolbar.
Definition: toolbar_widget.h:70
terraform_gui.h
ScenarioEditorToolbarWindow::OnInvalidateData
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition: toolbar_gui.cpp:2470
MainToolbarWindow::OnPaint
void OnPaint() override
The window must be repainted.
Definition: toolbar_gui.cpp:1970
SC_WORLD
@ SC_WORLD
World screenshot.
Definition: screenshot.h:23
ShowBuildDocksScenToolbar
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition: dock_gui.cpp:399
graph_gui.h
MenuClickHelp
static CallBackFunction MenuClickHelp(int index)
Choose the proper callback function for the main toolbar's help menu.
Definition: toolbar_gui.cpp:1113
PC_VERY_DARK_RED
static const uint8 PC_VERY_DARK_RED
Almost-black red palette colour.
Definition: gfx_func.h:197
NWidgetBase::pos_x
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:189
Pool::PoolItem<&_company_pool >::GetNumItems
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:367
DeleteAllMessages
void DeleteAllMessages()
Delete all messages and close their corresponding window (if any).
Definition: window.cpp:3315
WIDGET_LIST_END
static const int WIDGET_LIST_END
indicate the end of widgets' list for vararg functions
Definition: widget_type.h:20
Window::SetWidgetsLoweredState
void CDECL SetWidgetsLoweredState(bool lowered_stat, int widgets,...)
Sets the lowered/raised status of a list of widgets.
Definition: window.cpp:566
FONT_HEIGHT_NORMAL
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
Definition: gfx_func.h:167
ScenarioEditorToolbarWindow
Definition: toolbar_gui.cpp:2309
NWidget
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1207
ShowTransparencyToolbar
void ShowTransparencyToolbar()
Show the transparency toolbar.
Definition: transparency_gui.cpp:159
COMPANY_SPECTATOR
@ COMPANY_SPECTATOR
The client is spectating.
Definition: company_type.h:35
NWidgetBase::fill_x
uint fill_x
Horizontal fill stepsize (from initial size, 0 means not resizable).
Definition: widget_type.h:176
framerate_type.h
InvalidateWindowClassesData
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:3251
SetStartingYear
void SetStartingYear(Year year)
Set the starting year for a scenario.
Definition: toolbar_gui.cpp:1099
MenuClickGoal
static CallBackFunction MenuClickGoal(int index)
Handle click on the entry in the Goal menu.
Definition: toolbar_gui.cpp:659
WID_TN_SMALL_MAP
@ WID_TN_SMALL_MAP
Small map menu.
Definition: toolbar_widget.h:19
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition: widget_type.h:48
MenuClickBuildWater
static CallBackFunction MenuClickBuildWater(int index)
Handle click on the entry in the Build Waterways menu.
Definition: toolbar_gui.cpp:940
ShowLastNewsMessage
void ShowLastNewsMessage()
Show previous news item.
Definition: news_gui.cpp:1040
PM_PAUSED_NORMAL
@ PM_PAUSED_NORMAL
A game normally paused.
Definition: openttd.h:62
Window::SetWidgetsDisabledState
void CDECL SetWidgetsDisabledState(bool disab_stat, int widgets,...)
Sets the enabled/disabled status of a list of widgets.
Definition: window.cpp:547
WID_TN_TOWNS
@ WID_TN_TOWNS
Town menu.
Definition: toolbar_widget.h:20
MenuClickNewspaper
static CallBackFunction MenuClickNewspaper(int index)
Handle click on the entry in the Newspaper menu.
Definition: toolbar_gui.cpp:1032
NWidgetToolbarContainer
Full blown container to make it behave exactly as we want :)
Definition: toolbar_gui.cpp:1314
NWidgetBase::resize_y
uint resize_y
Vertical resize step (0 means not resizable).
Definition: widget_type.h:179
Window::IsWidgetLowered
bool IsWidgetLowered(byte widget_index) const
Gets the lowered state of a widget.
Definition: window_gui.h:487
ShowSmallMap
void ShowSmallMap()
Show the smallmap window.
Definition: smallmap_gui.cpp:1866
ShowAIDebugWindow
Window * ShowAIDebugWindow(CompanyID show_company)
Open the AI debug window and select the given company.
Definition: ai_gui.cpp:1537
MainToolbarWindow::OnClick
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: toolbar_gui.cpp:1985
EventState
EventState
State of handling an event.
Definition: window_type.h:717
HT_RECT
@ HT_RECT
rectangle (stations, depots, ...)
Definition: tilehighlight_type.h:21
transparency_gui.h
WID_TE_SMALL_MAP
@ WID_TE_SMALL_MAP
Small map menu.
Definition: toolbar_widget.h:61
DO_SHOW_SIGNS
@ DO_SHOW_SIGNS
Display signs.
Definition: openttd.h:47
news_gui.h
WD_IMGBTN_TOP
@ WD_IMGBTN_TOP
Top offset of image in the button.
Definition: window_gui.h:42
PlaceProc_Sign
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Definition: signs_cmd.cpp:131
ScenarioEditorToolbarWindow::DrawWidget
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Definition: toolbar_gui.cpp:2339
FT_HEIGHTMAP
@ FT_HEIGHTMAP
heightmap file
Definition: fileio_type.h:20
WID_TN_MESSAGES
@ WID_TN_MESSAGES
Messages menu.
Definition: toolbar_widget.h:45
SC_DEFAULTZOOM
@ SC_DEFAULTZOOM
Zoomed to default zoom level screenshot of the visible area.
Definition: screenshot.h:22
WC_MAIN_WINDOW
@ WC_MAIN_WINDOW
Main window; Window numbers:
Definition: window_type.h:43
GameCreationSettings::starting_year
Year starting_year
starting date
Definition: settings_type.h:306
NWID_SPACER
@ NWID_SPACER
Invisible widget that takes some space.
Definition: widget_type.h:77
MenuClickSettings
static CallBackFunction MenuClickSettings(int index)
Handle click on one of the entries in the Options button menu.
Definition: toolbar_gui.cpp:347
DO_SHOW_TOWN_NAMES
@ DO_SHOW_TOWN_NAMES
Display town names.
Definition: openttd.h:45
company_func.h
NWidgetScenarioToolbarContainer::panel_widths
uint panel_widths[2]
The width of the two panels (the text panel and date panel)
Definition: toolbar_gui.cpp:1794
WID_TN_INDUSTRIES
@ WID_TN_INDUSTRIES
Industry menu.
Definition: toolbar_widget.h:29
NWidgetContainer
Baseclass for container widgets.
Definition: widget_type.h:400
TO_SIGNS
@ TO_SIGNS
signs
Definition: transparency.h:23
ShowLinkGraphLegend
void ShowLinkGraphLegend()
Open a link graph legend window.
Definition: linkgraph_gui.cpp:471
DEF_START_YEAR
static const Year DEF_START_YEAR
The default starting year.
Definition: date_type.h:87
GUITimer::Elapsed
bool Elapsed(uint delta)
Test if a timer has elapsed.
Definition: guitimer_func.h:55
network.h
_grfconfig
GRFConfig * _grfconfig
First item in list of current GRF set up.
Definition: newgrf_config.cpp:171
MILLISECONDS_PER_TICK
static const uint MILLISECONDS_PER_TICK
The number of milliseconds per game tick.
Definition: gfx_type.h:310
window_func.h
WID_TE_FAST_FORWARD
@ WID_TE_FAST_FORWARD
Fast forward the game.
Definition: toolbar_widget.h:54
MenuClickMusicWindow
static CallBackFunction MenuClickMusicWindow(int index)
Handle click on the entry in the Music menu.
Definition: toolbar_gui.cpp:1012
ToggleBit
static T ToggleBit(T &x, const uint8 y)
Toggles a bit in a variable.
Definition: bitmath_func.hpp:181
Window::ToggleWidgetLoweredState
void ToggleWidgetLoweredState(byte widget_index)
Invert the lowered/raised status of a widget.
Definition: window_gui.h:457
SoundSettings::click_beep
bool click_beep
Beep on a random selection of buttons.
Definition: settings_type.h:211
lengthof
#define lengthof(x)
Return the length of an fixed size array.
Definition: stdafx.h:378
Window::width
int width
width of the window (number of pixels to the right in x direction)
Definition: window_gui.h:314
CTMN_SPECTATOR
static const int CTMN_SPECTATOR
Show a company window as spectator.
Definition: toolbar_gui.cpp:208
ShowTerraformToolbar
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
Definition: terraform_gui.cpp:357
MarkWholeScreenDirty
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition: gfx.cpp:1751
WDP_MANUAL
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition: window_gui.h:155
ToggleTransparency
static void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
Definition: transparency.h:69
SetPIP
static NWidgetPart SetPIP(uint8 pre, uint8 inter, uint8 post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1169
SC_VIEWPORT
@ SC_VIEWPORT
Screenshot of viewport.
Definition: screenshot.h:19
MakeScreenshotWithConfirm
void MakeScreenshotWithConfirm(ScreenshotType t)
Make a screenshot.
Definition: screenshot.cpp:877
WID_TN_ZOOM_IN
@ WID_TN_ZOOM_IN
Zoom in the main viewport.
Definition: toolbar_widget.h:35
NWidgetBase::pos_y
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition: widget_type.h:190
ShowBuildRoadToolbar
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition: road_gui.cpp:889
INVALID_COMPANY
@ INVALID_COMPANY
An invalid company.
Definition: company_type.h:30
engine_base.h
NWidgetMainToolbarContainer::GetButtonArrangement
const byte * GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
Get the arrangement of the buttons for the toolbar.
Definition: toolbar_gui.cpp:1472
console_gui.h
MenuClickShowTrains
static CallBackFunction MenuClickShowTrains(int index)
Handle click on the entry in the Train menu.
Definition: toolbar_gui.cpp:769
WID_TE_SWITCH_BAR
@ WID_TE_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
Definition: toolbar_widget.h:75
WID_TE_INDUSTRY
@ WID_TE_INDUSTRY
Industry building window.
Definition: toolbar_widget.h:66
gui.h
CeilDiv
static uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
Definition: math_func.hpp:254
MenuClickStations
static CallBackFunction MenuClickStations(int index)
Handle click on the entry in the Stations menu.
Definition: toolbar_gui.cpp:563
Window
Data structure for an opened window.
Definition: window_gui.h:279
NWidgetToolbarContainer::spacers
uint spacers
Number of spacer widgets in this toolbar.
Definition: toolbar_gui.cpp:1317
GetRoadTypes
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition: road.cpp:216
SizingType
SizingType
Different forms of sizing nested widgets, using NWidgetBase::AssignSizePosition()
Definition: widget_type.h:111
NWidgetToolbarContainer::AssignSizePosition
void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl) override
Definition: toolbar_gui.cpp:1367
VEH_TRAIN
@ VEH_TRAIN
Train vehicle type.
Definition: vehicle_type.h:24
Pool::PoolItem<&_company_pool >::IsValidID
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:326
Window::RaiseWidget
void RaiseWidget(byte widget_index)
Marks a widget as raised.
Definition: window_gui.h:477
WID_TN_FAST_FORWARD
@ WID_TN_FAST_FORWARD
Fast forward the game.
Definition: toolbar_widget.h:16
SetObjectToPlace
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:3375
Window::DrawWidgets
void DrawWidgets() const
Paint all widgets of a window.
Definition: widget.cpp:636
WID_TN_SWITCH_BAR
@ WID_TN_SWITCH_BAR
Only available when toolbar has been split to switch between different subsets.
Definition: toolbar_widget.h:47
IConsoleSwitch
void IConsoleSwitch()
Toggle in-game console between opened and closed.
Definition: console_gui.cpp:438
WID_TE_TRAMS
@ WID_TE_TRAMS
Tram building menu.
Definition: toolbar_widget.h:68
Window::IsWidgetDisabled
bool IsWidgetDisabled(byte widget_index) const
Gets the enabled/disabled status of a widget.
Definition: window_gui.h:415
ScenarioEditorToolbarWindow::OnPlaceObject
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Definition: toolbar_gui.cpp:2422
NWidgetCore
Base class for a 'real' widget.
Definition: widget_type.h:311
story_base.h
WKC_MINUS
@ WKC_MINUS
Definition: gfx_type.h:104
Window::SetWidgetDirty
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:608
ShowAIConfigWindow
void ShowAIConfigWindow()
Open the AI config window.
Definition: ai_gui.cpp:973
MenuClickLeague
static CallBackFunction MenuClickLeague(int index)
Handle click on the entry in the CompanyLeague menu.
Definition: toolbar_gui.cpp:709
ShowCompany
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
Definition: company_gui.cpp:2698
GUISettings::UserIsAllowedToChangeNewGRFs
bool UserIsAllowedToChangeNewGRFs() const
Returns true when the user has sufficient privileges to edit newgrfs on a running game.
Definition: settings_type.h:199
HandleZoomMessage
void HandleZoomMessage(Window *w, const Viewport *vp, byte widget_zoom_in, byte widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
Definition: viewport.cpp:483
ScenarioEditorToolbarWindow::OnRealtimeTick
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Definition: toolbar_gui.cpp:2449
VEH_SHIP
@ VEH_SHIP
Ship vehicle type.
Definition: vehicle_type.h:26
ToolbarMode
ToolbarMode
Toobar modes.
Definition: toolbar_gui.cpp:70
ROADTYPES_NONE
@ ROADTYPES_NONE
No roadtypes.
Definition: road_type.h:37
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition: geometry_type.hpp:47
ScenarioEditorToolbarWindow::OnTimeout
void OnTimeout() override
Called when this window's timeout has been reached.
Definition: toolbar_gui.cpp:2442
WID_TE_MUSIC_SOUND
@ WID_TE_MUSIC_SOUND
Music/sound configuration menu.
Definition: toolbar_widget.h:73
WID_TN_VEHICLE_START
@ WID_TN_VEHICLE_START
Helper for the offset of the vehicle menus.
Definition: toolbar_widget.h:30
NWidgetBase::resize_x
uint resize_x
Horizontal resize step (0 means not resizable).
Definition: widget_type.h:178
WC_MAIN_TOOLBAR
@ WC_MAIN_TOOLBAR
Main toolbar (the long bar at the top); Window numbers:
Definition: window_type.h:50
ScenarioEditorToolbarWindow::OnPaint
void OnPaint() override
The window must be repainted.
Definition: toolbar_gui.cpp:2329
QSF_ENABLE_DEFAULT
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition: textbuf_gui.h:21
DO_SHOW_WAYPOINT_NAMES
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
Definition: openttd.h:50
CLRBITS
#define CLRBITS(x, y)
Clears several bits in a variable.
Definition: bitmath_func.hpp:166
NWidgetBase::current_x
uint current_x
Current horizontal size (after resizing).
Definition: widget_type.h:186
DropDownListItem::masked
bool masked
Masked and unselectable item.
Definition: dropdown_type.h:25
ResetObjectToPlace
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
Definition: viewport.cpp:3423
NWidgetResizeBase::SetMinimalSize
void SetMinimalSize(uint min_x, uint min_y)
Set minimal size of the widget.
Definition: widget.cpp:866
Window::SetWidgetLoweredState
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:447
_left_button_clicked
bool _left_button_clicked
Is left mouse button clicked?
Definition: gfx.cpp:40
NWidgetCore::GetWidgetFromPos
NWidgetCore * GetWidgetFromPos(int x, int y) override
Definition: widget.cpp:1000
TD_RTL
@ TD_RTL
Text is written right-to-left by default.
Definition: strings_type.h:24
network_func.h
_current_text_dir
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition: strings.cpp:48
CS_NUMERAL
@ CS_NUMERAL
Only numeric ones.
Definition: string_type.h:28
WID_TN_TRAINS
@ WID_TN_TRAINS
Train menu.
Definition: toolbar_widget.h:31
_game_speed
uint16 _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
Definition: gfx.cpp:38
DropDownListIconItem
List item with icon and string.
Definition: dropdown_type.h:82
MenuClickForest
static CallBackFunction MenuClickForest(int index)
Handle click on the entry in the landscaping menu.
Definition: toolbar_gui.cpp:988
ClientSettings::gui
GUISettings gui
settings related to the GUI
Definition: settings_type.h:594
MenuClickBuildRoad
static CallBackFunction MenuClickBuildRoad(int index)
Handle click on the entry in the Build Road menu.
Definition: toolbar_gui.cpp:894
DropDownListCheckedItem
Drop down list entry for showing a checked/unchecked toggle item.
Definition: toolbar_gui.cpp:89
MainToolbarWindow::OnPlaceObjectAbort
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition: toolbar_gui.cpp:2061
ShowEditorTerraformToolbar
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
Definition: terraform_gui.cpp:749
PopupMainCompanyToolbMenu
static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey=0)
Pop up a generic company list menu.
Definition: toolbar_gui.cpp:216
Hotkey
All data for a single hotkey.
Definition: hotkeys.h:22
MainToolbarWindow::OnDropdownSelect
void OnDropdownSelect(int widget, int index) override
A dropdown option associated to this window has been selected.
Definition: toolbar_gui.cpp:1990
ShowBuildDocksToolbar
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition: dock_gui.cpp:358
Window::FindWindowPlacementAndResize
virtual void FindWindowPlacementAndResize(int def_width, int def_height)
Resize window towards the default size.
Definition: window.cpp:1457
hotkeys.h
cheat_func.h
ShowBuildRoadScenToolbar
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Definition: road_gui.cpp:976
MAX_YEAR
static const Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
Definition: date_type.h:95
WID_TN_GRAPHS
@ WID_TN_GRAPHS
Graph menu.
Definition: toolbar_widget.h:27
NWidgetToolbarContainer::visible
bool visible[WID_TN_END]
The visible headers.
Definition: toolbar_gui.cpp:1315
WID_TN_RAILS
@ WID_TN_RAILS
Rail building menu.
Definition: toolbar_widget.h:38