Fix #10377, Fix 94167df: bad sorting of rail vehicles when primary variant is missing

This commit is contained in:
Rubidium 2023-01-19 20:07:10 +01:00 committed by Michael Lutz
parent 52319891ce
commit f88766c976
3 changed files with 6 additions and 11 deletions

View File

@ -1333,8 +1333,7 @@ struct BuildVehicleWindow : Window {
{ {
std::vector<EngineID> variants; std::vector<EngineID> variants;
EngineID sel_id = INVALID_ENGINE; EngineID sel_id = INVALID_ENGINE;
int num_engines = 0; size_t num_engines = 0;
int num_wagons = 0;
list.clear(); list.clear();
@ -1355,12 +1354,7 @@ struct BuildVehicleWindow : Window {
list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); list.emplace_back(eid, e->info.variant_id, e->display_flags, 0);
if (rvi->railveh_type != RAILVEH_WAGON) { if (rvi->railveh_type != RAILVEH_WAGON) num_engines++;
num_engines++;
} else {
num_wagons++;
}
if (e->info.variant_id != eid && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id); if (e->info.variant_id != eid && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id);
if (eid == this->sel_engine) sel_id = eid; if (eid == this->sel_engine) sel_id = eid;
} }
@ -1370,6 +1364,7 @@ struct BuildVehicleWindow : Window {
if (std::find(list.begin(), list.end(), variant) == list.end()) { if (std::find(list.begin(), list.end(), variant) == list.end()) {
const Engine *e = Engine::Get(variant); const Engine *e = Engine::Get(variant);
list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0); list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlags::Shaded, 0);
if (e->u.rail.railveh_type != RAILVEH_WAGON) num_engines++;
} }
} }
@ -1387,7 +1382,7 @@ struct BuildVehicleWindow : Window {
EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], 0, num_engines); EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], 0, num_engines);
/* and finally sort wagons */ /* and finally sort wagons */
EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], num_engines, num_wagons); EngList_SortPartial(&list, _engine_sort_functions[0][this->sort_criteria], num_engines, list.size() - num_engines);
} }
/* Figure out what road vehicle EngineIDs to put in the list */ /* Figure out what road vehicle EngineIDs to put in the list */

View File

@ -337,7 +337,7 @@ void EngList_Sort(GUIEngineList *el, EngList_SortTypeFunction compare)
* @param begin start of sorting * @param begin start of sorting
* @param num_items count of items to be sorted * @param num_items count of items to be sorted
*/ */
void EngList_SortPartial(GUIEngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items) void EngList_SortPartial(GUIEngineList *el, EngList_SortTypeFunction compare, size_t begin, size_t num_items)
{ {
if (num_items < 2) return; if (num_items < 2) return;
assert(begin < el->size()); assert(begin < el->size());

View File

@ -32,7 +32,7 @@ typedef GUIList<GUIEngineListItem, CargoID> GUIEngineList;
typedef bool EngList_SortTypeFunction(const GUIEngineListItem&, const GUIEngineListItem&); ///< argument type for #EngList_Sort. typedef bool EngList_SortTypeFunction(const GUIEngineListItem&, const GUIEngineListItem&); ///< argument type for #EngList_Sort.
void EngList_Sort(GUIEngineList *el, EngList_SortTypeFunction compare); void EngList_Sort(GUIEngineList *el, EngList_SortTypeFunction compare);
void EngList_SortPartial(GUIEngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items); void EngList_SortPartial(GUIEngineList *el, EngList_SortTypeFunction compare, size_t begin, size_t num_items);
StringID GetEngineCategoryName(EngineID engine); StringID GetEngineCategoryName(EngineID engine);
StringID GetEngineInfoString(EngineID engine); StringID GetEngineInfoString(EngineID engine);