diff --git a/src/command.cpp b/src/command.cpp index ebfb859505..15d53e1f55 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -272,6 +272,7 @@ CommandProc CmdScheduledDispatchSetDuration; CommandProc CmdScheduledDispatchSetStartDate; CommandProc CmdScheduledDispatchSetDelay; CommandProc CmdScheduledDispatchResetLastDispatch; +CommandProc CmdScheduledDispatchClear; CommandProc CmdAddPlan; CommandProcEx CmdAddPlanLine; @@ -507,6 +508,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdScheduledDispatchSetStartDate, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_SET_START_DATE DEF_CMD(CmdScheduledDispatchSetDelay, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_SET_DELAY DEF_CMD(CmdScheduledDispatchResetLastDispatch, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_RESET_LAST_DISPATCH + DEF_CMD(CmdScheduledDispatchClear, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_CLEAR DEF_CMD(CmdAddPlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN DEF_CMD(CmdAddPlanLine, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN_LINE diff --git a/src/command_type.h b/src/command_type.h index 073888428b..2528ebfed9 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -449,6 +449,7 @@ enum Commands { CMD_SCHEDULED_DISPATCH_SET_START_DATE, ///< scheduled dispatch set start date CMD_SCHEDULED_DISPATCH_SET_DELAY, ///< scheduled dispatch set maximum allow delay CMD_SCHEDULED_DISPATCH_RESET_LAST_DISPATCH, ///< scheduled dispatch reset last dispatch date + CMD_SCHEDULED_DISPATCH_CLEAR, ///< scheduled dispatch clear schedule CMD_ADD_PLAN, CMD_ADD_PLAN_LINE, diff --git a/src/lang/english.txt b/src/lang/english.txt index ce1b00486c..b116deedd9 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -7098,6 +7098,10 @@ STR_SCHDISPATCH_DELAY_CAPTION_DAY :{BLACK}Delay (d STR_SCHDISPATCH_DELAY_CAPTION_TICKS :{BLACK}Delay (ticks) STR_SCHDISPATCH_RESET_LAST_DISPATCH :{BLACK}Reset Last Dispatched STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Reset when a vehicle was last dispatched from the schedule. +STR_SCHDISPATCH_CLEAR :{BLACK}Clear Departure Slots +STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Clear all departure slots from the schedule. +STR_SCHDISPATCH_MANAGE :{BLACK}Manage Schedule +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING} STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_PAST :{BLACK}Last departure at {DATE_WALLCLOCK_TINY}. STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_FUTURE :{BLACK}Last departure has not left yet, it will depart at {DATE_WALLCLOCK_TINY}. diff --git a/src/order_base.h b/src/order_base.h index 9de61093f0..401eeeee9f 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -761,6 +761,7 @@ public: void SetScheduledDispatch(std::vector dispatch_list); void AddScheduledDispatch(uint32 offset); void RemoveScheduledDispatch(uint32 offset); + void ClearScheduledDispatch() { this->scheduled_dispatch.clear(); } void UpdateScheduledDispatch(); void ResetScheduledDispatch(); diff --git a/src/schdispatch_cmd.cpp b/src/schdispatch_cmd.cpp index 1ad8d7ae2c..a6144a9dff 100644 --- a/src/schdispatch_cmd.cpp +++ b/src/schdispatch_cmd.cpp @@ -276,6 +276,36 @@ CommandCost CmdScheduledDispatchResetLastDispatch(TileIndex tile, DoCommandFlag return CommandCost(); } +/** + * Clear scheduled dispatch schedule + * + * @param tile Not used. + * @param flags Operation to perform. + * @param p1 Vehicle index + * @param p2 Not used + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdScheduledDispatchClear(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + VehicleID veh = GB(p1, 0, 20); + + Vehicle *v = Vehicle::GetIfValid(veh); + if (v == nullptr || !v->IsPrimaryVehicle()) return CMD_ERROR; + + CommandCost ret = CheckOwnership(v->owner); + if (ret.Failed()) return ret; + + if (v->orders.list == nullptr) return CMD_ERROR; + + if (flags & DC_EXEC) { + v->orders.list->ClearScheduledDispatch(); + SetWindowDirty(WC_SCHDISPATCH_SLOTS, v->index); + } + + return CommandCost(); +} + /** * Set scheduled dispatch slot list. * @param dispatch_list The offset time list, must be correctly sorted. diff --git a/src/schdispatch_gui.cpp b/src/schdispatch_gui.cpp index 30d6040dce..5a615a1c49 100644 --- a/src/schdispatch_gui.cpp +++ b/src/schdispatch_gui.cpp @@ -47,7 +47,7 @@ enum SchdispatchWidgets { WID_SCHDISPATCH_SET_DURATION, ///< Duration button WID_SCHDISPATCH_SET_START_DATE, ///< Start Date button WID_SCHDISPATCH_SET_DELAY, ///< Delat button - WID_SCHDISPATCH_RESET_DISPATCH, ///< Reset dispatch button + WID_SCHDISPATCH_MANAGEMENT, ///< Management button }; /** @@ -185,6 +185,11 @@ struct SchdispatchWindow : Window { uint flag_width; uint flag_height; + enum ManagementDropdown { + SCH_MD_RESET_LAST_DISPATCHED, + SCH_MD_CLEAR_SCHEDULE, + }; + virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { @@ -259,7 +264,7 @@ struct SchdispatchWindow : Window { this->SetWidgetDisabledState(WID_SCHDISPATCH_SET_DURATION, disabled); this->SetWidgetDisabledState(WID_SCHDISPATCH_SET_START_DATE, disabled); this->SetWidgetDisabledState(WID_SCHDISPATCH_SET_DELAY, disabled); - this->SetWidgetDisabledState(WID_SCHDISPATCH_RESET_DISPATCH, disabled); + this->SetWidgetDisabledState(WID_SCHDISPATCH_MANAGEMENT, disabled); this->vscroll->SetCount(CeilDiv(this->item_count, this->num_columns)); @@ -287,6 +292,14 @@ struct SchdispatchWindow : Window { break; } + case WID_SCHDISPATCH_MANAGEMENT: { + uint64 params[2]; + params[0] = STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP; + params[1] = STR_SCHDISPATCH_CLEAR_TOOLTIP; + GuiShowTooltips(this, STR_SCHDISPATCH_MANAGE_TOOLTIP, 2, params, close_cond); + return true; + } + default: break; } @@ -553,8 +566,11 @@ struct SchdispatchWindow : Window { break; } - case WID_SCHDISPATCH_RESET_DISPATCH: { - DoCommandP(0, v->index, 0, CMD_SCHEDULED_DISPATCH_RESET_LAST_DISPATCH | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + case WID_SCHDISPATCH_MANAGEMENT: { + DropDownList list; + list.emplace_back(new DropDownListStringItem(STR_SCHDISPATCH_RESET_LAST_DISPATCH, SCH_MD_RESET_LAST_DISPATCHED, false)); + list.emplace_back(new DropDownListStringItem(STR_SCHDISPATCH_CLEAR, SCH_MD_CLEAR_SCHEDULE, false)); + ShowDropDownList(this, std::move(list), -1, WID_SCHDISPATCH_MANAGEMENT); break; } } @@ -562,6 +578,26 @@ struct SchdispatchWindow : Window { this->SetDirty(); } + void OnDropdownSelect(int widget, int index) override + { + switch (widget) { + case WID_SCHDISPATCH_MANAGEMENT: { + switch((ManagementDropdown)index) { + case SCH_MD_RESET_LAST_DISPATCHED: + DoCommandP(0, this->vehicle->index, 0, CMD_SCHEDULED_DISPATCH_RESET_LAST_DISPATCH | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + break; + + case SCH_MD_CLEAR_SCHEDULE: + DoCommandP(0, this->vehicle->index, 0, CMD_SCHEDULED_DISPATCH_CLEAR | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + break; + } + } + + default: + break; + } + } + virtual void OnQueryTextFinished(char *str) override { if (str == nullptr) return; @@ -682,7 +718,7 @@ static const NWidgetPart _nested_schdispatch_widgets[] = { EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCHDISPATCH_SET_DELAY), SetDataTip(STR_SCHDISPATCH_DELAY, STR_SCHDISPATCH_DELAY_TOOLTIP), SetFill(1, 1), SetResize(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCHDISPATCH_RESET_DISPATCH), SetDataTip(STR_SCHDISPATCH_RESET_LAST_DISPATCH, STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP), SetFill(1, 1), SetResize(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCHDISPATCH_MANAGEMENT), SetDataTip(STR_SCHDISPATCH_MANAGE, STR_SCHDISPATCH_MANAGE_TOOLTIP), SetFill(1, 1), SetResize(1, 0), EndContainer(), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(),