summaryrefslogtreecommitdiff
path: root/src/build_vehicle_gui.cpp
diff options
context:
space:
mode:
authorDidac Perez Parera <perez.didac@gmail.com>2021-03-08 03:03:11 -0800
committerGitHub <noreply@github.com>2021-03-08 12:03:11 +0100
commit6e2a96c1333a0d383c7a0191c75dabd837feeeb5 (patch)
tree18695bae70f976e0dbab9f84b34584eea40172ca /src/build_vehicle_gui.cpp
parentf70aa8fabe5eabb39a62cc50a3a27ec1c2434ded (diff)
downloadopenttd-6e2a96c1333a0d383c7a0191c75dabd837feeeb5.tar.xz
Add: filter for "engines only" in build train window (#8733)
Diffstat (limited to 'src/build_vehicle_gui.cpp')
-rw-r--r--src/build_vehicle_gui.cpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index 2a986c4a5..58d6ea4e6 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -86,8 +86,9 @@ static const NWidgetPart _nested_build_vehicle_widgets[] = {
};
/** Special cargo filter criteria */
-static const CargoID CF_ANY = CT_NO_REFIT; ///< Show all vehicles independent of carried cargo (i.e. no filtering)
-static const CargoID CF_NONE = CT_INVALID; ///< Show only vehicles which do not carry cargo (e.g. train engines)
+static const CargoID CF_ANY = CT_NO_REFIT; ///< Show all vehicles independent of carried cargo (i.e. no filtering)
+static const CargoID CF_NONE = CT_INVALID; ///< Show only vehicles which do not carry cargo (e.g. train engines)
+static const CargoID CF_ENGINES = CT_AUTO_REFIT; ///< Show only engines (for rail vehicles only)
bool _engine_sort_direction; ///< \c false = descending, \c true = ascending.
byte _engine_sort_last_criteria[] = {0, 0, 0, 0}; ///< Last set sort criteria, for each vehicle type.
@@ -531,16 +532,21 @@ const StringID _engine_sort_listing[][12] = {{
INVALID_STRING_ID
}};
-/** Cargo filter functions */
-static bool CDECL CargoFilter(const EngineID *eid, const CargoID cid)
+/** Filters vehicles by cargo and engine (in case of rail vehicle). */
+static bool CDECL CargoAndEngineFilter(const EngineID *eid, const CargoID cid)
{
- if (cid == CF_ANY) return true;
- CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask;
- return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid));
+ if (cid == CF_ANY) {
+ return true;
+ } else if (cid == CF_ENGINES) {
+ return Engine::Get(*eid)->GetPower() != 0;
+ } else {
+ CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask;
+ return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid));
+ }
}
static GUIEngineList::FilterFunction * const _filter_funcs[] = {
- &CargoFilter,
+ &CargoAndEngineFilter,
};
static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine, TestedEngineDetails &te)
@@ -1046,8 +1052,8 @@ struct BuildVehicleWindow : Window {
EngineID sel_engine; ///< Currently selected engine, or #INVALID_ENGINE
EngineID rename_engine; ///< Engine being renamed.
GUIEngineList eng_list;
- CargoID cargo_filter[NUM_CARGO + 2]; ///< Available cargo filters; CargoID or CF_ANY or CF_NONE
- StringID cargo_filter_texts[NUM_CARGO + 3]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID
+ CargoID cargo_filter[NUM_CARGO + 3]; ///< Available cargo filters; CargoID or CF_ANY or CF_NONE or CF_ENGINES
+ StringID cargo_filter_texts[NUM_CARGO + 4]; ///< Texts for filter_cargo, terminated by INVALID_STRING_ID
byte cargo_filter_criteria; ///< Selected cargo filter
int details_height; ///< Minimal needed height of the details panels (found so far).
Scrollbar *vscroll;
@@ -1165,9 +1171,15 @@ struct BuildVehicleWindow : Window {
this->cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_ALL_TYPES;
filter_items++;
- /* Add item for vehicles not carrying anything, e.g. train engines.
- * This could also be useful for eyecandy vehicles of other types, but is likely too confusing for joe, */
+ /* Specific filters for trains. */
if (this->vehicle_type == VEH_TRAIN) {
+ /* Add item for locomotives only in case of trains. */
+ this->cargo_filter[filter_items] = CF_ENGINES;
+ this->cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_ENGINES_ONLY;
+ filter_items++;
+
+ /* Add item for vehicles not carrying anything, e.g. train engines.
+ * This could also be useful for eyecandy vehicles of other types, but is likely too confusing for joe, */
this->cargo_filter[filter_items] = CF_NONE;
this->cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_NONE;
filter_items++;
@@ -1254,7 +1266,7 @@ struct BuildVehicleWindow : Window {
bool FilterSingleEngine(EngineID eid)
{
CargoID filter_type = this->cargo_filter[this->cargo_filter_criteria];
- return (filter_type == CF_ANY || CargoFilter(&eid, filter_type));
+ return CargoAndEngineFilter(&eid, filter_type);
}
/* Figure out what train EngineIDs to put in the list */