diff options
Diffstat (limited to 'src/order_gui.cpp')
-rw-r--r-- | src/order_gui.cpp | 69 |
1 files changed, 62 insertions, 7 deletions
diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 6f1a61539..748d9e395 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -40,6 +40,7 @@ enum OrderWindowWidgets { ORDER_WIDGET_SCROLLBAR, ORDER_WIDGET_SKIP, ORDER_WIDGET_DELETE, + ORDER_WIDGET_STOP_SHARING, ORDER_WIDGET_NON_STOP, ORDER_WIDGET_GOTO, ORDER_WIDGET_FULL_LOAD, @@ -53,6 +54,7 @@ enum OrderWindowWidgets { ORDER_WIDGET_SEL_TOP_MIDDLE, ///< #NWID_SELECTION widget for middle part of the top row of the 'your train' order window. ORDER_WIDGET_SEL_TOP_RIGHT, ///< #NWID_SELECTION widget for right part of the top row of the 'your train' order window. ORDER_WIDGET_SEL_TOP_ROW, ///< #NWID_SELECTION widget for the top row of the 'your non-trains' order window. + ORDER_WIDGET_SEL_BOTTOM_MIDDLE, ///< #NWID_SELECTION widget for the middle part of the bottom row of the 'your train' order window. ORDER_WIDGET_SHARED_ORDER_LIST, }; @@ -458,6 +460,10 @@ private: DP_ROW_LOAD = 0, ///< Display 'load' / 'unload' buttons in the top row of the ship/airplane order window. DP_ROW_DEPOT = 1, ///< Display 'refit' / 'service' buttons in the top row of the ship/airplane order window. DP_ROW_CONDITIONAL = 2, ///< Display the conditional order buttons in the top row of the ship/airplane order window. + + /* ORDER_WIDGET_SEL_BOTTOM_MIDDLE */ + DP_BOTTOM_MIDDLE_DELETE = 0, ///< Display 'delete' in the middle button of the bottom row of the vehicle order window. + DP_BOTTOM_MIDDLE_STOP_SHARING = 1, ///< Display 'stop sharing' in the middle button of the bottom row of the vehicle order window. }; int selected_order; @@ -673,6 +679,31 @@ private: } /** + * Handle the click on the 'stop sharing' button. + * If 'End of Shared Orders' isn't selected, do nothing. If Ctrl is pressed, call OrderClick_Delete and exit. + * To stop sharing this vehicle order list, we copy the orders of a vehicle that share this order list. That way we + * exit the group of shared vehicles while keeping the same order list. + * @param i Dummy parameter. + */ + void OrderClick_StopSharing(int i) + { + /* Don't try to stop sharing orders if 'End of Shared Orders' isn't selected. */ + if (!this->vehicle->IsOrderListShared() || this->selected_order != this->vehicle->GetNumOrders()) return; + /* If Ctrl is pressed, delete the order list as if we clicked the 'Delete' button. */ + if (_ctrl_pressed) { + this->OrderClick_Delete(i); + return; + } + + /* Get another vehicle that share orders with this vehicle. */ + Vehicle *other_shared = (this->vehicle->FirstShared() == this->vehicle) ? this->vehicle->NextShared() : this->vehicle->PreviousShared(); + /* Copy the order list of the other vehicle. */ + if (DoCommandP(this->vehicle->tile, this->vehicle->index | CO_COPY << 30, other_shared->index, CMD_CLONE_ORDER | CMD_MSG(STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST))) { + this->UpdateButtonState(); + } + } + + /** * Handle the click on the refit button. * If ctrl is pressed, cancel refitting, else show the refit window. * @param i Dummy parameter. @@ -823,9 +854,17 @@ public: /* skip */ this->SetWidgetDisabledState(ORDER_WIDGET_SKIP, this->vehicle->GetNumOrders() <= 1); - /* delete */ - this->SetWidgetDisabledState(ORDER_WIDGET_DELETE, + /* delete / stop sharing */ + NWidgetStacked *delete_sel = this->GetWidget<NWidgetStacked>(ORDER_WIDGET_SEL_BOTTOM_MIDDLE); + if (shared_orders && this->selected_order == this->vehicle->GetNumOrders()) { + /* The 'End of Shared Orders' order is selected, show the 'stop sharing' button. */ + delete_sel->SetDisplayedPlane(DP_BOTTOM_MIDDLE_STOP_SHARING); + } else { + /* The 'End of Shared Orders' order isn't selected, show the 'delete' button. */ + delete_sel->SetDisplayedPlane(DP_BOTTOM_MIDDLE_DELETE); + this->SetWidgetDisabledState(ORDER_WIDGET_DELETE, (uint)this->vehicle->GetNumOrders() + ((shared_orders || this->vehicle->GetNumOrders() != 0) ? 1 : 0) <= (uint)this->selected_order); + } /* First row. */ this->RaiseWidget(ORDER_WIDGET_FULL_LOAD); @@ -1072,6 +1111,10 @@ public: this->OrderClick_Delete(0); break; + case ORDER_WIDGET_STOP_SHARING: + this->OrderClick_StopSharing(0); + break; + case ORDER_WIDGET_NON_STOP: if (this->GetWidget<NWidgetLeaf>(widget)->ButtonHit(pt)) { this->OrderClick_Nonstop(-1); @@ -1225,6 +1268,10 @@ public: case ORDER_WIDGET_DELETE: this->OrderClick_Delete(0); break; + + case ORDER_WIDGET_STOP_SHARING: + this->OrderClick_StopSharing(0); + break; } ResetObjectToPlace(); @@ -1327,7 +1374,7 @@ public: virtual void OnTimeout() { static const int raise_widgets[] = { - ORDER_WIDGET_TIMETABLE_VIEW, ORDER_WIDGET_SKIP, ORDER_WIDGET_DELETE, ORDER_WIDGET_REFIT, ORDER_WIDGET_SHARED_ORDER_LIST, WIDGET_LIST_END, + ORDER_WIDGET_TIMETABLE_VIEW, ORDER_WIDGET_SKIP, ORDER_WIDGET_DELETE, ORDER_WIDGET_STOP_SHARING, ORDER_WIDGET_REFIT, ORDER_WIDGET_SHARED_ORDER_LIST, WIDGET_LIST_END, }; /* Unclick all buttons in raise_widgets[]. */ @@ -1407,8 +1454,12 @@ static const NWidgetPart _nested_orders_train_widgets[] = { NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_SKIP), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDERS_SKIP_BUTTON, STR_ORDERS_SKIP_TOOLTIP), SetResize(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_DELETE), SetMinimalSize(124, 12), SetFill(1, 0), - SetDataTip(STR_ORDERS_DELETE_BUTTON, STR_ORDERS_DELETE_TOOLTIP), SetResize(1, 0), + NWidget(NWID_SELECTION, INVALID_COLOUR, ORDER_WIDGET_SEL_BOTTOM_MIDDLE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_DELETE), SetMinimalSize(124, 12), SetFill(1, 0), + SetDataTip(STR_ORDERS_DELETE_BUTTON, STR_ORDERS_DELETE_TOOLTIP), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_STOP_SHARING), SetMinimalSize(124, 12), SetFill(1, 0), + SetDataTip(STR_ORDERS_STOP_SHARING_BUTTON, STR_ORDERS_STOP_SHARING_TOOLTIP), SetResize(1, 0), + EndContainer(), NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_GOTO), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDERS_GO_TO_BUTTON, STR_ORDERS_GO_TO_TOOLTIP), SetResize(1, 0), EndContainer(), @@ -1473,8 +1524,12 @@ static const NWidgetPart _nested_orders_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_SKIP), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDERS_SKIP_BUTTON, STR_ORDERS_SKIP_TOOLTIP), SetResize(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_DELETE), SetMinimalSize(124, 12), SetFill(1, 0), - SetDataTip(STR_ORDERS_DELETE_BUTTON, STR_ORDERS_DELETE_TOOLTIP), SetResize(1, 0), + NWidget(NWID_SELECTION, INVALID_COLOUR, ORDER_WIDGET_SEL_BOTTOM_MIDDLE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_DELETE), SetMinimalSize(124, 12), SetFill(1, 0), + SetDataTip(STR_ORDERS_DELETE_BUTTON, STR_ORDERS_DELETE_TOOLTIP), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_STOP_SHARING), SetMinimalSize(124, 12), SetFill(1, 0), + SetDataTip(STR_ORDERS_STOP_SHARING_BUTTON, STR_ORDERS_STOP_SHARING_TOOLTIP), SetResize(1, 0), + EndContainer(), NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_GOTO), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDERS_GO_TO_BUTTON, STR_ORDERS_GO_TO_TOOLTIP), SetResize(1, 0), NWidget(WWT_RESIZEBOX, COLOUR_GREY), |