Codechange: Make vehicle lists internally support grouping of vehicles
This is in preparation for the new UI feature that allows grouping by shared orders.
This commit is contained in:
		 Bernard Teo
					Bernard Teo
				
			
				
					committed by
					
						 Patric Stout
						Patric Stout
					
				
			
			
				
	
			
			
			 Patric Stout
						Patric Stout
					
				
			
						parent
						
							86e08aa8ef
						
					
				
				
					commit
					584df548f1
				
			| @@ -10,19 +10,59 @@ | ||||
| #ifndef VEHICLE_GUI_BASE_H | ||||
| #define VEHICLE_GUI_BASE_H | ||||
|  | ||||
| #include "core/smallvec_type.hpp" | ||||
| #include "date_type.h" | ||||
| #include "economy_type.h" | ||||
| #include "sortlist_type.h" | ||||
| #include "vehiclelist.h" | ||||
| #include "window_gui.h" | ||||
| #include "widgets/dropdown_type.h" | ||||
|  | ||||
| #include <iterator> | ||||
|  | ||||
| typedef GUIList<const Vehicle*> GUIVehicleList; | ||||
|  | ||||
| struct GUIVehicleGroup { | ||||
| 	VehicleList::const_iterator vehicles_begin;    ///< Pointer to beginning element of this vehicle group. | ||||
| 	VehicleList::const_iterator vehicles_end;      ///< Pointer to past-the-end element of this vehicle group. | ||||
| 	Money display_profit_this_year;                ///< Total profit for the vehicle group this year. | ||||
| 	Money display_profit_last_year;                ///< Total profit for the vehicle group laste year. | ||||
| 	Date age;                                      ///< Age in days of oldest vehicle in the group. | ||||
|  | ||||
| 	GUIVehicleGroup(VehicleList::const_iterator vehicles_begin, VehicleList::const_iterator vehicles_end, Money display_profit_this_year, Money display_profit_last_year, Date age) | ||||
| 		: vehicles_begin(vehicles_begin), vehicles_end(vehicles_end), display_profit_this_year(display_profit_this_year), display_profit_last_year(display_profit_last_year), age(age) {} | ||||
|  | ||||
| 	std::ptrdiff_t NumVehicles() const | ||||
| 	{ | ||||
| 		return std::distance(vehicles_begin, vehicles_end); | ||||
| 	} | ||||
| 	const Vehicle *GetSingleVehicle() const | ||||
| 	{ | ||||
| 		assert(NumVehicles() == 1); | ||||
| 		return vehicles_begin[0]; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| typedef GUIList<GUIVehicleGroup> GUIVehicleGroupList; | ||||
|  | ||||
| struct BaseVehicleListWindow : public Window { | ||||
| 	GUIVehicleList vehicles;  ///< The list of vehicles | ||||
| 	Listing *sorting;         ///< Pointer to the vehicle type related sorting. | ||||
| 	byte unitnumber_digits;   ///< The number of digits of the highest unit number | ||||
|  | ||||
| 	enum GroupBy : byte { | ||||
| 		GB_NONE, | ||||
|  | ||||
| 		GB_END, | ||||
| 	}; | ||||
|  | ||||
| 	GroupBy grouping;                         ///< How we want to group the list. | ||||
| 	VehicleList vehicles;                     ///< List of vehicles.  This is the buffer for `vehgroups` to point into; if this is structurally modified, `vehgroups` must be rebuilt. | ||||
| 	GUIVehicleGroupList vehgroups;            ///< List of (groups of) vehicles.  This stores iterators of `vehicles`, and should be rebuilt if `vehicles` is structurally changed. | ||||
| 	Listing *sorting;                         ///< Pointer to the vehicle type related sorting. | ||||
| 	byte unitnumber_digits;                   ///< The number of digits of the highest unit number. | ||||
| 	Scrollbar *vscroll; | ||||
| 	VehicleListIdentifier vli; ///< Identifier of the vehicle list we want to currently show. | ||||
| 	VehicleListIdentifier vli;                ///< Identifier of the vehicle list we want to currently show. | ||||
|  | ||||
| 	typedef GUIVehicleGroupList::SortFunction VehicleGroupSortFunction; | ||||
| 	typedef GUIVehicleList::SortFunction VehicleIndividualSortFunction; | ||||
|  | ||||
| 	enum ActionDropdownItem { | ||||
| 		ADI_REPLACE, | ||||
| @@ -33,19 +73,32 @@ struct BaseVehicleListWindow : public Window { | ||||
| 	}; | ||||
|  | ||||
| 	static const StringID vehicle_depot_name[]; | ||||
| 	static const StringID vehicle_sorter_names[]; | ||||
| 	static GUIVehicleList::SortFunction * const vehicle_sorter_funcs[]; | ||||
| 	static const StringID vehicle_group_by_names[]; | ||||
| 	static const StringID vehicle_group_none_sorter_names[]; | ||||
| 	static const StringID vehicle_group_shared_orders_sorter_names[]; | ||||
| 	static VehicleGroupSortFunction * const vehicle_group_none_sorter_funcs[]; | ||||
| 	static VehicleGroupSortFunction * const vehicle_group_shared_orders_sorter_funcs[]; | ||||
|  | ||||
| 	BaseVehicleListWindow(WindowDesc *desc, WindowNumber wno) : Window(desc), vli(VehicleListIdentifier::UnPack(wno)) | ||||
| 	{ | ||||
| 		this->vehicles.SetSortFuncs(this->vehicle_sorter_funcs); | ||||
| 	} | ||||
| 	BaseVehicleListWindow(WindowDesc *desc, WindowNumber wno); | ||||
|  | ||||
| 	void UpdateSortingFromGrouping(); | ||||
|  | ||||
| 	void DrawVehicleListItems(VehicleID selected_vehicle, int line_height, const Rect &r) const; | ||||
| 	void UpdateVehicleGroupBy(GroupBy group_by); | ||||
| 	void SortVehicleList(); | ||||
| 	void BuildVehicleList(); | ||||
| 	Dimension GetActionDropdownSize(bool show_autoreplace, bool show_group); | ||||
| 	DropDownList BuildActionDropdownList(bool show_autoreplace, bool show_group); | ||||
|  | ||||
| 	const StringID *GetVehicleSorterNames() | ||||
| 	{ | ||||
| 		return vehicle_group_none_sorter_names; | ||||
| 	} | ||||
|  | ||||
| 	VehicleGroupSortFunction * const *GetVehicleSorterFuncs() | ||||
| 	{ | ||||
| 		return vehicle_group_none_sorter_funcs; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| uint GetVehicleListHeight(VehicleType type, uint divisor = 1); | ||||
| @@ -57,6 +110,7 @@ struct Sorting { | ||||
| 	Listing train; | ||||
| }; | ||||
|  | ||||
| extern Sorting _sorting; | ||||
| extern BaseVehicleListWindow::GroupBy _grouping[VLT_END][VEH_COMPANY_END]; | ||||
| extern Sorting _sorting[BaseVehicleListWindow::GB_END]; | ||||
|  | ||||
| #endif /* VEHICLE_GUI_BASE_H */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user