OpenTTD Source 20241224-master-gf74b0cf984
vehicle_gui_base.h
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#ifndef VEHICLE_GUI_BASE_H
11#define VEHICLE_GUI_BASE_H
12
13#include "cargo_type.h"
15#include "economy_type.h"
16#include "sortlist_type.h"
17#include "vehicle_base.h"
18#include "vehiclelist.h"
19#include "window_gui.h"
20#include "dropdown_type.h"
21
23
25 VehicleList::const_iterator vehicles_begin;
26 VehicleList::const_iterator vehicles_end;
27
28 GUIVehicleGroup(VehicleList::const_iterator vehicles_begin, VehicleList::const_iterator vehicles_end)
30
31 std::ptrdiff_t NumVehicles() const
32 {
33 return std::distance(this->vehicles_begin, this->vehicles_end);
34 }
35
36 const Vehicle *GetSingleVehicle() const
37 {
38 assert(this->NumVehicles() == 1);
39 return this->vehicles_begin[0];
40 }
41
42 Money GetDisplayProfitThisYear() const
43 {
44 return std::accumulate(this->vehicles_begin, this->vehicles_end, (Money)0, [](Money acc, const Vehicle *v) {
45 return acc + v->GetDisplayProfitThisYear();
46 });
47 }
48
49 Money GetDisplayProfitLastYear() const
50 {
51 return std::accumulate(this->vehicles_begin, this->vehicles_end, (Money)0, [](Money acc, const Vehicle *v) {
52 return acc + v->GetDisplayProfitLastYear();
53 });
54 }
55
56 TimerGameEconomy::Date GetOldestVehicleAge() const
57 {
58 const Vehicle *oldest = *std::max_element(this->vehicles_begin, this->vehicles_end, [](const Vehicle *v_a, const Vehicle *v_b) {
59 return v_a->economy_age < v_b->economy_age;
60 });
61 return oldest->economy_age;
62 }
63};
64
66
68
69 enum GroupBy : uint8_t {
70 GB_NONE,
71 GB_SHARED_ORDERS,
72
73 GB_END,
74 };
75
76 GroupBy grouping;
81 Scrollbar *vscroll;
86 CargoTypes used_cargoes;
87
88 typedef GUIVehicleGroupList::SortFunction VehicleGroupSortFunction;
89 typedef GUIVehicleList::SortFunction VehicleIndividualSortFunction;
90
91 enum ActionDropdownItem {
92 ADI_REPLACE,
93 ADI_SERVICE,
94 ADI_DEPOT,
95 ADI_ADD_SHARED,
96 ADI_REMOVE_ALL,
97 ADI_CREATE_GROUP,
98 };
99
100 static const StringID vehicle_depot_name[];
101 static const std::initializer_list<const StringID> vehicle_group_by_names;
102 static const std::initializer_list<const StringID> vehicle_group_none_sorter_names_calendar;
103 static const std::initializer_list<const StringID> vehicle_group_none_sorter_names_wallclock;
104 static const std::initializer_list<const StringID> vehicle_group_shared_orders_sorter_names_calendar;
105 static const std::initializer_list<const StringID> vehicle_group_shared_orders_sorter_names_wallclock;
106 static const std::initializer_list<VehicleGroupSortFunction * const> vehicle_group_none_sorter_funcs;
107 static const std::initializer_list<VehicleGroupSortFunction * const> vehicle_group_shared_orders_sorter_funcs;
108
110
111 void OnInit() override;
112
113 void UpdateSortingFromGrouping();
114
115 void DrawVehicleListItems(VehicleID selected_vehicle, int line_height, const Rect &r) const;
116 void UpdateVehicleGroupBy(GroupBy group_by);
117 void SortVehicleList();
118 void BuildVehicleList();
119 void SetCargoFilter(uint8_t index);
120 void SetCargoFilterArray();
121 void FilterVehicleList();
122 StringID GetCargoFilterLabel(CargoID cid) const;
126
127 std::span<const StringID> GetVehicleSorterNames();
128
129 std::span<VehicleGroupSortFunction * const> GetVehicleSorterFuncs()
130 {
131 switch (this->grouping) {
132 case GB_NONE:
133 return vehicle_group_none_sorter_funcs;
134 case GB_SHARED_ORDERS:
135 return vehicle_group_shared_orders_sorter_funcs;
136 default:
137 NOT_REACHED();
138 }
139 }
140};
141
143 int left;
144 int right;
145 CargoID cargo_type;
146 uint cargo_cap;
147
148 constexpr CargoIconOverlay(int left, int right, CargoID cargo_type, uint cargo_cap)
149 : left(left), right(right), cargo_type(cargo_type), cargo_cap(cargo_cap)
150 { }
151};
152
154void AddCargoIconOverlay(std::vector<CargoIconOverlay> &overlays, int x, int width, const Vehicle *v);
155void DrawCargoIconOverlay(int x, int y, CargoID cid);
156void DrawCargoIconOverlays(std::span<const CargoIconOverlay> overlays, int y);
157
158uint GetVehicleListHeight(VehicleType type, uint divisor = 1);
159
160struct Sorting {
161 Listing aircraft;
162 Listing roadveh;
163 Listing ship;
164 Listing train;
165};
166
167extern BaseVehicleListWindow::GroupBy _grouping[VLT_END][VEH_COMPANY_END];
168extern Sorting _sorting[BaseVehicleListWindow::GB_END];
169
170#endif /* VEHICLE_GUI_BASE_H */
Types related to cargoes...
uint8_t CargoID
Cargo slots to indicate a cargo type within a game.
Definition cargo_type.h:22
List template of 'things' T to sort in a GUI.
std::conditional_t< std::is_same_v< std::nullptr_t, std::nullptr_t >, bool(const GUIVehicleGroup &, const GUIVehicleGroup &), bool(const GUIVehicleGroup &, const GUIVehicleGroup &, const std::nullptr_t)> SortFunction
Signature of sort function.
Scrollbar data structure.
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.
Types related to the economy.
Base types for having sorted lists in GUIs.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
CargoID cargo_filter_criteria
Selected cargo filter index.
VehicleListIdentifier vli
Identifier of the vehicle list we want to currently show.
void DrawVehicleListItems(VehicleID selected_vehicle, int line_height, const Rect &r) const
Draw all the vehicle list items.
VehicleID vehicle_sel
Selected vehicle.
Listing * sorting
Pointer to the vehicle type related sorting.
void SetCargoFilter(uint8_t index)
Set cargo filter for the vehicle group list.
GroupBy grouping
How we want to group the list.
Dimension GetActionDropdownSize(bool show_autoreplace, bool show_group, bool show_create)
Compute the size for the Action dropdown.
uint order_arrow_width
Width of the arrow in the small order list.
uint8_t unitnumber_digits
The number of digits of the highest unit number.
DropDownList BuildActionDropdownList(bool show_autoreplace, bool show_group, bool show_create)
Display the Action dropdown window.
VehicleList vehicles
List of vehicles. This is the buffer for vehgroups to point into; if this is structurally modified,...
GUIVehicleGroupList vehgroups
List of (groups of) vehicles. This stores iterators of vehicles, and should be rebuilt if vehicles is...
void SetCargoFilterArray()
Populate the filter list and set the cargo filter criteria.
DropDownList BuildCargoDropDownList(bool full) const
Build drop down list for cargo filter selection.
void OnInit() override
Notification that the nested widget tree gets initialized.
void FilterVehicleList()
Filter the engine list against the currently selected cargo filter.
Dimensions (a width and height) of a rectangle in 2D.
VehicleList::const_iterator vehicles_end
Pointer to past-the-end element of this vehicle group.
VehicleList::const_iterator vehicles_begin
Pointer to beginning element of this vehicle group.
Data structure describing how to show the list (what sort direction and criteria).
Specification of a rectangle with absolute coordinates of all edges.
The information about a vehicle list.
Definition vehiclelist.h:28
Vehicle data structure.
Money GetDisplayProfitThisYear() const
Gets the profit vehicle had this year.
TimerGameEconomy::Date economy_age
Age in economy days.
Money GetDisplayProfitLastYear() const
Gets the profit vehicle had last year.
High level window description.
Definition window_gui.h:159
Data structure for an opened window.
Definition window_gui.h:273
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:977
Definition of the game-calendar-timer.
Base class for all vehicles.
uint GetVehicleListHeight(VehicleType type, uint divisor=1)
Get the height of a vehicle in the vehicle list GUIs.
void DrawCargoIconOverlays(std::span< const CargoIconOverlay > overlays, int y)
Draw a list of cargo icon overlays.
void AddCargoIconOverlay(std::vector< CargoIconOverlay > &overlays, int x, int width, const Vehicle *v)
Add a cargo icon to the list of overlays.
bool ShowCargoIconOverlay()
Test if cargo icon overlays should be drawn.
void DrawCargoIconOverlay(int x, int y, CargoID cid)
Draw a cargo icon overlaying an existing sprite, with a black contrast outline.
VehicleType
Available vehicle types.
@ VEH_COMPANY_END
Last company-ownable type.
uint32_t VehicleID
The type all our vehicle IDs have.
Functions and type for generating vehicle lists.
std::vector< const Vehicle * > VehicleList
A list of vehicles.
Definition vehiclelist.h:54
Functions, definitions and such used only by the GUI.
int32_t WindowNumber
Number to differentiate different windows of the same class.