From 7ba89b946e66ea8b2d7bc17c490c328d5be5f131 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 3 Dec 2023 18:11:08 +0000 Subject: [PATCH] Change: Hide unused cargos from vehicle cargo filter. (#11533) The list of used cargo types is updated when the list is invalidated. --- src/group_gui.cpp | 4 ++-- src/vehicle_gui.cpp | 22 ++++++++++++++++++---- src/vehicle_gui_base.h | 3 ++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 929e01509b..7d89d6afd0 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -424,7 +424,7 @@ public: break; case WID_GL_FILTER_BY_CARGO: - size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList()).width + padding.width); + size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList(true)).width + padding.width); break; case WID_GL_MANAGE_VEHICLES_DROPDOWN: { @@ -665,7 +665,7 @@ public: return; case WID_GL_FILTER_BY_CARGO: // Select filtering criteria dropdown menu - ShowDropDownList(this, this->BuildCargoDropDownList(), this->cargo_filter_criteria, widget); + ShowDropDownList(this, this->BuildCargoDropDownList(false), this->cargo_filter_criteria, widget); break; case WID_GL_ALL_VEHICLES: // All vehicles button diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 51c2c67462..29fa4cd641 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -191,6 +191,14 @@ void BaseVehicleListWindow::BuildVehicleList() GenerateVehicleSortList(&this->vehicles, this->vli); + CargoTypes used = 0; + for (const Vehicle *v : this->vehicles) { + for (const Vehicle *u = v; u != nullptr; u = u->Next()) { + if (u->cargo_cap > 0) SetBit(used, u->cargo_type); + } + } + this->used_cargoes = used; + if (this->grouping == GB_NONE) { uint max_unitnumber = 0; for (auto it = this->vehicles.begin(); it != this->vehicles.end(); ++it) { @@ -371,7 +379,12 @@ StringID BaseVehicleListWindow::GetCargoFilterLabel(CargoID cid) const } } -DropDownList BaseVehicleListWindow::BuildCargoDropDownList() const +/** + * Build drop down list for cargo filter selection. + * @param full If true, build list with all cargo types, instead of only used cargo types. + * @return Drop down list for cargo filter. + */ +DropDownList BaseVehicleListWindow::BuildCargoDropDownList(bool full) const { DropDownList list; @@ -385,7 +398,8 @@ DropDownList BaseVehicleListWindow::BuildCargoDropDownList() const /* Add cargos */ Dimension d = GetLargestCargoIconSize(); for (const CargoSpec *cs : _sorted_cargo_specs) { - list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false)); + if (!full && !HasBit(this->used_cargoes, cs->Index())) continue; + list.push_back(std::make_unique(d, cs->GetCargoIcon(), PAL_NONE, cs->name, cs->Index(), false, !HasBit(this->used_cargoes, cs->Index()))); } return list; @@ -1877,7 +1891,7 @@ public: break; case WID_VL_FILTER_BY_CARGO: - size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList()).width + padding.width); + size->width = std::max(size->width, GetDropDownListDimension(this->BuildCargoDropDownList(true)).width + padding.width); break; case WID_VL_MANAGE_VEHICLES_DROPDOWN: { @@ -2007,7 +2021,7 @@ public: return; case WID_VL_FILTER_BY_CARGO: // Cargo filter dropdown - ShowDropDownList(this, this->BuildCargoDropDownList(), this->cargo_filter_criteria, widget); + ShowDropDownList(this, this->BuildCargoDropDownList(false), this->cargo_filter_criteria, widget); break; case WID_VL_LIST: { // Matrix to show vehicles diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index 3a54805c2c..a20bbd802c 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -90,6 +90,7 @@ struct BaseVehicleListWindow : public Window { VehicleID vehicle_sel; ///< Selected vehicle CargoID cargo_filter_criteria; ///< Selected cargo filter index uint order_arrow_width; ///< Width of the arrow in the small order list. + CargoTypes used_cargoes; typedef GUIVehicleGroupList::SortFunction VehicleGroupSortFunction; typedef GUIVehicleList::SortFunction VehicleIndividualSortFunction; @@ -124,7 +125,7 @@ struct BaseVehicleListWindow : public Window { void SetCargoFilterArray(); void FilterVehicleList(); StringID GetCargoFilterLabel(CargoID cid) const; - DropDownList BuildCargoDropDownList() const; + DropDownList BuildCargoDropDownList(bool full) const; Dimension GetActionDropdownSize(bool show_autoreplace, bool show_group, bool show_create); DropDownList BuildActionDropdownList(bool show_autoreplace, bool show_group, bool show_create);