diff options
-rw-r--r-- | src/vehicle_gui.cpp | 105 |
1 files changed, 60 insertions, 45 deletions
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 98fe3a921..38f92b1a4 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -147,7 +147,7 @@ struct RefitOption { }; struct RefitList { - uint num_lines; + uint num_lines; ///< Number of #items. RefitOption *items; }; @@ -275,31 +275,33 @@ enum VehicleRefitWidgets { VRW_RESIZEBOX, }; +/** Refit cargo window. */ struct RefitWindow : public Window { - int sel; - RefitOption *cargo; - RefitList *list; - uint length; - VehicleOrderID order; + int sel; ///< Index in refit options, \c -1 if nothing is selected. + RefitOption *cargo; ///< Refit option selected by \v sel. + RefitList *list; ///< List of cargo types available for refitting. + uint length; ///< For trains, the number of vehicles. + VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly). - RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window(desc, v->index) + RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window() { + this->CreateNestedTree(desc); + + this->GetWidget<NWidgetCore>(VRW_SELECTHEADER)->tool_tip = STR_REFIT_TRAIN_LIST_TOOLTIP + v->type; + this->GetWidget<NWidgetCore>(VRW_MATRIX)->tool_tip = STR_REFIT_TRAIN_LIST_TOOLTIP + v->type; + NWidgetCore *nwi = this->GetWidget<NWidgetCore>(VRW_REFITBUTTON); + nwi->widget_data = STR_REFIT_TRAIN_REFIT_BUTTON + v->type; + nwi->tool_tip = STR_REFIT_TRAIN_REFIT_TOOLTIP + v->type; + + this->FinishInitNested(desc, v->index); this->owner = v->owner; - this->vscroll.SetCapacity(8); - this->resize.step_height = 14; + this->vscroll.SetCapacity(this->GetWidget<NWidgetCore>(VRW_MATRIX)->current_y / this->resize.step_height); this->order = order; this->sel = -1; this->list = BuildRefitList(v); if (v->type == VEH_TRAIN) this->length = CountVehiclesInChain(v); this->vscroll.SetCount(this->list->num_lines); - - this->widget[VRW_SELECTHEADER].tooltips = STR_REFIT_TRAIN_LIST_TOOLTIP + v->type; - this->widget[VRW_MATRIX].tooltips = STR_REFIT_TRAIN_LIST_TOOLTIP + v->type; - this->widget[VRW_REFITBUTTON].data = STR_REFIT_TRAIN_REFIT_BUTTON + v->type; - this->widget[VRW_REFITBUTTON].tooltips = STR_REFIT_TRAIN_REFIT_TOOLTIP + v->type; - - this->FindWindowPlacementAndResize(desc); } ~RefitWindow() @@ -326,24 +328,48 @@ struct RefitWindow : public Window { this->vscroll.SetCount(this->list->num_lines); - SetDParam(0, v->index); + this->cargo = (this->sel >= 0 && this->sel < (int)this->list->num_lines) ? &this->list->items[this->sel] : NULL; this->DrawWidgets(); + } - DrawVehicleRefitWindow(this->list, this->sel, this->vscroll.GetPosition(), this->vscroll.GetCapacity(), this->resize.step_height, this->width - 2); - this->cargo = (this->sel >= 0 && this->sel < (int)this->list->num_lines) ? &this->list->items[this->sel] : NULL; + virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize) + { + switch (widget) { + case VRW_MATRIX: + resize->height = WD_MATRIX_TOP + FONT_HEIGHT_NORMAL + WD_MATRIX_BOTTOM; + size->height = resize->height * 8; + break; + case VRW_INFOPANEL: + size->height = max(size->height, WD_FRAMERECT_TOP + 2 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM); + break; + } + } - if (this->cargo != NULL) { - CommandCost cost; + virtual void SetStringParameters(int widget) const + { + if (widget == VRW_CAPTION) SetDParam(0, Vehicle::Get(this->window_number)->index); + } - cost = DoCommand(v->tile, v->index, this->cargo->cargo | this->cargo->subtype << 8, - DC_QUERY_COST, GetCmdRefitVeh(v->type)); + virtual void DrawWidget(const Rect &r, int widget) const + { + switch (widget) { + case VRW_MATRIX: + DrawVehicleRefitWindow(this->list, this->sel, this->vscroll.GetPosition(), this->vscroll.GetCapacity(), this->resize.step_height, r.right - WD_FRAMERECT_RIGHT); + break; - if (CmdSucceeded(cost)) { - SetDParam(0, this->cargo->cargo); - SetDParam(1, _returned_refit_capacity); - SetDParam(2, cost.GetCost()); - DrawStringMultiLine(2, this->width - 2, this->widget[VRW_INFOPANEL].top + 1, this->widget[VRW_INFOPANEL].bottom, STR_REFIT_NEW_CAPACITY_COST_OF_REFIT); - } + case VRW_INFOPANEL: + if (this->cargo != NULL) { + Vehicle *v = Vehicle::Get(this->window_number); + CommandCost cost = DoCommand(v->tile, v->index, this->cargo->cargo | this->cargo->subtype << 8, DC_QUERY_COST, GetCmdRefitVeh(v->type)); + if (CmdSucceeded(cost)) { + SetDParam(0, this->cargo->cargo); + SetDParam(1, _returned_refit_capacity); + SetDParam(2, cost.GetCost()); + DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, + r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM, STR_REFIT_NEW_CAPACITY_COST_OF_REFIT); + } + } + break; } } @@ -351,7 +377,7 @@ struct RefitWindow : public Window { { switch (widget) { case VRW_MATRIX: { // listbox - int y = pt.y - this->widget[VRW_MATRIX].top; + int y = pt.y - this->GetWidget<NWidgetBase>(VRW_MATRIX)->pos_y; if (y >= 0) { this->sel = (y / (int)this->resize.step_height) + this->vscroll.GetPosition(); this->SetDirty(); @@ -375,23 +401,12 @@ struct RefitWindow : public Window { virtual void OnResize() { - this->vscroll.SetCapacity((this->widget[VRW_MATRIX].bottom - this->widget[VRW_MATRIX].top + 1) / this->resize.step_height); - this->widget[VRW_MATRIX].data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); + NWidgetCore *nwi = this->GetWidget<NWidgetCore>(VRW_MATRIX); + this->vscroll.SetCapacity(nwi->current_y / this->resize.step_height); + nwi->widget_data = (this->vscroll.GetCapacity() << MAT_ROW_START) + (1 << MAT_COL_START); } }; -static const Widget _vehicle_refit_widgets[] = { - { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // VRW_CLOSEBOX - { WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 239, 0, 13, STR_REFIT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // VRW_CAPTION - { WWT_TEXTBTN, RESIZE_NONE, COLOUR_GREY, 0, 239, 14, 27, STR_REFIT_TITLE, STR_NULL}, // VRW_SELECTHEADER - { WWT_MATRIX, RESIZE_BOTTOM, COLOUR_GREY, 0, 227, 28, 139, 0x801, STR_NULL}, // VRW_MATRIX - { WWT_SCROLLBAR, RESIZE_BOTTOM, COLOUR_GREY, 228, 239, 28, 139, 0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST}, // VRW_SCROLLBAR - { WWT_PANEL, RESIZE_TB, COLOUR_GREY, 0, 239, 140, 161, 0x0, STR_NULL}, // VRW_INFOPANEL - { WWT_PUSHTXTBTN, RESIZE_TB, COLOUR_GREY, 0, 227, 162, 173, 0x0, STR_NULL}, // VRW_REFITBUTTON - { WWT_RESIZEBOX, RESIZE_TB, COLOUR_GREY, 228, 239, 162, 173, 0x0, STR_TOOLTIP_RESIZE}, // VRW_RESIZEBOX - { WIDGETS_END}, -}; - static const NWidgetPart _nested_vehicle_refit_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY, VRW_CLOSEBOX), @@ -414,7 +429,7 @@ static const WindowDesc _vehicle_refit_desc( WDP_AUTO, WDP_AUTO, 240, 174, 240, 174, WC_VEHICLE_REFIT, WC_VEHICLE_VIEW, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE | WDF_CONSTRUCTION, - _vehicle_refit_widgets, _nested_vehicle_refit_widgets, lengthof(_nested_vehicle_refit_widgets) + NULL, _nested_vehicle_refit_widgets, lengthof(_nested_vehicle_refit_widgets) ); /** Show the refit window for a vehicle |