diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vehicle_gui.cpp | 237 | ||||
-rw-r--r-- | src/vehicle_gui.h | 2 |
2 files changed, 125 insertions, 114 deletions
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5b258f5b4..4b6a12617 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1525,26 +1525,6 @@ static void ShowVehicleDetailsWindow(const Vehicle *v) /* Unified vehicle GUI - Vehicle View Window */ /** Vehicle view widgets. */ -static const Widget _vehicle_view_widgets[] = { - { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW }, // VVW_WIDGET_CLOSEBOX - { WWT_CAPTION, RESIZE_RIGHT, COLOUR_GREY, 11, 237, 0, 13, STR_VEHICLE_VIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS }, // VVW_WIDGET_CAPTION - { WWT_STICKYBOX, RESIZE_LR, COLOUR_GREY, 238, 249, 0, 13, 0x0, STR_TOOLTIP_STICKY }, // VVW_WIDGET_STICKY - { WWT_PANEL, RESIZE_RB, COLOUR_GREY, 0, 231, 14, 103, 0x0, STR_NULL }, // VVW_WIDGET_PANEL - { WWT_INSET, RESIZE_RB, COLOUR_GREY, 2, 229, 16, 101, 0x0, STR_NULL }, // VVW_WIDGET_VIEWPORT - { WWT_PUSHBTN, RESIZE_RTB, COLOUR_GREY, 0, 237, 104, 115, 0x0, 0x0 /* filled later */ }, // VVW_WIDGET_START_STOP_VEH - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 14, 31, SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */ }, // VVW_WIDGET_CENTER_MAIN_VIEH - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 32, 49, 0x0 /* filled later */, 0x0 /* filled later */ }, // VVW_WIDGET_GOTO_DEPOT - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 50, 67, SPR_REFIT_VEHICLE, 0x0 /* filled later */ }, // VVW_WIDGET_REFIT_VEH - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 68, 85, SPR_SHOW_ORDERS, 0x0 /* filled later */ }, // VVW_WIDGET_SHOW_ORDERS - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 86, 103, SPR_SHOW_VEHICLE_DETAILS, 0x0 /* filled later */ }, // VVW_WIDGET_SHOW_DETAILS - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 32, 49, 0x0 /* filled later */, 0x0 /* filled later */ }, // VVW_WIDGET_CLONE_VEH - { WWT_PANEL, RESIZE_LRB, COLOUR_GREY, 232, 249, 104, 103, 0x0, STR_NULL }, // VVW_WIDGET_EMPTY_BOTTOM_RIGHT - { WWT_RESIZEBOX, RESIZE_LRTB, COLOUR_GREY, 238, 249, 104, 115, 0x0, STR_TOOLTIP_RESIZE }, // VVW_WIDGET_RESIZE - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 50, 67, SPR_FORCE_VEHICLE_TURN, STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP }, // VVW_WIDGET_TURN_AROUND - { WWT_PUSHIMGBTN, RESIZE_LR, COLOUR_GREY, 232, 249, 50, 67, SPR_IGNORE_SIGNALS, STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP }, // VVW_WIDGET_FORCE_PROCEED -{ WIDGETS_END}, -}; - static const NWidgetPart _nested_vehicle_view_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY, VVW_WIDGET_CLOSEBOX), @@ -1556,22 +1536,22 @@ static const NWidgetPart _nested_vehicle_view_widgets[] = { NWidget(WWT_INSET, COLOUR_GREY, VVW_WIDGET_VIEWPORT), SetPadding(2, 2, 2, 2), SetMinimalSize(228, 86), SetResize(1, 1), EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CENTER_MAIN_VIEH), SetMinimalSize(18, 18), SetDataTip(SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */), - NWidget(NWID_SELECTION, INVALID_COLOUR, -1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_GOTO_DEPOT), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CLONE_VEH), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CENTER_MAIN_VIEH), SetMinimalSize(18, 18), SetFill(true, true), SetDataTip(SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */), + NWidget(NWID_SELECTION, INVALID_COLOUR, VVW_WIDGET_SELECT_DEPOT_CLONE), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_GOTO_DEPOT), SetMinimalSize(18, 18), SetFill(true, true), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CLONE_VEH), SetMinimalSize(18, 18), SetFill(true, true), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), EndContainer(), - NWidget(NWID_SELECTION, INVALID_COLOUR, -1), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_REFIT_VEH), SetMinimalSize(18, 18), - SetDataTip(SPR_REFIT_VEHICLE, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_TURN_AROUND), SetMinimalSize(18, 18), + /* For trains only, 'ignore signal' button. */ + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_FORCE_PROCEED), SetMinimalSize(18, 18), SetFill(true, true), + SetDataTip(SPR_IGNORE_SIGNALS, STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, VVW_WIDGET_SELECT_REFIT_TURN), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_REFIT_VEH), SetMinimalSize(18, 18), SetFill(true, true), SetDataTip(SPR_REFIT_VEHICLE, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_TURN_AROUND), SetMinimalSize(18, 18), SetFill(true, true), SetDataTip(SPR_FORCE_VEHICLE_TURN, STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_FORCE_PROCEED), SetMinimalSize(18, 18), - SetDataTip(SPR_IGNORE_SIGNALS, STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP), EndContainer(), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_SHOW_ORDERS), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_ORDERS, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_SHOW_DETAILS), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_VEHICLE_DETAILS, 0x0 /* filled later */), - NWidget(WWT_PANEL, COLOUR_GREY, VVW_WIDGET_EMPTY_BOTTOM_RIGHT), SetMinimalSize(18, 0), SetResize(0, 1), EndContainer(), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_SHOW_ORDERS), SetFill(true, true), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_ORDERS, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_SHOW_DETAILS), SetFill(true, true), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_VEHICLE_DETAILS, 0x0 /* filled later */), + NWidget(WWT_PANEL, COLOUR_GREY, VVW_WIDGET_EMPTY_BOTTOM_RIGHT), SetFill(true, true), SetMinimalSize(18, 0), SetResize(0, 1), EndContainer(), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -1585,7 +1565,7 @@ static const WindowDesc _vehicle_view_desc( WDP_AUTO, WDP_AUTO, 250, 116, 250, 116, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, - _vehicle_view_widgets, _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) + NULL, _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) ); /** Vehicle view window descriptor for trains. Only minimum_height and @@ -1595,7 +1575,7 @@ static const WindowDesc _train_view_desc( WDP_AUTO, WDP_AUTO, 250, 134, 250, 134, WC_VEHICLE_VIEW, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, - _vehicle_view_widgets, _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) + NULL, _nested_vehicle_view_widgets, lengthof(_nested_vehicle_view_widgets) ); @@ -1663,22 +1643,46 @@ static bool IsVehicleRefitable(const Vehicle *v) } struct VehicleViewWindow : Window { - VehicleViewWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number) +private: + /** Display planes available in the vehicle view window. */ + enum PlaneSelections { + SEL_DC_GOTO_DEPOT, ///< Display 'goto depot' button in #VVW_WIDGET_SELECT_DEPOT_CLONE stacked widget. + SEL_DC_CLONE, ///< Display 'clone vehicle' button in #VVW_WIDGET_SELECT_DEPOT_CLONE stacked widget. + + SEL_RT_REFIT, ///< Display 'refit' button in #VVW_WIDGET_SELECT_REFIT_TURN stacked widget. + SEL_RT_TURN_AROUND, ///< Display 'turn around' button in #VVW_WIDGET_SELECT_REFIT_TURN stacked widget. + + SEL_DC_BASEPLANE = SEL_DC_GOTO_DEPOT, ///< First plane of the #VVW_WIDGET_SELECT_DEPOT_CLONE stacked widget. + SEL_RT_BASEPLANE = SEL_RT_REFIT, ///< First plane of the #VVW_WIDGET_SELECT_REFIT_TURN stacked widget. + }; + + /** Display a plane in the window. + * @param plane Plane to show. + */ + void SelectPlane(PlaneSelections plane) { - const Vehicle *v = Vehicle::Get(this->window_number); + switch (plane) { + case SEL_DC_GOTO_DEPOT: + case SEL_DC_CLONE: + this->GetWidget<NWidgetStacked>(VVW_WIDGET_SELECT_DEPOT_CLONE)->SetDisplayedPlane(plane - SEL_DC_BASEPLANE); + break; - this->owner = v->owner; - InitializeWindowViewport(this, VV_VIEWPORT_X, VV_VIEWPORT_Y, VV_INITIAL_VIEWPORT_WIDTH, - (v->type == VEH_TRAIN) ? VV_INITIAL_VIEWPORT_HEIGHT_TRAIN : VV_INITIAL_VIEWPORT_HEIGHT, - this->window_number | (1 << 31), _vehicle_view_zoom_levels[v->type]); + case SEL_RT_REFIT: + case SEL_RT_TURN_AROUND: + this->GetWidget<NWidgetStacked>(VVW_WIDGET_SELECT_REFIT_TURN)->SetDisplayedPlane(plane - SEL_RT_BASEPLANE); + break; - this->widget[VVW_WIDGET_START_STOP_VEH].tooltips = STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP + v->type; - this->widget[VVW_WIDGET_CENTER_MAIN_VIEH].tooltips = STR_VEHICLE_VIEW_TRAIN_LOCATION_TOOLTIP + v->type; - this->widget[VVW_WIDGET_REFIT_VEH].tooltips = STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP + v->type; - this->widget[VVW_WIDGET_GOTO_DEPOT].tooltips = STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP + v->type; - this->widget[VVW_WIDGET_SHOW_ORDERS].tooltips = STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP + v->type; - this->widget[VVW_WIDGET_SHOW_DETAILS].tooltips = STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP + v->type; - this->widget[VVW_WIDGET_CLONE_VEH].tooltips = STR_VEHICLE_VIEW_CLONE_TRAIN_INFO + v->type; + default: + NOT_REACHED(); + } + } + +public: + VehicleViewWindow(const WindowDesc *desc, WindowNumber window_number) : Window() + { + const Vehicle *v = Vehicle::Get(window_number); + + this->CreateNestedTree(desc); /* * fill in data and tooltip codes for the widgets and @@ -1686,68 +1690,46 @@ struct VehicleViewWindow : Window { */ switch (v->type) { case VEH_TRAIN: - this->widget[VVW_WIDGET_GOTO_DEPOT].data = SPR_SEND_TRAIN_TODEPOT; - this->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_TRAIN; - - this->widget[VVW_WIDGET_TURN_AROUND].tooltips = STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP; - - /* due to more buttons we must modify the layout a bit for trains */ - this->widget[VVW_WIDGET_PANEL].bottom = 121; - this->widget[VVW_WIDGET_VIEWPORT].bottom = 119; - - this->widget[VVW_WIDGET_START_STOP_VEH].top = 122; - this->widget[VVW_WIDGET_START_STOP_VEH].bottom = 133; - - this->widget[VVW_WIDGET_REFIT_VEH].top = 68; - this->widget[VVW_WIDGET_REFIT_VEH].bottom = 85; + this->GetWidget<NWidgetCore>(VVW_WIDGET_GOTO_DEPOT)->widget_data = SPR_SEND_TRAIN_TODEPOT; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CLONE_VEH)->widget_data = SPR_CLONE_TRAIN; - this->widget[VVW_WIDGET_SHOW_ORDERS].top = 86; - this->widget[VVW_WIDGET_SHOW_ORDERS].bottom = 103; - - this->widget[VVW_WIDGET_SHOW_DETAILS].top = 104; - this->widget[VVW_WIDGET_SHOW_DETAILS].bottom = 121; - - this->widget[VVW_WIDGET_EMPTY_BOTTOM_RIGHT].top = 122; - this->widget[VVW_WIDGET_EMPTY_BOTTOM_RIGHT].bottom = 121; - - this->widget[VVW_WIDGET_RESIZE].top = 122; - this->widget[VVW_WIDGET_RESIZE].bottom = 133; - - this->widget[VVW_WIDGET_TURN_AROUND].top = 68; - this->widget[VVW_WIDGET_TURN_AROUND].bottom = 85; + this->GetWidget<NWidgetCore>(VVW_WIDGET_TURN_AROUND)->tool_tip = STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP; break; case VEH_ROAD: - this->widget[VVW_WIDGET_GOTO_DEPOT].data = SPR_SEND_ROADVEH_TODEPOT; - this->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_ROADVEH; - - this->SetWidgetHiddenState(VVW_WIDGET_FORCE_PROCEED, true); + this->GetWidget<NWidgetCore>(VVW_WIDGET_GOTO_DEPOT)->widget_data = SPR_SEND_ROADVEH_TODEPOT; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CLONE_VEH)->widget_data = SPR_CLONE_ROADVEH; break; case VEH_SHIP: - this->widget[VVW_WIDGET_GOTO_DEPOT].data = SPR_SEND_SHIP_TODEPOT; - this->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_SHIP; + this->GetWidget<NWidgetCore>(VVW_WIDGET_GOTO_DEPOT)->widget_data = SPR_SEND_SHIP_TODEPOT; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CLONE_VEH)->widget_data = SPR_CLONE_SHIP; - this->SetWidgetsHiddenState(true, - VVW_WIDGET_TURN_AROUND, - VVW_WIDGET_FORCE_PROCEED, - WIDGET_LIST_END); + this->SelectPlane(SEL_RT_REFIT); break; case VEH_AIRCRAFT: - this->widget[VVW_WIDGET_GOTO_DEPOT].data = SPR_SEND_AIRCRAFT_TODEPOT; - this->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_AIRCRAFT; + this->GetWidget<NWidgetCore>(VVW_WIDGET_GOTO_DEPOT)->widget_data = SPR_SEND_AIRCRAFT_TODEPOT; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CLONE_VEH)->widget_data = SPR_CLONE_AIRCRAFT; - this->SetWidgetsHiddenState(true, - VVW_WIDGET_TURN_AROUND, - VVW_WIDGET_FORCE_PROCEED, - WIDGET_LIST_END); + this->SelectPlane(SEL_RT_REFIT); break; default: NOT_REACHED(); } + this->FinishInitNested(desc, window_number); + this->owner = v->owner; + InitializeWindowViewport(this, VV_VIEWPORT_X, VV_VIEWPORT_Y, VV_INITIAL_VIEWPORT_WIDTH, + (v->type == VEH_TRAIN) ? VV_INITIAL_VIEWPORT_HEIGHT_TRAIN : VV_INITIAL_VIEWPORT_HEIGHT, + this->window_number | (1 << 31), _vehicle_view_zoom_levels[v->type]); - this->FindWindowPlacementAndResize(desc); + this->GetWidget<NWidgetCore>(VVW_WIDGET_START_STOP_VEH)->tool_tip = STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CENTER_MAIN_VIEH)->tool_tip = STR_VEHICLE_VIEW_TRAIN_LOCATION_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_REFIT_VEH)->tool_tip = STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_GOTO_DEPOT)->tool_tip = STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_SHOW_ORDERS)->tool_tip = STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_SHOW_DETAILS)->tool_tip = STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VVW_WIDGET_CLONE_VEH)->tool_tip = STR_VEHICLE_VIEW_CLONE_TRAIN_INFO + v->type; } ~VehicleViewWindow() @@ -1758,16 +1740,26 @@ struct VehicleViewWindow : Window { DeleteWindowById(WC_VEHICLE_TIMETABLE, this->window_number, false); } + virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize) + { + const Vehicle *v = Vehicle::Get(this->window_number); + switch (widget) { + case VVW_WIDGET_FORCE_PROCEED: + if (v->type != VEH_TRAIN) { + size->height = 0; + size->width = 0; + } break; + } + } + virtual void OnPaint() { const Vehicle *v = Vehicle::Get(this->window_number); - StringID str; bool is_localcompany = v->owner == _local_company; bool refitable_and_stopped_in_depot = IsVehicleRefitable(v); this->SetWidgetDisabledState(VVW_WIDGET_GOTO_DEPOT, !is_localcompany); - this->SetWidgetDisabledState(VVW_WIDGET_REFIT_VEH, - !refitable_and_stopped_in_depot || !is_localcompany); + this->SetWidgetDisabledState(VVW_WIDGET_REFIT_VEH, !refitable_and_stopped_in_depot || !is_localcompany); this->SetWidgetDisabledState(VVW_WIDGET_CLONE_VEH, !is_localcompany); if (v->type == VEH_TRAIN) { @@ -1775,10 +1767,25 @@ struct VehicleViewWindow : Window { this->SetWidgetDisabledState(VVW_WIDGET_TURN_AROUND, !is_localcompany); } - /* draw widgets & caption */ - SetDParam(0, v->index); this->DrawWidgets(); + this->DrawViewport(); + } + + virtual void SetStringParameters(int widget) const + { + if (widget != VVW_WIDGET_CAPTION) return; + + const Vehicle *v = Vehicle::Get(this->window_number); + SetDParam(0, v->index); + } + + virtual void DrawWidget(const Rect &r, int widget) const + { + if (widget != VVW_WIDGET_START_STOP_VEH) return; + + const Vehicle *v = Vehicle::Get(this->window_number); + StringID str; if (v->vehstatus & VS_CRASHED) { str = STR_VEHICLE_STATUS_CRASHED; } else if (v->type != VEH_AIRCRAFT && v->breakdown_ctr == 1) { // check for aircraft necessary? @@ -1856,9 +1863,8 @@ struct VehicleViewWindow : Window { } /* draw the flag plus orders */ - DrawSprite(v->vehstatus & VS_STOPPED ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, 2, this->widget[VVW_WIDGET_START_STOP_VEH].top + 1); - DrawString(this->widget[VVW_WIDGET_START_STOP_VEH].left + 8, this->widget[VVW_WIDGET_START_STOP_VEH].right, this->widget[VVW_WIDGET_START_STOP_VEH].top + 1, str, TC_FROMSTRING, SA_CENTER); - this->DrawViewport(); + DrawSprite(v->vehstatus & VS_STOPPED ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, WD_FRAMERECT_LEFT, r.top + WD_FRAMERECT_TOP); + DrawString(r.left + WD_FRAMERECT_LEFT + 6, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_FROMSTRING, SA_CENTER); } virtual void OnClick(Point pt, int widget) @@ -1926,20 +1932,23 @@ struct VehicleViewWindow : Window { const Vehicle *v = Vehicle::Get(this->window_number); bool veh_stopped = v->IsStoppedInDepot(); - /* Widget VVW_WIDGET_GOTO_DEPOT must be hidden if the vehicle is already - * stopped in depot. - * Widget VVW_WIDGET_CLONE_VEH should then be shown, since cloning is - * allowed only while in depot and stopped. - * This sytem allows to have two buttons, on top of each other. - * The same system applies to widget VVW_WIDGET_REFIT_VEH and VVW_WIDGET_TURN_AROUND.*/ - if (veh_stopped != this->IsWidgetHidden(VVW_WIDGET_GOTO_DEPOT) || veh_stopped == this->IsWidgetHidden(VVW_WIDGET_CLONE_VEH)) { - this->SetWidgetHiddenState( VVW_WIDGET_GOTO_DEPOT, veh_stopped); // send to depot - this->SetWidgetHiddenState(VVW_WIDGET_CLONE_VEH, !veh_stopped); // clone - if (v->type == VEH_ROAD || v->type == VEH_TRAIN) { - this->SetWidgetHiddenState( VVW_WIDGET_REFIT_VEH, !veh_stopped); // refit - this->SetWidgetHiddenState(VVW_WIDGET_TURN_AROUND, veh_stopped); // force turn around + /* Widget VVW_WIDGET_GOTO_DEPOT must be hidden if the vehicle is already stopped in depot. + * Widget VVW_WIDGET_CLONE_VEH should then be shown, since cloning is allowed only while in depot and stopped. + */ + PlaneSelections plane = veh_stopped ? SEL_DC_CLONE : SEL_DC_GOTO_DEPOT; + NWidgetStacked *nwi = this->GetWidget<NWidgetStacked>(VVW_WIDGET_SELECT_DEPOT_CLONE); // Selection widget 'send to depot' / 'clone'. + if (nwi->shown_plane + SEL_DC_BASEPLANE != plane) { + this->SelectPlane(plane); + this->SetWidgetDirty(VVW_WIDGET_SELECT_DEPOT_CLONE); + } + /* The same system applies to widget VVW_WIDGET_REFIT_VEH and VVW_WIDGET_TURN_AROUND.*/ + if (v->type == VEH_ROAD || v->type == VEH_TRAIN) { + PlaneSelections plane = veh_stopped ? SEL_RT_REFIT : SEL_RT_TURN_AROUND; + NWidgetStacked *nwi = this->GetWidget<NWidgetStacked>(VVW_WIDGET_SELECT_REFIT_TURN); + if (nwi->shown_plane + SEL_RT_BASEPLANE != plane) { + this->SelectPlane(plane); + this->SetWidgetDirty(VVW_WIDGET_SELECT_REFIT_TURN); } - this->SetDirty(); } } }; diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index 60935cb94..889b18281 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -37,6 +37,8 @@ enum VehicleViewWindowWidgets { VVW_WIDGET_SHOW_DETAILS, VVW_WIDGET_CLONE_VEH, VVW_WIDGET_EMPTY_BOTTOM_RIGHT, + VVW_WIDGET_SELECT_DEPOT_CLONE, ///< Selection widget between 'goto depot', and 'clone vehicle' buttons. + VVW_WIDGET_SELECT_REFIT_TURN, ///< Selection widget between 'refit' and 'turn around' buttons. VVW_WIDGET_RESIZE, VVW_WIDGET_TURN_AROUND, VVW_WIDGET_FORCE_PROCEED, |