Allow removing vehicle from slots using vehicle details window dropdown
This commit is contained in:
@@ -1622,6 +1622,7 @@ STR_VEHICLE_DETAILS_TRAIN_MAX_SPEED :{BLACK}Max. spe
|
|||||||
STR_VEHICLE_DETAILS_EXTRA_ACTIONS_TOOLTIP :{BLACK}Extra vehicle actions
|
STR_VEHICLE_DETAILS_EXTRA_ACTIONS_TOOLTIP :{BLACK}Extra vehicle actions
|
||||||
STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION :Remove speed restriction
|
STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION :Remove speed restriction
|
||||||
STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION :Set speed restriction
|
STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION :Set speed restriction
|
||||||
|
STR_VEHICLE_DETAILS_REMOVE_FROM_SLOT :Remove from slot:
|
||||||
|
|
||||||
STR_ORDER_DROP_CARGO_TYPE_LOAD :Load by cargo type
|
STR_ORDER_DROP_CARGO_TYPE_LOAD :Load by cargo type
|
||||||
STR_ORDER_DROP_CARGO_TYPE_UNLOAD :Unload by cargo type
|
STR_ORDER_DROP_CARGO_TYPE_UNLOAD :Unload by cargo type
|
||||||
|
@@ -2848,6 +2848,7 @@ struct VehicleDetailsWindow : Window {
|
|||||||
enum DropDownAction {
|
enum DropDownAction {
|
||||||
VDWDDA_CLEAR_SPEED_RESTRICTION,
|
VDWDDA_CLEAR_SPEED_RESTRICTION,
|
||||||
VDWDDA_SET_SPEED_RESTRICTION,
|
VDWDDA_SET_SPEED_RESTRICTION,
|
||||||
|
VDWDDA_REMOVE_FROM_SLOT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Initialize a newly created vehicle details window */
|
/** Initialize a newly created vehicle details window */
|
||||||
@@ -2955,6 +2956,19 @@ struct VehicleDetailsWindow : Window {
|
|||||||
return HasBit(Train::From(v)->flags, VRF_SPEED_ADAPTATION_EXEMPT);
|
return HasBit(Train::From(v)->flags, VRF_SPEED_ADAPTATION_EXEMPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<TraceRestrictSlotID> GetVehicleSlots(const Vehicle *v) const
|
||||||
|
{
|
||||||
|
std::vector<TraceRestrictSlotID> slots;
|
||||||
|
TraceRestrictGetVehicleSlots(v->index, slots);
|
||||||
|
|
||||||
|
std::sort(slots.begin(), slots.end(), [&](TraceRestrictSlotID a, TraceRestrictSlotID b) -> bool {
|
||||||
|
int r = StrNaturalCompare(TraceRestrictSlot::Get(a)->name, TraceRestrictSlot::Get(b)->name);
|
||||||
|
if (r == 0) return a < b;
|
||||||
|
return r < 0;
|
||||||
|
});
|
||||||
|
return slots;
|
||||||
|
}
|
||||||
|
|
||||||
void UpdateWidgetSize(WidgetID widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
void UpdateWidgetSize(WidgetID widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
||||||
{
|
{
|
||||||
switch (widget) {
|
switch (widget) {
|
||||||
@@ -3230,14 +3244,7 @@ struct VehicleDetailsWindow : Window {
|
|||||||
|
|
||||||
bool should_show_slots = this->ShouldShowSlotsLine(v);
|
bool should_show_slots = this->ShouldShowSlotsLine(v);
|
||||||
if (should_show_slots) {
|
if (should_show_slots) {
|
||||||
std::vector<TraceRestrictSlotID> slots;
|
std::vector<TraceRestrictSlotID> slots = this->GetVehicleSlots(v);
|
||||||
TraceRestrictGetVehicleSlots(v->index, slots);
|
|
||||||
|
|
||||||
std::sort(slots.begin(), slots.end(), [&](TraceRestrictSlotID a, TraceRestrictSlotID b) -> bool {
|
|
||||||
int r = StrNaturalCompare(TraceRestrictSlot::Get(a)->name, TraceRestrictSlot::Get(b)->name);
|
|
||||||
if (r == 0) return a < b;
|
|
||||||
return r < 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
SetDParam(0, slots.size());
|
SetDParam(0, slots.size());
|
||||||
std::string buffer = GetString(STR_TRACE_RESTRICT_SLOT_LIST_HEADER);
|
std::string buffer = GetString(STR_TRACE_RESTRICT_SLOT_LIST_HEADER);
|
||||||
@@ -3338,7 +3345,7 @@ struct VehicleDetailsWindow : Window {
|
|||||||
WID_VD_INCREASE_SERVICING_INTERVAL,
|
WID_VD_INCREASE_SERVICING_INTERVAL,
|
||||||
WID_VD_DECREASE_SERVICING_INTERVAL);
|
WID_VD_DECREASE_SERVICING_INTERVAL);
|
||||||
|
|
||||||
this->SetWidgetDisabledState(WID_VD_EXTRA_ACTIONS, v->type != VEH_TRAIN);
|
this->SetWidgetDisabledState(WID_VD_EXTRA_ACTIONS, v->type != VEH_TRAIN && !HasBit(v->vehicle_flags, VF_HAVE_SLOT));
|
||||||
|
|
||||||
StringID str =
|
StringID str =
|
||||||
!v->ServiceIntervalIsCustom() ? STR_VEHICLE_DETAILS_DEFAULT :
|
!v->ServiceIntervalIsCustom() ? STR_VEHICLE_DETAILS_DEFAULT :
|
||||||
@@ -3400,6 +3407,16 @@ struct VehicleDetailsWindow : Window {
|
|||||||
list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION, VDWDDA_CLEAR_SPEED_RESTRICTION, !change_allowed || Train::From(v)->speed_restriction == 0));
|
list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_REMOVE_SPEED_RESTRICTION, VDWDDA_CLEAR_SPEED_RESTRICTION, !change_allowed || Train::From(v)->speed_restriction == 0));
|
||||||
list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION, VDWDDA_SET_SPEED_RESTRICTION, !change_allowed));
|
list.emplace_back(new DropDownListStringItem(STR_VEHICLE_DETAILS_SET_SPEED_RESTRICTION, VDWDDA_SET_SPEED_RESTRICTION, !change_allowed));
|
||||||
}
|
}
|
||||||
|
if (HasBit(v->vehicle_flags, VF_HAVE_SLOT)) {
|
||||||
|
if (!list.empty()) list.push_back(std::make_unique<DropDownListDividerItem>(-1, false));
|
||||||
|
list.push_back(std::make_unique<DropDownUnselectable<DropDownListStringItem>>(STR_VEHICLE_DETAILS_REMOVE_FROM_SLOT, -1));
|
||||||
|
|
||||||
|
std::vector<TraceRestrictSlotID> slots = this->GetVehicleSlots(v);
|
||||||
|
for (TraceRestrictSlotID slot_id : slots) {
|
||||||
|
SetDParam(0, slot_id);
|
||||||
|
list.emplace_back(new DropDownListCheckedItem(false, STR_TRACE_RESTRICT_SLOT_NAME, VDWDDA_REMOVE_FROM_SLOT | (slot_id << 8), TraceRestrictSlot::Get(slot_id)->owner != _local_company));
|
||||||
|
}
|
||||||
|
}
|
||||||
ShowDropDownList(this, std::move(list), -1, WID_VD_EXTRA_ACTIONS, 140);
|
ShowDropDownList(this, std::move(list), -1, WID_VD_EXTRA_ACTIONS, 140);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3439,7 +3456,7 @@ struct VehicleDetailsWindow : Window {
|
|||||||
|
|
||||||
case WID_VD_EXTRA_ACTIONS: {
|
case WID_VD_EXTRA_ACTIONS: {
|
||||||
const Vehicle *v = Vehicle::Get(this->window_number);
|
const Vehicle *v = Vehicle::Get(this->window_number);
|
||||||
switch (index) {
|
switch (GB(index, 0, 8)) {
|
||||||
case VDWDDA_CLEAR_SPEED_RESTRICTION:
|
case VDWDDA_CLEAR_SPEED_RESTRICTION:
|
||||||
DoCommandP(v->tile, v->index, 0, CMD_SET_TRAIN_SPEED_RESTRICTION | CMD_MSG(STR_ERROR_CAN_T_CHANGE_SPEED_RESTRICTION));
|
DoCommandP(v->tile, v->index, 0, CMD_SET_TRAIN_SPEED_RESTRICTION | CMD_MSG(STR_ERROR_CAN_T_CHANGE_SPEED_RESTRICTION));
|
||||||
break;
|
break;
|
||||||
@@ -3447,6 +3464,12 @@ struct VehicleDetailsWindow : Window {
|
|||||||
case VDWDDA_SET_SPEED_RESTRICTION: {
|
case VDWDDA_SET_SPEED_RESTRICTION: {
|
||||||
SetDParam(0, ConvertKmhishSpeedToDisplaySpeed(Train::From(v)->speed_restriction, VEH_TRAIN));
|
SetDParam(0, ConvertKmhishSpeedToDisplaySpeed(Train::From(v)->speed_restriction, VEH_TRAIN));
|
||||||
ShowQueryString(STR_JUST_INT, STR_TIMETABLE_CHANGE_SPEED, 10, this, CS_NUMERAL, QSF_NONE);
|
ShowQueryString(STR_JUST_INT, STR_TIMETABLE_CHANGE_SPEED, 10, this, CS_NUMERAL, QSF_NONE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case VDWDDA_REMOVE_FROM_SLOT: {
|
||||||
|
DoCommandP(0, GB(index, 8, 16), v->index, CMD_REMOVE_VEHICLE_TRACERESTRICT_SLOT | CMD_MSG(STR_TRACE_RESTRICT_ERROR_SLOT_CAN_T_REMOVE_VEHICLE));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -211,6 +211,19 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop down unselectable component.
|
||||||
|
* @tparam TBase Base component.
|
||||||
|
*/
|
||||||
|
template<class TBase>
|
||||||
|
class DropDownUnselectable : public TBase {
|
||||||
|
public:
|
||||||
|
template <typename... Args>
|
||||||
|
explicit DropDownUnselectable(Args&&... args) : TBase(std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
bool Selectable() const override { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
/* Commonly used drop down list items. */
|
/* Commonly used drop down list items. */
|
||||||
using DropDownListDividerItem = DropDownDivider<DropDownListItem>;
|
using DropDownListDividerItem = DropDownDivider<DropDownListItem>;
|
||||||
using DropDownListStringItem = DropDownString<DropDownListItem>;
|
using DropDownListStringItem = DropDownString<DropDownListItem>;
|
||||||
|
Reference in New Issue
Block a user