Changeset - r25002:76f645370cb4
[Not reviewed]
master
0 2 0
Didac Perez Parera - 3 years ago 2021-03-08 11:03:11
perez.didac@gmail.com
Add: filter for "engines only" in build train window (#8733)
2 files changed with 26 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/build_vehicle_gui.cpp
Show inline comments
 
@@ -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 */
src/lang/english.txt
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)