From befe9fb43f63510543d189d0b60b28fa66f88f84 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Sat, 26 Jan 2008 22:15:39 +0000 Subject: (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one. The station view window is now resizable to cope with the extra information. --- src/lang/english.txt | 3 +- src/station_gui.cpp | 168 ++++++++++++++++++++++++++++----------------------- src/station_gui.h | 13 ++-- 3 files changed, 102 insertions(+), 82 deletions(-) (limited to 'src') diff --git a/src/lang/english.txt b/src/lang/english.txt index d872bcb8d..41d48e373 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -15,8 +15,7 @@ STR_EMPTY : STR_0007_FLAT_LAND_REQUIRED :{WHITE}Flat land required STR_0008_WAITING :{BLACK}Waiting: {WHITE}{STRING} STR_0009 :{WHITE}{CARGO} -STR_000A_EN_ROUTE_FROM :{WHITE}{CARGO}{YELLOW} (en-route from -STR_000B :{YELLOW}{STATION}) +STR_EN_ROUTE_FROM :{YELLOW}({SHORTCARGO} en-route from {STATION}) STR_000C_ACCEPTS :{BLACK}Accepts: {WHITE} STR_000D_ACCEPTS :{BLACK}Accepts: {GOLD} STR_000E : diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 24cf2ece3..618587ffa 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -664,39 +664,21 @@ void ShowPlayerStations(PlayerID player) } } -static const Widget _station_view_expanded_widgets[] = { -{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // SVW_CLOSEBOX -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 236, 0, 13, STR_300A_0, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_STICKYBOX, RESIZE_NONE, 14, 237, 248, 0, 13, 0x0, STR_STICKY_BUTTON}, -{ WWT_PANEL, RESIZE_NONE, 14, 0, 236, 14, 65, 0x0, STR_NULL}, // SVW_WAITING -{ WWT_SCROLLBAR, RESIZE_NONE, 14, 237, 248, 14, 65, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // SVW_ACCEPTLIST -{ WWT_PANEL, RESIZE_NONE, 14, 0, 248, 66, 197, 0x0, STR_NULL}, // SVW_RATINGLIST -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 63, 198, 209, STR_00E4_LOCATION, STR_3053_CENTER_MAIN_VIEW_ON_STATION}, // SVW_LOCATION -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 64, 128, 198, 209, STR_3033_ACCEPTS, STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO}, // SVW_ACCEPTS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 129, 192, 198, 209, STR_0130_RENAME, STR_3055_CHANGE_NAME_OF_STATION}, // SVW_RENAME -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 193, 206, 198, 209, STR_TRAIN, STR_SCHEDULED_TRAINS_TIP }, // SVW_TRAINS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 207, 220, 198, 209, STR_LORRY, STR_SCHEDULED_ROAD_VEHICLES_TIP }, // SVW_ROADVEHS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 221, 234, 198, 209, STR_PLANE, STR_SCHEDULED_AIRCRAFT_TIP }, // SVW_PLANES -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 235, 248, 198, 209, STR_SHIP, STR_SCHEDULED_SHIPS_TIP }, // SVW_SHIPS -{ WIDGETS_END}, -}; - static const Widget _station_view_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // SVW_CLOSEBOX -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 236, 0, 13, STR_300A_0, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_STICKYBOX, RESIZE_NONE, 14, 237, 248, 0, 13, 0x0, STR_STICKY_BUTTON}, -{ WWT_PANEL, RESIZE_NONE, 14, 0, 236, 14, 65, 0x0, STR_NULL}, // SVW_WAITING -{ WWT_SCROLLBAR, RESIZE_NONE, 14, 237, 248, 14, 65, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, -{ WWT_PANEL, RESIZE_NONE, 14, 0, 248, 66, 97, 0x0, STR_NULL}, // SVW_ACCEPTLIST -{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // SVW_RATINGLIST -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 63, 98, 109, STR_00E4_LOCATION, STR_3053_CENTER_MAIN_VIEW_ON_STATION}, // SVW_LOCATION -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 64, 128, 98, 109, STR_3032_RATINGS, STR_3054_SHOW_STATION_RATINGS}, // SVW_RATINGS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 129, 192, 98, 109, STR_0130_RENAME, STR_3055_CHANGE_NAME_OF_STATION}, // SVW_RENAME -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 193, 206, 98, 109, STR_TRAIN, STR_SCHEDULED_TRAINS_TIP }, // SVW_TRAINS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 207, 220, 98, 109, STR_LORRY, STR_SCHEDULED_ROAD_VEHICLES_TIP }, // SVW_ROADVEHS -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 221, 234, 98, 109, STR_PLANE, STR_SCHEDULED_AIRCRAFT_TIP }, // SVW_PLANES -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 235, 248, 98, 109, STR_SHIP, STR_SCHEDULED_SHIPS_TIP }, // SVW_SHIPS +{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 236, 0, 13, STR_300A_0, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, RESIZE_LR, 14, 237, 248, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, RESIZE_RB, 14, 0, 236, 14, 65, 0x0, STR_NULL}, // SVW_WAITING +{ WWT_SCROLLBAR, RESIZE_LRB, 14, 237, 248, 14, 65, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PANEL, RESIZE_RTB, 14, 0, 248, 66, 97, 0x0, STR_NULL}, // SVW_ACCEPTLIST / SVW_RATINGLIST +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 59, 98, 109, STR_00E4_LOCATION, STR_3053_CENTER_MAIN_VIEW_ON_STATION}, // SVW_LOCATION +{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 60, 120, 98, 109, STR_3032_RATINGS, STR_3054_SHOW_STATION_RATINGS}, // SVW_RATINGS / SVW_ACCEPTS +{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 121, 180, 98, 109, STR_0130_RENAME, STR_3055_CHANGE_NAME_OF_STATION}, // SVW_RENAME +{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 181, 194, 98, 109, STR_TRAIN, STR_SCHEDULED_TRAINS_TIP }, // SVW_TRAINS +{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 195, 208, 98, 109, STR_LORRY, STR_SCHEDULED_ROAD_VEHICLES_TIP }, // SVW_ROADVEHS +{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 209, 222, 98, 109, STR_PLANE, STR_SCHEDULED_AIRCRAFT_TIP }, // SVW_PLANES +{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 223, 236, 98, 109, STR_SHIP, STR_SCHEDULED_SHIPS_TIP }, // SVW_SHIPS +{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 237, 248, 98, 109, 0x0, STR_RESIZE_BUTTON}, { WIDGETS_END}, }; @@ -708,9 +690,9 @@ static const Widget _station_view_widgets[] = { * @param x x on-screen coordinate where to start with drawing icons * @param y y coordinate */ -static void DrawCargoIcons(CargoID i, uint waiting, int x, int y) +static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width) { - uint num = min((waiting + 5) / 10, 23); // maximum is 23 icons so it won't overflow + uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow if (num == 0) return; const CargoSpec *cs = GetCargo(i); @@ -731,6 +713,20 @@ static void DrawCargoIcons(CargoID i, uint waiting, int x, int y) } while (--num); } +struct CargoData { + CargoID cargo; + StationID source; + uint count; + + CargoData(CargoID cargo, StationID source, uint count) : + cargo(cargo), + source(source), + count(count) + { } +}; + +typedef std::list CargoDataList; + /** * Redraws whole StationView window * @@ -740,20 +736,40 @@ static void DrawStationViewWindow(Window *w) { StationID station_id = w->window_number; const Station* st = GetStation(station_id); - uint num; ///< number of cargo types waiting at station int x, y; ///< coordinates used for printing waiting/accepted/rating of cargo int pos; ///< = w->vscroll.pos StringID str; + CargoDataList cargolist; /* count types of cargos waiting in station */ - num = 1; for (CargoID i = 0; i < NUM_CARGO; i++) { if (!st->goods[i].cargo.Empty()) { - num++; - if (st->goods[i].cargo.Source() != station_id) num++; + /* Add an entry for total amount of cargo of this type waiting. */ + cargolist.push_back(CargoData(i, INVALID_STATION, st->goods[i].cargo.Count())); + + /* Add an entry for each distinct cargo source. */ + const CargoList::List *packets = st->goods[i].cargo.Packets(); + for (CargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) { + const CargoPacket *cp = *it; + if (cp->source != station_id) { + bool added = false; + + /* Check if we already have this source in the list */ + for (CargoDataList::iterator jt = cargolist.begin(); jt != cargolist.end(); jt++) { + CargoData *cd = &(*jt); + if (cd->cargo == i && cd->source == cp->source) { + cd->count += cp->count; + added = true; + break; + } + } + + if (!added) cargolist.push_back(CargoData(i, cp->source, cp->count)); + } + } } } - SetVScrollCount(w, num); // update scrollbar + SetVScrollCount(w, cargolist.size() + 1); // update scrollbar /* disable some buttons */ w->SetWidgetDisabledState(SVW_RENAME, st->owner != _local_player); @@ -770,6 +786,9 @@ static void DrawStationViewWindow(Window *w) y = 15; pos = w->vscroll.pos; + uint width = w->widget[SVW_WAITING].right - w->widget[SVW_WAITING].left - 4; + int maxrows = w->vscroll.cap; + if (--pos < 0) { str = STR_00D0_NOTHING; for (CargoID i = 0; i < NUM_CARGO; i++) { @@ -780,37 +799,27 @@ static void DrawStationViewWindow(Window *w) y += 10; } - for (CargoID i = 0; i < NUM_CARGO && pos > -5; i++) { - uint waiting = st->goods[i].cargo.Count(); - if (waiting == 0) continue; - - if (st->goods[i].cargo.Source() == station_id) { - if (--pos < 0) { - DrawCargoIcons(i, waiting, x, y); - SetDParam(1, waiting); - SetDParam(0, i); - DrawStringRightAligned(x + 234, y, STR_0009, TC_FROMSTRING); - y += 10; - } - } else { - /* enroute */ - if (--pos < 0) { - DrawCargoIcons(i, waiting, x, y); - SetDParam(1, waiting); - SetDParam(0, i); - DrawStringRightAligned(x + 234, y, STR_000A_EN_ROUTE_FROM, TC_FROMSTRING); - y += 10; + for (CargoDataList::const_iterator it = cargolist.begin(); it != cargolist.end() && pos > -maxrows; ++it) { + if (--pos < 0) { + const CargoData *cd = &(*it); + if (cd->source == INVALID_STATION) { + /* Heading */ + DrawCargoIcons(cd->cargo, cd->count, x, y, width); + SetDParam(0, cd->cargo); + SetDParam(1, cd->count); + DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING); + } else { + SetDParam(0, cd->cargo); + SetDParam(1, cd->count); + SetDParam(2, cd->source); + DrawStringRightAlignedTruncated(x + width, y, STR_EN_ROUTE_FROM, TC_FROMSTRING, width); } - if (pos > -5 && --pos < 0) { - SetDParam(0, st->goods[i].cargo.Source()); - DrawStringRightAligned(x + 234, y, STR_000B, TC_FROMSTRING); - y += 10; - } + y += 10; } } - if (IsWindowOfPrototype(w, _station_view_widgets)) { // small window with list of accepted cargo + if (w->widget[SVW_ACCEPTS].data == STR_3032_RATINGS) { // small window with list of accepted cargo char *b = _userstring; bool first = true; @@ -838,11 +847,13 @@ static void DrawStationViewWindow(Window *w) /* Make sure we detect any buffer overflow */ assert(b < endof(_userstring)); - DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245); + DrawStringMultiLine(2, w->widget[SVW_ACCEPTLIST].top + 1, STR_SPEC_USERSTRING, w->widget[SVW_ACCEPTLIST].right - w->widget[SVW_ACCEPTLIST].left); } else { // extended window with list of cargo ratings - DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, TC_FROMSTRING); + y = w->widget[SVW_RATINGLIST].top + 1; + + DrawString(2, y, STR_3034_LOCAL_RATING_OF_TRANSPORT, TC_FROMSTRING); + y += 10; - y = 77; for (CargoID i = 0; i < NUM_CARGO; i++) { const CargoSpec *cs = GetCargo(i); if (!cs->IsValid()) continue; @@ -882,13 +893,16 @@ static void StationViewWndProc(Window *w, WindowEvent *e) case SVW_RATINGS: SetWindowDirty(w); - /* toggle height/widget set */ - if (IsWindowOfPrototype(w, _station_view_expanded_widgets)) { - AssignWidgetToWindow(w, _station_view_widgets); - w->height = 110; + if (w->widget[SVW_RATINGS].data == STR_3032_RATINGS) { + /* Switch to ratings view */ + w->widget[SVW_RATINGS].data = STR_3033_ACCEPTS; + w->widget[SVW_RATINGS].tooltips = STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO; + ResizeWindowForWidget(w, SVW_ACCEPTLIST, 0, 100); } else { - AssignWidgetToWindow(w, _station_view_expanded_widgets); - w->height = 210; + /* Switch to accepts view */ + w->widget[SVW_RATINGS].data = STR_3032_RATINGS; + w->widget[SVW_RATINGS].tooltips = STR_3054_SHOW_STATION_RATINGS; + ResizeWindowForWidget(w, SVW_ACCEPTLIST, 0, -100); } SetWindowDirty(w); @@ -947,6 +961,11 @@ static void StationViewWndProc(Window *w, WindowEvent *e) DeleteWindowById(WC_AIRCRAFT_LIST, wno); break; } + + case WE_RESIZE: + if (e->we.sizing.diff.x != 0) ResizeButtons(w, SVW_LOCATION, SVW_RENAME); + w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height; + break; } } @@ -954,7 +973,7 @@ static void StationViewWndProc(Window *w, WindowEvent *e) static const WindowDesc _station_view_desc = { WDP_AUTO, WDP_AUTO, 249, 110, 249, 110, WC_STATION_VIEW, WC_NONE, - WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _station_view_widgets, StationViewWndProc }; @@ -972,4 +991,5 @@ void ShowStationViewWindow(StationID station) PlayerID owner = GetStation(w->window_number)->owner; if (owner != OWNER_NONE) w->caption_color = owner; w->vscroll.cap = 5; + w->resize.step_height = 10; } diff --git a/src/station_gui.h b/src/station_gui.h index 250280458..ef4a3efeb 100644 --- a/src/station_gui.h +++ b/src/station_gui.h @@ -36,15 +36,16 @@ enum StationViewWidgets { SVW_CAPTION = 1, ///< Caption of the window SVW_WAITING = 3, ///< List of waiting cargo SVW_ACCEPTLIST = 5, ///< List of accepted cargos - SVW_RATINGLIST = 6, ///< Ratings of cargos - SVW_LOCATION = 7, ///< 'Location' button - SVW_RATINGS = 8, ///< 'Ratings' button - SVW_ACCEPTS = 8, ///< 'Accepts' button - SVW_RENAME = 9, ///< 'Rename' button - SVW_TRAINS = 10, ///< List of scheduled trains button + SVW_RATINGLIST = 5, ///< Ratings of cargos + SVW_LOCATION = 6, ///< 'Location' button + SVW_RATINGS = 7, ///< 'Ratings' button + SVW_ACCEPTS = 7, ///< 'Accepts' button + SVW_RENAME = 8, ///< 'Rename' button + SVW_TRAINS = 9, ///< List of scheduled trains button SVW_ROADVEHS, ///< List of scheduled road vehs button SVW_PLANES, ///< List of scheduled planes button SVW_SHIPS, ///< List of scheduled ships button + SVW_RESIZE, ///< Resize button }; /* sorter stuff */ -- cgit v1.2.3-54-g00ecf