summaryrefslogtreecommitdiff
path: root/station_gui.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-06 18:15:13 +0000
committerdarkvater <darkvater@openttd.org>2004-09-06 18:15:13 +0000
commitbf0652d3fce57024fe56f75d43898a261fea7570 (patch)
treeff59ad94248c5c270741fe954c139e1f953b197c /station_gui.c
parentdf1397a47e68cf07d0a0d4fe02758f4b4f8c469f (diff)
downloadopenttd-bf0652d3fce57024fe56f75d43898a261fea7570.tar.xz
(svn r165) -Feature: Option to sort vehicles in vehicle-list window by different criteria. Total independent sort for all types and players. Periodic resort of list every 10 TTD days. Thank you for your graphical inspiration follow and buxo (since none of you provided any code).
-Fix: Sorter icon pointing down 'v' sorts in every window lowest value first, '^' highest value first -CodeChange: move Dropdownlist from settings_gui.c to widget.c. More in place there.
Diffstat (limited to 'station_gui.c')
-rw-r--r--station_gui.c58
1 files changed, 26 insertions, 32 deletions
diff --git a/station_gui.c b/station_gui.c
index 17cb74240..be2cb28ca 100644
--- a/station_gui.c
+++ b/station_gui.c
@@ -44,47 +44,37 @@ static void StationsWndShowStationRating(int x, int y, int type, uint acceptance
}
}
-// used to get a sorted list of the stations
-typedef struct StationSort {
- uint16 index;
- byte owner;
-} StationSort;
-
-static StationSort _station_sort[lengthof(_stations)];
+static SortStruct _station_sort[lengthof(_stations)];
static uint16 _num_station_sort[MAX_PLAYERS];
static char _bufcache[64];
static uint16 _last_station_idx;
-static int CDECL StationSorterByName(const void *a, const void *b)
+static int CDECL StationNameSorter(const void *a, const void *b)
{
char buf1[64];
Station *st;
- StationSort *cmp1, *cmp2;
- cmp1 = (StationSort*)a;
- cmp2 = (StationSort*)b;
-
- // sort stations by owner, and inside owner by name
- if (cmp1->owner == cmp2->owner) { // if same owner, sort by name
- st = DEREF_STATION(cmp1->index);
+ SortStruct *cmp1, *cmp2;
+ cmp1 = (SortStruct*)a;
+ cmp2 = (SortStruct*)b;
+
+ st = DEREF_STATION(cmp1->index);
+ SET_DPARAM16(0, st->town->townnametype);
+ SET_DPARAM32(1, st->town->townnameparts);
+ GetString(buf1, st->string_id);
+
+ if ( cmp2->index != _last_station_idx) {
+ _last_station_idx = cmp2->index;
+ st = DEREF_STATION(cmp2->index);
SET_DPARAM16(0, st->town->townnametype);
SET_DPARAM32(1, st->town->townnameparts);
- GetString(buf1, st->string_id);
-
- if ( cmp2->index != _last_station_idx) {
- _last_station_idx = cmp2->index;
- st = DEREF_STATION(cmp2->index);
- SET_DPARAM16(0, st->town->townnametype);
- SET_DPARAM32(1, st->town->townnameparts);
- GetString(_bufcache, st->string_id);
- }
-
- return strcmp(buf1, _bufcache); // sort by name
+ GetString(_bufcache, st->string_id);
}
- return cmp1->owner - cmp2->owner; // sort by owner
+
+ return strcmp(buf1, _bufcache); // sort by name
}
-static void MakeSortedStationList(Window *w)
+static void MakeSortedStationList()
{
Station *st;
uint16 n = 0;
@@ -106,7 +96,11 @@ static void MakeSortedStationList(Window *w)
for (i = &_num_station_sort[1]; i != endof(_num_station_sort); i++) {*i += *(i-1);}
_last_station_idx = 255; // used for "cache"
- qsort(_station_sort, n, sizeof(_station_sort[0]), StationSorterByName);
+
+ // sort by owner, then only subsort the requested owner-vehicles
+ qsort(_station_sort, n, sizeof(_station_sort[0]), GeneralOwnerSorter);
+
+ qsort(_station_sort, n, sizeof(_station_sort[0]), StationNameSorter);
DEBUG(misc, 1) ("Resorting Stations list...");
}
@@ -118,12 +112,12 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
byte i;
if (_station_sort_dirty) {
_station_sort_dirty = false;
- MakeSortedStationList(w);
+ MakeSortedStationList();
}
// stations are stored as a cummulative index, eg 25, 41, 43. This means
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 stations
- i = (byte)(w->window_number == 0) ? 0 : _num_station_sort[w->window_number-1];;
+ i = (byte)(w->window_number == 0) ? 0 : _num_station_sort[w->window_number-1];
SetVScrollCount(w, _num_station_sort[w->window_number] - i);
/* draw widgets, with player's name in the caption */
@@ -167,7 +161,7 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
}
y += 10;
i++; // next station
- if (++p == 12) { break;} // max number of stations in 1 window
+ if (++p == w->vscroll.cap) { break;} // max number of stations in 1 window
}
}
} break;