OpenTTD Source 20260820-master-g39da062c0c
terraform_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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
11#include "core/backup_type.hpp"
12#include "clear_map.h"
13#include "company_func.h"
14#include "company_base.h"
15#include "house.h"
16#include "gui.h"
17#include "window_gui.h"
18#include "window_func.h"
19#include "viewport_func.h"
20#include "command_func.h"
21#include "signs_func.h"
22#include "sound_func.h"
23#include "base_station_base.h"
24#include "textbuf_gui.h"
25#include "genworld.h"
26#include "tree_map.h"
27#include "landscape_type.h"
28#include "tilehighlight_func.h"
29#include "strings_func.h"
30#include "newgrf_object.h"
31#include "object.h"
32#include "hotkeys.h"
33#include "engine_base.h"
34#include "terraform_gui.h"
35#include "terraform_cmd.h"
36#include "zoom_func.h"
37#include "rail_cmd.h"
38#include "landscape_cmd.h"
39#include "terraform_cmd.h"
40#include "object_cmd.h"
41
43
44#include "table/strings.h"
45
46#include "safeguards.h"
47
48void CcTerraform(Commands, const CommandCost &result, Money, TileIndex tile)
49{
50 if (result.Succeeded()) {
51 if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
52 } else {
54 }
55}
56
57
63static void GenerateDesertArea(TileIndex end, TileIndex start)
64{
65 if (_game_mode != GameMode::Editor) return;
66
67 Backup<bool> old_generating_world(_generating_world, true);
68
69 TileArea ta(start, end);
70 for (TileIndex tile : ta) {
72 Command<Commands::LandscapeClear>::Post(tile);
74 }
75 old_generating_world.Restore();
76 InvalidateWindowClassesData(WindowClass::TownView, 0);
77}
78
85static void PlaceRockyArea(TileIndex end, TileIndex start, bool remove)
86{
87 if (_game_mode != GameMode::Editor) return;
88
89 bool success = false;
90 TileArea ta(start, end);
91
92 for (TileIndex tile : ta) {
93 switch (GetTileType(tile)) {
94 case TileType::Trees:
95 if (GetTreeGround(tile) == TreeGround::Shore) continue;
96 if (!remove) {
98 }
99 break;
100
101 case TileType::Clear:
102 if (remove) {
103 if (GetClearGround(tile) == ClearGround::Rocks) {
105 }
106 } else {
108 }
109 break;
110
111 default:
112 continue;
113 }
115 success = true;
116 }
117
118 if (success && _settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, end);
119}
120
127static void PlaceRoughGround(TileIndex end, TileIndex start, bool remove)
128{
129 if (_game_mode != GameMode::Editor) return;
130
131 bool success = false;
132 TileArea ta(start, end);
133
134 for (TileIndex tile : ta) {
135 switch (GetTileType(tile)) {
136 case TileType::Trees: {
137 /* Preserve snowline density underneath trees, so the tile loop
138 * doesn't have to come back and fix it later. */
139 uint density = GetTreeDensity(tile);
140 if (remove) {
141 switch (GetTreeGround(tile)) {
144 break;
147 break;
148 default:
149 continue;
150 }
151 } else {
152 switch (GetTreeGround(tile)) {
155 break;
158 break;
159 default:
160 continue;
161 }
162 }
163 break;
164 }
165
166 case TileType::Clear:
167 if (remove) {
168 if (GetClearGround(tile) == ClearGround::Rough) {
170 } else {
171 continue;
172 }
173 } else {
175 }
176 break;
177
178 default:
179 continue;
180 }
182 success = true;
183 }
184
185 if (success && _settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, end);
186}
187
198{
199 if (!_settings_game.construction.freeform_edges) {
200 /* When end_tile is TileType::Void, the error tile will not be visible to the
201 * user. This happens when terraforming at the southern border. */
202 if (TileX(end_tile) == Map::MaxX()) end_tile += TileDiffXY(-1, 0);
203 if (TileY(end_tile) == Map::MaxY()) end_tile += TileDiffXY(0, -1);
204 }
205
206 switch (proc) {
208 Command<Commands::ClearArea>::Post(STR_ERROR_CAN_T_CLEAR_THIS_AREA, CcPlaySound_EXPLOSION, end_tile, start_tile, _ctrl_pressed);
209 break;
211 Command<Commands::LevelLand>::Post(STR_ERROR_CAN_T_RAISE_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LevelMode::Raise);
212 break;
214 Command<Commands::LevelLand>::Post(STR_ERROR_CAN_T_LOWER_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LevelMode::Lower);
215 break;
216 case DDSP_LEVEL_AREA:
217 Command<Commands::LevelLand>::Post(STR_ERROR_CAN_T_LEVEL_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LevelMode::Level);
218 break;
220 PlaceRockyArea(end_tile, start_tile, _ctrl_pressed);
221 break;
223 PlaceRoughGround(end_tile, start_tile, _ctrl_pressed);
224 break;
226 GenerateDesertArea(end_tile, start_tile);
227 break;
228 default:
229 return false;
230 }
231
232 return true;
233}
234
243
245struct TerraformToolbarWindow : Window {
247
248 TerraformToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc)
249 {
250 /* This is needed as we like to have the tree available on OnInit. */
251 this->CreateNestedTree();
252 this->FinishInitNested(window_number);
253 }
254
255 void OnInit() override
256 {
257 /* Don't show the place object button when there are no objects to place. */
260 }
261
262 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
263 {
264 if (widget < WID_TT_BUTTONS_START) return;
265
266 switch (widget) {
267 case WID_TT_LOWER_LAND: // Lower land button
269 this->last_user_action = widget;
270 break;
271
272 case WID_TT_RAISE_LAND: // Raise land button
274 this->last_user_action = widget;
275 break;
276
277 case WID_TT_LEVEL_LAND: // Level land button
279 this->last_user_action = widget;
280 break;
281
282 case WID_TT_DEMOLISH: // Demolish aka dynamite button
284 this->last_user_action = widget;
285 break;
286
287 case WID_TT_BUY_LAND: // Buy land button
289 this->last_user_action = widget;
290 break;
291
292 case WID_TT_PLANT_TREES: // Plant trees button
293 ShowBuildTreesToolbar();
294 break;
295
296 case WID_TT_PLACE_SIGN: // Place sign button
298 this->last_user_action = widget;
299 break;
300
301 case WID_TT_PLACE_OBJECT: // Place object button
303 break;
304
305 default: NOT_REACHED();
306 }
307 }
308
309 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
310 {
311 switch (this->last_user_action) {
312 case WID_TT_LOWER_LAND: // Lower land button
314 break;
315
316 case WID_TT_RAISE_LAND: // Raise land button
318 break;
319
320 case WID_TT_LEVEL_LAND: // Level land button
322 break;
323
324 case WID_TT_DEMOLISH: // Demolish aka dynamite button
326 break;
327
328 case WID_TT_BUY_LAND: // Buy land button
330 break;
331
332 case WID_TT_PLACE_SIGN: // Place sign button
333 PlaceProc_Sign(tile);
334 break;
335
336 default: NOT_REACHED();
337 }
338 }
339
340 void OnPlaceDrag(ViewportPlaceMethod select_method, [[maybe_unused]] ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt) override
341 {
342 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
343 }
344
345 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
346 {
348 if (FindWindowByClass(WindowClass::BuildToolbar) != nullptr && !_settings_client.gui.link_terraform_toolbar) pt.y += sm_height;
349
350 return pt;
351 }
352
353 void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
354 {
355 if (pt.x != -1) {
356 switch (select_proc) {
357 default: NOT_REACHED();
361 case DDSP_LEVEL_AREA:
362 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
363 break;
365 if (!_settings_game.construction.freeform_edges) {
366 /* When end_tile is TileType::Void, the error tile will not be visible to the
367 * user. This happens when terraforming at the southern border. */
368 if (TileX(end_tile) == Map::MaxX()) end_tile += TileDiffXY(-1, 0);
369 if (TileY(end_tile) == Map::MaxY()) end_tile += TileDiffXY(0, -1);
370 }
371 Command<Commands::BuildObjectArea>::Post(STR_ERROR_CAN_T_PURCHASE_THIS_LAND, CcPlaySound_CONSTRUCTION_RAIL,
372 end_tile, start_tile, OBJECT_OWNED_LAND, 0, _ctrl_pressed);
373 break;
374 }
375 }
376 }
377
378 void OnPlaceObjectAbort() override
379 {
380 this->RaiseButtons();
381 }
382
389 {
390 if (_game_mode != GameMode::Normal) return EventState::NotHandled;
391 Window *w = ShowTerraformToolbar(nullptr);
392 if (w == nullptr) return EventState::NotHandled;
393 return w->OnHotkey(hotkey);
394 }
395
396 static inline HotkeyList hotkeys{"terraform", {
400 Hotkey('D' | WKC_GLOBAL_HOTKEY, "dynamite", WID_TT_DEMOLISH),
401 Hotkey('U', "buyland", WID_TT_BUY_LAND),
402 Hotkey('I', "trees", WID_TT_PLANT_TREES),
403 Hotkey('O', "placesign", WID_TT_PLACE_SIGN),
404 Hotkey('P', "placeobject", WID_TT_PLACE_OBJECT),
406};
407
408static constexpr std::initializer_list<NWidgetPart> _nested_terraform_widgets = {
411 NWidget(WWT_CAPTION, Colours::DarkGreen), SetStringTip(STR_LANDSCAPING_TOOLBAR, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
413 EndContainer(),
416 SetFill(0, 1), SetSpriteTip(SPR_IMG_TERRAFORM_DOWN, STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND),
418 SetFill(0, 1), SetSpriteTip(SPR_IMG_TERRAFORM_UP, STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND),
420 SetFill(0, 1), SetSpriteTip(SPR_IMG_LEVEL_LAND, STR_LANDSCAPING_LEVEL_LAND_TOOLTIP),
421
423
425 SetFill(0, 1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
427 SetFill(0, 1), SetSpriteTip(SPR_IMG_BUY_LAND, STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND),
429 SetFill(0, 1), SetSpriteTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES_TOOLTIP),
431 SetFill(0, 1), SetSpriteTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN_TOOLTIP),
434 SetFill(0, 1), SetSpriteTip(SPR_IMG_TRANSMITTER, STR_SCENEDIT_TOOLBAR_PLACE_OBJECT_TOOLTIP),
435 EndContainer(),
436 EndContainer(),
437};
438
441 WindowPosition::Manual, "toolbar_landscape", 0, 0,
442 WindowClass::ScenarioGenerateLandscape, WindowClass::None,
444 _nested_terraform_widgets,
445 &TerraformToolbarWindow::hotkeys
446);
447
454{
455 if (!Company::IsValidID(_local_company)) return nullptr;
456
457 /* Delete the terraform toolbar to place it again. */
458 CloseWindowById(WindowClass::ScenarioGenerateLandscape, 0, true);
459
461
463 /* Put the linked toolbar to the left / right of the main toolbar. */
464 link->left = w->left + (_current_text_dir == TD_RTL ? w->width : -link->width);
465 link->top = w->top;
466 link->SetDirty();
467
468 return w;
469}
470
471static uint8_t _terraform_size = 1;
472
482static void CommonRaiseLowerBigLand(TileIndex tile, bool mode)
483{
484 if (_terraform_size == 1) {
485 StringID msg =
486 mode ? STR_ERROR_CAN_T_RAISE_LAND_HERE : STR_ERROR_CAN_T_LOWER_LAND_HERE;
487
488 Command<Commands::TerraformLand>::Post(msg, CcTerraform, tile, SLOPE_N, mode);
489 } else {
490 assert(_terraform_size != 0);
491 TileArea ta(tile, _terraform_size, _terraform_size);
492 ta.ClampToMap();
493
494 if (ta.w == 0 || ta.h == 0) return;
495
496 if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
497
498 uint h;
499 if (mode != 0) {
500 /* Raise land */
501 h = MAX_TILE_HEIGHT;
502 for (TileIndex tile2 : ta) {
503 h = std::min(h, TileHeight(tile2));
504 }
505 } else {
506 /* Lower land */
507 h = 0;
508 for (TileIndex tile2 : ta) {
509 h = std::max(h, TileHeight(tile2));
510 }
511 }
512
513 for (TileIndex tile2 : ta) {
514 if (TileHeight(tile2) == h) {
515 Command<Commands::TerraformLand>::Post(tile2, SLOPE_N, mode);
516 }
517 }
518 }
519}
520
521static const int8_t _multi_terraform_coords[][2] = {
522 { 0, -2},
523 { 4, 0}, { -4, 0}, { 0, 2},
524 { -8, 2}, { -4, 4}, { 0, 6}, { 4, 4}, { 8, 2},
525 {-12, 0}, { -8, -2}, { -4, -4}, { 0, -6}, { 4, -4}, { 8, -2}, { 12, 0},
526 {-16, 2}, {-12, 4}, { -8, 6}, { -4, 8}, { 0, 10}, { 4, 8}, { 8, 6}, { 12, 4}, { 16, 2},
527 {-20, 0}, {-16, -2}, {-12, -4}, { -8, -6}, { -4, -8}, { 0,-10}, { 4, -8}, { 8, -6}, { 12, -4}, { 16, -2}, { 20, 0},
528 {-24, 2}, {-20, 4}, {-16, 6}, {-12, 8}, { -8, 10}, { -4, 12}, { 0, 14}, { 4, 12}, { 8, 10}, { 12, 8}, { 16, 6}, { 20, 4}, { 24, 2},
529 {-28, 0}, {-24, -2}, {-20, -4}, {-16, -6}, {-12, -8}, { -8,-10}, { -4,-12}, { 0,-14}, { 4,-12}, { 8,-10}, { 12, -8}, { 16, -6}, { 20, -4}, { 24, -2}, { 28, 0},
530};
531
532static constexpr std::initializer_list<NWidgetPart> _nested_scen_edit_land_gen_widgets = {
535 NWidget(WWT_CAPTION, Colours::DarkGreen), SetStringTip(STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
538 EndContainer(),
540 NWidget(NWID_HORIZONTAL), SetPadding(2, 2, 7, 2),
543 SetFill(0, 1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
545 SetFill(0, 1), SetSpriteTip(SPR_IMG_TERRAFORM_DOWN, STR_TERRAFORM_TOOLTIP_LOWER_A_CORNER_OF_LAND),
547 SetFill(0, 1), SetSpriteTip(SPR_IMG_TERRAFORM_UP, STR_TERRAFORM_TOOLTIP_RAISE_A_CORNER_OF_LAND),
549 SetFill(0, 1), SetSpriteTip(SPR_IMG_LEVEL_LAND, STR_LANDSCAPING_LEVEL_LAND_TOOLTIP),
551 SetFill(0, 1), SetSpriteTip(SPR_IMG_ROCKS, STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE),
553 SetFill(0, 1), SetSpriteTip(SPR_IMG_SHOW_COUNTOURS, STR_TERRAFORM_TOOLTIP_PLACE_ROUGH_AREAS_ON_LANDSCAPE),
556 SetFill(0, 1), SetSpriteTip(SPR_IMG_DESERT, STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA),
557 EndContainer(),
559 SetFill(0, 1), SetSpriteTip(SPR_IMG_TRANSMITTER, STR_SCENEDIT_TOOLBAR_PLACE_OBJECT_TOOLTIP),
561 EndContainer(),
568 NWidget(WWT_IMGBTN, Colours::Grey, WID_ETT_INCREASE_SIZE), SetMinimalSize(12, 12), SetSpriteTip(SPR_ARROW_UP, STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA),
570 NWidget(WWT_IMGBTN, Colours::Grey, WID_ETT_DECREASE_SIZE), SetMinimalSize(12, 12), SetSpriteTip(SPR_ARROW_DOWN, STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA),
572 EndContainer(),
574 EndContainer(),
577 SetFill(1, 0), SetStringTip(STR_TERRAFORM_SE_NEW_WORLD, STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND), SetPadding(0, 2, 0, 2),
579 SetFill(1, 0), SetStringTip(STR_TERRAFORM_RESET_LANDSCAPE, STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP), SetPadding(1, 2, 2, 2),
580 EndContainer(),
581};
582
587static void ResetLandscapeConfirmationCallback(Window *, bool confirmed)
588{
589 if (confirmed) {
590 /* Set generating_world to true to get instant-green grass after removing
591 * company property. */
592 Backup<bool> old_generating_world(_generating_world, true);
593
594 /* Delete all companies */
595 for (Company *c : Company::Iterate()) {
597 delete c;
598 }
599
600 old_generating_world.Restore();
601
602 /* Delete all station signs */
603 for (BaseStation *st : BaseStation::Iterate()) {
604 /* There can be buoys, remove them */
605 if (IsBuoyTile(st->xy)) Command<Commands::LandscapeClear>::Do({DoCommandFlag::Execute, DoCommandFlag::Bankrupt}, st->xy);
606 if (!st->IsInUse()) delete st;
607 }
608
609 /* Now that all vehicles are gone, we can reset the engine pool. Maybe it reduces some NewGRF changing-mess */
611
613 }
614}
615
617struct ScenarioEditorLandscapeGenerationWindow : Window {
619
620 ScenarioEditorLandscapeGenerationWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc)
621 {
622 this->CreateNestedTree();
624 show_desert->SetDisplayedPlane(_settings_game.game_creation.landscape == LandscapeType::Tropic ? 0 : SZSP_NONE);
625 this->FinishInitNested(window_number);
626 }
627
628 void OnPaint() override
629 {
630 this->DrawWidgets();
631
632 if (this->IsWidgetLowered(WID_ETT_LOWER_LAND) || this->IsWidgetLowered(WID_ETT_RAISE_LAND)) { // change area-size if raise/lower corner is selected
633 SetTileSelectSize(_terraform_size, _terraform_size);
634 }
635 }
636
637 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
638 {
639 if (widget != WID_ETT_DOTS) return;
640
641 size.width = std::max<uint>(size.width, ScaleGUITrad(59));
642 size.height = std::max<uint>(size.height, ScaleGUITrad(31));
643 }
644
645 void DrawWidget(const Rect &r, WidgetID widget) const override
646 {
647 if (widget != WID_ETT_DOTS) return;
648
649 int center_x = RoundDivSU(r.left + r.right, 2);
650 int center_y = RoundDivSU(r.top + r.bottom, 2);
651
652 int n = _terraform_size * _terraform_size;
653 const int8_t *coords = &_multi_terraform_coords[0][0];
654
655 assert(n != 0);
656 do {
657 DrawSprite(SPR_WHITE_POINT, PAL_NONE, center_x + ScaleGUITrad(coords[0]), center_y + ScaleGUITrad(coords[1]));
658 coords += 2;
659 } while (--n);
660 }
661
662 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
663 {
664 if (widget < WID_ETT_BUTTONS_START) return;
665
666 switch (widget) {
667 case WID_ETT_DEMOLISH: // Demolish aka dynamite button
669 this->last_user_action = widget;
670 break;
671
672 case WID_ETT_LOWER_LAND: // Lower land button
674 this->last_user_action = widget;
675 break;
676
677 case WID_ETT_RAISE_LAND: // Raise land button
679 this->last_user_action = widget;
680 break;
681
682 case WID_ETT_LEVEL_LAND: // Level land button
684 this->last_user_action = widget;
685 break;
686
687 case WID_ETT_PLACE_ROCKS: // Place rocks button
689 this->last_user_action = widget;
690 break;
691
692 case WID_ETT_PLACE_ROUGH: // Place rough land button
694 this->last_user_action = widget;
695 break;
696
697 case WID_ETT_PLACE_DESERT: // Place desert button (in tropical climate)
699 this->last_user_action = widget;
700 break;
701
702 case WID_ETT_PLACE_OBJECT: // Place transmitter button
704 break;
705
707 case WID_ETT_DECREASE_SIZE: { // Increase/Decrease terraform size
708 int size = (widget == WID_ETT_INCREASE_SIZE) ? 1 : -1;
709 this->HandleButtonClick(widget);
710 size += _terraform_size;
711
712 if (!IsInsideMM(size, 1, 8 + 1)) return;
713 _terraform_size = size;
714
715 this->SetDirty();
716 break;
717 }
718
719 case WID_ETT_NEW_SCENARIO: // gen random land
720 this->HandleButtonClick(widget);
722 break;
723
724 case WID_ETT_RESET_LANDSCAPE: // Reset landscape
725 ShowQuery(
726 GetEncodedString(STR_QUERY_RESET_LANDSCAPE_CAPTION),
727 GetEncodedString(STR_RESET_LANDSCAPE_CONFIRMATION_TEXT),
729 break;
730
731 default: NOT_REACHED();
732 }
733 }
734
735 void OnTimeout() override
736 {
737 for (const auto &pair : this->widget_lookup) {
738 if (pair.first < WID_ETT_START || (pair.first >= WID_ETT_BUTTONS_START && pair.first < WID_ETT_BUTTONS_END)) continue; // skip the buttons
739 this->RaiseWidgetWhenLowered(pair.first);
740 }
741 }
742
743 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
744 {
745 switch (this->last_user_action) {
746 case WID_ETT_DEMOLISH: // Demolish aka dynamite button
748 break;
749
750 case WID_ETT_LOWER_LAND: // Lower land button
751 if (_terraform_size == 1) {
753 } else {
754 CommonRaiseLowerBigLand(tile, false);
755 }
756 break;
757
758 case WID_ETT_RAISE_LAND: // Raise land button
759 if (_terraform_size == 1) {
761 } else {
762 CommonRaiseLowerBigLand(tile, true);
763 }
764 break;
765
766 case WID_ETT_LEVEL_LAND: // Level land button
768 break;
769
770 case WID_ETT_PLACE_ROCKS: // Place rocks button
772 break;
773
774 case WID_ETT_PLACE_ROUGH: // Place rough land button
776 break;
777
778 case WID_ETT_PLACE_DESERT: // Place desert button (in tropical climate)
780 break;
781
782 default: NOT_REACHED();
783 }
784 }
785
786 void OnPlaceDrag(ViewportPlaceMethod select_method, [[maybe_unused]] ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt) override
787 {
788 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
789 }
790
791 void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
792 {
793 if (pt.x != -1) {
794 switch (select_proc) {
795 default: NOT_REACHED();
801 case DDSP_LEVEL_AREA:
803 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
804 break;
805 }
806 }
807 }
808
810 {
811 switch (this->last_user_action) {
815 if (this->IsWidgetLowered(this->last_user_action)) {
816 SetSelectionRed(_ctrl_pressed);
817 return EventState::Handled;
818 }
819 break;
820 }
822 }
823
824 void OnPlaceObjectAbort() override
825 {
826 this->RaiseButtons();
827 this->SetDirty();
828 }
829
836 {
837 if (_game_mode != GameMode::Editor) return EventState::NotHandled;
839 if (w == nullptr) return EventState::NotHandled;
840 return w->OnHotkey(hotkey);
841 }
842
843 static inline HotkeyList hotkeys{"terraform_editor", {
844 Hotkey('D' | WKC_GLOBAL_HOTKEY, "dynamite", WID_ETT_DEMOLISH),
848 Hotkey('R', "rocky", WID_ETT_PLACE_ROCKS),
849 Hotkey('T', "desert", WID_ETT_PLACE_DESERT),
850 Hotkey('O', "object", WID_ETT_PLACE_OBJECT),
852};
853
856 WindowPosition::Automatic, "toolbar_landscape_scen", 0, 0,
857 WindowClass::ScenarioGenerateLandscape, WindowClass::None,
859 _nested_scen_edit_land_gen_widgets,
860 &ScenarioEditorLandscapeGenerationWindow::hotkeys
861);
862
Class for backupping variables and making sure they are restored later.
Base classes/functions for base stations.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
Stacked widgets, widgets all occupying the same space in the window.
bool SetDisplayedPlane(int plane)
Select which plane to show (for NWID_SELECTION only).
Definition widget.cpp:1458
Map accessors for 'clear' tiles.
@ Rocks
Rocks with snow transition (0-3).
Definition clear_map.h:24
@ Grass
Plain grass with dirt transition (0-3).
Definition clear_map.h:22
@ Rough
Rough mounds (3).
Definition clear_map.h:23
void MakeClear(Tile t, ClearGround g, uint density)
Make a clear tile.
Definition clear_map.h:253
ClearGround GetClearGround(Tile t)
Get the type of clear tile.
Definition clear_map.h:52
void SetClearGroundDensity(Tile t, ClearGround type, uint density)
Sets ground type and density in one go, also sets the counter to 0.
Definition clear_map.h:152
Functions related to commands.
@ Execute
execute the given command
@ Bankrupt
company bankrupts, skip money check, skip vehicle on tile check in some cases
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.
void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
Change the ownership of all the items of a company.
Definition economy.cpp:323
static constexpr Owner INVALID_OWNER
An invalid owner.
Base class for engines.
bool _generating_world
Whether we are generating the map or not.
Definition genworld.cpp:74
Functions related to world/map generation.
void ShowCreateScenario()
Show the window to create a scenario.
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:39
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:1037
@ Invalid
Invalid marker.
Definition gfx_type.h:302
@ Grey
Grey.
Definition gfx_type.h:299
@ DarkGreen
Dark green.
Definition gfx_type.h:292
@ WKC_GLOBAL_HOTKEY
Fake keycode bit to indicate global hotkeys.
Definition gfx_type.h:35
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetToolbarMinimalSize(int width)
Widget part function to setting the minimal size for a toolbar button.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetToolbarSpacerMinimalSize()
Widget part function to setting the minimal size for a toolbar spacer.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
static const CursorID ANIMCURSOR_DEMOLISH
704 - 707 - demolish dynamite
Definition sprites.h:1693
static const CursorID ANIMCURSOR_LOWERLAND
699 - 701 - lower land tool
Definition sprites.h:1694
static const CursorID ANIMCURSOR_RAISELAND
696 - 698 - raise land tool
Definition sprites.h:1695
static const CursorID SPR_CURSOR_LEVEL_LAND
Definition sprites.h:1577
static const CursorID SPR_CURSOR_SIGN
Definition sprites.h:1573
static const CursorID SPR_CURSOR_ROCKY_AREA
Definition sprites.h:1581
static const CursorID SPR_CURSOR_DESERT
Definition sprites.h:1582
static const CursorID SPR_CURSOR_BUY_LAND
Definition sprites.h:1576
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Definition window.cpp:975
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1553
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
GUI functions that shouldn't be here.
Hotkey related functions.
Definition of HouseSpec and accessors.
Command definitions related to landscape (slopes etc.).
Types related to the landscape.
@ Tropic
Landscape with distinct rainforests and deserts,.
#define Point
Macro that prevents name conflicts between included headers.
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
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition map_func.h:392
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:429
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:419
@ Raise
Raise the land.
Definition map_type.h:46
@ Level
Level the land.
Definition map_type.h:44
@ Lower
Lower the land.
Definition map_type.h:45
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr int RoundDivSU(int a, uint b)
Computes round(a / b) for signed a and unsigned b.
void ShowQuery(EncodedString &&caption, EncodedString &&message, Window *parent, QueryCallbackProc *callback, bool focus)
Show a confirmation window with standard 'yes' and 'no' buttons The window is aligned to the centre o...
Functions related to NewGRF objects.
Functions related to objects.
Window * ShowBuildObjectPicker()
Show our object picker.
Command definitions related to objects.
static const ObjectType OBJECT_OWNED_LAND
Owned land 'flag'.
Definition object_type.h:21
@ Editor
In the scenario editor.
Definition openttd.h:21
@ Normal
Playing a game.
Definition openttd.h:20
Command definitions for rail.
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:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
Functions related to signs.
@ SLOPE_N
the north corner of the tile is raised
Definition slope_type.h:58
Functions related to sound.
@ SND_1F_CONSTRUCTION_OTHER
29 == 0x1D Construction: other (non-water, non-rail, non-bridge)
Definition sound_type.h:77
static const SpriteID SPR_IMG_PLANTTREES
Definition sprites.h:1259
static const SpriteID SPR_IMG_DYNAMITE
Definition sprites.h:1235
static const SpriteID SPR_IMG_SIGN
Definition sprites.h:1275
static const SpriteID SPR_IMG_TRANSMITTER
Definition sprites.h:1238
static const SpriteID SPR_IMG_BUY_LAND
Definition sprites.h:1276
static const SpriteID SPR_IMG_ROCKS
Definition sprites.h:1236
static const SpriteID SPR_IMG_SHOW_COUNTOURS
Definition sprites.h:1255
static const SpriteID SPR_IMG_TERRAFORM_UP
Definition sprites.h:1233
static const SpriteID SPR_IMG_LEVEL_LAND
Definition sprites.h:1239
static const SpriteID SPR_ARROW_DOWN
Definition sprites.h:85
static const SpriteID SPR_IMG_DESERT
Definition sprites.h:1237
static const SpriteID SPR_ARROW_UP
Definition sprites.h:86
static const SpriteID SPR_IMG_TERRAFORM_DOWN
Definition sprites.h:1234
bool IsBuoyTile(Tile t)
Is tile t a buoy tile?
Definition of base types and functions in a cross-platform compatible way.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
StrongType::Typedef< uint32_t, struct StringIDTag, StrongType::Compare, StrongType::Integer > StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
Class to backup a specific variable and restore it later.
void Restore()
Restore the variable.
Base class for all station-ish types.
T y
Y coordinate.
Dimensions (a width and height) of a rectangle in 2D.
static bool ResetToCurrentNewGRFConfig()
Tries to reset the engine mapping to match the current NewGRF configuration.
Definition engine.cpp:620
List of hotkeys for a window.
Definition hotkeys.h:46
All data for a single hotkey.
Definition hotkeys.h:22
static uint MaxY()
Gets the maximum Y coordinate within the map, including TileType::Void.
Definition map_func.h:298
static uint MaxX()
Gets the maximum X coordinate within the map, including TileType::Void.
Definition map_func.h:289
void ClampToMap()
Clamp the tile area to map borders.
Definition tilearea.cpp:142
uint16_t w
The width of the area.
uint16_t h
The height of the area.
static Pool::IterateWrapper< Company > Iterate(size_t from=0)
Specification of a rectangle with absolute coordinates of all edges.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
void OnPaint() override
The window must be repainted.
WidgetID last_user_action
Last started user action.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
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.
EventState OnCTRLStateChange() override
The state of the control key has changed.
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 OnTimeout() override
Called when this window's timeout has been reached.
static EventState TerraformToolbarEditorGlobalHotkeys(int hotkey)
Handler for global hotkeys of the ScenarioEditorLandscapeGenerationWindow.
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 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 OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
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 OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInit() override
Notification that the nested widget tree gets initialized.
Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number) override
Compute the initial position of the window.
static EventState TerraformToolbarGlobalHotkeys(int hotkey)
Handler for global hotkeys of the TerraformToolbarWindow.
WidgetID last_user_action
Last started user action.
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
High level window description.
Definition window_gui.h:172
Number to differentiate different windows of the same class.
Data structure for an opened window.
Definition window_gui.h:273
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1817
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:792
void RaiseWidgetWhenLowered(WidgetID widget_index)
Marks a widget as raised and dirty (redraw), when it is marked as lowered.
Definition window_gui.h:478
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1807
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:491
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition window.cpp:539
int left
x position of left edge of the window
Definition window_gui.h:309
int top
y position of top edge of the window
Definition window_gui.h:310
WidgetLookup widget_lookup
Indexed access to the nested widget tree. Do not access directly, use Window::GetWidget() instead.
Definition window_gui.h:322
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1841
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:989
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition window.cpp:604
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition window.cpp:579
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:302
Command definitions related to terraforming.
static void PlaceRockyArea(TileIndex end, TileIndex start, bool remove)
Scenario editor command that generates rocky areas.
bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile)
A central place to handle all X_AND_Y dragged GUI functions.
static WindowDesc _scen_edit_land_gen_desc(WindowPosition::Automatic, "toolbar_landscape_scen", 0, 0, WindowClass::ScenarioGenerateLandscape, WindowClass::None, WindowDefaultFlag::Construction, _nested_scen_edit_land_gen_widgets, &ScenarioEditorLandscapeGenerationWindow::hotkeys)
Window definition for the landscaping toolbar for he scenario editor.
static void ResetLandscapeConfirmationCallback(Window *, bool confirmed)
Callback function for the scenario editor 'reset landscape' confirmation window.
void PlaceProc_DemolishArea(TileIndex tile)
Start a drag for demolishing an area.
static WindowDesc _terraform_desc(WindowPosition::Manual, "toolbar_landscape", 0, 0, WindowClass::ScenarioGenerateLandscape, WindowClass::None, WindowDefaultFlag::Construction, _nested_terraform_widgets, &TerraformToolbarWindow::hotkeys)
Window definition for the landscaping toolbar.
Window * ShowEditorTerraformToolbar()
Show the toolbar for terraforming in the scenario editor.
static void PlaceRoughGround(TileIndex end, TileIndex start, bool remove)
Scenario editor command that generates rough land areas.
static void CommonRaiseLowerBigLand(TileIndex tile, bool mode)
Raise/Lower a bigger chunk of land at the same time in the editor.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
static void GenerateDesertArea(TileIndex end, TileIndex start)
Scenario editor command that generates desert areas.
GUI stuff related to terraforming.
Types related to the terraform widgets.
@ WID_ETT_INCREASE_SIZE
Upwards arrow button to increase terraforming size.
@ WID_ETT_PLACE_ROCKS
Place rocks button.
@ WID_ETT_DOTS
Invisible widget for rendering the terraform size on.
@ WID_ETT_PLACE_ROUGH
Place rough land button.
@ WID_ETT_DECREASE_SIZE
Downwards arrow button to decrease terraforming size.
@ WID_ETT_SHOW_PLACE_DESERT
Should the place desert button be shown?
@ WID_ETT_PLACE_OBJECT
Place transmitter button.
@ WID_ETT_PLACE_DESERT
Place desert button (in tropical climate).
@ WID_ETT_NEW_SCENARIO
Button for generating a new scenario.
@ WID_ETT_RESET_LANDSCAPE
Button for removing all company-owned property.
@ WID_ETT_BUTTONS_START
Start of pushable buttons.
@ WID_ETT_LEVEL_LAND
Level land button.
@ WID_ETT_LOWER_LAND
Lower land button.
@ WID_ETT_START
Used for iterations.
@ WID_ETT_RAISE_LAND
Raise land button.
@ WID_ETT_BUTTONS_END
End of pushable buttons.
@ WID_ETT_DEMOLISH
Demolish aka dynamite button.
@ WID_TT_LEVEL_LAND
Level land button.
@ WID_TT_DEMOLISH
Demolish aka dynamite button.
@ WID_TT_SHOW_PLACE_OBJECT
Should the place object button be shown?
@ WID_TT_RAISE_LAND
Raise land button.
@ WID_TT_PLACE_OBJECT
Place object button.
@ WID_TT_PLANT_TREES
Plant trees button (note: opens separate window, no place-push-button).
@ WID_TT_PLACE_SIGN
Place sign button.
@ WID_TT_BUY_LAND
Buy land button.
@ WID_TT_BUTTONS_START
Start of pushable buttons.
@ WID_TT_LOWER_LAND
Lower land button.
Stuff related to the text buffer GUI.
static uint TileHeight(Tile tile)
Returns the height of a tile.
Definition tile_map.h:29
void SetTropicZone(Tile tile, TropicZone type)
Set the tropic zone.
Definition tile_map.h:225
static TileType GetTileType(Tile tile)
Get the tiletype of a given tile.
Definition tile_map.h:96
static constexpr uint MAX_TILE_HEIGHT
Maximum allowed tile height.
Definition tile_type.h:24
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
@ Desert
Tile is desert.
Definition tile_type.h:83
@ Normal
Normal tropiczone.
Definition tile_type.h:82
@ Trees
Tile with one or more trees.
Definition tile_type.h:53
@ Clear
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition tile_type.h:49
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Functions related to tile highlights.
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
Prepare state for highlighting tiles while dragging with the mouse.
@ HT_DIAGONAL
Also allow 'diagonal rectangles'. Only usable in combination with HT_RECT or HT_POINT.
@ HT_POINT
point (lower land, raise land, level land, ...)
@ HT_RECT
rectangle (stations, depots, ...)
Map accessors for tree tiles.
TreeGround GetTreeGround(Tile t)
Returns the groundtype for tree tiles.
Definition tree_map.h:102
@ SnowOrDesert
Snow or desert, depending on landscape.
Definition tree_map.h:55
@ Shore
Shore.
Definition tree_map.h:56
@ RoughSnow
A snow tile that is rough underneath.
Definition tree_map.h:57
@ Grass
Normal grass.
Definition tree_map.h:53
@ Rough
Rough land.
Definition tree_map.h:54
void SetTreeGroundDensity(Tile t, TreeGround g, uint d)
Set the density and ground type of a tile with trees.
Definition tree_map.h:145
uint GetTreeDensity(Tile t)
Returns the 'density' of a tile with trees.
Definition tree_map.h:128
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
void SetRedErrorSquare(TileIndex tile)
Set a tile to display a red error square.
Functions related to (drawing on) viewports.
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects).
@ VPM_X_AND_Y
area of land in X and Y directions
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you've selected it.
@ DDSP_CREATE_DESERT
Fill area with desert.
@ DDSP_CREATE_ROUGH
Fill area with rough land.
@ DDSP_LOWER_AND_LEVEL_AREA
Lower / level area.
@ DDSP_DEMOLISH_AREA
Clear area.
@ DDSP_CREATE_ROCKS
Fill area with rocks.
@ DDSP_RAISE_AND_LEVEL_AREA
Raise / level area.
@ DDSP_LEVEL_AREA
Level area.
@ DDSP_BUILD_OBJECT
Build an object.
static RectPadding ScaleGUITrad(const RectPadding &r)
Scale a RectPadding to GUI zoom level.
Definition widget.cpp:49
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:44
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX).
Definition widget_type.h:57
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX).
Definition widget_type.h:55
@ WWT_CAPTION
Window caption (window title between closebox and stickybox).
Definition widget_type.h:52
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window).
Definition widget_type.h:60
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:37
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:71
@ SZSP_NONE
Display plane with zero size in both directions (none filling and resizing).
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:1204
Window * FindWindowByClass(WindowClass cls)
Find any window by its class.
Definition window.cpp:1176
Point GetToolbarAlignedWindowPosition(int window_width)
Computer the position of the top-left corner of a window to be opened right under the toolbar.
Definition window.cpp:1694
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:3336
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Construction
This window is used for construction; close it whenever changing company.
Definition window_gui.h:155
Twindow * AllocateWindowDescFront(WindowDesc &desc, WindowNumber window_number, Targs... extra_arguments)
Open a new window.
@ Automatic
Find a place automatically.
Definition window_gui.h:146
@ Manual
Manually align the window (so no automatic location finding).
Definition window_gui.h:145
int WidgetID
Widget ID.
Definition window_type.h:21
EventState
State of handling an event.
@ Handled
The passed event is handled.
@ NotHandled
The passed event is not handled.
static constexpr WidgetID INVALID_WIDGET
An invalid widget index.
Definition window_type.h:24
Functions related to zooming.