OpenTTD Source 20260421-master-gc2fbc6fdeb
bridge_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 "error.h"
12#include "command_func.h"
13#include "rail.h"
14#include "road.h"
15#include "strings_func.h"
16#include "window_func.h"
17#include "sound_func.h"
18#include "gfx_func.h"
19#include "tunnelbridge.h"
20#include "sortlist_type.h"
21#include "dropdown_func.h"
23#include "tunnelbridge_map.h"
24#include "road_gui.h"
25#include "tunnelbridge_cmd.h"
26
28
29#include "table/strings.h"
30
31#include "safeguards.h"
32
37
42 BridgeType index;
43 const BridgeSpec *spec;
44 Money cost;
45};
46
48
57void CcBuildBridge(Commands, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, RailType, RoadType)
58{
59 if (result.Failed()) return;
60 if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_CONSTRUCTION_BRIDGE, end_tile);
61
62 if (transport_type == TRANSPORT_ROAD) {
63 DiagDirection end_direction = ReverseDiagDir(GetTunnelBridgeDirection(end_tile));
64 ConnectRoadToStructure(end_tile, end_direction);
65
66 DiagDirection start_direction = ReverseDiagDir(GetTunnelBridgeDirection(tile_start));
67 ConnectRoadToStructure(tile_start, start_direction);
68 }
69}
70
72class BuildBridgeWindow : public Window {
73private:
74 /* Runtime saved values */
75 static Listing last_sorting;
76
78 static inline const StringID sorter_names[] = {
79 STR_SORT_BY_NUMBER,
80 STR_SORT_BY_COST,
81 STR_SORT_BY_MAX_SPEED,
82 };
83 static const std::initializer_list<GUIBridgeList::SortFunction * const> sorter_funcs;
84
85 TileIndex start_tile = INVALID_TILE;
86 TileIndex end_tile = INVALID_TILE;
87 TransportType transport_type = INVALID_TRANSPORT;
90 GUIBridgeList bridges{};
91 int icon_width = 0;
92 Scrollbar *vscroll = nullptr;
93
95 static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
96 {
97 return a.index < b.index;
98 }
99
101 static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
102 {
103 return a.cost < b.cost;
104 }
105
107 static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
108 {
109 return a.spec->speed < b.spec->speed;
110 }
111
112 void BuildBridge(BridgeType type)
113 {
114 switch (this->transport_type) {
115 case TRANSPORT_RAIL: _last_railbridge_type = type; break;
116 case TRANSPORT_ROAD: _last_roadbridge_type = type; break;
117 default: break;
118 }
119 Command<Commands::BuildBridge>::Post(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, CcBuildBridge,
120 this->end_tile, this->start_tile, this->transport_type, type, this->railtype, this->roadtype);
121 }
122
125 {
126 this->bridges.Sort();
127
128 /* Display the current sort variant */
130
131 /* Set the modified widgets dirty */
134 }
135
141 std::string GetBridgeSelectString(const BuildBridgeData &bridge_data) const
142 {
143 /* If the bridge has no meaningful speed limit, don't display it. */
144 if (bridge_data.spec->speed == UINT16_MAX) {
145 return _game_mode == GM_EDITOR
146 ? GetString(STR_SELECT_BRIDGE_INFO_NAME, bridge_data.spec->material)
147 : GetString(STR_SELECT_BRIDGE_INFO_NAME_COST, bridge_data.spec->material, bridge_data.cost);
148 }
149
150 uint64_t packed_velocity = PackVelocity(bridge_data.spec->speed, static_cast<VehicleType>(this->transport_type));
151 return _game_mode == GM_EDITOR
152 ? GetString(STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED, bridge_data.spec->material, packed_velocity)
153 : GetString(STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST, bridge_data.spec->material, packed_velocity, bridge_data.cost);
154 }
155
156public:
168 start_tile(start),
169 end_tile(end),
170 transport_type(transport_type),
173 bridges(std::move(bl))
174 {
175 this->CreateNestedTree();
176 this->vscroll = this->GetScrollbar(WID_BBS_SCROLLBAR);
177 /* Change the data, or the caption of the gui. Set it to road or rail, accordingly. */
178 this->GetWidget<NWidgetCore>(WID_BBS_CAPTION)->SetString((transport_type == TRANSPORT_ROAD) ? STR_SELECT_ROAD_BRIDGE_CAPTION : STR_SELECT_RAIL_BRIDGE_CAPTION);
179 this->FinishInitNested(transport_type); // Initializes 'this->icon_width'.
180
181 this->parent = FindWindowById(WC_BUILD_TOOLBAR, transport_type);
184 this->bridges.NeedResort();
185 this->SortBridgeList();
186
187 this->vscroll->SetCount(this->bridges.size());
188 }
189
192 {
194 }
195
196 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
197 {
198 switch (widget) {
201 d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
202 d.height += padding.height;
203 size = maxdim(size, d);
204 break;
205 }
208 d.width += padding.width;
209 d.height += padding.height;
210 size = maxdim(size, d);
211 break;
212 }
213 case WID_BBS_BRIDGE_LIST: {
214 Dimension sprite_dim = {0, 0}; // Biggest bridge sprite dimension
215 Dimension text_dim = {0, 0}; // Biggest text dimension
216 for (const BuildBridgeData &bridge_data : this->bridges) {
217 sprite_dim = maxdim(sprite_dim, GetScaledSpriteSize(bridge_data.spec->sprite));
218 text_dim = maxdim(text_dim, GetStringBoundingBox(GetBridgeSelectString(bridge_data)));
219 }
220 fill.height = resize.height = std::max(sprite_dim.height, text_dim.height) + padding.height; // Max of both sizes + account for matrix edges.
221
222 this->icon_width = sprite_dim.width; // Width of bridge icon.
223 size.width = this->icon_width + WidgetDimensions::scaled.hsep_normal + text_dim.width + padding.width;
224 size.height = 4 * resize.height; // Smallest bridge gui is 4 entries high in the matrix.
225 break;
226 }
227 }
228 }
229
230 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
231 {
232 /* Position the window so hopefully the first bridge from the list is under the mouse pointer. */
234 Point corner; // point of the top left corner of the window.
235 corner.y = Clamp(_cursor.pos.y - list->pos_y - 5, GetMainViewTop(), GetMainViewBottom() - sm_height);
236 corner.x = Clamp(_cursor.pos.x - list->pos_x - 5, 0, _screen.width - sm_width);
237 return corner;
238 }
239
240 void DrawWidget(const Rect &r, WidgetID widget) const override
241 {
242 switch (widget) {
244 this->DrawSortButtonState(widget, this->bridges.IsDescSortOrder() ? SBS_DOWN : SBS_UP);
245 break;
246
247 case WID_BBS_BRIDGE_LIST: {
248 Rect tr = r.WithHeight(this->resize.step_height).Shrink(WidgetDimensions::scaled.matrix);
249 bool rtl = _current_text_dir == TD_RTL;
250 auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->bridges);
251 for (auto it = first; it != last; ++it) {
252 const BridgeSpec *b = it->spec;
253 DrawSpriteIgnorePadding(b->sprite, b->pal, tr.WithWidth(this->icon_width, rtl), SA_HOR_CENTER | SA_BOTTOM);
254 DrawStringMultiLineWithClipping(tr.Indent(this->icon_width + WidgetDimensions::scaled.hsep_normal, rtl), GetBridgeSelectString(*it));
255 tr = tr.Translate(0, this->resize.step_height);
256 }
257 break;
258 }
259 }
260 }
261
262 EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode) override
263 {
264 const uint8_t i = keycode - '1';
265 if (i < 9 && i < this->bridges.size()) {
266 /* Build the requested bridge */
267 this->BuildBridge(this->bridges[i].index);
268 this->Close();
269 return ES_HANDLED;
270 }
271 return ES_NOT_HANDLED;
272 }
273
274 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
275 {
276 switch (widget) {
277 default: break;
278 case WID_BBS_BRIDGE_LIST: {
279 auto it = this->vscroll->GetScrolledItemFromWidget(this->bridges, pt.y, this, WID_BBS_BRIDGE_LIST);
280 if (it != this->bridges.end()) {
281 this->BuildBridge(it->index);
282 this->Close();
283 }
284 break;
285 }
286
288 this->bridges.ToggleSortOrder();
289 this->SetDirty();
290 break;
291
294 break;
295 }
296 }
297
298 void OnDropdownSelect(WidgetID widget, int index, int) override
299 {
300 if (widget == WID_BBS_DROPDOWN_CRITERIA && this->bridges.SortType() != index) {
301 this->bridges.SetSortType(index);
302
303 this->SortBridgeList();
304 }
305 }
306
307 void OnResize() override
308 {
309 this->vscroll->SetCapacityFromWidget(this, WID_BBS_BRIDGE_LIST);
310 }
311};
312
315
317const std::initializer_list<GUIBridgeList::SortFunction * const> BuildBridgeWindow::sorter_funcs = {
321};
322
324static constexpr std::initializer_list<NWidgetPart> _nested_build_bridge_widgets = {
325 /* Header */
328 NWidget(WWT_CAPTION, Colours::DarkGreen, WID_BBS_CAPTION), SetStringTip(STR_SELECT_RAIL_BRIDGE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
330 EndContainer(),
331
334 /* Sort order + criteria buttons */
336 NWidget(WWT_TEXTBTN, Colours::DarkGreen, WID_BBS_DROPDOWN_ORDER), SetFill(1, 0), SetStringTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
338 EndContainer(),
339 /* Matrix. */
340 NWidget(WWT_MATRIX, Colours::DarkGreen, WID_BBS_BRIDGE_LIST), SetFill(1, 0), SetResize(0, 22), SetMatrixDataTip(1, 0, STR_SELECT_BRIDGE_SELECTION_TOOLTIP), SetScrollbar(WID_BBS_SCROLLBAR),
341 EndContainer(),
342
343 /* scrollbar + resize button */
347 EndContainer(),
348 EndContainer(),
349};
350
353 WDP_AUTO, "build_bridge", 200, 114,
357);
358
370void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, RailType railtype, RoadType roadtype)
371{
373
374 /* The bridge length without ramps. */
375 const uint bridge_len = GetTunnelBridgeLength(start, end);
376
377 /* If Ctrl is being pressed, check whether the last bridge built is available
378 * If so, return this bridge type. Otherwise continue normally.
379 * We store bridge types for each transport type, so we have to check for
380 * the transport type beforehand.
381 */
382 BridgeType last_bridge_type = 0;
383 switch (transport_type) {
384 case TRANSPORT_ROAD: last_bridge_type = _last_roadbridge_type; break;
385 case TRANSPORT_RAIL: last_bridge_type = _last_railbridge_type; break;
386 default: break; // water ways and air routes don't have bridge types
387 }
388 if (_ctrl_pressed && CheckBridgeAvailability(last_bridge_type, bridge_len).Succeeded()) {
389 Command<Commands::BuildBridge>::Post(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, CcBuildBridge, end, start, transport_type, last_bridge_type, railtype, roadtype);
390 return;
391 }
392
393 /* only query bridge building possibility once, result is the same for all bridges!
394 * returns CMD_ERROR on failure, and price on success */
395 CommandCost ret = Command<Commands::BuildBridge>::Do(CommandFlagsToDCFlags(GetCommandFlags<Commands::BuildBridge>()) | DoCommandFlag::QueryCost, end, start, transport_type, 0, railtype, roadtype);
396
397 GUIBridgeList bl;
398 if (!ret.Failed()) {
399 /* check which bridges can be built */
400 const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
401
402 Money infra_cost = 0;
403 switch (transport_type) {
404 case TRANSPORT_ROAD: {
405 /* In case we add a new road type as well, we must be aware of those costs. */
406 RoadType road_rt = INVALID_ROADTYPE;
407 RoadType tram_rt = INVALID_ROADTYPE;
408 if (IsBridgeTile(start)) {
409 road_rt = GetRoadTypeRoad(start);
410 tram_rt = GetRoadTypeTram(start);
411 }
412 if (RoadTypeIsRoad(roadtype)) {
413 road_rt = roadtype;
414 } else {
415 tram_rt = roadtype;
416 }
417
418 if (road_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(road_rt);
419 if (tram_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(tram_rt);
420
421 break;
422 }
423 case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost(railtype); break;
424 default: break;
425 }
426
427 bool any_available = false;
428 CommandCost type_check;
429 /* loop for all bridgetypes */
430 for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) {
431 type_check = CheckBridgeAvailability(brd_type, bridge_len);
432 if (type_check.Succeeded()) {
433 /* bridge is accepted, add to list */
434 BuildBridgeData &item = bl.emplace_back();
435 item.index = brd_type;
436 item.spec = GetBridgeSpec(brd_type);
437 /* Add to terraforming & bulldozing costs the cost of the
438 * bridge itself (not computed with DoCommandFlag::QueryCost) */
439 item.cost = ret.GetCost() + (((int64_t)tot_bridgedata_len * _price[Price::BuildBridge] * item.spec->price) >> 8) + infra_cost;
440 any_available = true;
441 }
442 }
443 /* give error cause if no bridges available here*/
444 if (!any_available) ret = std::move(type_check);
445 }
446
447 if (!bl.empty()) {
448 new BuildBridgeWindow(_build_bridge_desc, start, end, transport_type, railtype, roadtype, std::move(bl));
449 } else {
450 ShowErrorMessage(GetEncodedString(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE), TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE, ret);
451 }
452}
int CalcBridgeLenCostFactor(int x)
Calculate the price factor for building a long bridge.
const BridgeSpec * GetBridgeSpec(BridgeType i)
Get the specification of a bridge type.
Definition bridge.h:60
static const uint MAX_BRIDGES
Maximal number of available bridge specs.
Definition bridge.h:18
CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoCommandFlags flags={})
Is a bridge of the specified type and length available?
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, RailType railtype, RoadType roadtype)
Prepare the data for the build a bridge window.
GUIList< BuildBridgeData > GUIBridgeList
List of bridges, used in BuildBridgeWindow.
static BridgeType _last_railbridge_type
The type of the last built rail bridge.
static WindowDesc _build_bridge_desc(WDP_AUTO, "build_bridge", 200, 114, WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR, WindowDefaultFlag::Construction, _nested_build_bridge_widgets)
Window definition for the rail bridge selection window.
void CcBuildBridge(Commands, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, RailType, RoadType)
Callback executed after a build Bridge CMD has been called.
static constexpr std::initializer_list< NWidgetPart > _nested_build_bridge_widgets
Widgets of the bridge gui.
static BridgeType _last_roadbridge_type
The type of the last built road bridge.
bool IsBridgeTile(Tile t)
checks if there is a bridge on this tile
Definition bridge_map.h:35
uint BridgeType
Bridge spec number.
Definition bridge_type.h:15
Types related to the bridge widgets.
@ WID_BBS_DROPDOWN_CRITERIA
Criteria of sort dropdown.
@ WID_BBS_BRIDGE_LIST
List of bridges.
@ WID_BBS_DROPDOWN_ORDER
Direction of sort dropdown.
@ WID_BBS_SCROLLBAR
Scrollbar of the list.
@ WID_BBS_CAPTION
Caption of the window.
Window class for handling the bridge-build GUI.
void OnResize() override
Called after the window got resized.
void SortBridgeList()
Sort the builable bridges.
RoadType roadtype
Road type to build if building a road bridge.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
std::string GetBridgeSelectString(const BuildBridgeData &bridge_data) const
Get the StringID to draw in the selection list and set the appropriate DParams.
static const StringID sorter_names[]
Strings describing how bridges are sorted.
static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their price.
RailType railtype
Rail type to build if building a rail bridge.
EventState OnKeyPress(char32_t key, uint16_t keycode) override
A key has been pressed.
~BuildBridgeWindow() override
Save the last sorting state.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number) override
Compute the initial position of the window.
static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their maximum speed.
static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their index.
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.
static const std::initializer_list< GUIBridgeList::SortFunction *const > sorter_funcs
Functions to sort bridges.
static Listing last_sorting
Last setting of the sort.
BuildBridgeWindow(WindowDesc &desc, TileIndex start, TileIndex end, TransportType transport_type, RailType railtype, RoadType roadtype, GUIBridgeList &&bl)
Create this BuildBridgeWindoow.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
int icon_width
Scaled width of the the bridge icon sprite.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
Money GetCost() const
The costs as made up to this moment.
bool Failed() const
Did this command fail?
List template of 'things' T to sort in a GUI.
void SetListing(Listing l)
Import sort conditions.
bool IsDescSortOrder() const
Check if the sort order is descending.
void ToggleSortOrder()
Toggle the sort order Since that is the worst condition for the sort function reverse the list here.
bool Sort(Comp compare)
Sort the list.
uint8_t SortType() const
Get the sorttype of the list.
Listing GetListing() const
Export current sort conditions.
void SetSortFuncs(std::span< SortFunction *const > n_funcs)
Hand the sort function pointers to the GUIList.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0.
void SetSortType(uint8_t n_type)
Set the sorttype of the list.
Baseclass for nested widgets.
int pos_y
Vertical position of top-left corner of the widget in the window.
int pos_x
Horizontal position of top-left corner of the widget in the window.
Scrollbar data structure.
void SetCount(size_t num)
Sets the number of elements in the list.
auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Return an iterator pointing to the element of a scrolled widget that a user clicked in.
void SetCapacityFromWidget(Window *w, WidgetID widget, int padding=0)
Set capacity of visible elements from the size and resize properties of a widget.
Definition widget.cpp:2532
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
CommandFlags GetCommandFlags(Commands cmd)
Get the command flags associated with the given command.
Definition command.cpp:113
Functions related to commands.
static constexpr DoCommandFlags CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
@ QueryCost
query cost only, don't build.
Commands
List of commands.
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
DiagDirection
Enumeration for diagonal directions.
void ShowDropDownMenu(Window *w, std::span< const StringID > strings, int selected, WidgetID button, uint32_t disabled_mask, uint32_t hidden_mask, uint width, DropDownOptions options, std::string *const persistent_filter_text)
Show a dropdown menu window near a widget of the parent window.
Definition dropdown.cpp:629
Functions related to the drop down widget.
Prices _price
Prices and also the fractional part.
Definition economy.cpp:106
@ BuildBridge
Price for building bridges.
Functions related to errors.
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, CommandCost &cc)
Display an error message in a window.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:900
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition gfx.cpp:939
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:39
bool DrawStringMultiLineWithClipping(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw a multiline string, possibly over multiple lines, if the region is within the current display cl...
Definition gfx.cpp:873
Functions related to the gfx engine.
Dimension GetScaledSpriteSize(SpriteID sprid)
Scale sprite size for GUI.
Definition widget.cpp:70
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:389
@ SA_BOTTOM
Bottom align the text.
Definition gfx_type.h:395
@ DarkGreen
Dark green.
Definition gfx_type.h:292
constexpr NWidgetPart SetMatrixDataTip(uint32_t cols, uint32_t rows, StringID tip={})
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
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.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Definition window.cpp:980
#define Point
Macro that prevents name conflicts between included headers.
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
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Rail specific functions.
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition rail.h:429
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
@ INVALID_RAILTYPE
Flag for invalid railtype.
Definition rail_type.h:32
Road specific functions.
Money RoadBuildCost(RoadType roadtype)
Returns the cost of building the specified roadtype.
Definition road.h:240
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction)
If required, connects a new structure to an existing road or tram by building the missing roadbit.
Definition road_gui.cpp:167
Functions/types related to the road GUIs.
RoadType GetRoadTypeRoad(Tile t)
Get the road type for RoadTramType being RoadTramType::Road.
Definition road_map.h:152
RoadType GetRoadTypeTram(Tile t)
Get the road type for RoadTramType being RoadTramType::Tram.
Definition road_map.h:163
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:28
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
Base types for having sorted lists in GUIs.
Functions related to sound.
@ SND_27_CONSTRUCTION_BRIDGE
37 == 0x25 Construction: bridge
Definition sound_type.h:85
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
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
int64_t PackVelocity(uint speed, VehicleType type)
Pack velocity and vehicle type for use with SCC_VELOCITY string parameter.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
Struct containing information about a single bridge type.
Definition bridge.h:27
uint16_t price
the price multiplier
Definition bridge.h:38
PaletteID pal
the palette which is used in the GUI
Definition bridge.h:41
StringID material
the string that contains the bridge description
Definition bridge.h:42
SpriteID sprite
the sprite which is used in the GUI
Definition bridge.h:40
uint16_t speed
maximum travel speed (1 unit = 1/1.6 mph = 1 km-ish/h)
Definition bridge.h:39
Carriage for the data we need if we want to build a bridge.
T y
Y coordinate.
T x
X coordinate.
Dimensions (a width and height) of a rectangle in 2D.
Data structure describing how to show the list (what sort direction and criteria).
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
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 Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
High level window description.
Definition window_gui.h:168
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1117
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
Definition widget.cpp:835
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1822
Window * parent
Parent window.
Definition window_gui.h:329
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:570
void DrawSortButtonState(WidgetID widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
Definition widget.cpp:818
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1812
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1846
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:990
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition window.cpp:327
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:303
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
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:100
static constexpr uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
TransportType
Available types of transport.
@ TRANSPORT_RAIL
Transport by train.
@ INVALID_TRANSPORT
Sentinel for invalid transport types.
@ TRANSPORT_ROAD
Transport by road vehicle.
Header file for things common for tunnels and bridges.
uint GetTunnelBridgeLength(TileIndex begin, TileIndex end)
Calculates the length of a tunnel or a bridge (without end tiles).
Command definitions related to tunnels and bridges.
Functions that have tunnels and bridges in common.
DiagDirection GetTunnelBridgeDirection(Tile t)
Get the direction pointing to the other end.
VehicleType
Available vehicle types.
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:44
@ WWT_MATRIX
Grid of rows and columns.
Definition widget_type.h:50
@ WWT_CAPTION
Window caption (window title between closebox and stickybox).
Definition widget_type.h:52
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:76
@ 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_RESIZEBOX
Resize box (normally at bottom-right of a window).
Definition widget_type.h:59
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX).
Definition widget_type.h:56
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:61
int GetMainViewTop()
Return the top of the main view available for general use.
Definition window.cpp:2153
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1222
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Definition window.cpp:2164
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition window.cpp:1166
Window functions not directly related to making/drawing windows.
@ Construction
This window is used for construction; close it whenever changing company.
Definition window_gui.h:153
@ SBS_DOWN
Sort ascending.
Definition window_gui.h:219
@ SBS_UP
Sort descending.
Definition window_gui.h:220
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:144
int WidgetID
Widget ID.
Definition window_type.h:21
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition window_type.h:79
@ WC_BUILD_BRIDGE
Build bridge; Window numbers: