Merge branch 'departure-boards' into jgrpp

pull/28/head
Jonathan G Rennison 7 years ago
commit 51e018c9a4

@ -199,9 +199,11 @@ static void ScheduledDispatchDepartureLocalFix(DepartureList *departure_list)
* @param show_vehicle_types the types of vehicles to include in the departure list
* @param type the type of departures to get (departures or arrivals)
* @param show_vehicles_via whether to include vehicles that have this station in their orders but do not stop at it
* @param show_pax whether to include passenger vehicles
* @param show_freight whether to include freight vehicles
* @return a list of departures, which is empty if an error occurred
*/
DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[5], DepartureType type, bool show_vehicles_via)
DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[5], DepartureType type, bool show_vehicles_via, bool show_pax, bool show_freight)
{
/* This function is the meat of the departure boards functionality. */
/* As an overview, it works by repeatedly considering the best possible next departure to show. */
@ -213,6 +215,8 @@ DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[5],
/* The list of departures which will be returned as a result. */
SmallVector<Departure*, 32> *result = new SmallVector<Departure*, 32>();
if (!show_pax && !show_freight) return result;
/* A list of the next scheduled orders to be considered for inclusion in the departure list. */
SmallVector<OrderDate*, 32> next_orders;
@ -249,19 +253,19 @@ DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[5],
/* Get the first order for each vehicle for the station we're interested in that doesn't have No Loading set. */
/* We find the least order while we're at it. */
for (const Vehicle **v = vehicles.Begin(); v != vehicles.End(); v++) {
if (_settings_client.gui.departure_only_passengers) {
if (show_pax != show_freight) {
bool carries_passengers = false;
const Vehicle *u = *v;
while (u != NULL) {
if (u->cargo_type == CT_PASSENGERS && u->cargo_cap > 0) {
if (u->cargo_cap > 0 && IsCargoInClass(u->cargo_type, CC_PASSENGERS)) {
carries_passengers = true;
break;
}
u = u->Next();
}
if (carries_passengers == false) {
if (carries_passengers != show_pax) {
continue;
}
}

@ -16,6 +16,7 @@
#include "core/smallvec_type.hpp"
#include "departures_type.h"
DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[4], DepartureType type = D_DEPARTURE, bool show_vehicles_via = false);
DepartureList* MakeDepartureList(StationID station, bool show_vehicle_types[4], DepartureType type = D_DEPARTURE,
bool show_vehicles_via = false, bool show_pax = true, bool show_freight = true);
#endif /* DEPARTURES_FUNC_H */

@ -53,6 +53,8 @@ static const NWidgetPart _nested_departures_list[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(0, 12), SetResize(1, 0), SetFill(1, 1), EndContainer(),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_DB_SHOW_PAX), SetMinimalSize(6, 12), SetFill(0, 1), SetDataTip(STR_DEPARTURES_PAX, STR_DEPARTURES_PAX_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_DB_SHOW_FREIGHT), SetMinimalSize(6, 12), SetFill(0, 1), SetDataTip(STR_DEPARTURES_FREIGHT, STR_DEPARTURES_FREIGHT_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_DB_SHOW_ARRS), SetMinimalSize(6, 12), SetFill(0, 1), SetDataTip(STR_DEPARTURES_ARRIVALS, STR_DEPARTURES_ARRIVALS_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_DB_SHOW_DEPS), SetMinimalSize(6, 12), SetFill(0, 1), SetDataTip(STR_DEPARTURES_DEPARTURES, STR_DEPARTURES_DEPARTURES_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_DB_SHOW_VIA), SetMinimalSize(11, 12), SetFill(0, 1), SetDataTip(STR_DEPARTURES_VIA_BUTTON, STR_DEPARTURES_VIA_TOOLTIP),
@ -88,6 +90,9 @@ protected:
int calc_tick_countdown; ///< The number of ticks to wait until recomputing the departure list. Signed in case it goes below zero.
bool show_types[4]; ///< The vehicle types to show in the departure list.
bool departure_types[3]; ///< The types of departure to show in the departure list.
bool show_pax; ///< Show passenger vehicles
bool show_freight; ///< Show freight vehicles
bool cargo_buttons_disabled;///< Show pax/freight buttons disabled
uint min_width; ///< The minimum width of this window.
Scrollbar *vscroll;
@ -95,6 +100,30 @@ protected:
static void RecomputeDateWidth();
virtual void DrawDeparturesListItems(const Rect &r) const;
void DeleteDeparturesList(DepartureList* list);
void ToggleCargoFilter(int widget, bool &flag)
{
flag = !flag;
this->SetWidgetLoweredState(widget, flag);
/* We need to recompute the departures list. */
this->calc_tick_countdown = 0;
/* We need to redraw the button that was pressed. */
this->SetWidgetDirty(widget);
}
void SetCargoFilterDisabledState()
{
this->cargo_buttons_disabled = _settings_client.gui.departure_only_passengers;
this->SetWidgetDisabledState(WID_DB_SHOW_PAX, cargo_buttons_disabled);
this->SetWidgetDisabledState(WID_DB_SHOW_FREIGHT, cargo_buttons_disabled);
if (this->cargo_buttons_disabled) {
this->show_pax = true;
this->LowerWidget(WID_DB_SHOW_PAX);
this->show_freight = false;
this->RaiseWidget(WID_DB_SHOW_FREIGHT);
}
}
public:
DeparturesWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc),
@ -114,9 +143,14 @@ public:
departure_types[0] = true;
departure_types[1] = false;
departure_types[2] = false;
show_pax = true;
show_freight = true;
this->LowerWidget(WID_DB_SHOW_DEPS);
this->RaiseWidget(WID_DB_SHOW_ARRS);
this->RaiseWidget(WID_DB_SHOW_VIA);
this->LowerWidget(WID_DB_SHOW_PAX);
this->LowerWidget(WID_DB_SHOW_FREIGHT);
this->SetCargoFilterDisabledState();
for (uint i = 0; i < 4; ++i) {
show_types[i] = true;
@ -213,7 +247,7 @@ public:
this->SetWidgetDirty(widget);
break;
case WID_DB_LIST: // Matrix to show departures
case WID_DB_LIST: { // Matrix to show departures
/* We need to find the departure corresponding to where the user clicked. */
uint32 id_v = (pt.y - this->GetWidget<NWidgetBase>(WID_DB_LIST)->pos_y) / this->entry_height;
@ -252,6 +286,15 @@ public:
}
}
break;
}
case WID_DB_SHOW_PAX:
this->ToggleCargoFilter(widget, this->show_pax);
break;
case WID_DB_SHOW_FREIGHT:
this->ToggleCargoFilter(widget, this->show_freight);
break;
}
}
@ -270,6 +313,13 @@ public:
this->RecomputeDateWidth();
}
if (this->cargo_buttons_disabled != _settings_client.gui.departure_only_passengers) {
this->SetCargoFilterDisabledState();
this->calc_tick_countdown = 0;
this->SetWidgetDirty(WID_DB_SHOW_PAX);
this->SetWidgetDirty(WID_DB_SHOW_FREIGHT);
}
/* We need to redraw the scrolling text in its new position. */
this->SetWidgetDirty(WID_DB_LIST);
@ -278,8 +328,10 @@ public:
this->calc_tick_countdown = _settings_client.gui.departure_calc_frequency;
this->DeleteDeparturesList(this->departures);
this->DeleteDeparturesList(this->arrivals);
this->departures = (this->departure_types[0] ? MakeDepartureList(this->station, this->show_types, D_DEPARTURE, Twaypoint || this->departure_types[2]) : new DepartureList());
this->arrivals = (this->departure_types[1] && !_settings_client.gui.departure_show_both ? MakeDepartureList(this->station, this->show_types, D_ARRIVAL ) : new DepartureList());
bool show_pax = _settings_client.gui.departure_only_passengers ? true : this->show_pax;
bool show_freight = _settings_client.gui.departure_only_passengers ? false : this->show_freight;
this->departures = (this->departure_types[0] ? MakeDepartureList(this->station, this->show_types, D_DEPARTURE, Twaypoint || this->departure_types[2], show_pax, show_freight) : new DepartureList());
this->arrivals = (this->departure_types[1] && !_settings_client.gui.departure_show_both ? MakeDepartureList(this->station, this->show_types, D_ARRIVAL, false, show_pax, show_freight) : new DepartureList());
this->SetWidgetDirty(WID_DB_LIST);
}

