diff --git a/src/lang/english.txt b/src/lang/english.txt index 14f6cfa6cd..7430138b64 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4469,6 +4469,8 @@ STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP :{BLACK}Show occ STR_ORDERS_OCCUPANCY_LIST_TOOLTIP :{BLACK}Order occupancy - this shows running averages of recent occupancy levels when leaving a station, for all vehicles sharing these orders STR_ORDERS_OCCUPANCY_PERCENT :{NUM}% +STR_ORDERS_NEW_GROUP_TOOLTIP :{BLACK}Create group from single vehicle + # String parts to build the order string STR_ORDER_GO_TO_WAYPOINT :Go via {WAYPOINT} STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Go non-stop via {WAYPOINT} @@ -5723,6 +5725,7 @@ STR_ORANGE_STRING1_LTBLUE :{ORANGE}{STRING STR_TINY_BLACK_HEIGHT :{TINY_FONT}{BLACK}{HEIGHT} STR_TINY_BLACK_VEHICLE :{TINY_FONT}{BLACK}{VEHICLE} STR_TINY_RIGHT_ARROW :{TINY_FONT}{RIGHT_ARROW} +STR_BLACK_PLUS :{BLACK}+ STR_WHITE :{WHITE} STR_BLACK :{BLACK} diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 95b5a96ad5..e1a7f267e5 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -30,6 +30,7 @@ #include "hotkeys.h" #include "aircraft.h" #include "engine_func.h" +#include "vehiclelist.h" #include "widgets/order_widget.h" @@ -1021,6 +1022,10 @@ private: /* WID_O_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. + + /* WID_O_SEL_SHARED */ + DP_SHARED_LIST = 0, ///< Display shared order list button + DP_SHARED_VEH_GROUP = 1, ///< Display add veh to new group button }; int selected_order; @@ -1032,6 +1037,7 @@ private: bool can_do_autorefit; ///< Vehicle chain can be auto-refitted. StringID cargo_names_list[NUM_CARGO + 1]; uint32 cargo_bitmask; + int query_text_widget; ///< widget which most recently called ShowQueryString /** * Return the memorised selected order. @@ -1490,6 +1496,12 @@ public: } } + virtual EventState OnCTRLStateChange() OVERRIDE + { + this->UpdateButtonState(); + return ES_NOT_HANDLED; + } + void UpdateButtonState() { if (this->vehicle->owner != _local_company) return; // No buttons are displayed with competitor order windows. @@ -1657,6 +1669,8 @@ public: } } + this->GetWidget(WID_O_SEL_SHARED)->SetDisplayedPlane(_ctrl_pressed ? DP_SHARED_VEH_GROUP : DP_SHARED_LIST); + /* Disable list of vehicles with the same shared orders if there is no list */ this->SetWidgetDisabledState(WID_O_SHARED_ORDER_LIST, !(shared_orders || _settings_client.gui.enable_single_veh_shared_order_gui)); @@ -1973,6 +1987,7 @@ public: const Order *order = this->vehicle->GetOrder(this->OrderGetSel()); uint value = order->GetConditionValue(); if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value); + this->query_text_widget = WID_O_COND_VALUE; SetDParam(0, value); ShowQueryString(STR_JUST_INT, STR_ORDER_CONDITIONAL_VALUE_CAPT, 5, this, CS_NUMERAL, QSF_NONE); break; @@ -1982,6 +1997,12 @@ public: ShowVehicleListWindow(this->vehicle); break; + case WID_O_ADD_VEH_GROUP: { + this->query_text_widget = WID_O_ADD_VEH_GROUP; + ShowQueryString(STR_EMPTY, STR_GROUP_RENAME_CAPTION, MAX_LENGTH_GROUP_NAME_CHARS, this, CS_ALPHANUMERAL, QSF_ENABLE_DEFAULT | QSF_LEN_IN_CHARS); + break; + } + case WID_O_OCCUPANCY_TOGGLE: ToggleWidgetLoweredState(WID_O_OCCUPANCY_TOGGLE); this->UpdateButtonState(); @@ -1992,7 +2013,7 @@ public: virtual void OnQueryTextFinished(char *str) OVERRIDE { - if (!StrEmpty(str)) { + if (this->query_text_widget == WID_O_COND_VALUE && !StrEmpty(str)) { VehicleOrderID sel = this->OrderGetSel(); uint value = atoi(str); @@ -2012,6 +2033,10 @@ public: } DoCommandP(this->vehicle->tile, this->vehicle->index + (sel << 20), MOF_COND_VALUE | Clamp(value, 0, 2047) << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); } + + if (this->query_text_widget == WID_O_ADD_VEH_GROUP) { + DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, this->vehicle->type, this->vehicle->owner, this->vehicle->index).Pack(), 0, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), NULL, str); + } } virtual void OnDropdownSelect(int widget, int index) OVERRIDE @@ -2284,7 +2309,10 @@ static const NWidgetPart _nested_orders_train_widgets[] = { EndContainer(), EndContainer(), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(36, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_SHARED), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_O_ADD_VEH_GROUP), SetMinimalSize(12, 12), SetDataTip(STR_BLACK_PLUS, STR_ORDERS_NEW_GROUP_TOOLTIP), + EndContainer(), EndContainer(), /* Second button row. */ @@ -2368,7 +2396,10 @@ static const NWidgetPart _nested_orders_widgets[] = { EndContainer(), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(36, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_SHARED), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_O_ADD_VEH_GROUP), SetMinimalSize(12, 12), SetDataTip(STR_BLACK_PLUS, STR_ORDERS_NEW_GROUP_TOOLTIP), + EndContainer(), EndContainer(), /* Second button row. */ diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 7dad64ef87..e4aa22e7d9 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -26,6 +26,7 @@ #include "settings_type.h" #include "viewport_func.h" #include "schdispatch.h" +#include "vehiclelist.h" #include "widgets/timetable_widget.h" @@ -330,6 +331,12 @@ struct TimetableWindow : Window { } } + virtual EventState OnCTRLStateChange() OVERRIDE + { + this->UpdateSelectionStates(); + this->SetDirty(); + return ES_NOT_HANDLED; + } virtual void OnPaint() { @@ -363,6 +370,7 @@ struct TimetableWindow : Window { this->SetWidgetDisabledState(WID_VT_AUTOFILL, v->orders.list == NULL || HasBit(v->vehicle_flags, VF_AUTOMATE_TIMETABLE)); this->SetWidgetDisabledState(WID_VT_AUTO_SEPARATION, HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); this->EnableWidget(WID_VT_AUTOMATE); + this->EnableWidget(WID_VT_ADD_VEH_GROUP); } else { this->DisableWidget(WID_VT_START_DATE); this->DisableWidget(WID_VT_CHANGE_TIME); @@ -374,6 +382,7 @@ struct TimetableWindow : Window { this->DisableWidget(WID_VT_AUTOMATE); this->DisableWidget(WID_VT_AUTO_SEPARATION); this->DisableWidget(WID_VT_SHARED_ORDER_LIST); + this->DisableWidget(WID_VT_ADD_VEH_GROUP); } this->SetWidgetLoweredState(WID_VT_AUTOFILL, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)); @@ -700,6 +709,11 @@ struct TimetableWindow : Window { case WID_VT_SHARED_ORDER_LIST: ShowVehicleListWindow(v); break; + + case WID_VT_ADD_VEH_GROUP: { + ShowQueryString(STR_EMPTY, STR_GROUP_RENAME_CAPTION, MAX_LENGTH_GROUP_NAME_CHARS, this, CS_ALPHANUMERAL, QSF_ENABLE_DEFAULT | QSF_LEN_IN_CHARS); + break; + } } this->SetDirty(); @@ -747,6 +761,11 @@ struct TimetableWindow : Window { } break; } + + case WID_VT_ADD_VEH_GROUP: { + DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, v->type, v->owner, v->index).Pack(), 0, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), NULL, str); + break; + } } } @@ -763,6 +782,7 @@ struct TimetableWindow : Window { { this->GetWidget(WID_VT_ARRIVAL_DEPARTURE_SELECTION)->SetDisplayedPlane(_settings_client.gui.timetable_arrival_departure ? 0 : SZSP_NONE); this->GetWidget(WID_VT_EXPECTED_SELECTION)->SetDisplayedPlane(_settings_client.gui.timetable_arrival_departure ? 0 : 1); + this->GetWidget(WID_VT_SEL_SHARED)->SetDisplayedPlane(this->vehicle->owner == _local_company && _ctrl_pressed ? 1 : 0); } virtual void OnFocus(Window *previously_focused_window) @@ -830,7 +850,10 @@ static const NWidgetPart _nested_timetable_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VT_SHARED_ORDER_LIST), SetFill(0, 1), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VT_SEL_SHARED), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VT_SHARED_ORDER_LIST), SetFill(0, 1), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_VT_ADD_VEH_GROUP), SetFill(0, 1), SetDataTip(STR_BLACK_PLUS, STR_ORDERS_NEW_GROUP_TOOLTIP), + EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), NWidget(WWT_RESIZEBOX, COLOUR_GREY), SetFill(0, 1), EndContainer(), diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp index 354d776435..005e52a74f 100644 --- a/src/vehiclelist.cpp +++ b/src/vehiclelist.cpp @@ -200,6 +200,12 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli break; } + case VL_SINGLE_VEH: { + v = Vehicle::GetIfValid(vli.index); + if (v != NULL) *list->Append() = v; + break; + } + default: return false; } diff --git a/src/vehiclelist.h b/src/vehiclelist.h index 2e586fcea3..09bb4358fe 100644 --- a/src/vehiclelist.h +++ b/src/vehiclelist.h @@ -25,6 +25,7 @@ enum VehicleListType { VL_DEPOT_LIST, VL_GROUP_LIST, VL_SLOT_LIST, + VL_SINGLE_VEH, VLT_END }; diff --git a/src/widgets/order_widget.h b/src/widgets/order_widget.h index d45aabf37e..5f10d4e5b0 100644 --- a/src/widgets/order_widget.h +++ b/src/widgets/order_widget.h @@ -43,7 +43,9 @@ enum OrderWidgets { WID_O_SEL_TOP_ROW_GROUNDVEHICLE, ///< #NWID_SELECTION widget for the top row of the 'your train' order window. WID_O_SEL_TOP_ROW, ///< #NWID_SELECTION widget for the top row of the 'your non-trains' order window. WID_O_SEL_BOTTOM_MIDDLE, ///< #NWID_SELECTION widget for the middle part of the bottom row of the 'your train' order window. + WID_O_SEL_SHARED, ///< #NWID_SELECTION widget for WID_O_SHARED_ORDER_LIST and WID_O_ADD_VEH_GROUP WID_O_SHARED_ORDER_LIST, ///< Open list of shared vehicles. + WID_O_ADD_VEH_GROUP, ///< Add single vehicle to new group button. WID_O_SEL_OCCUPANCY, ///< #NWID_SELECTION widget for the occupancy list panel. WID_O_OCCUPANCY_LIST, ///< Occupancy list panel. WID_O_OCCUPANCY_TOGGLE, ///< Toggle display of occupancy measures. diff --git a/src/widgets/timetable_widget.h b/src/widgets/timetable_widget.h index 36bf59bfa2..e80b819c44 100644 --- a/src/widgets/timetable_widget.h +++ b/src/widgets/timetable_widget.h @@ -28,7 +28,9 @@ enum VehicleTimetableWidgets { WID_VT_AUTOMATE, ///< Automate button. WID_VT_AUTO_SEPARATION, ///< Auto separation button. WID_VT_EXPECTED, ///< Toggle between expected and scheduled arrivals. + WID_VT_SEL_SHARED, ///< #NWID_SELECTION widget for WID_VT_SHARED_ORDER_LIST and WID_VT_ADD_VEH_GROUP WID_VT_SHARED_ORDER_LIST, ///< Show the shared order list. + WID_VT_ADD_VEH_GROUP, ///< Create new group from single vehicle WID_VT_ARRIVAL_DEPARTURE_SELECTION, ///< Disable/hide the arrival departure panel. WID_VT_AUTO_SELECTION, ///< Disable/hide the automate button. WID_VT_EXPECTED_SELECTION, ///< Disable/hide the expected selection button.