00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "terraform_gui.h"
00014 #include "window_gui.h"
00015 #include "station_gui.h"
00016 #include "command_func.h"
00017 #include "water.h"
00018 #include "window_func.h"
00019 #include "vehicle_func.h"
00020 #include "sound_func.h"
00021 #include "viewport_func.h"
00022 #include "gfx_func.h"
00023 #include "company_func.h"
00024 #include "slope_func.h"
00025 #include "tilehighlight_func.h"
00026 #include "company_base.h"
00027 #include "hotkeys.h"
00028
00029 #include "widgets/dock_widget.h"
00030
00031 #include "table/sprites.h"
00032 #include "table/strings.h"
00033
00034 static void ShowBuildDockStationPicker(Window *parent);
00035 static void ShowBuildDocksDepotPicker(Window *parent);
00036
00037 static Axis _ship_depot_direction;
00038
00039 void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00040 {
00041 if (result.Failed()) return;
00042
00043 if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
00044 if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
00045 }
00046
00047 void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00048 {
00049 if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
00050 }
00051
00052
00059 static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = NULL)
00060 {
00061 int z;
00062 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, &z));
00063
00064
00065
00066
00067
00068 if (!IsValidDiagDirection(dir)) return TILE_ADDXY(tile_from, TileX(tile_from) > 2 ? -1 : 1, 0);
00069
00070
00071 TileIndexDiff offset = TileOffsByDiagDir(ReverseDiagDir(dir));
00072
00073 int max_length = min(_settings_game.construction.max_bridge_length, DistanceFromEdgeDir(tile_from, ReverseDiagDir(dir)) - 1);
00074
00075 TileIndex endtile = tile_from;
00076 for (int length = 0; IsValidTile(endtile) && TileX(endtile) != 0 && TileY(endtile) != 0; length++) {
00077 endtile = TILE_ADD(endtile, offset);
00078
00079 if (length > max_length) break;
00080
00081 if (GetTileMaxZ(endtile) > z) {
00082 if (tile_to != NULL) *tile_to = endtile;
00083 break;
00084 }
00085 }
00086
00087 return endtile;
00088 }
00089
00091 struct BuildDocksToolbarWindow : Window {
00092 DockToolbarWidgets last_clicked_widget;
00093
00094 BuildDocksToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
00095 {
00096 this->last_clicked_widget = WID_DT_INVALID;
00097 this->InitNested(desc, window_number);
00098 this->OnInvalidateData();
00099 if (_settings_client.gui.link_terraform_toolbar) ShowTerraformToolbar(this);
00100 }
00101
00102 ~BuildDocksToolbarWindow()
00103 {
00104 if (_settings_client.gui.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0, false);
00105 }
00106
00112 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
00113 {
00114 if (!gui_scope) return;
00115 this->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP),
00116 WID_DT_DEPOT,
00117 WID_DT_STATION,
00118 WID_DT_BUOY,
00119 WIDGET_LIST_END);
00120 }
00121
00122 virtual void OnClick(Point pt, int widget, int click_count)
00123 {
00124 switch (widget) {
00125 case WID_DT_CANAL:
00126 HandlePlacePushButton(this, WID_DT_CANAL, SPR_CURSOR_CANAL, HT_RECT);
00127 break;
00128
00129 case WID_DT_LOCK:
00130 HandlePlacePushButton(this, WID_DT_LOCK, SPR_CURSOR_LOCK, HT_SPECIAL);
00131 break;
00132
00133 case WID_DT_DEMOLISH:
00134 HandlePlacePushButton(this, WID_DT_DEMOLISH, ANIMCURSOR_DEMOLISH, HT_RECT | HT_DIAGONAL);
00135 break;
00136
00137 case WID_DT_DEPOT:
00138 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00139 if (HandlePlacePushButton(this, WID_DT_DEPOT, SPR_CURSOR_SHIP_DEPOT, HT_RECT)) ShowBuildDocksDepotPicker(this);
00140 break;
00141
00142 case WID_DT_STATION:
00143 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00144 if (HandlePlacePushButton(this, WID_DT_STATION, SPR_CURSOR_DOCK, HT_SPECIAL)) ShowBuildDockStationPicker(this);
00145 break;
00146
00147 case WID_DT_BUOY:
00148 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00149 HandlePlacePushButton(this, WID_DT_BUOY, SPR_CURSOR_BUOY, HT_RECT);
00150 break;
00151
00152 case WID_DT_RIVER:
00153 if (_game_mode != GM_EDITOR) return;
00154 HandlePlacePushButton(this, WID_DT_RIVER, SPR_CURSOR_RIVER, HT_RECT);
00155 break;
00156
00157 case WID_DT_BUILD_AQUEDUCT:
00158 HandlePlacePushButton(this, WID_DT_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, HT_SPECIAL);
00159 break;
00160
00161 default: return;
00162 }
00163 this->last_clicked_widget = (DockToolbarWidgets)widget;
00164 }
00165
00166 virtual EventState OnKeyPress(WChar key, uint16 keycode)
00167 {
00168 int num = CheckHotkeyMatch(dockstoolbar_hotkeys, keycode, this);
00169 if (num == -1) return ES_NOT_HANDLED;
00170 this->OnClick(Point(), num, 1);
00171 return ES_HANDLED;
00172 }
00173
00174 virtual void OnPlaceObject(Point pt, TileIndex tile)
00175 {
00176 switch (this->last_clicked_widget) {
00177 case WID_DT_CANAL:
00178 VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER);
00179 break;
00180
00181 case WID_DT_LOCK:
00182 DoCommandP(tile, 0, 0, CMD_BUILD_LOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_LOCKS), CcBuildDocks);
00183 break;
00184
00185 case WID_DT_DEMOLISH:
00186 PlaceProc_DemolishArea(tile);
00187 break;
00188
00189 case WID_DT_DEPOT:
00190 DoCommandP(tile, _ship_depot_direction, 0, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_ERROR_CAN_T_BUILD_SHIP_DEPOT), CcBuildDocks);
00191 break;
00192
00193 case WID_DT_STATION: {
00194 uint32 p2 = (uint32)INVALID_STATION << 16;
00195
00196
00197 CommandContainer cmdcont = { tile, _ctrl_pressed, p2, CMD_BUILD_DOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_DOCK_HERE), CcBuildDocks, "" };
00198
00199
00200 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile));
00201 TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
00202
00203 ShowSelectStationIfNeeded(cmdcont, TileArea(tile, tile_to));
00204 break;
00205 }
00206
00207 case WID_DT_BUOY:
00208 DoCommandP(tile, 0, 0, CMD_BUILD_BUOY | CMD_MSG(STR_ERROR_CAN_T_POSITION_BUOY_HERE), CcBuildDocks);
00209 break;
00210
00211 case WID_DT_RIVER:
00212 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
00213 break;
00214
00215 case WID_DT_BUILD_AQUEDUCT:
00216 DoCommandP(tile, GetOtherAqueductEnd(tile), TRANSPORT_WATER << 15, CMD_BUILD_BRIDGE | CMD_MSG(STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE), CcBuildBridge);
00217 break;
00218
00219 default: NOT_REACHED();
00220 }
00221 }
00222
00223 virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
00224 {
00225 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
00226 }
00227
00228 virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
00229 {
00230 if (pt.x != -1) {
00231 switch (select_proc) {
00232 case DDSP_DEMOLISH_AREA:
00233 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
00234 break;
00235 case DDSP_CREATE_WATER:
00236 DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcBuildCanal);
00237 break;
00238 case DDSP_CREATE_RIVER:
00239 DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcBuildCanal);
00240 break;
00241
00242 default: break;
00243 }
00244 }
00245 }
00246
00247 virtual void OnPlaceObjectAbort()
00248 {
00249 this->RaiseButtons();
00250
00251 DeleteWindowById(WC_BUILD_STATION, TRANSPORT_WATER);
00252 DeleteWindowById(WC_BUILD_DEPOT, TRANSPORT_WATER);
00253 DeleteWindowById(WC_SELECT_STATION, 0);
00254 DeleteWindowByClass(WC_BUILD_BRIDGE);
00255 }
00256
00257 virtual void OnPlacePresize(Point pt, TileIndex tile_from)
00258 {
00259 TileIndex tile_to = tile_from;
00260
00261 if (this->last_clicked_widget == WID_DT_BUILD_AQUEDUCT) {
00262 GetOtherAqueductEnd(tile_from, &tile_to);
00263 } else {
00264 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from));
00265 if (IsValidDiagDirection(dir)) {
00266
00267 tile_to = TileAddByDiagDir(tile_from, ReverseDiagDir(dir));
00268
00269 if (this->last_clicked_widget == WID_DT_LOCK) tile_from = TileAddByDiagDir(tile_from, dir);
00270 }
00271 }
00272
00273 VpSetPresizeRange(tile_from, tile_to);
00274 }
00275
00276 static Hotkey<BuildDocksToolbarWindow> dockstoolbar_hotkeys[];
00277 };
00278
00279 const uint16 _dockstoolbar_aqueduct_keys[] = {'B', '8', 0};
00280
00281 Hotkey<BuildDocksToolbarWindow> BuildDocksToolbarWindow::dockstoolbar_hotkeys[] = {
00282 Hotkey<BuildDocksToolbarWindow>('1', "canal", WID_DT_CANAL),
00283 Hotkey<BuildDocksToolbarWindow>('2', "lock", WID_DT_LOCK),
00284 Hotkey<BuildDocksToolbarWindow>('3', "demolish", WID_DT_DEMOLISH),
00285 Hotkey<BuildDocksToolbarWindow>('4', "depot", WID_DT_DEPOT),
00286 Hotkey<BuildDocksToolbarWindow>('5', "dock", WID_DT_STATION),
00287 Hotkey<BuildDocksToolbarWindow>('6', "buoy", WID_DT_BUOY),
00288 Hotkey<BuildDocksToolbarWindow>('7', "river", WID_DT_RIVER),
00289 Hotkey<BuildDocksToolbarWindow>(_dockstoolbar_aqueduct_keys, "aqueduct", WID_DT_BUILD_AQUEDUCT),
00290 HOTKEY_LIST_END(BuildDocksToolbarWindow)
00291 };
00292 Hotkey<BuildDocksToolbarWindow> *_dockstoolbar_hotkeys = BuildDocksToolbarWindow::dockstoolbar_hotkeys;
00293
00298 static const NWidgetPart _nested_build_docks_toolbar_widgets[] = {
00299 NWidget(NWID_HORIZONTAL),
00300 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00301 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00302 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00303 EndContainer(),
00304 NWidget(NWID_HORIZONTAL_LTR),
00305 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP),
00306 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00307 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00308 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00309 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEPOT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DEPOT, STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP),
00310 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_STATION), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DOCK, STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP),
00311 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUOY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUOY, STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP),
00312 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(23, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00313 EndContainer(),
00314 };
00315
00316 static const WindowDesc _build_docks_toolbar_desc(
00317 WDP_ALIGN_TOOLBAR, 0, 0,
00318 WC_BUILD_TOOLBAR, WC_NONE,
00319 WDF_CONSTRUCTION,
00320 _nested_build_docks_toolbar_widgets, lengthof(_nested_build_docks_toolbar_widgets)
00321 );
00322
00330 Window *ShowBuildDocksToolbar()
00331 {
00332 if (!Company::IsValidID(_local_company)) return NULL;
00333
00334 DeleteWindowByClass(WC_BUILD_TOOLBAR);
00335 return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
00336 }
00337
00338 EventState DockToolbarGlobalHotkeys(WChar key, uint16 keycode)
00339 {
00340 int num = CheckHotkeyMatch<BuildDocksToolbarWindow>(_dockstoolbar_hotkeys, keycode, NULL, true);
00341 if (num == -1) return ES_NOT_HANDLED;
00342 Window *w = ShowBuildDocksToolbar();
00343 if (w == NULL) return ES_NOT_HANDLED;
00344 return w->OnKeyPress(key, keycode);
00345 }
00346
00351 static const NWidgetPart _nested_build_docks_scen_toolbar_widgets[] = {
00352 NWidget(NWID_HORIZONTAL),
00353 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00354 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00355 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00356 EndContainer(),
00357 NWidget(NWID_HORIZONTAL),
00358 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP),
00359 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00360 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00361 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00362 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_RIVER), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_RIVER, STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP),
00363 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00364 EndContainer(),
00365 };
00366
00368 static const WindowDesc _build_docks_scen_toolbar_desc(
00369 WDP_AUTO, 0, 0,
00370 WC_SCEN_BUILD_TOOLBAR, WC_NONE,
00371 WDF_CONSTRUCTION,
00372 _nested_build_docks_scen_toolbar_widgets, lengthof(_nested_build_docks_scen_toolbar_widgets)
00373 );
00374
00380 Window *ShowBuildDocksScenToolbar()
00381 {
00382 return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
00383 }
00384
00386 enum BuildDockStationWidgets {
00387 BDSW_BACKGROUND,
00388 BDSW_LT_OFF,
00389 BDSW_LT_ON,
00390 BDSW_INFO,
00391 };
00392
00393 struct BuildDocksStationWindow : public PickerWindowBase {
00394 public:
00395 BuildDocksStationWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00396 {
00397 this->InitNested(desc, TRANSPORT_WATER);
00398 this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00399 }
00400
00401 virtual ~BuildDocksStationWindow()
00402 {
00403 DeleteWindowById(WC_SELECT_STATION, 0);
00404 }
00405
00406 virtual void OnPaint()
00407 {
00408 int rad = (_settings_game.station.modified_catchment) ? CA_DOCK : CA_UNMODIFIED;
00409
00410 this->DrawWidgets();
00411
00412 if (_settings_client.gui.station_show_coverage) {
00413 SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
00414 } else {
00415 SetTileSelectSize(1, 1);
00416 }
00417
00418
00419 int top = this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->pos_y + this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->current_y + WD_PAR_VSEP_NORMAL;
00420 NWidgetBase *back_nwi = this->GetWidget<NWidgetBase>(BDSW_BACKGROUND);
00421 int right = back_nwi->pos_x + back_nwi->current_x;
00422 int bottom = back_nwi->pos_y + back_nwi->current_y;
00423 top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL;
00424 top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL;
00425
00426
00427
00428 if (top > bottom) {
00429 ResizeWindow(this, 0, top - bottom);
00430 }
00431 }
00432
00433 virtual void OnClick(Point pt, int widget, int click_count)
00434 {
00435 switch (widget) {
00436 case BDSW_LT_OFF:
00437 case BDSW_LT_ON:
00438 this->RaiseWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00439 _settings_client.gui.station_show_coverage = (widget != BDSW_LT_OFF);
00440 this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00441 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
00442 this->SetDirty();
00443 break;
00444 }
00445 }
00446
00447 virtual void OnTick()
00448 {
00449 CheckRedrawStationCoverage(this);
00450 }
00451 };
00452
00454 static const NWidgetPart _nested_build_dock_station_widgets[] = {
00455 NWidget(NWID_HORIZONTAL),
00456 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00457 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00458 EndContainer(),
00459 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND),
00460 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00461 NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetMinimalSize(148, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL),
00462 NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14),
00463 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
00464 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
00465 EndContainer(),
00466 NWidget(NWID_SPACER), SetMinimalSize(0, 20), SetResize(0, 1),
00467 EndContainer(),
00468 };
00469
00470 static const WindowDesc _build_dock_station_desc(
00471 WDP_AUTO, 0, 0,
00472 WC_BUILD_STATION, WC_BUILD_TOOLBAR,
00473 WDF_CONSTRUCTION,
00474 _nested_build_dock_station_widgets, lengthof(_nested_build_dock_station_widgets)
00475 );
00476
00477 static void ShowBuildDockStationPicker(Window *parent)
00478 {
00479 new BuildDocksStationWindow(&_build_dock_station_desc, parent);
00480 }
00481
00482 struct BuildDocksDepotWindow : public PickerWindowBase {
00483 private:
00484 static void UpdateDocksDirection()
00485 {
00486 if (_ship_depot_direction != AXIS_X) {
00487 SetTileSelectSize(1, 2);
00488 } else {
00489 SetTileSelectSize(2, 1);
00490 }
00491 }
00492
00493 public:
00494 BuildDocksDepotWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00495 {
00496 this->InitNested(desc, TRANSPORT_WATER);
00497 this->LowerWidget(_ship_depot_direction + WID_BDD_X);
00498 UpdateDocksDirection();
00499 }
00500
00501 virtual void OnPaint()
00502 {
00503 this->DrawWidgets();
00504
00505 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(WID_BDD_X)->pos_x + 64, this->GetWidget<NWidgetBase>(WID_BDD_X)->pos_y + 18, AXIS_X, DEPOT_PART_NORTH);
00506 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(WID_BDD_X)->pos_x + 32, this->GetWidget<NWidgetBase>(WID_BDD_X)->pos_y + 34, AXIS_X, DEPOT_PART_SOUTH);
00507 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(WID_BDD_Y)->pos_x + 32, this->GetWidget<NWidgetBase>(WID_BDD_Y)->pos_y + 18, AXIS_Y, DEPOT_PART_NORTH);
00508 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(WID_BDD_Y)->pos_x + 64, this->GetWidget<NWidgetBase>(WID_BDD_Y)->pos_y + 34, AXIS_Y, DEPOT_PART_SOUTH);
00509 }
00510
00511 virtual void OnClick(Point pt, int widget, int click_count)
00512 {
00513 switch (widget) {
00514 case WID_BDD_X:
00515 case WID_BDD_Y:
00516 this->RaiseWidget(_ship_depot_direction + WID_BDD_X);
00517 _ship_depot_direction = (widget == WID_BDD_X ? AXIS_X : AXIS_Y);
00518 this->LowerWidget(_ship_depot_direction + WID_BDD_X);
00519 if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
00520 UpdateDocksDirection();
00521 this->SetDirty();
00522 break;
00523 }
00524 }
00525 };
00526
00527 static const NWidgetPart _nested_build_docks_depot_widgets[] = {
00528 NWidget(NWID_HORIZONTAL),
00529 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00530 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00531 EndContainer(),
00532 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BDD_BACKGROUND),
00533 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00534 NWidget(NWID_HORIZONTAL_LTR),
00535 NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00536 NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_X), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00537 EndContainer(),
00538 NWidget(NWID_SPACER), SetMinimalSize(2, 0),
00539 NWidget(WWT_PANEL, COLOUR_GREY, WID_BDD_Y), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00540 EndContainer(),
00541 NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00542 EndContainer(),
00543 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00544 EndContainer(),
00545 };
00546
00547 static const WindowDesc _build_docks_depot_desc(
00548 WDP_AUTO, 0, 0,
00549 WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
00550 WDF_CONSTRUCTION,
00551 _nested_build_docks_depot_widgets, lengthof(_nested_build_docks_depot_widgets)
00552 );
00553
00554
00555 static void ShowBuildDocksDepotPicker(Window *parent)
00556 {
00557 new BuildDocksDepotWindow(&_build_docks_depot_desc, parent);
00558 }
00559
00560
00561 void InitializeDockGui()
00562 {
00563 _ship_depot_direction = AXIS_X;
00564 }