# HG changeset patch # User Didac Perez Parera # Date 2021-03-08 11:03:11 # Node ID 76f645370cb4f1d155e48ec14c3a9f9f1cb74bec # Parent eb006c6b0388557780592173bb18be7002f53292 Add: filter for "engines only" in build train window (#8733) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -86,8 +86,9 @@ static const NWidgetPart _nested_build_v }; /** 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 */ diff --git a/src/lang/english.txt b/src/lang/english.txt --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3566,6 +3566,7 @@ STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Refittable to: {GOLD}{STRING2} STR_PURCHASE_INFO_ALL_TYPES :All cargo types STR_PURCHASE_INFO_NONE :None +STR_PURCHASE_INFO_ENGINES_ONLY :Engines only STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles