# HG changeset patch # User rubidium # Date 1208516291 0 # Node ID a7ffe39edea9d6d45c2c223e79bdde364d1c8b93 # Parent c08376c16fb2597de5278412debc0b2debef2fd6 (svn r12766) -Add: sorting by road vehicle/train length. Based on a patch by Sir Bob. diff -r c08376c16fb2 -r a7ffe39edea9 src/group_gui.cpp --- a/src/group_gui.cpp Fri Apr 18 10:16:51 2008 +0000 +++ b/src/group_gui.cpp Fri Apr 18 10:58:11 2008 +0000 @@ -523,7 +523,7 @@ break; case GRP_WIDGET_SORT_BY_DROPDOWN: // Select sorting criteria dropdown menu - ShowDropDownMenu(w, _vehicle_sort_listing, gv->l.sort_type, GRP_WIDGET_SORT_BY_DROPDOWN, 0, 0); + ShowDropDownMenu(w, _vehicle_sort_listing, gv->l.sort_type, GRP_WIDGET_SORT_BY_DROPDOWN, 0, (gv->vehicle_type == VEH_TRAIN || gv->vehicle_type == VEH_ROAD) ? 0 : (1 << 10)); return; case GRP_WIDGET_ALL_VEHICLES: // All vehicles button diff -r c08376c16fb2 -r a7ffe39edea9 src/lang/english.txt --- a/src/lang/english.txt Fri Apr 18 10:16:51 2008 +0000 +++ b/src/lang/english.txt Fri Apr 18 10:58:11 2008 +0000 @@ -378,6 +378,7 @@ STR_SORT_BY_MAX_SPEED :Maximum speed STR_SORT_BY_MODEL :Model STR_SORT_BY_VALUE :Value +STR_SORT_BY_LENGTH :Length STR_SORT_BY_FACILITY :Station type STR_SORT_BY_WAITING :Waiting cargo value STR_SORT_BY_RATING_MAX :Cargo rating diff -r c08376c16fb2 -r a7ffe39edea9 src/vehicle_gui.cpp --- a/src/vehicle_gui.cpp Fri Apr 18 10:16:51 2008 +0000 +++ b/src/vehicle_gui.cpp Fri Apr 18 10:58:11 2008 +0000 @@ -72,6 +72,7 @@ static VehicleSortListingTypeFunction VehicleMaxSpeedSorter; static VehicleSortListingTypeFunction VehicleModelSorter; static VehicleSortListingTypeFunction VehicleValueSorter; +static VehicleSortListingTypeFunction VehicleLengthSorter; static VehicleSortListingTypeFunction* const _vehicle_sorter[] = { &VehicleNumberSorter, @@ -84,6 +85,7 @@ &VehicleMaxSpeedSorter, &VehicleModelSorter, &VehicleValueSorter, + &VehicleLengthSorter, }; const StringID _vehicle_sort_listing[] = { @@ -97,6 +99,7 @@ STR_SORT_BY_MAX_SPEED, STR_SORT_BY_MODEL, STR_SORT_BY_VALUE, + STR_SORT_BY_LENGTH, INVALID_STRING_ID }; @@ -698,6 +701,30 @@ return (_internal_sort_order & 1) ? -r : r; } +static int CDECL VehicleLengthSorter(const void *a, const void *b) +{ + const Vehicle *va = *(const Vehicle**)a; + const Vehicle *vb = *(const Vehicle**)b; + int r = 0; + + switch (va->type) { + case VEH_TRAIN: + r = va->u.rail.cached_total_length - vb->u.rail.cached_total_length; + break; + + case VEH_ROAD: + for (const Vehicle *u = va; u != NULL; u = u->Next()) r += u->u.road.cached_veh_length; + for (const Vehicle *u = vb; u != NULL; u = u->Next()) r -= u->u.road.cached_veh_length; + break; + + default: NOT_REACHED(); + } + + VEHICLEUNITNUMBERSORTER(r, va, vb); + + return (_internal_sort_order & 1) ? -r : r; +} + void InitializeGUI() { memset(&_sorting, 0, sizeof(_sorting)); @@ -1061,7 +1088,7 @@ SetWindowDirty(w); break; case VLW_WIDGET_SORT_BY_PULLDOWN:/* Select sorting criteria dropdown menu */ - ShowDropDownMenu(w, _vehicle_sort_listing, vl->l.sort_type, VLW_WIDGET_SORT_BY_PULLDOWN, 0, 0); + ShowDropDownMenu(w, _vehicle_sort_listing, vl->l.sort_type, VLW_WIDGET_SORT_BY_PULLDOWN, 0, (vl->vehicle_type == VEH_TRAIN || vl->vehicle_type == VEH_ROAD) ? 0 : (1 << 10)); return; case VLW_WIDGET_LIST: { /* Matrix to show vehicles */ uint32 id_v = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / w->resize.step_height;