OpenTTD Source 20241224-master-gee860a5c8e
airport_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 "economy_func.h"
12#include "window_gui.h"
13#include "station_gui.h"
14#include "terraform_gui.h"
15#include "sound_func.h"
16#include "window_func.h"
17#include "strings_func.h"
18#include "viewport_func.h"
19#include "company_func.h"
20#include "tilehighlight_func.h"
21#include "company_base.h"
22#include "station_type.h"
23#include "newgrf_airport.h"
24#include "newgrf_callbacks.h"
25#include "dropdown_type.h"
26#include "dropdown_func.h"
28#include "hotkeys.h"
29#include "vehicle_func.h"
30#include "gui.h"
31#include "command_func.h"
32#include "airport_cmd.h"
33#include "station_cmd.h"
34#include "zoom_func.h"
35#include "timer/timer.h"
37
39
40#include "safeguards.h"
41
42
46
47static void ShowBuildAirportPicker(Window *parent);
48
49SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout);
50
51void CcBuildAirport(Commands, const CommandCost &result, TileIndex tile)
52{
53 if (result.Failed()) return;
54
57}
58
63static void PlaceAirport(TileIndex tile)
64{
65 if (_selected_airport_index == -1) return;
66
68 uint8_t layout = _selected_airport_layout;
69 bool adjacent = _ctrl_pressed;
70
71 auto proc = [=](bool test, StationID to_join) -> bool {
72 if (test) {
73 return Command<CMD_BUILD_AIRPORT>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_AIRPORT>()), tile, airport_type, layout, INVALID_STATION, adjacent).Succeeded();
74 } else {
75 return Command<CMD_BUILD_AIRPORT>::Post(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE, CcBuildAirport, tile, airport_type, layout, to_join, adjacent);
76 }
77 };
78
79 ShowSelectStationIfNeeded(TileArea(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE), proc);
80}
81
84 int last_user_action; // Last started user action.
85
87 {
88 this->InitNested(window_number);
89 this->OnInvalidateData();
91 this->last_user_action = INVALID_WID_AT;
92 }
93
94 void Close([[maybe_unused]] int data = 0) override
95 {
98 this->Window::Close();
99 }
100
106 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
107 {
108 if (!gui_scope) return;
109
111 this->SetWidgetDisabledState(WID_AT_AIRPORT, !can_build);
112 if (!can_build) {
114
115 /* Show in the tooltip why this button is disabled. */
117 } else {
119 }
120 }
121
122 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
123 {
124 switch (widget) {
125 case WID_AT_AIRPORT:
126 if (HandlePlacePushButton(this, WID_AT_AIRPORT, SPR_CURSOR_AIRPORT, HT_RECT)) {
127 ShowBuildAirportPicker(this);
128 this->last_user_action = widget;
129 }
130 break;
131
132 case WID_AT_DEMOLISH:
134 this->last_user_action = widget;
135 break;
136
137 default: break;
138 }
139 }
140
141
142 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
143 {
144 switch (this->last_user_action) {
145 case WID_AT_AIRPORT:
146 PlaceAirport(tile);
147 break;
148
149 case WID_AT_DEMOLISH:
151 break;
152
153 default: NOT_REACHED();
154 }
155 }
156
158 {
159 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
160 }
161
162 void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
163 {
164 if (pt.x != -1 && select_proc == DDSP_DEMOLISH_AREA) {
165 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
166 }
167 }
168
178
185 {
186 if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED;
188 if (w == nullptr) return ES_NOT_HANDLED;
189 return w->OnHotkey(hotkey);
190 }
191
192 static inline HotkeyList hotkeys{"airtoolbar", {
193 Hotkey('1', "airport", WID_AT_AIRPORT),
194 Hotkey('2', "demolish", WID_AT_DEMOLISH),
196};
197
198static constexpr NWidgetPart _nested_air_toolbar_widgets[] = {
200 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
201 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_TOOLBAR_AIRCRAFT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
202 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
203 EndContainer(),
205 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_AT_AIRPORT), SetFill(0, 1), SetMinimalSize(42, 22), SetDataTip(SPR_IMG_AIRPORT, STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP),
206 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(4, 22), SetFill(1, 1), EndContainer(),
207 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_AT_DEMOLISH), SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
208 EndContainer(),
209};
210
211static WindowDesc _air_toolbar_desc(
212 WDP_ALIGN_TOOLBAR, "toolbar_air", 0, 0,
215 _nested_air_toolbar_widgets,
216 &BuildAirToolbarWindow::hotkeys
217);
218
227{
228 if (!Company::IsValidID(_local_company)) return nullptr;
229
231 return AllocateWindowDescFront<BuildAirToolbarWindow>(_air_toolbar_desc, TRANSPORT_AIR);
232}
233
236 int line_height;
237 Scrollbar *vscroll;
238
241 {
242 DropDownList list;
243
244 for (const auto &cls : AirportClass::Classes()) {
245 list.push_back(MakeDropDownListStringItem(cls.name, cls.Index()));
246 }
247
248 return list;
249 }
250
251public:
253 {
254 this->CreateNestedTree();
255
256 this->vscroll = this->GetScrollbar(WID_AP_SCROLLBAR);
257 this->vscroll->SetCapacity(5);
258 this->vscroll->SetPosition(0);
259
261
264 this->OnInvalidateData();
265
266 /* Ensure airport class is valid (changing NewGRFs). */
269 this->vscroll->SetCount(ac->GetSpecCount());
270
271 /* Ensure the airport index is valid for this class (changing NewGRFs). */
272 _selected_airport_index = Clamp(_selected_airport_index, -1, ac->GetSpecCount() - 1);
273
274 /* Only when no valid airport was selected, we want to select the first airport. */
275 bool selectFirstAirport = true;
276 if (_selected_airport_index != -1) {
277 const AirportSpec *as = ac->GetSpec(_selected_airport_index);
278 if (as->IsAvailable()) {
279 /* Ensure the airport layout is valid. */
280 _selected_airport_layout = Clamp(_selected_airport_layout, 0, static_cast<uint8_t>(as->layouts.size() - 1));
281 selectFirstAirport = false;
282 this->UpdateSelectSize();
283 }
284 }
285
287 }
288
289 void Close([[maybe_unused]] int data = 0) override
290 {
293 }
294
295 void SetStringParameters(WidgetID widget) const override
296 {
297 switch (widget) {
300 break;
301
304 if (_selected_airport_index != -1) {
307 if (string != STR_UNDEFINED) {
308 SetDParam(0, string);
309 } else if (as->layouts.size() > 1) {
312 }
313 }
314 break;
315
316 default: break;
317 }
318 }
319
321 {
322 switch (widget) {
324 Dimension d = {0, 0};
325 for (const auto &cls : AirportClass::Classes()) {
326 d = maxdim(d, GetStringBoundingBox(cls.name));
327 }
328 d.width += padding.width;
329 d.height += padding.height;
330 size = maxdim(size, d);
331 break;
332 }
333
334 case WID_AP_AIRPORT_LIST: {
335 for (int i = 0; i < NUM_AIRPORTS; i++) {
336 const AirportSpec *as = AirportSpec::Get(i);
337 if (!as->enabled) continue;
338
339 size.width = std::max(size.width, GetStringBoundingBox(as->name).width + padding.width);
340 }
341
342 this->line_height = GetCharacterHeight(FS_NORMAL) + padding.height;
343 size.height = 5 * this->line_height;
344 break;
345 }
346
348 for (int i = 0; i < NUM_AIRPORTS; i++) {
349 const AirportSpec *as = AirportSpec::Get(i);
350 if (!as->enabled) continue;
351 for (uint8_t layout = 0; layout < static_cast<uint8_t>(as->layouts.size()); layout++) {
352 SpriteID sprite = GetCustomAirportSprite(as, layout);
353 if (sprite != 0) {
354 Dimension d = GetSpriteSize(sprite);
357 size = maxdim(d, size);
358 }
359 }
360 }
361 break;
362
364 for (int i = NEW_AIRPORT_OFFSET; i < NUM_AIRPORTS; i++) {
365 const AirportSpec *as = AirportSpec::Get(i);
366 if (!as->enabled) continue;
367 for (uint8_t layout = 0; layout < static_cast<uint8_t>(as->layouts.size()); layout++) {
369 if (string == STR_UNDEFINED) continue;
370
372 size = maxdim(d, size);
373 }
374 }
375 break;
376
377 default: break;
378 }
379 }
380
381 void DrawWidget(const Rect &r, WidgetID widget) const override
382 {
383 switch (widget) {
384 case WID_AP_AIRPORT_LIST: {
385 Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel);
386 Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix);
387 const auto specs = AirportClass::Get(_selected_airport_class)->Specs();
388 auto [first, last] = this->vscroll->GetVisibleRangeIterators(specs);
389 for (auto it = first; it != last; ++it) {
390 const AirportSpec *as = *it;
391 if (!as->IsAvailable()) {
393 }
394 DrawString(text, as->name, (static_cast<int>(as->index) == _selected_airport_index) ? TC_WHITE : TC_BLACK);
395 row = row.Translate(0, this->line_height);
396 text = text.Translate(0, this->line_height);
397 }
398 break;
399 }
400
402 if (this->preview_sprite != 0) {
403 Dimension d = GetSpriteSize(this->preview_sprite);
404 DrawSprite(this->preview_sprite, COMPANY_SPRITE_COLOUR(_local_company), CenterBounds(r.left, r.right, d.width), CenterBounds(r.top, r.bottom, d.height));
405 }
406 break;
407
409 if (_selected_airport_index != -1) {
412 if (string != STR_UNDEFINED) {
413 DrawStringMultiLine(r.left, r.right, r.top, r.bottom, string, TC_BLACK);
414 }
415 }
416 break;
417 }
418 }
419
420 void OnPaint() override
421 {
422 this->DrawWidgets();
423
424 Rect r = this->GetWidget<NWidgetBase>(WID_AP_ACCEPTANCE)->GetCurrentRect();
425 int top = r.top;
426
427 if (_selected_airport_index != -1) {
429 int rad = _settings_game.station.modified_catchment ? as->catchment : (uint)CA_UNMODIFIED;
430
431 /* only show the station (airport) noise, if the noise option is activated */
433 /* show the noise of the selected airport */
434 SetDParam(0, as->noise_level);
435 DrawString(r.left, r.right, top, STR_STATION_BUILD_NOISE);
437 }
438
440 Money monthly = _price[PR_INFRASTRUCTURE_AIRPORT] * as->maintenance_cost >> 3;
441 SetDParam(0, monthly * 12);
444 }
445
446 /* strings such as 'Size' and 'Coverage Area' */
448 top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true);
449 }
450
451 /* Resize background if the window is too small.
452 * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
453 * (This is the case, if making the window bigger moves the mouse into the window.) */
454 if (top > r.bottom) {
455 ResizeWindow(this, 0, top - r.bottom, false);
456 }
457 }
458
459 void SelectOtherAirport(int airport_index)
460 {
463
464 this->UpdateSelectSize();
465 this->SetDirty();
466 }
467
468 void UpdateSelectSize()
469 {
470 if (_selected_airport_index == -1) {
471 SetTileSelectSize(1, 1);
474 } else {
476 int w = as->size_x;
477 int h = as->size_y;
478 Direction rotation = as->layouts[_selected_airport_layout].rotation;
479 if (rotation == DIR_E || rotation == DIR_W) Swap(w, h);
480 SetTileSelectSize(w, h);
481
482 this->preview_sprite = GetCustomAirportSprite(as, _selected_airport_layout);
483
486
487 int rad = _settings_game.station.modified_catchment ? as->catchment : (uint)CA_UNMODIFIED;
488 if (_settings_client.gui.station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
489 }
490 }
491
492 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
493 {
494 switch (widget) {
497 break;
498
499 case WID_AP_AIRPORT_LIST: {
500 int32_t num_clicked = this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget, 0, this->line_height);
501 if (num_clicked == INT32_MAX) break;
503 if (as->IsAvailable()) this->SelectOtherAirport(num_clicked);
504 break;
505 }
506
511 this->SetDirty();
513 this->UpdateSelectSize();
514 SetViewportCatchmentStation(nullptr, true);
515 break;
516
519 this->UpdateSelectSize();
520 this->SetDirty();
521 break;
522
525 this->UpdateSelectSize();
526 this->SetDirty();
527 break;
528 }
529 }
530
537 {
538 /* First try to select an airport in the selected class. */
540 for (const AirportSpec *as : sel_apclass->Specs()) {
541 if (as->IsAvailable()) {
542 this->SelectOtherAirport(as->index);
543 return;
544 }
545 }
546 if (change_class) {
547 /* If that fails, select the first available airport
548 * from the first class where airports are available. */
549 for (const auto &cls : AirportClass::Classes()) {
550 for (const auto &as : cls.Specs()) {
551 if (as->IsAvailable()) {
552 _selected_airport_class = cls.Index();
553 this->vscroll->SetCount(cls.GetSpecCount());
554 this->SelectOtherAirport(as->index);
555 return;
556 }
557 }
558 }
559 }
560 /* If all airports are unavailable, select nothing. */
561 this->SelectOtherAirport(-1);
562 }
563
564 void OnDropdownSelect(WidgetID widget, int index) override
565 {
566 if (widget == WID_AP_CLASS_DROPDOWN) {
569 this->SelectFirstAvailableAirport(false);
570 }
571 }
572
573 void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
574 {
576 }
577
578 IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
579 this->InvalidateData();
580 }};
581};
582
583static constexpr NWidgetPart _nested_build_airport_widgets[] = {
585 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
586 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_AIRPORT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
587 EndContainer(),
588 NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
591 NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_AIRPORT_CLASS_LABEL, STR_NULL), SetFill(1, 0),
592 NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_AP_CLASS_DROPDOWN), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_STATION_BUILD_AIRPORT_TOOLTIP),
593 NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_AIRPORT_SPRITE), SetFill(1, 0),
595 NWidget(WWT_MATRIX, COLOUR_GREY, WID_AP_AIRPORT_LIST), SetFill(1, 0), SetMatrixDataTip(1, 5, STR_STATION_BUILD_AIRPORT_TOOLTIP), SetScrollbar(WID_AP_SCROLLBAR),
597 EndContainer(),
598 NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_ORIENTATION, STR_NULL), SetFill(1, 0),
601 NWidget(WWT_LABEL, COLOUR_GREY, WID_AP_LAYOUT_NUM), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING1, STR_NULL),
603 EndContainer(),
604 NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
605 NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
606 NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14), SetPIPRatio(1, 0, 1),
608 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DONTHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
609 SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
610 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DOHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
611 SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
612 EndContainer(),
613 EndContainer(),
614 EndContainer(),
615 NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_ACCEPTANCE), SetResize(0, 1), SetFill(1, 0), SetMinimalTextLines(2, WidgetDimensions::unscaled.vsep_normal),
616 EndContainer(),
617 EndContainer(),
618};
619
620static WindowDesc _build_airport_desc(
621 WDP_AUTO, nullptr, 0, 0,
624 _nested_build_airport_widgets
625);
626
627static void ShowBuildAirportPicker(Window *parent)
628{
629 new BuildAirportWindow(_build_airport_desc, parent);
630}
631
632void InitializeAirportGui()
633{
636}
@ NUM_AIRPORTS
Maximal number of airports in total.
Definition airport.h:41
@ NEW_AIRPORT_OFFSET
Number of the first newgrf airport.
Definition airport.h:39
Command definitions related to airports.
static void PlaceAirport(TileIndex tile)
Place an airport.
Window * ShowBuildAirToolbar()
Open the build airport toolbar window.
static int _selected_airport_index
the index of the selected airport in the current class or -1
static AirportClassID _selected_airport_class
the currently visible airport class
static uint8_t _selected_airport_layout
selected airport layout number.
Types related to the airport widgets.
@ WID_AT_DEMOLISH
Demolish button.
@ WID_AT_AIRPORT
Build airport button.
@ WID_AP_AIRPORT_LIST
List of airports.
@ WID_AP_ACCEPTANCE
Acceptance info.
@ WID_AP_LAYOUT_DECREASE
Decrease the layout number.
@ WID_AP_LAYOUT_INCREASE
Increase the layout number.
@ WID_AP_CLASS_DROPDOWN
Dropdown of airport classes.
@ WID_AP_BTN_DOHILIGHT
Show the coverage button.
@ WID_AP_AIRPORT_SPRITE
A visual display of the airport currently selected.
@ WID_AP_SCROLLBAR
Scrollbar of the list.
@ WID_AP_BTN_DONTHILIGHT
Don't show the coverage button.
@ WID_AP_LAYOUT_NUM
Current number of the layout.
@ WID_AP_EXTRA_TEXT
Additional text about the airport.
static DropDownList BuildAirportClassDropDown()
Build a dropdown list of available airport classes.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnRealtimeTick(uint delta_ms) override
Called periodically.
SpriteID preview_sprite
Cached airport preview sprite.
void OnPaint() override
The window must be repainted.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
void SelectFirstAvailableAirport(bool change_class)
Select the first available airport.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
Common return value for all commands.
bool Failed() const
Did this command fail?
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
Struct containing information relating to NewGRF classes for stations and airports.
static std::span< NewGRFClass< Tspec, Tindex, Tmax > const > Classes()
Get read-only span of all classes of this type.
std::span< Tspec *const > Specs() const
Get read-only span of specs of this class.
static NewGRFClass * Get(Tindex class_index)
Get a particular class.
uint GetSpecCount() const
Get the number of allocated specs within the class.
static uint GetClassCount()
Get the number of allocated classes.
const Tspec * GetSpec(uint index) const
Get a spec from the class at a given index.
Base class for windows opened from a toolbar.
Definition window_gui.h:986
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:3524
Scrollbar data structure.
void SetCount(size_t num)
Sets the number of elements in the list.
void SetCapacity(size_t capacity)
Set the capacity of visible elements.
size_type GetScrolledRowFromWidget(int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Compute the row of a scrolled widget that a user clicked in.
Definition widget.cpp:2377
bool SetPosition(size_type position)
Sets the position of the first visible element.
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
static bool UsingWallclockUnits(bool newgame=false)
Check if we are using wallclock units.
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:42
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
int vsep_normal
Normal vertical spacing.
Definition window_gui.h:60
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:96
Functions related to commands.
static constexpr DoCommandFlag CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
Commands
List of commands.
Definition of stuff that is very close to a company, like the company struct itself.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
Direction
Defines the 8 directions on the map.
@ DIR_W
West.
@ DIR_E
East.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:404
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Functions related to the economy.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition gfx.cpp:922
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Definition gfx.cpp:114
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition gfx.cpp:988
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion)
Calculate string bounding box for multi-line strings.
Definition gfx.cpp:740
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition gfx.cpp:774
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
Definition gfx_func.h:166
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:18
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
Definition gfx_type.h:299
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
Widget part function for setting a pre/inter/post ratio.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:940
GUI functions that shouldn't be here.
Hotkey related functions.
bool HandlePlacePushButton(Window *w, WidgetID widget, CursorID cursor, HighLightStyle mode)
This code is shared for the majority of the pushbuttons.
Definition main_gui.cpp:63
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
constexpr void Swap(T &a, T &b)
Type safe swap operation.
StringID GetAirportTextCallback(const AirportSpec *as, uint8_t layout, uint16_t callback)
Get a custom text for the airport.
NewGRF handling of airports.
AirportClassID
List of default airport classes.
@ APC_BEGIN
Lowest valid airport class id.
Callbacks that NewGRFs could implement.
@ CBID_AIRPORT_ADDITIONAL_TEXT
This callback is called from airport list.
@ CBID_AIRPORT_LAYOUT_NAME
Called to determine text to show as airport layout name.
static const uint8_t PC_BLACK
Black palette colour.
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:56
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
@ SND_1F_CONSTRUCTION_OTHER
29 == 0x1D Construction: other (non-water, non-rail, non-bridge)
Definition sound_type.h:76
static const CursorID ANIMCURSOR_DEMOLISH
704 - 707 - demolish dynamite
Definition sprites.h:1508
Command definitions related to stations.
void ShowSelectStationIfNeeded(TileArea ta, StationPickerCmdProc proc)
Show the station selection window when needed.
void CheckRedrawStationCoverage(const Window *w)
Check whether we need to redraw the station coverage text.
int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies)
Calculates and draws the accepted or supplied cargo around the selected tile(s)
Contains enums and function declarations connected with stations GUI.
@ SCT_ALL
Draw all cargoes.
Definition station_gui.h:23
Types related to stations.
static constexpr uint CA_UNMODIFIED
Catchment for all stations with "modified catchment" disabled.
Definition of base types and functions in a cross-platform compatible way.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Defines the data structure for an airport.
std::vector< AirportTileLayout > layouts
List of layouts composing the airport.
static const AirportSpec * Get(uint8_t type)
Retrieve airport spec for the given airport.
Airport build toolbar window handler.
void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt) override
The user is dragging over the map when the tile highlight mode has been set.
void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) override
The user has dragged over the map when the tile highlight mode has been set.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
static EventState AirportToolbarGlobalHotkeys(int hotkey)
Handler for global hotkeys of the BuildAirToolbarWindow.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
bool station_noise_level
build new airports when the town noise level is still within accepted limits
bool infrastructure_maintenance
enable monthly maintenance fee for owner infrastructure
bool persistent_buildingtools
keep the building tools active after usage
bool station_show_coverage
whether to highlight coverage area
bool link_terraform_toolbar
display terraform toolbar when displaying rail, road, water and airport toolbars
EconomySettings economy
settings to change the economy
StationSettings station
settings related to station management
List of hotkeys for a window.
Definition hotkeys.h:37
All data for a single hotkey.
Definition hotkeys.h:21
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
bool modified_catchment
different-size catchment areas
Point size
Size, in tile "units", of the white/red selection area.
High level window description.
Definition window_gui.h:159
Data structure for an opened window.
Definition window_gui.h:273
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1047
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
Definition window_gui.h:786
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1733
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:732
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3159
Window * parent
Parent window.
Definition window_gui.h:328
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void DisableWidget(WidgetID widget_index)
Sets a widget to disabled.
Definition window_gui.h:397
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1723
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:497
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition window.cpp:525
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:447
int top
y position of top edge of the window
Definition window_gui.h:310
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:977
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1746
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition window.cpp:314
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition window.cpp:565
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:387
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:302
bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile)
A central place to handle all X_AND_Y dragged GUI functions.
void PlaceProc_DemolishArea(TileIndex tile)
Start a drag for demolishing an area.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
static const uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
@ HT_DIAGONAL
Also allow 'diagonal rectangles'. Only usable in combination with HT_RECT or HT_POINT.
@ HT_RECT
rectangle (stations, depots, ...)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
@ TRANSPORT_AIR
Transport through air.
bool CanBuildVehicleInfrastructure(VehicleType type, uint8_t subtype)
Check whether we can build infrastructure for the given vehicle type.
Definition vehicle.cpp:1922
Functions related to vehicles.
@ VEH_AIRCRAFT
Aircraft vehicle type.
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
void SetViewportCatchmentStation(const Station *st, bool sel)
Select or deselect station for coverage area highlight.
Functions related to (drawing on) viewports.
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you've selected it.
@ DDSP_DEMOLISH_AREA
Clear area.
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects)
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:31
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:32
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:52
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
@ WWT_LABEL
Centered label.
Definition widget_type.h:57
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:55
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:66
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:59
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:85
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:48
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:70
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition window.cpp:1140
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
Definition window.cpp:2022
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1152
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WDF_CONSTRUCTION
This window is used for construction; close it whenever changing company.
Definition window_gui.h:203
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:147
@ WDP_ALIGN_TOOLBAR
Align toward the toolbar.
Definition window_gui.h:149
int WidgetID
Widget ID.
Definition window_type.h:18
int32_t WindowNumber
Number to differentiate different windows of the same class.
EventState
State of handling an event.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_BUILD_STATION
Build station; Window numbers:
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition window_type.h:73
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:45
@ WC_SCEN_LAND_GEN
Landscape generation (in Scenario Editor); Window numbers:
@ WC_SELECT_STATION
Select station (when joining stations); Window numbers:
Functions related to zooming.