Changeset - r3820:37a4f2a16e05
[Not reviewed]
master
0 1 0
Darkvater - 19 years ago 2006-05-11 15:14:50
darkvater@openttd.org
(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
1 file changed with 16 insertions and 56 deletions:
0 comments (0 inline, 0 general)
station_gui.c
Show inline comments
 
@@ -245,8 +245,15 @@ static void PlayerStationsWndProc(Window
 
	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
 

	
 
			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
 
		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
 
			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
 
		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_wid
 
{      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_wid
 
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
 
};
0 comments (0 inline, 0 general)