71 static const StringID _start_replace_dropdown[] = {
72 STR_REPLACE_VEHICLES_NOW,
73 STR_REPLACE_VEHICLES_WHEN_OLD,
106 if ((rvi->railveh_type ==
RAILVEH_WAGON) == show_engines)
return false;
110 if (rvi->railtype != this->sel_railtype)
return false;
124 byte side = draw_left ? 0 : 1;
130 FOR_ALL_ENGINES_OF_TYPE(e, type) {
141 if (e->u.road.
roadtype != this->sel_roadtype)
continue;
158 list->push_back(eid);
159 if (eid == this->sel_engine[side]) selected_engine = eid;
161 this->sel_engine[side] = selected_engine;
175 if (this->engines[0].NeedRebuild()) {
178 this->vscroll[0]->
SetCount((uint)this->engines[0].size());
179 if (this->reset_sel_engine && this->sel_engine[0] ==
INVALID_ENGINE && this->engines[0].size() != 0) {
180 this->sel_engine[0] = this->engines[0][0];
184 if (this->engines[1].NeedRebuild() || e != this->sel_engine[0]) {
188 this->engines[1].clear();
191 if (this->reset_sel_engine && this->sel_engine[0] !=
INVALID_ENGINE) {
198 this->vscroll[1]->
SetCount((uint)this->engines[1].size());
199 if (this->reset_sel_engine && this->sel_engine[1] !=
INVALID_ENGINE) {
201 for (
EngineID &eid : this->engines[1]) {
202 if (eid == this->sel_engine[1])
break;
212 this->reset_sel_engine =
false;
221 EngineID veh_from = this->sel_engine[0];
222 EngineID veh_to = this->sel_engine[1];
231 this->replace_engines =
true;
234 this->reset_sel_engine =
true;
245 widget->
widget_data = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN + vehicletype;
246 widget->
tool_tip = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP + vehicletype;
247 widget->
SetLowered(this->show_hidden_engines);
252 widget->
tool_tip = STR_REPLACE_HELP_RAILTYPE + vehicletype;
258 this->sel_group = id_g;
267 d.height += padding.height;
275 size->height = (this->window_number <=
VEH_ROAD ? 8 : 4) * resize->height;
280 size->height = this->details_height;
289 d.width += padding.width;
290 d.height += padding.height;
298 d.width += padding.width;
299 d.height += padding.height;
320 if (rti->
label == 0)
continue;
329 if (rti->
label == 0)
continue;
334 default: NOT_REACHED();
336 d.width += padding.width;
337 d.height += padding.height;
347 d.width += padding.width;
348 d.height += padding.height;
404 str = STR_REPLACE_NOT_REPLACING;
406 bool when_old =
false;
408 str = when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME;
412 str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED;
423 EngineID end =
min(this->vscroll[side]->GetCapacity() + start, (uint)this->
engines[side].size());
427 &this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group);
469 for (
int side = 0; side < 2; side++) {
539 if (this->GetWidget<NWidgetLeaf>(widget)->ButtonHit(pt)) {
564 size_t engine_count = this->
engines[click_side].size();
569 if (click_side == 0) {
607 default: NOT_REACHED();
656 static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
666 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
669 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
675 NWidget(
WWT_DROPDOWN, COLOUR_GREY,
WID_RV_RAIL_ROAD_TYPE_DROPDOWN),
SetMinimalSize(136, 12),
SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE),
SetFill(1, 0),
SetResize(1, 0),
692 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_LEFT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_LEFT_SCROLLBAR),
694 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_RIGHT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_RIGHT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_RIGHT_SCROLLBAR),
701 NWidget(
WWT_PUSHTXTBTN, COLOUR_GREY,
WID_RV_TRAIN_WAGONREMOVE_TOGGLE),
SetMinimalSize(138, 12),
SetDataTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_HELP),
SetFill(1, 0),
SetResize(1, 0),
714 WDP_AUTO,
"replace_vehicle_train", 500, 140,
717 _nested_replace_rail_vehicle_widgets,
lengthof(_nested_replace_rail_vehicle_widgets)
720 static const NWidgetPart _nested_replace_road_vehicle_widgets[] = {
730 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
733 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
738 NWidget(
WWT_DROPDOWN, COLOUR_GREY,
WID_RV_RAIL_ROAD_TYPE_DROPDOWN),
SetMinimalSize(136, 12),
SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE),
SetFill(1, 0),
SetResize(1, 0),
753 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_LEFT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_LEFT_SCROLLBAR),
755 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_RIGHT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_RIGHT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_RIGHT_SCROLLBAR),
772 WDP_AUTO,
"replace_vehicle_road", 500, 140,
775 _nested_replace_road_vehicle_widgets,
lengthof(_nested_replace_road_vehicle_widgets)
778 static const NWidgetPart _nested_replace_vehicle_widgets[] = {
788 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
791 NWidget(
WWT_LABEL, COLOUR_GREY),
SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP),
SetFill(1, 1),
SetMinimalSize(0, 12),
SetResize(1, 0),
808 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_LEFT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_LEFT_SCROLLBAR),
810 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_RV_RIGHT_MATRIX),
SetMinimalSize(216, 0),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_REPLACE_HELP_RIGHT_ARRAY),
SetResize(1, 1),
SetScrollbar(
WID_RV_RIGHT_SCROLLBAR),
819 NWidget(
WWT_PANEL, COLOUR_GREY,
WID_RV_INFO_TAB),
SetMinimalSize(167, 12),
SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB),
SetResize(1, 0),
EndContainer(),
826 WDP_AUTO,
"replace_vehicle", 456, 118,
829 _nested_replace_vehicle_widgets,
lengthof(_nested_replace_vehicle_widgets)
841 switch (vehicletype) {
842 case VEH_TRAIN: desc = &_replace_rail_vehicle_desc;
break;
843 case VEH_ROAD: desc = &_replace_road_vehicle_desc;
break;
844 default: desc = &_replace_vehicle_desc;
break;
bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
Checks some basic properties whether autoreplace is allowed.
Functions related to OTTD's strings.
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
void RebuildDone()
Notify the sortlist that the rebuild is done.
Functions for NewGRF engines.
void OnDropdownSelect(int widget, int index) override
A dropdown option associated to this window has been selected.
uint GetCompanySettingIndex(const char *name)
Get the index in the _company_settings array of a setting.
static const RailtypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Horizontally center the text.
ResizeInfo resize
Resize information.
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
bool reset_sel_engine
Also reset sel_engine while updating left and/or right and no valid engine selected.
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Window for the autoreplacing of vehicles.
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
High level window description.
uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e)
Get the number of engines with EngineID id_e in the group with GroupID id_g and its sub-groups...
void DrawWidgets() const
Paint all widgets of a window.
static Titem * Get(size_t index)
Returns Titem with given index.
void GenerateReplaceVehList(bool draw_left)
Generate an engines list.
GroupID sel_group
Group selected to replace.
Offset at top to draw the frame rectangular area.
uint16 capacity
Cargo capacity.
void DisplayVehicleSortDropDown(Window *w, VehicleType vehicle_type, int selected, int button)
Display the dropdown for the vehicle sort criteria.
Functions/types related to the road GUIs.
byte _engine_sort_last_criteria[]
Last set sort criteria, for each vehicle type.
Replace vehicle window; Window numbers:
Flag for invalid railtype.
fluid_settings_t * settings
FluidSynth settings handle.
VehicleType
Available vehicle types.
Build vehicle; Window numbers:
Tindex index
Index of this pool item.
flag for invalid roadtype
uint GetEngineListHeight(VehicleType type)
Get the height of a single 'entry' in the engine lists.
bool GenerateReplaceRailList(EngineID e, bool draw_left, bool show_engines)
Figure out if an engine should be added to a list.
void ReInit(int rx=0, int ry=0)
Re-initialize a window, and optionally change its size.
EngList_SortTypeFunction *const _engine_sort_functions[][11]
Sort functions for the vehicle sort criteria, for each vehicle type.
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
RoadType
The different roadtypes we support.
static T max(const T a, const T b)
Returns the maximum of two values.
struct RailtypeInfo::@39 strings
Strings associated with the rail type.
CompanySettings settings
settings specific for each company
void CreateNestedTree(bool fill_nested=true)
Perform the first part of the initialization of a nested widget tree.
Functions related to the vehicle's GUIs.
CargoID GetDefaultCargoType() const
Determines the default cargo type of an engine.
uint16 mail_capacity
Mail capacity if available.
void SetStringParameters(int widget) const override
Initialize string parameters for a widget.
bool descending_sort_order
Order of sorting vehicles.
Functions, definitions and such used only by the GUI.
This struct contains all the info that is needed to draw and construct tracks.
bool _engine_sort_last_order[]
Last set direction of the sort order, for each vehicle type.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, int button, uint width, bool auto_width, bool instant_close)
Show a drop down list.
RoadType roadtype
Road type.
void ForceRebuild()
Force that a rebuild is needed.
StringID replace_text
Text used in the autoreplace GUI.
Data structure for an opened window.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
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...
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
static const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, TestedEngineDetails &te)
Draw the purchase info details of a vehicle at a given location.
This window is used for construction; close it whenever changing company.
RailType sel_railtype
Type of rail tracks selected. INVALID_RAILTYPE to show all.
Extra information about refitted cargo and capacity.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
Functions related to setting/changing the settings.
simple wagon, not motorized
void ReplaceClick_StartReplace(bool replace_when_old)
Handle click on the start replace button.
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
void GenerateLists()
Generate the lists.
bool replace_engines
If true, engines are replaced, if false, wagons are replaced (only for trains).
uint16 GroupID
Type for all group identifiers.
Engine GUI functions, used by build_vehicle_gui and autoreplace_gui
void DrawSortButtonState(int widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
const Scrollbar * GetScrollbar(uint widnum) const
Return the Scrollbar to a widget index.
void OnResize() override
Called after the window got resized.
void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group)
Engine drawing loop.
const StringID _engine_sort_listing[][12]
Dropdown menu strings for the vehicle sort criteria.
static EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group, bool *replace_when_old=nullptr)
Retrieve the engine replacement for the given company and original engine type.
Offset at bottom to draw the frame rectangular area.
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
struct RoadTypeInfo::@42 strings
Strings associated with the rail type.
Right offset of the text of the frame.
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
bool renew_keep_length
sell some wagons if after autoreplace the train is longer than before
EngineID sel_engine[2]
Selected engine left and right.
#define lengthof(x)
Return the length of an fixed size array.
static T min(const T a, const T b)
Returns the minimum of two values.
RailTypeLabel label
Unique 32 bit rail type identifier.
Left offset of the text of the frame.
static bool EngineHasReplacementWhenOldForCompany(const Company *c, EngineID engine, GroupID group)
Check if a company has a replacement set up for the given engine when it gets old.
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
Rebuild the left autoreplace list if an engine is removed or added.
Information about a rail vehicle.
StringID replace_text
Text used in the autoreplace GUI.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
bool IsHidden(CompanyID c) const
Check whether the engine is hidden in the GUI for the given company.
bool _engine_sort_direction
false = descending, true = ascending.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
No window, redirects to WC_MAIN_WINDOW.
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
static const EngineID INVALID_ENGINE
Constant denoting an invalid engine.
bool show_hidden_engines
Whether to show the hidden engines.
static const GroupID DEFAULT_GROUP
Ungrouped vehicles are in this group.
Functions related to companies.
RailType
Enumeration for all possible railtypes.
int details_height
Minimal needed height of the details panels (found so far).
uint16 EngineID
Unique identification number of an engine.
byte sort_criteria
Criteria of sorting vehicles.
void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
Show the autoreplace configuration window for a particular group.
Functions related to the drop down widget.
uint GetDisplayDefaultCapacity(uint16 *mail_capacity=nullptr) const
Determines the default cargo capacity of an engine for display purposes.
void EngList_Sort(GUIEngineList *el, EngList_SortTypeFunction compare)
Sort all items using quick sort and given 'CompareItems' function.
Functions related to commands.
Coordinates of a point in 2D.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Owner owner
The owner of the content shown in this window. Company colour is acquired from this variable...
void HandleButtonClick(byte widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
When an engine is made buildable or is removed from being buildable, add/remove it from the build/aut...
static bool EngineHasReplacementForCompany(const Company *c, EngineID engine, GroupID group)
Check if a company has a replacement set up for the given engine.
Offset at right to draw the frame rectangular area.
RoadType sel_roadtype
Type of road selected. INVALID_ROADTYPE to show all.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Specification of a rectangle with absolute coordinates of all edges.
bool IsShaded() const
Is window shaded currently?
WindowNumber window_number
Window number within the window class.
bool _engine_sort_show_hidden_engines[]
Last set 'show hidden engines' setting for each vehicle type.
static bool EngineNumberSorter(const EngineID &a, const EngineID &b)
Determines order of engines by engineID.
Window functions not directly related to making/drawing windows.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Find a place automatically.
void OnPaint() override
The window must be repainted.
Functions related to autoreplacing.
GUIEngineList engines[2]
Left and right list of engines.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Dimensions (a width and height) of a rectangle in 2D.
Offset at left to draw the frame rectangular area.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
RoadTypeLabel label
Unique 32 bit road type identifier.
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
static const GroupID ALL_GROUP
All vehicles are in this group.