diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 60a6323eab..ae20b3d5e5 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -388,7 +388,7 @@ private: } public: - VehicleGroupWindow(WindowDesc &desc, WindowNumber window_number) : BaseVehicleListWindow(desc, window_number) + VehicleGroupWindow(WindowDesc &desc, WindowNumber window_number, const VehicleListIdentifier &vli) : BaseVehicleListWindow(desc, vli) { this->CreateNestedTree(); @@ -1190,8 +1190,8 @@ static void ShowCompanyGroupInternal(CompanyID company, VehicleType vehicle_type if (!Company::IsValidID(company)) return; assert(vehicle_type < std::size(_vehicle_group_desc)); - const WindowNumber num = VehicleListIdentifier(VL_GROUP_LIST, vehicle_type, company).Pack(); - VehicleGroupWindow *w = AllocateWindowDescFront(_vehicle_group_desc[vehicle_type], num); + VehicleListIdentifier vli(VL_GROUP_LIST, vehicle_type, company); + VehicleGroupWindow *w = AllocateWindowDescFront(_vehicle_group_desc[vehicle_type], vli.Pack(), vli); if (w != nullptr) w->SelectGroup(group); } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 8fcee1f9ec..8cb28a5ffd 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -162,7 +162,7 @@ const StringID BaseVehicleListWindow::vehicle_depot_name[] = { STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR }; -BaseVehicleListWindow::BaseVehicleListWindow(WindowDesc &desc, WindowNumber wno) : Window(desc), vli(VehicleListIdentifier::UnPack(wno)) +BaseVehicleListWindow::BaseVehicleListWindow(WindowDesc &desc, const VehicleListIdentifier &vli) : Window(desc), vli(vli) { this->vehicle_sel = INVALID_VEHICLE; this->grouping = _grouping[vli.type][vli.vtype]; @@ -1924,12 +1924,7 @@ void BaseVehicleListWindow::UpdateVehicleGroupBy(GroupBy group_by) /** * Window for the (old) vehicle listing. - * - * bitmask for w->window_number - * 0-7 CompanyID (owner) - * 8-10 window type (use flags in vehicle_gui.h) - * 11-15 vehicle type (using VEH_, but can be compressed to fewer bytes if needed) - * 16-31 StationID or OrderID depending on window type (bit 8-10) + * See #VehicleListIdentifier::Pack for the contents of the window number. */ struct VehicleListWindow : public BaseVehicleListWindow { private: @@ -1946,7 +1941,7 @@ private: }; public: - VehicleListWindow(WindowDesc &desc, WindowNumber window_number) : BaseVehicleListWindow(desc, window_number) + VehicleListWindow(WindowDesc &desc, WindowNumber window_number, const VehicleListIdentifier &vli) : BaseVehicleListWindow(desc, vli) { this->CreateNestedTree(); @@ -2332,8 +2327,8 @@ static void ShowVehicleListWindowLocal(CompanyID company, VehicleListType vlt, V if (!Company::IsValidID(company) && company != OWNER_NONE) return; assert(vehicle_type < std::size(_vehicle_list_desc)); - WindowNumber num = VehicleListIdentifier(vlt, vehicle_type, company, unique_number).Pack(); - AllocateWindowDescFront(_vehicle_list_desc[vehicle_type], num); + VehicleListIdentifier vli(vlt, vehicle_type, company, unique_number); + AllocateWindowDescFront(_vehicle_list_desc[vehicle_type], vli.Pack(), vli); } void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type) diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index ef9989c420..74dd2ef43e 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -106,7 +106,7 @@ struct BaseVehicleListWindow : public Window { static const std::initializer_list vehicle_group_none_sorter_funcs; static const std::initializer_list vehicle_group_shared_orders_sorter_funcs; - BaseVehicleListWindow(WindowDesc &desc, WindowNumber wno); + BaseVehicleListWindow(WindowDesc &desc, const VehicleListIdentifier &vli); void OnInit() override; diff --git a/src/window_gui.h b/src/window_gui.h index 6e829652c3..f1c67bb7d3 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -1006,14 +1006,15 @@ Window *BringWindowToFrontById(WindowClass cls, ConvertibleThroughBase auto numb * @tparam Treturn_existing If set, also return the window if it already existed. * @param desc The pointer to the WindowDesc to be created * @param window_number the window number of the new window + * @param extra_arguments optional extra arguments to pass to the window's constructor. * @return %Window pointer of the newly created window, or the existing one if \a Treturn_existing is set, or \c nullptr. */ -template -Twindow *AllocateWindowDescFront(WindowDesc &desc, WindowNumber window_number) +template +Twindow *AllocateWindowDescFront(WindowDesc &desc, WindowNumber window_number, Targs... extra_arguments) { Twindow *w = static_cast(BringWindowToFrontById(desc.cls, window_number)); if (w != nullptr) return Treturn_existing ? w : nullptr; - return new Twindow(desc, window_number); + return new Twindow(desc, window_number, std::forward(extra_arguments)...); } void RelocateAllWindows(int neww, int newh);