(svn r4830) - Codechange: simplify station sorting a bit by recalculating the clicked-states on drawing the window. This also allows the 'Sort by' button to be visually clickable

pull/155/head
Darkvater 18 years ago
parent cbcf207e5e
commit bd3ccca31a

@ -245,8 +245,15 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
static byte facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
static uint16 cargo_filter = 0x1FFF;
plstations_d *sl = &WP(w, plstations_d);
switch (e->event) {
case WE_PAINT: {
/* Set up cargo click-states. Toggle the all-vehicle and all-cargo types button
* depending on if all types are clicked or not */
SB(w->click_state, 6, 5, facilities);
SB(w->click_state, 26, 1, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
SB(w->click_state, 12, NUM_CARGO + 1, cargo_filter);
SB(w->click_state, 27, 1, cargo_filter == 0x1FFF);
BuildStationsList(sl, owner, facilities, cargo_filter);
SortStationsList(sl);
@ -330,15 +337,12 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
id_v += w->vscroll.pos;
{
const Station* st;
if (id_v >= sl->list_length) return; // click out of list bound
if (id_v >= sl->list_length) return; // click out of list bound
st = GetStation(sl->sort_list[id_v].index);
{
const Station *st = GetStation(sl->sort_list[id_v].index);
assert(st->owner == owner);
ScrollMainWindowToTile(st->xy);
}
} break;
@ -349,39 +353,20 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
case 10: /* dock */
if (_ctrl_pressed) {
TOGGLEBIT(facilities, e->click.widget - 6);
TOGGLEBIT(w->click_state, e->click.widget);
if (facilities == 0) { /* None selected, so select all */
facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
}
} else {
/* We click on the only active button */
if (HAS_SINGLE_BIT(GB(w->click_state, 6, 5)) && HASBIT(w->click_state, e->click.widget)) {
facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
} else {
facilities = 0;
SETBIT(facilities, e->click.widget - 6);
}
facilities = 0;
SETBIT(facilities, e->click.widget - 6);
}
SB(w->click_state, 6, 5, facilities);
sl->flags |= SL_REBUILD;
SetWindowDirty(w);
if (facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK)) {
SETBIT(w->click_state, 26);
} else {
CLRBIT(w->click_state, 26);
}
break;
case 26:
facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
SB(w->click_state, 6, 5, facilities);
SETBIT(w->click_state, e->click.widget);
sl->flags |= SL_REBUILD;
SetWindowDirty(w);
break;
case 27:
cargo_filter = 0x1FFF; /* select everything */
SB(w->click_state, 12, NUM_CARGO + 1, cargo_filter);
SETBIT(w->click_state, e->click.widget);
sl->flags |= SL_REBUILD;
SetWindowDirty(w);
break;
@ -397,28 +382,13 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
if (e->click.widget >= 12 && e->click.widget <= 24) { //change cargo_filter
if (_ctrl_pressed) {
TOGGLEBIT(cargo_filter, e->click.widget - 12);
TOGGLEBIT(w->click_state, e->click.widget);
if (cargo_filter == 0) {
cargo_filter = 0x1FFF; /* select everything */
}
} else {
/* We click on the only active button */
if (HAS_SINGLE_BIT(GB(w->click_state, 12, NUM_CARGO + 1)) && HASBIT(w->click_state, e->click.widget)) {
cargo_filter = 0x1FFF;
} else {
cargo_filter = 0;
SETBIT(cargo_filter, e->click.widget - 12);
}
cargo_filter = 0;
SETBIT(cargo_filter, e->click.widget - 12);
}
SB(w->click_state, 12, NUM_CARGO + 1, cargo_filter);
sl->flags |= SL_REBUILD;
SetWindowDirty(w);
}
if (cargo_filter == 0x1FFF) {
SETBIT(w->click_state, 27);
} else {
CLRBIT(w->click_state, 27);
}
}
} break;
case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
@ -444,18 +414,8 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
sl->flags = SL_REBUILD;
sl->sort_type = 0;
sl->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
w->click_state = 0;
SB(w->click_state, 6, 5, facilities);
SB(w->click_state, 12, NUM_CARGO + 1, cargo_filter);
if (facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK)) {
SETBIT(w->click_state, 26);
}
if (cargo_filter == 0x1FFF) {
SETBIT(w->click_state, 27);
}
break;
case WE_RESIZE:
w->vscroll.cap += e->sizing.diff.y / 10;
break;
@ -497,7 +457,7 @@ static const Widget _player_stations_widgets[] = {
{ WWT_PANEL, RESIZE_NONE, 14, 271, 284, 14, 24, 0x0, STR_SELECT_ALL_TYPES},
//28
{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 80, 25, 36, STR_SORT_BY, STR_SORT_ORDER_TIP},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 80, 25, 36, STR_SORT_BY, STR_SORT_ORDER_TIP},
{ WWT_PANEL, RESIZE_NONE, 14, 81, 232, 25, 36, 0x0, STR_SORT_CRITERIA_TIP},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 233, 243, 25, 36, STR_0225, STR_SORT_CRITERIA_TIP},
{ WWT_PANEL, RESIZE_RIGHT, 14, 244, 345, 25, 36, 0x0, STR_NULL},
@ -507,7 +467,7 @@ static const Widget _player_stations_widgets[] = {
static const WindowDesc _player_stations_desc = {
-1, -1, 358, 162,
WC_STATION_LIST,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_player_stations_widgets,
PlayerStationsWndProc
};

Loading…
Cancel
Save