tron@2186: /* $Id$ */ tron@2186: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" tron@3144: #include "road_map.h" tron@3315: #include "station_map.h" tron@1363: #include "table/sprites.h" tron@507: #include "table/strings.h" tron@2163: #include "functions.h" tron@679: #include "map.h" tron@1209: #include "tile.h" truelight@0: #include "window.h" truelight@0: #include "gui.h" truelight@0: #include "gfx.h" truelight@0: #include "vehicle.h" truelight@0: #include "station.h" truelight@0: #include "town.h" truelight@0: #include "command.h" truelight@0: #include "viewport.h" truelight@1313: #include "depot.h" truelight@1542: #include "waypoint.h" bjarni@2676: #include "train.h" celestar@3392: #include "water_map.h" bjarni@4668: #include "vehicle_gui.h" truelight@0: belugas@4171: static int OrderGetSel(const Window *w) truelight@0: { belugas@4171: const Vehicle *v = GetVehicle(w->window_number); truelight@0: int num = WP(w,order_d).sel; truelight@0: tron@2549: return (num >= 0 && num < v->num_orders) ? num : v->num_orders; truelight@0: } truelight@0: celestar@1935: static StringID StationOrderStrings[] = { celestar@1937: STR_8806_GO_TO, celestar@1935: STR_8807_GO_TO_TRANSFER, celestar@1935: STR_8808_GO_TO_UNLOAD, celestar@1935: STR_8809_GO_TO_TRANSFER_UNLOAD, celestar@1935: STR_880A_GO_TO_LOAD, celestar@1935: STR_880B_GO_TO_TRANSFER_LOAD, celestar@1935: STR_NULL, celestar@1935: STR_NULL, celestar@1935: STR_880C_GO_NON_STOP_TO, celestar@1935: STR_880D_GO_TO_NON_STOP_TRANSFER, celestar@1935: STR_880E_GO_NON_STOP_TO_UNLOAD, celestar@1935: STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD, celestar@1935: STR_8810_GO_NON_STOP_TO_LOAD, celestar@1935: STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD, celestar@1935: STR_NULL celestar@1935: }; celestar@1935: truelight@0: static void DrawOrdersWindow(Window *w) truelight@0: { truelight@1024: const Vehicle *v; truelight@1024: const Order *order; truelight@1024: StringID str; truelight@1024: int sel; truelight@0: int y, i; truelight@1024: bool shared_orders; truelight@1024: byte color; truelight@0: truelight@919: v = GetVehicle(w->window_number); tron@1019: truelight@1024: shared_orders = IsOrderListShared(v); truelight@0: truelight@1024: SetVScrollCount(w, v->num_orders + 1); truelight@0: truelight@0: sel = OrderGetSel(w); truelight@1024: SetDParam(2, STR_8827_FULL_LOAD); truelight@193: truelight@1024: order = GetVehicleOrder(v, sel); tron@725: Darkvater@4949: if (v->owner == _local_player) { Darkvater@4949: /* skip */ Darkvater@4949: SetWindowWidgetDisabledState(w, 4, v->num_orders == 0); belugas@4709: Darkvater@4949: /* delete */ Darkvater@4949: SetWindowWidgetDisabledState(w, 5, Darkvater@4949: (uint)v->num_orders + (shared_orders ? 1 : 0) <= (uint)WP(w, order_d).sel); bjarni@4712: Darkvater@4949: /* non-stop only for trains */ Darkvater@4949: SetWindowWidgetDisabledState(w, 6, v->type != VEH_Train || order == NULL); Darkvater@4949: SetWindowWidgetDisabledState(w, 8, order == NULL); // full load Darkvater@4949: SetWindowWidgetDisabledState(w, 9, order == NULL); // unload Darkvater@4949: SetWindowWidgetDisabledState(w, 10, order == NULL); // transfer Darkvater@4949: /* Disable list of vehicles with the same shared orders if there is no list */ Darkvater@4949: SetWindowWidgetDisabledState(w, 11, !shared_orders || v->orders == NULL); Darkvater@4949: SetWindowWidgetDisabledState(w, 12, order == NULL); // Refit Darkvater@5242: HideWindowWidget(w, 12); // Refit Darkvater@4949: } else { Darkvater@4949: DisableWindowWidget(w, 10); Darkvater@4949: } bjarni@4712: bjarni@4712: ShowWindowWidget(w, 9); // Unload belugas@4709: truelight@1024: if (order != NULL) { truelight@1024: switch (order->type) { Darkvater@4949: case OT_GOTO_STATION: break; tron@2549: truelight@1024: case OT_GOTO_DEPOT: belugas@4709: DisableWindowWidget(w, 10); bjarni@4712: bjarni@4712: /* Remove unload and replace it with refit */ bjarni@4712: HideWindowWidget(w, 9); bjarni@4712: ShowWindowWidget(w, 12); truelight@1024: SetDParam(2,STR_SERVICE); truelight@1024: break; tron@725: truelight@1024: case OT_GOTO_WAYPOINT: belugas@4709: DisableWindowWidget(w, 8); belugas@4709: DisableWindowWidget(w, 9); belugas@4709: DisableWindowWidget(w, 10); truelight@1024: break; truelight@1024: belugas@4709: default: // every other orders belugas@4709: DisableWindowWidget(w, 6); belugas@4709: DisableWindowWidget(w, 8); belugas@4709: DisableWindowWidget(w, 9); truelight@1024: } truelight@0: } truelight@0: tron@534: SetDParam(0, v->string_id); tron@534: SetDParam(1, v->unitnumber); truelight@0: DrawWindowWidgets(w); truelight@0: truelight@0: y = 15; truelight@0: truelight@1024: i = w->vscroll.pos; truelight@1024: order = GetVehicleOrder(v, i); truelight@1024: while (order != NULL) { truelight@1024: str = (v->cur_order_index == i) ? STR_8805 : STR_8804; bjarni@4712: SetDParam(3, STR_EMPTY); truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: SetDParam(1, 6); truelight@1024: tron@2631: switch (order->type) { tron@2631: case OT_GOTO_STATION: tron@2631: SetDParam(1, StationOrderStrings[order->flags]); tron@4527: SetDParam(2, order->dest); tron@2631: break; celestar@1935: tron@2631: case OT_GOTO_DEPOT: { tron@2631: StringID s = STR_NULL; tron@2631: tron@2631: if (v->type == VEH_Aircraft) { tron@2631: s = STR_GO_TO_AIRPORT_HANGAR; tron@4527: SetDParam(2, order->dest); tron@2631: } else { tron@4527: SetDParam(2, GetDepot(order->dest)->town_index); tron@2631: tron@2631: switch (v->type) { tron@2631: case VEH_Train: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break; tron@2631: case VEH_Road: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; tron@2631: case VEH_Ship: s = STR_GO_TO_SHIP_DEPOT; break; tron@2631: default: break; tron@2631: } truelight@0: } celestar@1935: tron@2631: if (order->flags & OF_FULL_LOAD) s++; /* service at */ tron@2631: celestar@1935: SetDParam(1, s); bjarni@4782: if (order->refit_cargo < NUM_CARGO) { bjarni@4712: SetDParam(3, STR_REFIT_ORDER); bjarni@4712: SetDParam(4, _cargoc.names_s[order->refit_cargo]); bjarni@4782: } else { bjarni@4782: SetDParam(3, STR_EMPTY); bjarni@4712: } tron@2631: break; truelight@0: } truelight@1024: tron@2631: case OT_GOTO_WAYPOINT: tron@2631: SetDParam(1, (order->flags & OF_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); tron@4527: SetDParam(2, order->dest); tron@2631: break; truelight@4351: truelight@4351: default: break; truelight@0: } truelight@1024: truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: SetDParam(0, i + 1); truelight@1024: if (order->type != OT_DUMMY) { truelight@1024: DrawString(2, y, str, color); truelight@1024: } else { truelight@1024: SetDParam(1, STR_INVALID_ORDER); tron@4527: SetDParam(2, order->dest); truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: y += 10; truelight@0: } truelight@0: truelight@0: i++; truelight@1024: order = order->next; truelight@1024: } truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: str = shared_orders ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS; truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: } truelight@0: Darkvater@2436: static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) truelight@0: { darkvater@558: Order order; peter1138@3387: order.next = NULL; peter1138@3387: order.index = 0; bjarni@4715: order.refit_cargo = CT_INVALID; bjarni@4715: order.refit_subtype = 0; truelight@0: truelight@0: // check depot first truelight@0: if (_patches.gotodepot) { tron@1214: switch (GetTileType(tile)) { truelight@0: case MP_RAILWAY: tron@1901: if (v->type == VEH_Train && IsTileOwner(tile, _local_player)) { tron@4182: if (IsRailDepot(tile)) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: } truelight@0: break; truelight@0: truelight@0: case MP_STREET: rubidium@3793: if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_Road && IsTileOwner(tile, _local_player)) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_STATION: truelight@0: if (v->type != VEH_Aircraft) break; tron@3338: if (IsHangar(tile) && IsTileOwner(tile, _local_player)) { darkvater@558: order.type = OT_GOTO_DEPOT; Darkvater@2778: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetStationIndex(tile); darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_WATER: truelight@0: if (v->type != VEH_Ship) break; tron@1334: if (IsTileDepotType(tile, TRANSPORT_WATER) && tron@1334: IsTileOwner(tile, _local_player)) { celestar@3392: TileIndex tile2 = GetOtherShipDepotTile(tile); celestar@3392: darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile < tile2 ? tile : tile2)->index; darkvater@558: return order; truelight@0: } tron@1214: tron@1214: default: tron@1214: break; truelight@0: } truelight@0: } truelight@0: darkvater@395: // check waypoint tron@1901: if (IsTileType(tile, MP_RAILWAY) && tron@1901: v->type == VEH_Train && tron@1901: IsTileOwner(tile, _local_player) && truelight@2668: IsRailWaypoint(tile)) { darkvater@558: order.type = OT_GOTO_WAYPOINT; darkvater@558: order.flags = 0; tron@4527: order.dest = GetWaypointByTile(tile)->index; darkvater@558: return order; darkvater@558: } dominik@319: tron@1035: if (IsTileType(tile, MP_STATION)) { tron@3315: StationID st_index = GetStationIndex(tile); belugas@4171: const Station *st = GetStation(st_index); truelight@0: truelight@0: if (st->owner == _current_player || st->owner == OWNER_NONE) { truelight@0: byte facil; truelight@0: (facil=FACIL_DOCK, v->type == VEH_Ship) || truelight@0: (facil=FACIL_TRAIN, v->type == VEH_Train) || truelight@0: (facil=FACIL_AIRPORT, v->type == VEH_Aircraft) || truelight@0: (facil=FACIL_BUS_STOP, v->type == VEH_Road && v->cargo_type == CT_PASSENGERS) || truelight@0: (facil=FACIL_TRUCK_STOP, 1); darkvater@558: if (st->facilities & facil) { darkvater@558: order.type = OT_GOTO_STATION; darkvater@558: order.flags = 0; tron@4527: order.dest = st_index; darkvater@558: return order; darkvater@558: } truelight@0: } truelight@0: } truelight@0: truelight@0: // not found darkvater@558: order.type = OT_NOTHING; darkvater@558: order.flags = 0; tron@4527: order.dest = INVALID_STATION; darkvater@558: return order; truelight@0: } truelight@0: belugas@4171: static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w) truelight@0: { tron@2549: if (u->type != v->type) return false; truelight@0: bjarni@2676: if (u->type == VEH_Train && !IsFrontEngine(u)) { truelight@0: u = GetFirstVehicleInChain(u); bjarni@2676: if (!IsFrontEngine(u)) return false; truelight@0: } truelight@0: truelight@0: // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet truelight@0: // obviously if you press CTRL on a non-empty orders vehicle you know what you are doing tron@2549: if (v->num_orders != 0 && _ctrl_pressed == 0) return false; truelight@193: truelight@0: if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? 0 : 1, NULL, truelight@0: _ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) { truelight@0: WP(w,order_d).sel = -1; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: truelight@0: return true; truelight@0: } truelight@0: belugas@4171: static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w) truelight@0: { darkvater@558: Order cmd; belugas@4171: const Vehicle *u; truelight@193: truelight@0: // check if we're clicking on a vehicle first.. clone orders in that case. truelight@0: u = CheckMouseOverVehicle(); tron@2549: if (u != NULL && HandleOrderVehClick(v, u, w)) return; truelight@0: truelight@0: cmd = GetOrderCmdFromTile(v, tile); darkvater@558: if (cmd.type == OT_NOTHING) return; truelight@0: darkvater@558: if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) { tron@2549: if (WP(w,order_d).sel != -1) WP(w,order_d).sel++; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: } truelight@0: belugas@4171: static void OrderClick_Goto(Window *w, const Vehicle *v) Celestar@1000: { Celestar@1000: InvalidateWidget(w, 7); belugas@4719: ToggleWidgetLoweredState(w, 7); belugas@4719: if (IsWindowWidgetLowered(w, 7)) { Celestar@1000: _place_clicked_vehicle = NULL; Celestar@1000: SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, 1, w); Celestar@1000: } else { Celestar@1000: ResetObjectToPlace(); Celestar@1000: } Celestar@1000: } Celestar@1000: belugas@4171: static void OrderClick_FullLoad(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: belugas@4171: static void OrderClick_Unload(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_UNLOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); truelight@1024: } truelight@1024: belugas@4171: static void OrderClick_Nonstop(Window *w, const Vehicle *v) truelight@1024: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_NON_STOP, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: tron@2549: static void OrderClick_Transfer(Window* w, const Vehicle* v) celestar@1935: { celestar@1935: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); celestar@1935: } celestar@1935: belugas@4171: static void OrderClick_Skip(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, 0, NULL, CMD_SKIP_ORDER); Celestar@1000: } Celestar@1000: belugas@4171: static void OrderClick_Delete(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER)); Celestar@1000: } Celestar@1000: bjarni@4712: static void OrderClick_Refit(Window *w, const Vehicle *v) bjarni@4712: { bjarni@4712: if (_ctrl_pressed) { bjarni@4712: /* Cancel refitting */ bjarni@4712: DoCommandP(v->tile, v->index, (WP(w,order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT); bjarni@4712: } else { bjarni@4712: ShowVehicleRefitWindow(v, WP(w,order_d).sel); bjarni@4712: } bjarni@4712: } bjarni@4712: belugas@4171: typedef void OnButtonVehClick(Window *w, const Vehicle *v); Celestar@1000: belugas@4171: static OnButtonVehClick* const _order_button_proc[] = { Celestar@1000: OrderClick_Skip, Celestar@1000: OrderClick_Delete, Celestar@1000: OrderClick_Nonstop, Celestar@1000: OrderClick_Goto, Celestar@1000: OrderClick_FullLoad, celestar@1935: OrderClick_Unload, celestar@1935: OrderClick_Transfer Celestar@1000: }; Celestar@1000: Celestar@1000: static const uint16 _order_keycodes[] = { Celestar@1000: 'D', //skip order Celestar@1000: 'F', //delete order Celestar@1000: 'G', //non-stop Celestar@1000: 'H', //goto order Celestar@1000: 'J', //full load Celestar@1000: 'K' //unload Celestar@1000: }; truelight@0: truelight@0: static void OrdersWndProc(Window *w, WindowEvent *e) truelight@0: { tron@2549: switch (e->event) { bjarni@4712: case WE_CREATE: bjarni@4712: /* Move Refit to the same location as Unload bjarni@4712: * This will ensure that they always stay at the same location even if Unload is moved in a later commit */ bjarni@4712: w->widget[12].left = w->widget[9].left; bjarni@4712: w->widget[12].right = w->widget[9].right; bjarni@4712: w->widget[12].top = w->widget[9].top; bjarni@4712: w->widget[12].bottom = w->widget[9].bottom; bjarni@4712: break; bjarni@4712: truelight@0: case WE_PAINT: truelight@0: DrawOrdersWindow(w); truelight@0: break; truelight@0: truelight@0: case WE_CLICK: { truelight@919: Vehicle *v = GetVehicle(w->window_number); belugas@4634: switch (e->we.click.widget) { darkvater@1242: case 2: { /* orders list */ belugas@4634: int sel = (e->we.click.pt.y - 15) / 10; truelight@0: tron@4077: if ((uint)sel >= w->vscroll.cap) return; truelight@0: truelight@0: sel += w->vscroll.pos; truelight@0: truelight@1024: if (_ctrl_pressed && sel < v->num_orders) { truelight@1043: const Order *ord = GetVehicleOrder(v, sel); tron@4077: TileIndex xy; tron@4077: truelight@1024: switch (ord->type) { tron@4527: case OT_GOTO_STATION: xy = GetStation(ord->dest)->xy ; break; tron@4527: case OT_GOTO_DEPOT: xy = GetDepot(ord->dest)->xy; break; tron@4527: case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break; tron@4077: default: xy = 0; break; darkvater@44: } darkvater@44: tron@4077: if (xy != 0) ScrollMainWindowToTile(xy); darkvater@44: return; darkvater@44: } darkvater@44: truelight@0: if (sel == WP(w,order_d).sel) sel = -1; truelight@0: WP(w,order_d).sel = sel; truelight@0: SetWindowDirty(w); truelight@0: } break; truelight@0: truelight@0: case 4: /* skip button */ Celestar@1000: OrderClick_Skip(w, v); truelight@0: break; truelight@0: truelight@0: case 5: /* delete button */ Celestar@1000: OrderClick_Delete(w, v); truelight@0: break; truelight@0: Celestar@1000: case 6: /* non stop button */ Celestar@1000: OrderClick_Nonstop(w, v); Celestar@1000: break; tron@1019: truelight@0: case 7: /* goto button */ Celestar@1000: OrderClick_Goto(w, v); truelight@0: break; truelight@0: truelight@0: case 8: /* full load button */ Celestar@1000: OrderClick_FullLoad(w, v); truelight@0: break; truelight@0: truelight@0: case 9: /* unload button */ Celestar@1000: OrderClick_Unload(w, v); truelight@0: break; celestar@1935: case 10: /* transfer button */ celestar@1935: OrderClick_Transfer(w, v); celestar@1935: break; bjarni@4408: case 11: /* Vehicle with same shared Orders button */ bjarni@4668: ShowVehWithSharedOrders(v, v->type); bjarni@4408: break; bjarni@4712: case 12: bjarni@4712: OrderClick_Refit(w, v); bjarni@4712: break; truelight@0: } truelight@0: } break; tron@1019: Celestar@1000: case WE_KEYPRESS: { Celestar@1000: Vehicle *v = GetVehicle(w->window_number); Celestar@1000: uint i; Celestar@1000: Darkvater@4949: if (v->owner != _local_player) break; Darkvater@4949: tron@2952: for (i = 0; i < lengthof(_order_keycodes); i++) { belugas@4634: if (e->we.keypress.keycode == _order_keycodes[i]) { belugas@4634: e->we.keypress.cont = false; tron@1019: //see if the button is disabled belugas@4709: if (!IsWindowWidgetDisabled(w, i + 4)) _order_button_proc[i](w, v); Celestar@1000: break; Celestar@1000: } Celestar@1000: } Celestar@1000: break; Celestar@1000: } Celestar@1000: truelight@0: case WE_RCLICK: { belugas@4171: const Vehicle *v = GetVehicle(w->window_number); tron@2639: int s = OrderGetSel(w); tron@2639: belugas@4634: if (e->we.click.widget != 8) break; tron@2639: if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) { celestar@1256: GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER); tron@2639: } else { truelight@0: GuiShowTooltips(STR_SERVICE_HINT); tron@2639: } darkvater@1242: } break; truelight@0: truelight@0: case WE_PLACE_OBJ: { belugas@4634: OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w); truelight@0: } break; truelight@0: truelight@0: case WE_ABORT_PLACE_OBJ: { belugas@4719: RaiseWindowWidget(w, 7); truelight@0: InvalidateWidget(w, 7); truelight@0: } break; truelight@0: truelight@0: // check if a vehicle in a depot was clicked.. truelight@0: case WE_MOUSELOOP: { belugas@4171: const Vehicle *v = _place_clicked_vehicle; truelight@25: /* truelight@25: * Check if we clicked on a vehicle truelight@25: * and if the GOTO button of this window is pressed truelight@25: * This is because of all open order windows WE_MOUSELOOP is called truelight@25: * and if you have 3 windows open, and this check is not done truelight@25: * the order is copied to the last open window instead of the Darkvater@4949: * one where GOTO is enabled truelight@25: */ belugas@4719: if (v != NULL && IsWindowWidgetLowered(w, 7)) { truelight@0: _place_clicked_vehicle = NULL; truelight@919: HandleOrderVehClick(GetVehicle(w->window_number), v, w); truelight@0: } truelight@0: } break; truelight@193: darkvater@1242: case WE_RESIZE: darkvater@1242: /* Update the scroll + matrix */ darkvater@1242: w->vscroll.cap = (w->widget[2].bottom - w->widget[2].top) / 10; darkvater@1242: break; Darkvater@5013: Darkvater@5013: case WE_TIMEOUT: { // handle button unclick ourselves... Darkvater@5013: // unclick all buttons except for the 'goto' button (7), which is 'persistent' rubidium@5235: uint i; rubidium@5235: for (i = 0; i < w->widget_count; i++) { Darkvater@5013: if (IsWindowWidgetLowered(w, i) && i != 7) { Darkvater@5013: RaiseWindowWidget(w, i); Darkvater@5013: InvalidateWidget(w, i); Darkvater@5013: } Darkvater@5013: } Darkvater@5013: } break; truelight@0: } truelight@0: } truelight@0: dominik@1081: static const Widget _orders_train_widgets[] = { rubidium@4344: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, bjarni@4408: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 398, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, bjarni@4408: { WWT_PANEL, RESIZE_RB, 14, 0, 386, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, bjarni@4408: { WWT_SCROLLBAR, RESIZE_LRB, 14, 387, 398, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 52, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 53, 105, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 106, 158, 76, 87, STR_8825_NON_STOP, STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, glx@4968: { WWT_TEXTBTN, RESIZE_TB, 14, 159, 211, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 212, 264, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 265, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 372, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, Darkvater@4935: { WWT_PUSHIMGBTN, RESIZE_TB, 14, 373, 386, 76, 87, SPR_SHARED_ORDERS_ICON, STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, bjarni@4712: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 372, 76, 87, STR_REFIT, STR_REFIT_TIP}, bjarni@4408: { WWT_PANEL, RESIZE_RTB, 14, 387, 386, 76, 87, 0x0, STR_NULL}, bjarni@4408: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 387, 398, 76, 87, 0x0, STR_RESIZE_BUTTON}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: dominik@1081: static const WindowDesc _orders_train_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 399, 88, dominik@1081: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, Darkvater@5013: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, dominik@1081: _orders_train_widgets, dominik@1081: OrdersWndProc dominik@1081: }; dominik@1081: dominik@1081: static const Widget _orders_widgets[] = { rubidium@4344: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, bjarni@4408: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 409, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, bjarni@4408: { WWT_PANEL, RESIZE_RB, 14, 0, 397, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, bjarni@4408: { WWT_SCROLLBAR, RESIZE_LRB, 14, 398, 409, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 63, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 64, 128, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, rubidium@4344: { WWT_EMPTY, RESIZE_TB, 14, 0, 0, 76, 87, 0x0, 0x0}, glx@4968: { WWT_TEXTBTN, RESIZE_TB, 14, 129, 192, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 193, 256, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 257, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, rubidium@4344: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 383, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, Darkvater@4935: { WWT_PUSHIMGBTN, RESIZE_TB, 14, 384, 397, 76, 87, SPR_SHARED_ORDERS_ICON, STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, bjarni@4712: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 383, 76, 87, STR_REFIT, STR_REFIT_TIP}, bjarni@4408: { WWT_PANEL, RESIZE_RTB, 14, 397, 396, 76, 87, 0x0, STR_NULL}, bjarni@4408: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 398, 409, 76, 87, 0x0, STR_RESIZE_BUTTON}, dominik@1081: { WIDGETS_END}, dominik@1081: }; dominik@1081: celestar@995: static const WindowDesc _orders_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 410, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, Darkvater@5013: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, celestar@995: _orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: celestar@995: static const Widget _other_orders_widgets[] = { rubidium@4344: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, rubidium@4344: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 331, 0, 13, STR_A00B_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, rubidium@4344: { WWT_PANEL, RESIZE_RB, 14, 0, 319, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, rubidium@4344: { WWT_SCROLLBAR, RESIZE_LRB, 14, 320, 331, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_PANEL, RESIZE_RTB, 14, 0, 319, 76, 87, 0x0, STR_NULL}, rubidium@4344: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 320, 331, 76, 87, 0x0, STR_RESIZE_BUTTON}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: celestar@995: static const WindowDesc _other_orders_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 332, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, darkvater@1242: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, celestar@995: _other_orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: belugas@4171: void ShowOrdersWindow(const Vehicle *v) truelight@0: { truelight@0: Window *w; truelight@0: VehicleID veh = v->index; truelight@0: truelight@0: DeleteWindowById(WC_VEHICLE_ORDERS, veh); truelight@0: DeleteWindowById(WC_VEHICLE_DETAILS, veh); truelight@193: dominik@1081: if (v->owner != _local_player) { Darkvater@5071: w = AllocateWindowDescFront(&_other_orders_desc, veh); tron@2549: } else { Darkvater@5071: w = AllocateWindowDescFront((v->type == VEH_Train) ? &_orders_train_desc : &_orders_desc, veh); tron@2549: } truelight@0: darkvater@1242: if (w != NULL) { darkvater@1242: w->caption_color = v->owner; darkvater@1242: w->vscroll.cap = 6; darkvater@1242: w->resize.step_height = 10; darkvater@1242: WP(w,order_d).sel = -1; darkvater@1242: } truelight@0: }