|
|
@@ -194,7 +194,7 @@ void BaseVehicleListWindow::SortVehicleList() |
|
|
void DepotSortList(VehicleList *list) |
|
|
{ |
|
|
if (list->size() < 2) return; |
|
|
QSortT(list->data(), list->size(), &VehicleNumberSorter); |
|
|
std::sort(list->begin(), list->end(), &VehicleNumberSorter); |
|
|
} |
|
|
|
|
|
/** draw the vehicle profit button in the vehicle list window. */ |
|
|
@@ -1083,125 +1083,125 @@ StringID GetCargoSubtypeText(const Vehicle *v) |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their number */ |
|
|
static int CDECL VehicleNumberSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleNumberSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
return (*a)->unitnumber - (*b)->unitnumber; |
|
|
return a->unitnumber < b->unitnumber; |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their name */ |
|
|
static int CDECL VehicleNameSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleNameSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
static char last_name[2][64]; |
|
|
|
|
|
if (*a != _last_vehicle[0]) { |
|
|
_last_vehicle[0] = *a; |
|
|
SetDParam(0, (*a)->index); |
|
|
if (a != _last_vehicle[0]) { |
|
|
_last_vehicle[0] = a; |
|
|
SetDParam(0, a->index); |
|
|
GetString(last_name[0], STR_VEHICLE_NAME, lastof(last_name[0])); |
|
|
} |
|
|
|
|
|
if (*b != _last_vehicle[1]) { |
|
|
_last_vehicle[1] = *b; |
|
|
SetDParam(0, (*b)->index); |
|
|
if (b != _last_vehicle[1]) { |
|
|
_last_vehicle[1] = b; |
|
|
SetDParam(0, b->index); |
|
|
GetString(last_name[1], STR_VEHICLE_NAME, lastof(last_name[1])); |
|
|
} |
|
|
|
|
|
int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting). |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
return (r != 0) ? r < 0: VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their age */ |
|
|
static int CDECL VehicleAgeSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleAgeSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->age - (*b)->age; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->age - b->age; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by this year profit */ |
|
|
static int CDECL VehicleProfitThisYearSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleProfitThisYearSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = ClampToI32((*a)->GetDisplayProfitThisYear() - (*b)->GetDisplayProfitThisYear()); |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = ClampToI32(a->GetDisplayProfitThisYear() - b->GetDisplayProfitThisYear()); |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by last year profit */ |
|
|
static int CDECL VehicleProfitLastYearSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleProfitLastYearSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = ClampToI32((*a)->GetDisplayProfitLastYear() - (*b)->GetDisplayProfitLastYear()); |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = ClampToI32(a->GetDisplayProfitLastYear() - b->GetDisplayProfitLastYear()); |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their cargo */ |
|
|
static int CDECL VehicleCargoSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleCargoSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
const Vehicle *v; |
|
|
CargoArray diff; |
|
|
|
|
|
/* Append the cargo of the connected waggons */ |
|
|
for (v = *a; v != nullptr; v = v->Next()) diff[v->cargo_type] += v->cargo_cap; |
|
|
for (v = *b; v != nullptr; v = v->Next()) diff[v->cargo_type] -= v->cargo_cap; |
|
|
for (v = a; v != nullptr; v = v->Next()) diff[v->cargo_type] += v->cargo_cap; |
|
|
for (v = b; v != nullptr; v = v->Next()) diff[v->cargo_type] -= v->cargo_cap; |
|
|
|
|
|
int r = 0; |
|
|
for (CargoID i = 0; i < NUM_CARGO; i++) { |
|
|
r = diff[i]; |
|
|
if (r != 0) break; |
|
|
} |
|
|
|
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their reliability */ |
|
|
static int CDECL VehicleReliabilitySorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleReliabilitySorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->reliability - (*b)->reliability; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->reliability - b->reliability; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their max speed */ |
|
|
static int CDECL VehicleMaxSpeedSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleMaxSpeedSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->vcache.cached_max_speed - (*b)->vcache.cached_max_speed; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->vcache.cached_max_speed - b->vcache.cached_max_speed; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by model */ |
|
|
static int CDECL VehicleModelSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleModelSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->engine_type - (*b)->engine_type; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->engine_type - b->engine_type; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their value */ |
|
|
static int CDECL VehicleValueSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleValueSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
const Vehicle *u; |
|
|
Money diff = 0; |
|
|
|
|
|
for (u = *a; u != nullptr; u = u->Next()) diff += u->value; |
|
|
for (u = *b; u != nullptr; u = u->Next()) diff -= u->value; |
|
|
for (u = a; u != nullptr; u = u->Next()) diff += u->value; |
|
|
for (u = b; u != nullptr; u = u->Next()) diff -= u->value; |
|
|
|
|
|
int r = ClampToI32(diff); |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by their length */ |
|
|
static int CDECL VehicleLengthSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleLengthSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->GetGroundVehicleCache()->cached_total_length - (*b)->GetGroundVehicleCache()->cached_total_length; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->GetGroundVehicleCache()->cached_total_length - b->GetGroundVehicleCache()->cached_total_length; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by the time they can still live */ |
|
|
static int CDECL VehicleTimeToLiveSorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleTimeToLiveSorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = ClampToI32(((*a)->max_age - (*a)->age) - ((*b)->max_age - (*b)->age)); |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = ClampToI32((a->max_age - a->age) - (b->max_age - b->age)); |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
/** Sort vehicles by the timetable delay */ |
|
|
static int CDECL VehicleTimetableDelaySorter(const Vehicle * const *a, const Vehicle * const *b) |
|
|
static bool VehicleTimetableDelaySorter(const Vehicle * const &a, const Vehicle * const &b) |
|
|
{ |
|
|
int r = (*a)->lateness_counter - (*b)->lateness_counter; |
|
|
return (r != 0) ? r : VehicleNumberSorter(a, b); |
|
|
int r = a->lateness_counter - b->lateness_counter; |
|
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); |
|
|
} |
|
|
|
|
|
void InitializeGUI() |
|
|
|