tron@2186: /* $Id$ */ tron@2186: rubidium@10429: /** @file dock_gui.cpp GUI to create amazing water objects. */ belugas@6451: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" rubidium@8604: #include "tile_map.h" rubidium@9282: #include "station_type.h" truelight@0: #include "gui.h" rubidium@8701: #include "terraform_gui.h" rubidium@8603: #include "window_gui.h" rubidium@8603: #include "station_gui.h" rubidium@8612: #include "command_func.h" rubidium@8766: #include "settings_type.h" rubidium@8444: #include "water.h" rubidium@8627: #include "window_func.h" rubidium@8640: #include "vehicle_func.h" rubidium@8653: #include "sound_func.h" rubidium@8720: #include "viewport_func.h" rubidium@8720: #include "gfx_func.h" rubidium@8750: #include "player_func.h" frosch@8909: #include "slope_func.h" rubidium@10445: #include "tilehighlight_func.h" truelight@0: rubidium@8760: #include "table/sprites.h" rubidium@8760: #include "table/strings.h" rubidium@8760: frosch@10686: static void ShowBuildDockStationPicker(Window *parent); frosch@10686: static void ShowBuildDocksDepotPicker(Window *parent); truelight@0: tron@3157: static Axis _ship_depot_direction; truelight@0: tron@1977: void CcBuildDocks(bool success, TileIndex tile, uint32 p1, uint32 p2) truelight@0: { truelight@0: if (success) { tron@541: SndPlayTileFx(SND_02_SPLAT, tile); truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: } truelight@0: tron@1977: void CcBuildCanal(bool success, TileIndex tile, uint32 p1, uint32 p2) truelight@0: { tron@541: if (success) SndPlayTileFx(SND_02_SPLAT, tile); truelight@0: } truelight@0: truelight@0: tron@1977: static void PlaceDocks_Dock(TileIndex tile) truelight@0: { rubidium@8017: DoCommandP(tile, _ctrl_pressed, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE)); truelight@0: } truelight@0: tron@1977: static void PlaceDocks_Depot(TileIndex tile) truelight@0: { rubidium@8017: DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT)); truelight@0: } truelight@0: tron@1977: static void PlaceDocks_Buoy(TileIndex tile) truelight@0: { rubidium@8017: DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE)); truelight@0: } truelight@0: tron@1977: static void PlaceDocks_BuildCanal(TileIndex tile) truelight@0: { skidd13@11071: VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER); truelight@0: } truelight@0: tron@1977: static void PlaceDocks_BuildLock(TileIndex tile) truelight@0: { rubidium@8017: DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_MSG(STR_CANT_BUILD_LOCKS)); truelight@0: } truelight@0: skidd13@11071: static void PlaceDocks_BuildRiver(TileIndex tile) skidd13@11071: { skidd13@11071: VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER); skidd13@11071: } skidd13@11071: smatz@10926: static void PlaceDocks_Aqueduct(TileIndex tile) rubidium@10913: { rubidium@10913: VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE); rubidium@10913: } rubidium@10913: rubidium@10913: smatz@10671: /** Enum referring to the widgets of the build dock toolbar */ smatz@10671: enum DockToolbarWidgets { smatz@10671: DTW_BEGIN = 0, ///< Start of toolbar widgets smatz@10671: DTW_CLOSEBOX = DTW_BEGIN, ///< Close window button smatz@10671: DTW_CAPTION, ///< Window caption smatz@10671: DTW_STICKY, ///< Sticky window button smatz@10671: DTW_BUTTONS_BEGIN, ///< Begin of clickable buttons (except seperating panel) smatz@10671: DTW_CANAL = DTW_BUTTONS_BEGIN, ///< Build canal button smatz@10671: DTW_LOCK, ///< Build lock button smatz@10671: DTW_SEPERATOR, ///< Seperating panel between lock and demolish smatz@10671: DTW_DEMOLISH, ///< Demolish aka dynamite button smatz@10671: DTW_DEPOT, ///< Build depot button smatz@10671: DTW_STATION, ///< Build station button smatz@10671: DTW_BUOY, ///< Build buoy button skidd13@11071: DTW_RIVER, ///< Build river button (in scenario editor) smatz@10926: DTW_BUILD_AQUEDUCT, ///< Build aqueduct button smatz@10671: DTW_END, ///< End of toolbar widgets tron@5147: }; tron@5147: tron@5147: dominik@606: static void BuildDocksClick_Canal(Window *w) truelight@0: { skidd13@11071: rubidium@8385: HandlePlacePushButton(w, DTW_CANAL, SPR_CURSOR_CANAL, VHM_RECT, PlaceDocks_BuildCanal); truelight@0: } truelight@0: dominik@606: static void BuildDocksClick_Lock(Window *w) truelight@0: { rubidium@8385: HandlePlacePushButton(w, DTW_LOCK, SPR_CURSOR_LOCK, VHM_RECT, PlaceDocks_BuildLock); truelight@0: } truelight@0: truelight@0: static void BuildDocksClick_Demolish(Window *w) truelight@0: { belugas@10441: HandlePlacePushButton(w, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceProc_DemolishArea); truelight@0: } truelight@0: dominik@606: static void BuildDocksClick_Depot(Window *w) truelight@0: { rubidium@7582: if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return; frosch@10686: if (HandlePlacePushButton(w, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, VHM_RECT, PlaceDocks_Depot)) ShowBuildDocksDepotPicker(w); truelight@0: } truelight@0: dominik@606: static void BuildDocksClick_Dock(Window *w) truelight@0: { rubidium@7582: if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return; frosch@10686: if (HandlePlacePushButton(w, DTW_STATION, SPR_CURSOR_DOCK, VHM_SPECIAL, PlaceDocks_Dock)) ShowBuildDockStationPicker(w); truelight@0: } truelight@0: dominik@606: static void BuildDocksClick_Buoy(Window *w) truelight@0: { rubidium@7582: if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return; rubidium@8385: HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, VHM_RECT, PlaceDocks_Buoy); truelight@0: } truelight@0: skidd13@11071: static void BuildDocksClick_River(Window *w) skidd13@11071: { skidd13@11071: if (_game_mode != GM_EDITOR) return; skidd13@11071: HandlePlacePushButton(w, DTW_RIVER, SPR_CURSOR_RIVER, VHM_RECT, PlaceDocks_BuildRiver); skidd13@11071: } skidd13@11071: smatz@10926: static void BuildDocksClick_Aqueduct(Window *w) rubidium@10913: { skidd13@10937: HandlePlacePushButton(w, DTW_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, VHM_RECT, PlaceDocks_Aqueduct); rubidium@10913: } rubidium@10913: truelight@0: truelight@0: typedef void OnButtonClick(Window *w); truelight@0: static OnButtonClick * const _build_docks_button_proc[] = { truelight@0: BuildDocksClick_Canal, truelight@0: BuildDocksClick_Lock, tron@2548: NULL, dominik@606: BuildDocksClick_Demolish, dominik@606: BuildDocksClick_Depot, dominik@606: BuildDocksClick_Dock, rubidium@10913: BuildDocksClick_Buoy, skidd13@11071: BuildDocksClick_River, smatz@10926: BuildDocksClick_Aqueduct truelight@0: }; truelight@0: rubidium@10627: struct BuildDocksToolbarWindow : Window { rubidium@10627: BuildDocksToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number) rubidium@10627: { rubidium@10627: this->FindWindowPlacementAndResize(desc); rubidium@10775: if (_settings_client.gui.link_terraform_toolbar) ShowTerraformToolbar(this); truelight@0: } truelight@0: rubidium@10627: ~BuildDocksToolbarWindow() rubidium@10627: { rubidium@10775: if (_settings_client.gui.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0); rubidium@10627: } rubidium@10627: rubidium@10627: virtual void OnPaint() rubidium@10627: { smatz@10671: this->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP), DTW_DEPOT, DTW_STATION, DTW_BUOY, WIDGET_LIST_END); rubidium@10627: this->DrawWidgets(); rubidium@10627: } rubidium@10627: rubidium@10627: virtual void OnClick(Point pt, int widget) rubidium@10627: { smatz@10671: if (widget >= DTW_BUTTONS_BEGIN && widget != DTW_SEPERATOR) _build_docks_button_proc[widget - DTW_BUTTONS_BEGIN](this); rubidium@10627: } rubidium@10627: rubidium@10627: virtual EventState OnKeyPress(uint16 key, uint16 keycode) rubidium@10627: { rubidium@10627: switch (keycode) { rubidium@10627: case '1': BuildDocksClick_Canal(this); break; rubidium@10627: case '2': BuildDocksClick_Lock(this); break; rubidium@10627: case '3': BuildDocksClick_Demolish(this); break; rubidium@10627: case '4': BuildDocksClick_Depot(this); break; rubidium@10627: case '5': BuildDocksClick_Dock(this); break; rubidium@10627: case '6': BuildDocksClick_Buoy(this); break; skidd13@11071: case '7': BuildDocksClick_River(this); break; smatz@10928: case 'B': skidd13@11071: case '8': BuildDocksClick_Aqueduct(this); break; rubidium@10627: default: return ES_NOT_HANDLED; rubidium@10627: } rubidium@10627: return ES_HANDLED; rubidium@10627: } rubidium@10627: rubidium@10627: virtual void OnPlaceObject(Point pt, TileIndex tile) rubidium@10627: { rubidium@10627: _place_proc(tile); rubidium@10627: } rubidium@10627: rubidium@10627: virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt) rubidium@10627: { rubidium@10627: VpSelectTilesWithMethod(pt.x, pt.y, select_method); rubidium@10627: } rubidium@10627: rubidium@10627: virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) rubidium@10627: { rubidium@10627: if (pt.x != -1) { rubidium@10627: switch (select_proc) { rubidium@10913: case DDSP_BUILD_BRIDGE: rubidium@10913: ResetObjectToPlace(); rubidium@10913: extern void CcBuildBridge(bool success, TileIndex tile, uint32 p1, uint32 p2); smatz@10926: DoCommandP(end_tile, start_tile, TRANSPORT_WATER << 15, CcBuildBridge, CMD_BUILD_BRIDGE | CMD_MSG(STR_CAN_T_BUILD_AQUEDUCT_HERE)); rubidium@10913: maedhros@7166: case DDSP_DEMOLISH_AREA: rubidium@10627: GUIPlaceProcDragXY(select_proc, start_tile, end_tile); maedhros@7165: break; maedhros@7166: case DDSP_CREATE_WATER: skidd13@11071: DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR ? _ctrl_pressed : 0), CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS)); skidd13@11071: break; skidd13@11071: case DDSP_CREATE_RIVER: skidd13@11071: DoCommandP(end_tile, start_tile, 2, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_PLACE_RIVERS)); maedhros@7165: break; rubidium@10627: maedhros@7165: default: break; tron@2549: } truelight@0: } rubidium@10627: } truelight@0: rubidium@10627: virtual void OnPlaceObjectAbort() rubidium@10627: { rubidium@10627: this->RaiseButtons(); truelight@0: rubidium@10560: delete FindWindowById(WC_BUILD_STATION, 0); rubidium@10560: delete FindWindowById(WC_BUILD_DEPOT, 0); rubidium@10627: } truelight@193: rubidium@10627: virtual void OnPlacePresize(Point pt, TileIndex tile_from) rubidium@10627: { frosch@8909: DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, NULL)); rubidium@10627: TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile_from, ReverseDiagDir(dir)) : tile_from); frosch@8909: truelight@0: VpSetPresizeRange(tile_from, tile_to); truelight@0: } rubidium@10627: }; truelight@0: truelight@0: static const Widget _build_docks_toolb_widgets[] = { skidd13@11071: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // DTW_CLOSEBOX skidd13@11071: { WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_9801_WATERWAYS_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // DTW_CAPTION skidd13@11071: { WWT_STICKYBOX, RESIZE_NONE, 7, 148, 159, 0, 13, 0x0, STR_STICKY_BUTTON}, // DTW_STICKY skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_BUILD_CANALS_TIP}, // DTW_CANAL skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, // DTW_LOCK dominik@606: skidd13@11071: { WWT_PANEL, RESIZE_NONE, 7, 44, 48, 14, 35, 0x0, STR_NULL}, // DTW_SEPERATOR dominik@606: skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 49, 70, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // DTW_DEMOLISH skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 71, 92, 14, 35, SPR_IMG_SHIP_DEPOT, STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING}, // DTW_DEPOT skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 93, 114, 14, 35, SPR_IMG_SHIP_DOCK, STR_981D_BUILD_SHIP_DOCK}, // DTW_STATION skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 115, 136, 14, 35, SPR_IMG_BOUY, STR_9834_POSITION_BUOY_WHICH_CAN}, // DTW_BUOY skidd13@11071: { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_RIVER skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 137, 159, 14, 35, SPR_IMG_AQUEDUCT, STR_BUILD_AQUEDUCT}, // DTW_BUILD_AQUEDUCT darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _build_docks_toolbar_desc = { skidd13@11071: WDP_ALIGN_TBR, 22, 160, 36, 160, 36, rubidium@6144: WC_BUILD_TOOLBAR, WC_NONE, darkvater@756: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, truelight@0: _build_docks_toolb_widgets, truelight@0: }; truelight@0: rubidium@6573: void ShowBuildDocksToolbar() truelight@0: { rubidium@11161: if (!IsValidPlayerID(_current_player)) return; Darkvater@5005: rubidium@10397: DeleteWindowByClass(WC_BUILD_TOOLBAR); rubidium@10627: AllocateWindowDescFront(&_build_docks_toolbar_desc, TRANSPORT_WATER); truelight@0: } truelight@0: skidd13@11071: /* Widget definition for the build docks in scenario editor window */ skidd13@11071: static const Widget _build_docks_scen_toolb_widgets[] = { skidd13@11071: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // DTW_CLOSEBOX skidd13@11071: { WWT_CAPTION, RESIZE_NONE, 7, 11, 102, 0, 13, STR_9801_WATERWAYS_CONSTRUCTION_SE, STR_018C_WINDOW_TITLE_DRAG_THIS}, // DTW_CAPTION skidd13@11071: { WWT_STICKYBOX, RESIZE_NONE, 7, 103, 114, 0, 13, 0x0, STR_STICKY_BUTTON}, // DTW_STICKY skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_CREATE_LAKE}, // DTW_CANAL skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, // DTW_LOCK skidd13@11071: skidd13@11071: { WWT_PANEL, RESIZE_NONE, 7, 44, 48, 14, 35, 0x0, STR_NULL}, // DTW_SEPERATOR skidd13@11071: skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 49, 70, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // DTW_DEMOLISH skidd13@11071: { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_DEPOT skidd13@11071: { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_STATION skidd13@11071: { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_BUOY skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 71, 92, 14, 35, SPR_IMG_BUILD_RIVER, STR_CREATE_RIVER}, // DTW_RIVER skidd13@11071: { WWT_IMGBTN, RESIZE_NONE, 7, 93, 114, 14, 35, SPR_IMG_AQUEDUCT, STR_BUILD_AQUEDUCT}, // DTW_BUILD_AQUEDUCT skidd13@11071: { WIDGETS_END}, skidd13@11071: }; skidd13@11071: skidd13@11071: /* Window definition for the build docks in scenario editor window */ skidd13@11071: static const WindowDesc _build_docks_scen_toolbar_desc = { skidd13@11071: WDP_AUTO, WDP_AUTO, 115, 36, 115, 36, skidd13@11071: WC_SCEN_BUILD_TOOLBAR, WC_NONE, skidd13@11071: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, skidd13@11071: _build_docks_scen_toolb_widgets, skidd13@11071: }; skidd13@11071: skidd13@11071: void ShowBuildDocksScenToolbar() skidd13@11071: { skidd13@11071: AllocateWindowDescFront(&_build_docks_scen_toolbar_desc, TRANSPORT_WATER); skidd13@11071: } skidd13@11071: glx@10601: struct BuildDocksStationWindow : public PickerWindowBase { glx@10601: private: glx@10601: enum BuildDockStationWidgets { glx@10601: BDSW_CLOSE, glx@10601: BDSW_CAPTION, glx@10601: BDSW_BACKGROUND, glx@10601: BDSW_LT_OFF, glx@10601: BDSW_LT_ON, glx@10601: BDSW_INFO, glx@10601: }; belugas@4719: glx@10601: public: frosch@10686: BuildDocksStationWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(desc, parent) glx@10601: { glx@10601: this->LowerWidget(_station_show_coverage + BDSW_LT_OFF); glx@10601: this->FindWindowPlacementAndResize(desc); glx@10601: } glx@10601: glx@10601: virtual void OnPaint() glx@10601: { rubidium@10775: int rad = (_settings_game.station.modified_catchment) ? CA_DOCK : CA_UNMODIFIED; dominik@713: glx@10601: this->DrawWidgets(); tron@2631: rubidium@7325: if (_station_show_coverage) { rubidium@7325: SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad); rubidium@7325: } else { rubidium@7325: SetTileSelectSize(1, 1); rubidium@7325: } dominik@713: rubidium@9342: int text_end = DrawStationCoverageAreaText(4, 50, SCT_ALL, rad, false); rubidium@9342: text_end = DrawStationCoverageAreaText(4, text_end + 4, SCT_ALL, rad, true) + 4; glx@10601: if (text_end != this->widget[BDSW_BACKGROUND].bottom) { glx@10601: this->SetDirty(); glx@10601: ResizeWindowForWidget(this, 2, 0, text_end - this->widget[BDSW_BACKGROUND].bottom); glx@10601: this->SetDirty(); peter1138@8919: } tron@2639: } truelight@0: glx@10601: virtual void OnClick(Point pt, int widget) glx@10601: { glx@10601: switch (widget) { glx@10601: case BDSW_LT_OFF: glx@10601: case BDSW_LT_ON: glx@10601: this->RaiseWidget(_station_show_coverage + BDSW_LT_OFF); glx@10601: _station_show_coverage = (widget != BDSW_LT_OFF); glx@10601: this->LowerWidget(_station_show_coverage + BDSW_LT_OFF); tron@2639: SndPlayFx(SND_15_BEEP); glx@10601: this->SetDirty(); tron@2639: break; truelight@0: } glx@10601: } truelight@0: glx@10601: virtual void OnTick() glx@10601: { glx@10601: CheckRedrawStationCoverage(this); truelight@193: } glx@10601: }; truelight@0: truelight@0: static const Widget _build_dock_station_widgets[] = { glx@10601: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // BDSW_CLOSE glx@10601: { WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_3068_DOCK, STR_018C_WINDOW_TITLE_DRAG_THIS}, // BDSW_CAPTION glx@10601: { WWT_PANEL, RESIZE_NONE, 7, 0, 147, 14, 74, 0x0, STR_NULL}, // BDSW_BACKGROUND glx@10601: { WWT_TEXTBTN, RESIZE_NONE, 14, 14, 73, 30, 40, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE}, // BDSW_LT_OFF glx@10601: { WWT_TEXTBTN, RESIZE_NONE, 14, 74, 133, 30, 40, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA}, // BDSW_LT_ON glx@10601: { WWT_LABEL, RESIZE_NONE, 7, 0, 147, 17, 30, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL}, // BDSW_INFO darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _build_dock_station_desc = { rubidium@7837: WDP_AUTO, WDP_AUTO, 148, 75, 148, 75, Darkvater@5070: WC_BUILD_STATION, WC_BUILD_TOOLBAR, truelight@0: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, truelight@0: _build_dock_station_widgets, truelight@0: }; truelight@0: frosch@10686: static void ShowBuildDockStationPicker(Window *parent) truelight@0: { frosch@10686: new BuildDocksStationWindow(&_build_dock_station_desc, parent); truelight@0: } truelight@0: glx@10601: struct BuildDocksDepotWindow : public PickerWindowBase { glx@10601: private: glx@10601: enum BuildDockDepotWidgets { glx@10601: BDDW_CLOSE, glx@10601: BDDW_CAPTION, glx@10601: BDDW_BACKGROUND, glx@10601: BDDW_X, glx@10601: BDDW_Y, glx@10601: }; glx@10601: glx@10601: static void UpdateDocksDirection() glx@10601: { glx@10601: if (_ship_depot_direction != AXIS_X) { glx@10601: SetTileSelectSize(1, 2); glx@10601: } else { glx@10601: SetTileSelectSize(2, 1); glx@10601: } truelight@0: } truelight@0: glx@10601: public: frosch@10686: BuildDocksDepotWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(desc, parent) glx@10601: { glx@10601: this->LowerWidget(_ship_depot_direction + BDDW_X); glx@10601: UpdateDocksDirection(); glx@10601: this->FindWindowPlacementAndResize(desc); glx@10601: } belugas@4719: glx@10601: virtual void OnPaint() glx@10601: { glx@10601: this->DrawWidgets(); truelight@0: truelight@0: DrawShipDepotSprite(67, 35, 0); truelight@0: DrawShipDepotSprite(35, 51, 1); truelight@0: DrawShipDepotSprite(135, 35, 2); truelight@0: DrawShipDepotSprite(167, 51, 3); glx@10601: } truelight@0: glx@10601: virtual void OnClick(Point pt, int widget) glx@10601: { glx@10601: switch (widget) { glx@10601: case BDDW_X: glx@10601: case BDDW_Y: glx@10601: this->RaiseWidget(_ship_depot_direction + BDDW_X); glx@10601: _ship_depot_direction = (widget == BDDW_X ? AXIS_X : AXIS_Y); glx@10601: this->LowerWidget(_ship_depot_direction + BDDW_X); glx@10601: SndPlayFx(SND_15_BEEP); glx@10601: UpdateDocksDirection(); glx@10601: this->SetDirty(); glx@10601: break; truelight@0: } truelight@0: } glx@10601: }; truelight@0: truelight@0: static const Widget _build_docks_depot_widgets[] = { glx@10601: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // BDDW_CLOSE glx@10601: { WWT_CAPTION, RESIZE_NONE, 7, 11, 203, 0, 13, STR_3800_SHIP_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // BDDW_CAPTION glx@10601: { WWT_PANEL, RESIZE_NONE, 7, 0, 203, 14, 85, 0x0, STR_NULL}, // BDDW_BACKGROUND glx@10601: { WWT_PANEL, RESIZE_NONE, 14, 3, 100, 17, 82, 0x0, STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, // BDDW_X glx@10601: { WWT_PANEL, RESIZE_NONE, 14, 103, 200, 17, 82, 0x0, STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, // BDDW_Y darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _build_docks_depot_desc = { rubidium@7837: WDP_AUTO, WDP_AUTO, 204, 86, 204, 86, Darkvater@5070: WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, truelight@0: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, truelight@0: _build_docks_depot_widgets, truelight@0: }; truelight@0: truelight@0: frosch@10686: static void ShowBuildDocksDepotPicker(Window *parent) truelight@0: { frosch@10686: new BuildDocksDepotWindow(&_build_docks_depot_desc, parent); truelight@0: } truelight@0: truelight@0: rubidium@6573: void InitializeDockGui() truelight@0: { tron@3157: _ship_depot_direction = AXIS_X; truelight@0: }