src/order_gui.cpp
changeset 10136 d808af13bf7a
parent 10132 797415496aaa
child 10139 448ed1614a14
equal deleted inserted replaced
10135:b2777e2f98e5 10136:d808af13bf7a
    25 #include "vehicle_func.h"
    25 #include "vehicle_func.h"
    26 #include "settings_type.h"
    26 #include "settings_type.h"
    27 #include "player_func.h"
    27 #include "player_func.h"
    28 #include "newgrf_cargo.h"
    28 #include "newgrf_cargo.h"
    29 #include "widgets/dropdown_func.h"
    29 #include "widgets/dropdown_func.h"
       
    30 #include "textbuf_gui.h"
       
    31 #include "string_func.h"
    30 
    32 
    31 #include "table/sprites.h"
    33 #include "table/sprites.h"
    32 #include "table/strings.h"
    34 #include "table/strings.h"
    33 
    35 
    34 enum OrderWindowWidgets {
    36 enum OrderWindowWidgets {
    44 	ORDER_WIDGET_GOTO_DROPDOWN,
    46 	ORDER_WIDGET_GOTO_DROPDOWN,
    45 	ORDER_WIDGET_FULL_LOAD,
    47 	ORDER_WIDGET_FULL_LOAD,
    46 	ORDER_WIDGET_UNLOAD,
    48 	ORDER_WIDGET_UNLOAD,
    47 	ORDER_WIDGET_REFIT,
    49 	ORDER_WIDGET_REFIT,
    48 	ORDER_WIDGET_SERVICE,
    50 	ORDER_WIDGET_SERVICE,
       
    51 	ORDER_WIDGET_COND_VARIABLE,
       
    52 	ORDER_WIDGET_COND_COMPARATOR,
       
    53 	ORDER_WIDGET_COND_VALUE,
    49 	ORDER_WIDGET_RESIZE_BAR,
    54 	ORDER_WIDGET_RESIZE_BAR,
    50 	ORDER_WIDGET_SHARED_ORDER_LIST,
    55 	ORDER_WIDGET_SHARED_ORDER_LIST,
    51 	ORDER_WIDGET_RESIZE,
    56 	ORDER_WIDGET_RESIZE,
    52 };
    57 };
    53 
    58 
       
    59 /** Under what reason are we using the PlaceObject functionality? */
       
    60 enum OrderPlaceObjectState {
       
    61 	OPOS_GOTO,
       
    62 	OPOS_CONDITIONAL,
       
    63 };
       
    64 
    54 struct order_d {
    65 struct order_d {
    55 	int sel;
    66 	int sel;
       
    67 	OrderPlaceObjectState goto_type;
    56 };
    68 };
    57 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(order_d));
    69 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(order_d));
    58 
    70 
    59 /**
    71 /**
    60  * Return the memorised selected order.
    72  * Return the memorised selected order.
    87 	/*
    99 	/*
    88 	 * Calculation description:
   100 	 * Calculation description:
    89 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
   101 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
    90 	 * 10 = order text hight
   102 	 * 10 = order text hight
    91 	 */
   103 	 */
    92 	int sel = (y - 15) / 10;
   104 	int sel = (y - w->widget[ORDER_WIDGET_ORDER_LIST].top - 1) / 10;
    93 
   105 
    94 	if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER;
   106 	if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER;
    95 
   107 
    96 	sel += w->vscroll.pos;
   108 	sel += w->vscroll.pos;
    97 
   109 
   160 };
   172 };
   161 
   173 
   162 static const StringID _order_goto_dropdown[] = {
   174 static const StringID _order_goto_dropdown[] = {
   163 	STR_ORDER_GO_TO,
   175 	STR_ORDER_GO_TO,
   164 	STR_ORDER_GO_TO_NEAREST_DEPOT,
   176 	STR_ORDER_GO_TO_NEAREST_DEPOT,
       
   177 	STR_ORDER_CONDITIONAL,
   165 	INVALID_STRING_ID
   178 	INVALID_STRING_ID
   166 };
   179 };
   167 
   180 
   168 static const StringID _order_goto_dropdown_aircraft[] = {
   181 static const StringID _order_goto_dropdown_aircraft[] = {
   169 	STR_ORDER_GO_TO,
   182 	STR_ORDER_GO_TO,
   170 	STR_ORDER_GO_TO_NEAREST_HANGAR,
   183 	STR_ORDER_GO_TO_NEAREST_HANGAR,
       
   184 	STR_ORDER_CONDITIONAL,
   171 	INVALID_STRING_ID
   185 	INVALID_STRING_ID
   172 };
   186 };
       
   187 
       
   188 static const StringID _order_conditional_variable[] = {
       
   189 	STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE,
       
   190 	STR_ORDER_CONDITIONAL_RELIABILITY,
       
   191 	STR_ORDER_CONDITIONAL_MAX_SPEED,
       
   192 	STR_ORDER_CONDITIONAL_AGE,
       
   193 	STR_ORDER_CONDITIONAL_REQUIRES_SERVICE,
       
   194 	INVALID_STRING_ID,
       
   195 };
       
   196 
       
   197 static const StringID _order_conditional_condition[] = {
       
   198 	STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS,
       
   199 	STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS,
       
   200 	STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN,
       
   201 	STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS,
       
   202 	STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN,
       
   203 	STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS,
       
   204 	STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE,
       
   205 	STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE,
       
   206 	INVALID_STRING_ID,
       
   207 };
       
   208 
       
   209 extern uint ConvertSpeedToDisplaySpeed(uint speed);
       
   210 extern uint ConvertDisplaySpeedToSpeed(uint speed);
       
   211 
   173 
   212 
   174 static void DrawOrdersWindow(Window *w)
   213 static void DrawOrdersWindow(Window *w)
   175 {
   214 {
   176 	const Vehicle *v = GetVehicle(w->window_number);
   215 	const Vehicle *v = GetVehicle(w->window_number);
   177 	bool shared_orders = v->IsOrderListShared();
   216 	bool shared_orders = v->IsOrderListShared();
   181 	int sel = OrderGetSel(w);
   220 	int sel = OrderGetSel(w);
   182 	const Order *order = GetVehicleOrder(v, sel);
   221 	const Order *order = GetVehicleOrder(v, sel);
   183 
   222 
   184 	if (v->owner == _local_player) {
   223 	if (v->owner == _local_player) {
   185 		/* Set the strings for the dropdown boxes. */
   224 		/* Set the strings for the dropdown boxes. */
   186 		w->widget[ORDER_WIDGET_NON_STOP].data  = _order_non_stop_drowdown[order == NULL ? 0 : order->GetNonStopType()];
   225 		w->widget[ORDER_WIDGET_NON_STOP].data        = _order_non_stop_drowdown[order == NULL ? 0 : order->GetNonStopType()];
   187 		w->widget[ORDER_WIDGET_FULL_LOAD].data = _order_full_load_drowdown[order == NULL ? 0 : order->GetLoadType()];
   226 		w->widget[ORDER_WIDGET_FULL_LOAD].data       = _order_full_load_drowdown[order == NULL ? 0 : order->GetLoadType()];
   188 		w->widget[ORDER_WIDGET_UNLOAD].data    = _order_unload_drowdown[order == NULL ? 0 : order->GetUnloadType()];
   227 		w->widget[ORDER_WIDGET_UNLOAD].data          = _order_unload_drowdown[order == NULL ? 0 : order->GetUnloadType()];
       
   228 		w->widget[ORDER_WIDGET_COND_VARIABLE].data   = _order_conditional_variable[order == NULL ? 0 : order->GetConditionVariable()];
       
   229 		w->widget[ORDER_WIDGET_COND_COMPARATOR].data = _order_conditional_condition[order == NULL ? 0 : order->GetConditionComparator()];
   189 
   230 
   190 		/* skip */
   231 		/* skip */
   191 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   232 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   192 
   233 
   193 		/* delete */
   234 		/* delete */
   202 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   243 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   203 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
   244 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
   204 		w->SetWidgetDisabledState(ORDER_WIDGET_SERVICE,   order == NULL); // Refit
   245 		w->SetWidgetDisabledState(ORDER_WIDGET_SERVICE,   order == NULL); // Refit
   205 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
   246 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
   206 		w->HideWidget(ORDER_WIDGET_SERVICE); // Service
   247 		w->HideWidget(ORDER_WIDGET_SERVICE); // Service
   207 	} else {
   248 
   208 		w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   249 		w->HideWidget(ORDER_WIDGET_COND_VARIABLE);
   209 	}
   250 		w->HideWidget(ORDER_WIDGET_COND_COMPARATOR);
   210 
   251 		w->HideWidget(ORDER_WIDGET_COND_VALUE);
       
   252 	}
       
   253 
       
   254 	w->ShowWidget(ORDER_WIDGET_NON_STOP);
   211 	w->ShowWidget(ORDER_WIDGET_UNLOAD);
   255 	w->ShowWidget(ORDER_WIDGET_UNLOAD);
   212 	w->ShowWidget(ORDER_WIDGET_FULL_LOAD);
   256 	w->ShowWidget(ORDER_WIDGET_FULL_LOAD);
   213 
   257 
   214 	if (order != NULL) {
   258 	if (order != NULL) {
   215 		switch (order->GetType()) {
   259 		switch (order->GetType()) {
   230 				w->ShowWidget(ORDER_WIDGET_REFIT);
   274 				w->ShowWidget(ORDER_WIDGET_REFIT);
   231 				w->HideWidget(ORDER_WIDGET_FULL_LOAD);
   275 				w->HideWidget(ORDER_WIDGET_FULL_LOAD);
   232 				w->ShowWidget(ORDER_WIDGET_SERVICE);
   276 				w->ShowWidget(ORDER_WIDGET_SERVICE);
   233 				break;
   277 				break;
   234 
   278 
       
   279 			case OT_CONDITIONAL: {
       
   280 				w->HideWidget(ORDER_WIDGET_NON_STOP);
       
   281 				w->HideWidget(ORDER_WIDGET_UNLOAD);
       
   282 				w->HideWidget(ORDER_WIDGET_FULL_LOAD);
       
   283 				w->ShowWidget(ORDER_WIDGET_COND_VARIABLE);
       
   284 				w->ShowWidget(ORDER_WIDGET_COND_COMPARATOR);
       
   285 				w->ShowWidget(ORDER_WIDGET_COND_VALUE);
       
   286 
       
   287 				OrderConditionVariable ocv = order->GetConditionVariable();
       
   288 				w->SetWidgetDisabledState(ORDER_WIDGET_COND_VALUE, ocv == OCV_REQUIRES_SERVICE);
       
   289 
       
   290 				uint value = order->GetConditionValue();
       
   291 				if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   292 				SetDParam(1, value);
       
   293 			} break;
       
   294 
   235 			default: // every other orders
   295 			default: // every other orders
   236 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   296 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   237 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   297 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   238 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   298 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   239 		}
   299 		}
   247 	int i = w->vscroll.pos;
   307 	int i = w->vscroll.pos;
   248 	order = GetVehicleOrder(v, i);
   308 	order = GetVehicleOrder(v, i);
   249 	StringID str;
   309 	StringID str;
   250 	while (order != NULL) {
   310 	while (order != NULL) {
   251 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   311 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   252 		SetDParam(5, STR_EMPTY);
   312 		SetDParam(6, STR_EMPTY);
   253 
   313 
   254 		if (i - w->vscroll.pos < w->vscroll.cap) {
   314 		if (i - w->vscroll.pos < w->vscroll.cap) {
   255 			switch (order->GetType()) {
   315 			switch (order->GetType()) {
   256 				case OT_DUMMY:
   316 				case OT_DUMMY:
   257 					SetDParam(1, STR_INVALID_ORDER);
   317 					SetDParam(1, STR_INVALID_ORDER);
   300 					} else {
   360 					} else {
   301 						SetDParam(2, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_GO_NON_STOP_TO : STR_ORDER_GO_TO);
   361 						SetDParam(2, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_GO_NON_STOP_TO : STR_ORDER_GO_TO);
   302 					}
   362 					}
   303 
   363 
   304 					if (order->IsRefit()) {
   364 					if (order->IsRefit()) {
   305 						SetDParam(5, STR_REFIT_ORDER);
   365 						SetDParam(6, STR_REFIT_ORDER);
   306 						SetDParam(6, GetCargo(order->GetRefitCargo())->name);
   366 						SetDParam(7, GetCargo(order->GetRefitCargo())->name);
   307 					}
   367 					}
   308 					break;
   368 					break;
   309 
   369 
   310 				case OT_GOTO_WAYPOINT:
   370 				case OT_GOTO_WAYPOINT:
   311 					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
   371 					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
   312 					SetDParam(2, order->GetDestination());
   372 					SetDParam(2, order->GetDestination());
   313 					break;
   373 					break;
       
   374 
       
   375 				case OT_CONDITIONAL: {
       
   376 					OrderConditionComparator occ = order->GetConditionComparator();
       
   377 					SetDParam(1, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_CONDITIONAL_TRUE_FALSE : STR_CONDITIONAL_NUM);
       
   378 					SetDParam(2, order->GetConditionSkipToOrder() + 1);
       
   379 					SetDParam(3, STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + order->GetConditionVariable());
       
   380 					SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ);
       
   381 
       
   382 					uint value = order->GetConditionValue();
       
   383 					if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   384 					SetDParam(5, value);
       
   385 				} break;
   314 
   386 
   315 				default: NOT_REACHED();
   387 				default: NOT_REACHED();
   316 			}
   388 			}
   317 
   389 
   318 			SetDParam(0, i + 1);
   390 			SetDParam(0, i + 1);
   460 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   532 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   461 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   533 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   462 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   534 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   463 		_place_clicked_vehicle = NULL;
   535 		_place_clicked_vehicle = NULL;
   464 		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
   536 		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
       
   537 		WP(w, order_d).goto_type = OPOS_GOTO;
   465 	} else {
   538 	} else {
   466 		ResetObjectToPlace();
   539 		ResetObjectToPlace();
   467 	}
   540 	}
   468 }
   541 }
   469 
   542 
   488 			case OLF_FULL_LOAD_ANY:    load_type = OLFB_NO_LOAD;         break;
   561 			case OLF_FULL_LOAD_ANY:    load_type = OLFB_NO_LOAD;         break;
   489 			case OLFB_NO_LOAD:         load_type = OLF_LOAD_IF_POSSIBLE; break;
   562 			case OLFB_NO_LOAD:         load_type = OLF_LOAD_IF_POSSIBLE; break;
   490 			default: NOT_REACHED();
   563 			default: NOT_REACHED();
   491 		}
   564 		}
   492 	}
   565 	}
   493 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_LOAD | (load_type << 2), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   566 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_LOAD | (load_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   494 }
   567 }
   495 
   568 
   496 /**
   569 /**
   497  * Handle the click on the service.
   570  * Handle the click on the service.
   498  *
   571  *
   517 	order.index = 0;
   590 	order.index = 0;
   518 	order.MakeGoToDepot(0, ODTFB_PART_OF_ORDERS);
   591 	order.MakeGoToDepot(0, ODTFB_PART_OF_ORDERS);
   519 	order.SetDepotActionType(ODATFB_NEAREST_DEPOT);
   592 	order.SetDepotActionType(ODATFB_NEAREST_DEPOT);
   520 
   593 
   521 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), order.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER));
   594 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), order.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER));
       
   595 }
       
   596 
       
   597 /**
       
   598  * Handle the click on the conditional order button.
       
   599  *
       
   600  * @param w current window
       
   601  * @param v current vehicle
       
   602  */
       
   603 static void OrderClick_Conditional(Window *w, const Vehicle *v, int i)
       
   604 {
       
   605 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
       
   606 	w->LowerWidget(ORDER_WIDGET_GOTO);
       
   607 	SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
       
   608 	WP(w, order_d).goto_type = OPOS_CONDITIONAL;
   522 }
   609 }
   523 
   610 
   524 /**
   611 /**
   525  * Handle the click on the unload button.
   612  * Handle the click on the unload button.
   526  *
   613  *
   542 			case OUFB_NO_UNLOAD:         unload_type = OUF_UNLOAD_IF_POSSIBLE; break;
   629 			case OUFB_NO_UNLOAD:         unload_type = OUF_UNLOAD_IF_POSSIBLE; break;
   543 			default: NOT_REACHED();
   630 			default: NOT_REACHED();
   544 		}
   631 		}
   545 	}
   632 	}
   546 
   633 
   547 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (unload_type << 2), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   634 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (unload_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   548 }
   635 }
   549 
   636 
   550 /**
   637 /**
   551  * Handle the click on the nonstop button.
   638  * Handle the click on the nonstop button.
   552  *
   639  *
   564 	/* Keypress if negative, so 'toggle' to the next */
   651 	/* Keypress if negative, so 'toggle' to the next */
   565 	if (non_stop < 0) {
   652 	if (non_stop < 0) {
   566 		non_stop = (order->GetNonStopType() + 1) % ONSF_END;
   653 		non_stop = (order->GetNonStopType() + 1) % ONSF_END;
   567 	}
   654 	}
   568 
   655 
   569 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 2,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   656 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   570 }
   657 }
   571 
   658 
   572 /**
   659 /**
   573  * Handle the click on the transfer button.
   660  * Handle the click on the transfer button.
   574  *
   661  *
   578 static void OrderClick_Transfer(Window *w, const Vehicle *v, int i)
   665 static void OrderClick_Transfer(Window *w, const Vehicle *v, int i)
   579 {
   666 {
   580 	VehicleOrderID sel_ord = OrderGetSel(w);
   667 	VehicleOrderID sel_ord = OrderGetSel(w);
   581 	const Order *order = GetVehicleOrder(v, sel_ord);
   668 	const Order *order = GetVehicleOrder(v, sel_ord);
   582 
   669 
   583 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | ((order->GetUnloadType() & ~OUFB_NO_UNLOAD) ^ OUFB_TRANSFER) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   670 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | ((order->GetUnloadType() & ~OUFB_NO_UNLOAD) ^ OUFB_TRANSFER) << 4, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   584 }
   671 }
   585 
   672 
   586 /**
   673 /**
   587  * Handle the click on the skip button.
   674  * Handle the click on the skip button.
   588  * If ctrl is pressed skip to selected order.
   675  * If ctrl is pressed skip to selected order.
   761 
   848 
   762 				case ORDER_WIDGET_TIMETABLE_VIEW:
   849 				case ORDER_WIDGET_TIMETABLE_VIEW:
   763 					ShowTimetableWindow(v);
   850 					ShowTimetableWindow(v);
   764 					break;
   851 					break;
   765 
   852 
       
   853 				case ORDER_WIDGET_COND_VARIABLE:
       
   854 					ShowDropDownMenu(w, _order_conditional_variable, GetVehicleOrder(v, OrderGetSel(w))->GetConditionVariable(), ORDER_WIDGET_COND_VARIABLE, 0, 0);
       
   855 					break;
       
   856 
       
   857 				case ORDER_WIDGET_COND_COMPARATOR: {
       
   858 					const Order *o = GetVehicleOrder(v, OrderGetSel(w));
       
   859 					ShowDropDownMenu(w, _order_conditional_condition, o->GetConditionComparator(), ORDER_WIDGET_COND_COMPARATOR, 0, (o->GetConditionVariable() == OCV_REQUIRES_SERVICE) ? 0x3F : 0xC0);
       
   860 				} break;
       
   861 
       
   862 				case ORDER_WIDGET_COND_VALUE: {
       
   863 					const Order *order = GetVehicleOrder(v, OrderGetSel(w));
       
   864 					uint value = order->GetConditionValue();
       
   865 					if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   866 					SetDParam(0, value);
       
   867 					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_ORDER_CONDITIONAL_VALUE_CAPT, 5, 100, w, CS_NUMERAL);
       
   868 				} break;
       
   869 
   766 				case ORDER_WIDGET_SHARED_ORDER_LIST:
   870 				case ORDER_WIDGET_SHARED_ORDER_LIST:
   767 					ShowVehicleListWindow(v);
   871 					ShowVehicleListWindow(v);
   768 					break;
   872 					break;
       
   873 			}
       
   874 			break;
       
   875 
       
   876 		case WE_ON_EDIT_TEXT:
       
   877 			if (!StrEmpty(e->we.edittext.str)) {
       
   878 				VehicleOrderID sel = OrderGetSel(w);
       
   879 				uint value = atoi(e->we.edittext.str);
       
   880 
       
   881 				switch (GetVehicleOrder(v, sel)->GetConditionVariable()) {
       
   882 					case OCV_MAX_SPEED:
       
   883 						value = ConvertDisplaySpeedToSpeed(value);
       
   884 						break;
       
   885 
       
   886 					case OCV_RELIABILITY:
       
   887 					case OCV_LOAD_PERCENTAGE:
       
   888 						value = Clamp(value, 0, 100);
       
   889 
       
   890 					default:
       
   891 						break;
       
   892 				}
       
   893 				DoCommandP(v->tile, v->index + (sel << 16), MOF_COND_VALUE | Clamp(value, 0, 2047) << 4, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   769 			}
   894 			}
   770 			break;
   895 			break;
   771 
   896 
   772 		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
   897 		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
   773 			switch (e->we.dropdown.button) {
   898 			switch (e->we.dropdown.button) {
   783 					OrderClick_Unload(w, v, e->we.dropdown.index);
   908 					OrderClick_Unload(w, v, e->we.dropdown.index);
   784 					break;
   909 					break;
   785 
   910 
   786 				case ORDER_WIDGET_GOTO:
   911 				case ORDER_WIDGET_GOTO:
   787 					switch (e->we.dropdown.index) {
   912 					switch (e->we.dropdown.index) {
   788 						case 0: OrderClick_Goto(w, v, 0); break;
   913 						case 0:
       
   914 							w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
       
   915 							OrderClick_Goto(w, v, 0);
       
   916 							break;
       
   917 
   789 						case 1: OrderClick_NearestDepot(w, v, 0); break;
   918 						case 1: OrderClick_NearestDepot(w, v, 0); break;
       
   919 						case 2: OrderClick_Conditional(w, v, 0); break;
   790 						default: NOT_REACHED();
   920 						default: NOT_REACHED();
   791 					}
   921 					}
       
   922 					break;
       
   923 
       
   924 				case ORDER_WIDGET_COND_VARIABLE:
       
   925 					DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_COND_VARIABLE | e->we.dropdown.index << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   926 					break;
       
   927 
       
   928 				case ORDER_WIDGET_COND_COMPARATOR:
       
   929 					DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_COND_COMPARATOR | e->we.dropdown.index << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   930 					break;
   792 			}
   931 			}
   793 			break;
   932 			break;
   794 
   933 
   795 		case WE_DRAGDROP:
   934 		case WE_DRAGDROP:
   796 			switch (e->we.click.widget) {
   935 			switch (e->we.click.widget) {
   825 				}
   964 				}
   826 			}
   965 			}
   827 			break;
   966 			break;
   828 
   967 
   829 		case WE_PLACE_OBJ:
   968 		case WE_PLACE_OBJ:
   830 			OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
   969 			if (WP(w, order_d).goto_type == OPOS_GOTO) {
       
   970 				OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
       
   971 			}
   831 			break;
   972 			break;
   832 
   973 
   833 		case WE_ABORT_PLACE_OBJ:
   974 		case WE_ABORT_PLACE_OBJ:
       
   975 			if (WP(w, order_d).goto_type == OPOS_CONDITIONAL) {
       
   976 				WP(w, order_d).goto_type = OPOS_GOTO;
       
   977 				if (_cursor.pos.x >= (w->left + w->widget[ORDER_WIDGET_ORDER_LIST].left) &&
       
   978 						_cursor.pos.y >= (w->top  + w->widget[ORDER_WIDGET_ORDER_LIST].top) &&
       
   979 						_cursor.pos.x <= (w->left + w->widget[ORDER_WIDGET_ORDER_LIST].right) &&
       
   980 						_cursor.pos.y <= (w->top  + w->widget[ORDER_WIDGET_ORDER_LIST].bottom)) {
       
   981 					int order_id = GetOrderFromOrderWndPt(w, _cursor.pos.y - w->top, v);
       
   982 					if (order_id != INVALID_ORDER) {
       
   983 						Order order;
       
   984 						order.next = NULL;
       
   985 						order.index = 0;
       
   986 						order.MakeConditional(order_id);
       
   987 
       
   988 						DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), order.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER));
       
   989 					}
       
   990 				}
       
   991 			}
   834 			w->RaiseWidget(ORDER_WIDGET_GOTO);
   992 			w->RaiseWidget(ORDER_WIDGET_GOTO);
   835 			w->InvalidateWidget(ORDER_WIDGET_GOTO);
   993 			w->InvalidateWidget(ORDER_WIDGET_GOTO);
   836 			break;
   994 			break;
   837 
   995 
   838 		/* check if a vehicle in a depot was clicked.. */
   996 		/* check if a vehicle in a depot was clicked.. */
   889 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
  1047 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
   890 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
  1048 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
   891 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
  1049 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   892 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
  1050 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
   893 
  1051 
       
  1052 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP},   // ORDER_WIDGET_COND_VARIABLE
       
  1053 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP}, // ORDER_WIDGET_COND_COMPARATOR
       
  1054 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_CONDITIONAL_VALUE,   STR_ORDER_CONDITIONAL_VALUE_TOOLTIP},      // ORDER_WIDGET_COND_VALUE
       
  1055 
   894 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1056 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   895 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
  1057 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
   896 
  1058 
   897 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
  1059 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   898 	{   WIDGETS_END},
  1060 	{   WIDGETS_END},
   922 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
  1084 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   923 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
  1085 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
   924 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
  1086 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   925 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
  1087 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
   926 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
  1088 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
   927 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   186,   372,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
  1089 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
   928 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
  1090 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   929 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   372,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
  1091 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
       
  1092 
       
  1093 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP},   // ORDER_WIDGET_COND_VARIABLE
       
  1094 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP}, // ORDER_WIDGET_COND_COMPARATOR
       
  1095 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_CONDITIONAL_VALUE,   STR_ORDER_CONDITIONAL_VALUE_TOOLTIP},      // ORDER_WIDGET_COND_VALUE
   930 
  1096 
   931 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1097 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   932 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
  1098 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
   933 
  1099 
   934 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
  1100 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   963 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
  1129 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   964 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
  1130 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
   965 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
  1131 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
   966 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
  1132 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
   967 
  1133 
       
  1134 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_VARIABLE
       
  1135 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_COMPARATOR
       
  1136 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_VALUE
       
  1137 
   968 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   373,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1138 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   373,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   969 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
  1139 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
   970 
  1140 
   971 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                STR_RESIZE_BUTTON},              // ORDER_WIDGET_RESIZE
  1141 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   972 	{   WIDGETS_END},
  1142 	{   WIDGETS_END},
   973 };
  1143 };
   974 
  1144 
   975 static const WindowDesc _other_orders_desc = {
  1145 static const WindowDesc _other_orders_desc = {
   976 	WDP_AUTO, WDP_AUTO, 386, 88, 386, 88,
  1146 	WDP_AUTO, WDP_AUTO, 386, 88, 386, 88,