diff options
Diffstat (limited to 'src/vehicle_gui_base.h')
-rw-r--r-- | src/vehicle_gui_base.h | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index 89410b17e..c63d5ec18 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -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 */ |