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
 
@@ -83,14 +83,15 @@ static const NWidgetPart _nested_build_v
 
		NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_RENAME), SetResize(1, 0), SetFill(1, 0),
 
		NWidget(WWT_RESIZEBOX, COLOUR_GREY),
 
	EndContainer(),
 
};
 

	
 
/** 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.
 
bool _engine_sort_last_order[]          = {false, false, false, false}; ///< Last set direction of the sort order, for each vehicle type.
 
bool _engine_sort_show_hidden_engines[] = {false, false, false, false}; ///< Last set 'show hidden engines' setting for each vehicle type.
 
static CargoID _engine_sort_last_cargo_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY}; ///< Last set filter criteria, for each vehicle type.
 
@@ -528,22 +529,27 @@ const StringID _engine_sort_listing[][12
 
	STR_SORT_BY_RELIABILITY,
 
	STR_SORT_BY_CARGO_CAPACITY,
 
	STR_SORT_BY_RANGE,
 
	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)
 
{
 
	CargoArray cap;
 
	CargoTypes refits;
 
@@ -1043,14 +1049,14 @@ struct BuildVehicleWindow : Window {
 
	byte sort_criteria;                         ///< Current sort criterium.
 
	bool show_hidden_engines;                   ///< State of the 'show hidden engines' button.
 
	bool listview_mode;                         ///< If set, only display the available vehicles and do not show a 'build' button.
 
	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;
 
	TestedEngineDetails te;                     ///< Tested cost and capacity after refit.
 

	
 
	void SetBuyVehicleText()
 
@@ -1162,15 +1168,21 @@ struct BuildVehicleWindow : Window {
 

	
 
		/* Add item for disabling filtering. */
 
		this->cargo_filter[filter_items] = CF_ANY;
 
		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++;
 
		}
 

	
 
		/* Collect available cargo types for filtering. */
 
@@ -1251,13 +1263,13 @@ struct BuildVehicleWindow : Window {
 
	}
 

	
 
	/** Filter a single engine */
 
	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 */
 
	void GenerateBuildTrainList()
 
	{
 
		EngineID sel_id = INVALID_ENGINE;
src/lang/english.txt
Show inline comments
 
@@ -3563,12 +3563,13 @@ STR_PURCHASE_INFO_COST_SPEED            
 
STR_PURCHASE_INFO_COST_REFIT_SPEED                              :{BLACK}Cost: {GOLD}{CURRENCY_LONG}{BLACK} (Refit Cost: {GOLD}{CURRENCY_LONG}{BLACK}) Speed: {GOLD}{VELOCITY}
 
STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Capacity: {GOLD}{CARGO_LONG}, {CARGO_LONG}
 
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}Powered Wagons: {GOLD}+{POWER}{BLACK} Weight: {GOLD}+{WEIGHT_SHORT}
 
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
 
STR_PURCHASE_INFO_AIRCRAFT_TYPE                                 :{BLACK}Aircraft type: {GOLD}{STRING}
 

	
 
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP                              :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click for toggling hiding of the vehicle type
0 comments (0 inline, 0 general)