@ -3635,9 +3635,13 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent
# Departures window
STR_DEPARTURES_CAPTION :{WHITE}{STATION} Live Travel Information
STR_DEPARTURES_CAPTION_WAYPOINT :{WHITE}{WAYPOINT} Live Travel Information
STR_DEPARTURES_PAX :{BLACK}{TINY_FONT}P
STR_DEPARTURES_FREIGHT :{BLACK}{TINY_FONT}F
STR_DEPARTURES_DEPARTURES :{BLACK}{TINY_FONT}D
STR_DEPARTURES_ARRIVALS :{BLACK}{TINY_FONT}A
STR_DEPARTURES_VIA_BUTTON :{BLACK}{TINY_FONT}via
STR_DEPARTURES_PAX_TOOLTIP :{BLACK}Show passenger departures
STR_DEPARTURES_FREIGHT_TOOLTIP :{BLACK}Show freight departures
STR_DEPARTURES_DEPARTURES_TOOLTIP :{BLACK}Show timetabled departures
STR_DEPARTURES_ARRIVALS_TOOLTIP :{BLACK}Show timetabled arrivals
STR_DEPARTURES_VIA_TOOLTIP :{BLACK}Show timetabled vehicles that do not stop here

@ -17,6 +17,8 @@ enum DeparturesWindowWidgets {
WID_DB_CAPTION, ///< Window caption
WID_DB_LIST, ///< List of departures
WID_DB_SCROLLBAR, ///< List scrollbar
WID_DB_SHOW_PAX, ///< Toggle passenger departures button
WID_DB_SHOW_FREIGHT, ///< Toggle freight button
WID_DB_SHOW_DEPS, ///< Toggle departures button
WID_DB_SHOW_ARRS, ///< Toggle arrivals button
WID_DB_SHOW_VIA, ///< Toggle via button

Loading…
Cancel
Save