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