|
|
|
@ -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
|
|
|
|
|