dock_gui.cpp

Go to the documentation of this file.
00001 /* $Id: dock_gui.cpp 21627 2010-12-24 15:08:19Z alberth $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #include "stdafx.h"
00013 #include "openttd.h"
00014 #include "terraform_gui.h"
00015 #include "window_gui.h"
00016 #include "station_gui.h"
00017 #include "command_func.h"
00018 #include "water.h"
00019 #include "water_map.h"
00020 #include "window_func.h"
00021 #include "vehicle_func.h"
00022 #include "sound_func.h"
00023 #include "viewport_func.h"
00024 #include "gfx_func.h"
00025 #include "company_func.h"
00026 #include "slope_func.h"
00027 #include "tilehighlight_func.h"
00028 #include "company_base.h"
00029 #include "station_type.h"
00030 #include "hotkeys.h"
00031 #include "bridge.h"
00032 
00033 #include "table/sprites.h"
00034 #include "table/strings.h"
00035 
00036 static void ShowBuildDockStationPicker(Window *parent);
00037 static void ShowBuildDocksDepotPicker(Window *parent);
00038 
00039 static Axis _ship_depot_direction;
00040 
00041 void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00042 {
00043   if (result.Failed()) return;
00044 
00045   SndPlayTileFx(SND_02_SPLAT, tile);
00046   if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
00047 }
00048 
00049 void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00050 {
00051   if (result.Succeeded()) SndPlayTileFx(SND_02_SPLAT, tile);
00052 }
00053 
00054 
00061 static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = NULL)
00062 {
00063   uint z;
00064   DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, &z));
00065 
00066   /* If the direction isn't right, just return the next tile so the command
00067    * complains about the wrong slope instead of the ends not matching up.
00068    * Make sure the coordinate is always a valid tile within the map, so we
00069    * don't go "off" the map. That would cause the wrong error message. */
00070   if (!IsValidDiagDirection(dir)) return TILE_ADDXY(tile_from, TileX(tile_from) > 2 ? -1 : 1, 0);
00071 
00072   /* Direction the aqueduct is built to. */
00073   TileIndexDiff offset = TileOffsByDiagDir(ReverseDiagDir(dir));
00074   /* The maximum length of the aqueduct. */
00075   int max_length = min(_settings_game.construction.longbridges ? MAX_BRIDGE_LENGTH_LONGBRIDGES : MAX_BRIDGE_LENGTH, DistanceFromEdgeDir(tile_from, ReverseDiagDir(dir)) - 1);
00076 
00077   TileIndex endtile = tile_from;
00078   for (int length = 0; IsValidTile(endtile) && TileX(endtile) != 0 && TileY(endtile) != 0; length++) {
00079     endtile = TILE_ADD(endtile, offset);
00080 
00081     if (length > max_length) break;
00082 
00083     if (GetTileMaxZ(endtile) > z) {
00084       if (tile_to != NULL) *tile_to = endtile;
00085       break;
00086     }
00087   }
00088 
00089   return endtile;
00090 }
00091 
00093 enum DockToolbarWidgets {
00094   DTW_BUTTONS_BEGIN,             
00095   DTW_CANAL = DTW_BUTTONS_BEGIN, 
00096   DTW_LOCK,                      
00097   DTW_DEMOLISH,                  
00098   DTW_DEPOT,                     
00099   DTW_STATION,                   
00100   DTW_BUOY,                      
00101   DTW_RIVER,                     
00102   DTW_BUILD_AQUEDUCT,            
00103   DTW_END,                       
00104 };
00105 
00107 struct BuildDocksToolbarWindow : Window {
00108   DockToolbarWidgets last_clicked_widget; 
00109 
00110   BuildDocksToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
00111   {
00112     this->last_clicked_widget = DTW_END;
00113     this->InitNested(desc, window_number);
00114     this->OnInvalidateData();
00115     if (_settings_client.gui.link_terraform_toolbar) ShowTerraformToolbar(this);
00116   }
00117 
00118   ~BuildDocksToolbarWindow()
00119   {
00120     if (_settings_client.gui.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0, false);
00121   }
00122 
00123   void OnInvalidateData(int data = 0)
00124   {
00125     this->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP),
00126       DTW_DEPOT,
00127       DTW_STATION,
00128       DTW_BUOY,
00129       WIDGET_LIST_END);
00130   }
00131 
00132   virtual void OnClick(Point pt, int widget, int click_count)
00133   {
00134     this->last_clicked_widget = (DockToolbarWidgets)widget;
00135     switch (widget) {
00136       case DTW_CANAL: // Build canal button
00137         HandlePlacePushButton(this, DTW_CANAL, SPR_CURSOR_CANAL, HT_RECT);
00138         break;
00139 
00140       case DTW_LOCK: // Build lock button
00141         HandlePlacePushButton(this, DTW_LOCK, SPR_CURSOR_LOCK, HT_SPECIAL);
00142         break;
00143 
00144       case DTW_DEMOLISH: // Demolish aka dynamite button
00145         HandlePlacePushButton(this, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, HT_RECT | HT_DIAGONAL);
00146         break;
00147 
00148       case DTW_DEPOT: // Build depot button
00149         if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00150         if (HandlePlacePushButton(this, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, HT_RECT)) ShowBuildDocksDepotPicker(this);
00151         break;
00152 
00153       case DTW_STATION: // Build station button
00154         if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00155         if (HandlePlacePushButton(this, DTW_STATION, SPR_CURSOR_DOCK, HT_SPECIAL)) ShowBuildDockStationPicker(this);
00156         break;
00157 
00158       case DTW_BUOY: // Build buoy button
00159         if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00160         HandlePlacePushButton(this, DTW_BUOY, SPR_CURSOR_BOUY, HT_RECT);
00161         break;
00162 
00163       case DTW_RIVER: // Build river button (in scenario editor)
00164         if (_game_mode != GM_EDITOR) return;
00165         HandlePlacePushButton(this, DTW_RIVER, SPR_CURSOR_RIVER, HT_RECT);
00166         break;
00167 
00168       case DTW_BUILD_AQUEDUCT: // Build aqueduct button
00169         HandlePlacePushButton(this, DTW_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, HT_SPECIAL);
00170         break;
00171 
00172       default: break;
00173     }
00174   }
00175 
00176   virtual EventState OnKeyPress(uint16 key, uint16 keycode)
00177   {
00178     int num = CheckHotkeyMatch(dockstoolbar_hotkeys, keycode, this);
00179     if (num == -1) return ES_NOT_HANDLED;
00180     this->OnClick(Point(), num, 1);
00181     return ES_HANDLED;
00182   }
00183 
00184   virtual void OnPlaceObject(Point pt, TileIndex tile)
00185   {
00186     switch (this->last_clicked_widget) {
00187       case DTW_CANAL: // Build canal button
00188         VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER);
00189         break;
00190 
00191       case DTW_LOCK: // Build lock button
00192         DoCommandP(tile, 0, 0, CMD_BUILD_LOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_LOCKS), CcBuildDocks);
00193         break;
00194 
00195       case DTW_DEMOLISH: // Demolish aka dynamite button
00196         PlaceProc_DemolishArea(tile);
00197         break;
00198 
00199       case DTW_DEPOT: // Build depot button
00200         DoCommandP(tile, _ship_depot_direction, 0, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_ERROR_CAN_T_BUILD_SHIP_DEPOT), CcBuildDocks);
00201         break;
00202 
00203       case DTW_STATION: { // Build station button
00204         uint32 p2 = (uint32)INVALID_STATION << 16; // no station to join
00205 
00206         /* tile is always the land tile, so need to evaluate _thd.pos */
00207         CommandContainer cmdcont = { tile, _ctrl_pressed, p2, CMD_BUILD_DOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_DOCK_HERE), CcBuildDocks, "" };
00208 
00209         /* Determine the watery part of the dock. */
00210         DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile, NULL));
00211         TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
00212 
00213         ShowSelectStationIfNeeded(cmdcont, TileArea(tile, tile_to));
00214         break;
00215       }
00216 
00217       case DTW_BUOY: // Build buoy button
00218         DoCommandP(tile, 0, 0, CMD_BUILD_BUOY | CMD_MSG(STR_ERROR_CAN_T_POSITION_BUOY_HERE), CcBuildDocks);
00219         break;
00220 
00221       case DTW_RIVER: // Build river button (in scenario editor)
00222         VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
00223         break;
00224 
00225       case DTW_BUILD_AQUEDUCT: // Build aqueduct button
00226         DoCommandP(tile, GetOtherAqueductEnd(tile), TRANSPORT_WATER << 15, CMD_BUILD_BRIDGE | CMD_MSG(STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE), CcBuildBridge);
00227         break;
00228 
00229       default: NOT_REACHED();
00230     }
00231   }
00232 
00233   virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
00234   {
00235     VpSelectTilesWithMethod(pt.x, pt.y, select_method);
00236   }
00237 
00238   virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
00239   {
00240     if (pt.x != -1) {
00241       switch (select_proc) {
00242         case DDSP_DEMOLISH_AREA:
00243           GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
00244           break;
00245         case DDSP_CREATE_WATER:
00246           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);
00247           break;
00248         case DDSP_CREATE_RIVER:
00249           DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcBuildCanal);
00250           break;
00251 
00252         default: break;
00253       }
00254     }
00255   }
00256 
00257   virtual void OnPlaceObjectAbort()
00258   {
00259     this->RaiseButtons();
00260 
00261     DeleteWindowById(WC_BUILD_STATION, TRANSPORT_WATER);
00262     DeleteWindowById(WC_BUILD_DEPOT, TRANSPORT_WATER);
00263     DeleteWindowById(WC_SELECT_STATION, 0);
00264     DeleteWindowByClass(WC_BUILD_BRIDGE);
00265   }
00266 
00267   virtual void OnPlacePresize(Point pt, TileIndex tile_from)
00268   {
00269     TileIndex tile_to = tile_from;
00270 
00271     if (this->last_clicked_widget == DTW_BUILD_AQUEDUCT) {
00272       GetOtherAqueductEnd(tile_from, &tile_to);
00273     } else {
00274       DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, NULL));
00275       if (IsValidDiagDirection(dir)) {
00276         /* Locks and docks always select the tile "down" the slope. */
00277         tile_to = TileAddByDiagDir(tile_from, ReverseDiagDir(dir));
00278         /* Locks also select the tile "up" the slope. */
00279         if (this->last_clicked_widget == DTW_LOCK) tile_from = TileAddByDiagDir(tile_from, dir);
00280       }
00281     }
00282 
00283     VpSetPresizeRange(tile_from, tile_to);
00284   }
00285 
00286   static Hotkey<BuildDocksToolbarWindow> dockstoolbar_hotkeys[];
00287 };
00288 
00289 const uint16 _dockstoolbar_aqueduct_keys[] = {'B', '8', 0};
00290 
00291 Hotkey<BuildDocksToolbarWindow> BuildDocksToolbarWindow::dockstoolbar_hotkeys[] = {
00292   Hotkey<BuildDocksToolbarWindow>('1', "canal", DTW_CANAL),
00293   Hotkey<BuildDocksToolbarWindow>('2', "lock", DTW_LOCK),
00294   Hotkey<BuildDocksToolbarWindow>('3', "demolish", DTW_DEMOLISH),
00295   Hotkey<BuildDocksToolbarWindow>('4', "depot", DTW_DEPOT),
00296   Hotkey<BuildDocksToolbarWindow>('5', "dock", DTW_STATION),
00297   Hotkey<BuildDocksToolbarWindow>('6', "buoy", DTW_BUOY),
00298   Hotkey<BuildDocksToolbarWindow>('7', "river", DTW_RIVER),
00299   Hotkey<BuildDocksToolbarWindow>(_dockstoolbar_aqueduct_keys, "aqueduct", DTW_BUILD_AQUEDUCT),
00300   HOTKEY_LIST_END(BuildDocksToolbarWindow)
00301 };
00302 Hotkey<BuildDocksToolbarWindow> *_dockstoolbar_hotkeys = BuildDocksToolbarWindow::dockstoolbar_hotkeys;
00303 
00308 static const NWidgetPart _nested_build_docks_toolbar_widgets[] = {
00309   NWidget(NWID_HORIZONTAL),
00310     NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00311     NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00312     NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00313   EndContainer(),
00314   NWidget(NWID_HORIZONTAL_LTR),
00315     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP),
00316     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00317     NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00318     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00319     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEPOT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DEPOT, STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP),
00320     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_STATION), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DOCK, STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP),
00321     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUOY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BOUY, STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP),
00322     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUILD_AQUEDUCT), SetMinimalSize(23, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00323   EndContainer(),
00324 };
00325 
00326 static const WindowDesc _build_docks_toolbar_desc(
00327   WDP_ALIGN_TOOLBAR, 0, 0,
00328   WC_BUILD_TOOLBAR, WC_NONE,
00329   WDF_CONSTRUCTION,
00330   _nested_build_docks_toolbar_widgets, lengthof(_nested_build_docks_toolbar_widgets)
00331 );
00332 
00340 Window *ShowBuildDocksToolbar()
00341 {
00342   if (!Company::IsValidID(_local_company)) return NULL;
00343 
00344   DeleteWindowByClass(WC_BUILD_TOOLBAR);
00345   return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
00346 }
00347 
00348 EventState DockToolbarGlobalHotkeys(uint16 key, uint16 keycode)
00349 {
00350   int num = CheckHotkeyMatch<BuildDocksToolbarWindow>(_dockstoolbar_hotkeys, keycode, NULL, true);
00351   if (num == -1) return ES_NOT_HANDLED;
00352   Window *w = ShowBuildDocksToolbar();
00353   if (w == NULL) return ES_NOT_HANDLED;
00354   return w->OnKeyPress(key, keycode);
00355 }
00356 
00361 static const NWidgetPart _nested_build_docks_scen_toolbar_widgets[] = {
00362   NWidget(NWID_HORIZONTAL),
00363     NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00364     NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00365     NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00366   EndContainer(),
00367   NWidget(NWID_HORIZONTAL),
00368     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP),
00369     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00370     NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00371     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00372     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_RIVER), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_RIVER, STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP),
00373     NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUILD_AQUEDUCT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00374   EndContainer(),
00375 };
00376 
00378 static const WindowDesc _build_docks_scen_toolbar_desc(
00379   WDP_AUTO, 0, 0,
00380   WC_SCEN_BUILD_TOOLBAR, WC_NONE,
00381   WDF_CONSTRUCTION,
00382   _nested_build_docks_scen_toolbar_widgets, lengthof(_nested_build_docks_scen_toolbar_widgets)
00383 );
00384 
00390 Window *ShowBuildDocksScenToolbar()
00391 {
00392   return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
00393 }
00394 
00396 enum BuildDockStationWidgets {
00397   BDSW_BACKGROUND, 
00398   BDSW_LT_OFF,     
00399   BDSW_LT_ON,      
00400   BDSW_INFO,       
00401 };
00402 
00403 struct BuildDocksStationWindow : public PickerWindowBase {
00404 public:
00405   BuildDocksStationWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00406   {
00407     this->InitNested(desc, TRANSPORT_WATER);
00408     this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00409   }
00410 
00411   virtual ~BuildDocksStationWindow()
00412   {
00413     DeleteWindowById(WC_SELECT_STATION, 0);
00414   }
00415 
00416   virtual void OnPaint()
00417   {
00418     int rad = (_settings_game.station.modified_catchment) ? CA_DOCK : CA_UNMODIFIED;
00419 
00420     this->DrawWidgets();
00421 
00422     if (_settings_client.gui.station_show_coverage) {
00423       SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
00424     } else {
00425       SetTileSelectSize(1, 1);
00426     }
00427 
00428     /* strings such as 'Size' and 'Coverage Area' */
00429     int top = this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->pos_y + this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->current_y + WD_PAR_VSEP_NORMAL;
00430     NWidgetBase *back_nwi = this->GetWidget<NWidgetBase>(BDSW_BACKGROUND);
00431     int right  = back_nwi->pos_x + back_nwi->current_x;
00432     int bottom = back_nwi->pos_y + back_nwi->current_y;
00433     top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL;
00434     top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL;
00435     /* Resize background if the text is not equally long as the window. */
00436     if (top > bottom || (top < bottom && back_nwi->current_y > back_nwi->smallest_y)) {
00437       ResizeWindow(this, 0, top - bottom);
00438     }
00439   }
00440 
00441   virtual void OnClick(Point pt, int widget, int click_count)
00442   {
00443     switch (widget) {
00444       case BDSW_LT_OFF:
00445       case BDSW_LT_ON:
00446         this->RaiseWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00447         _settings_client.gui.station_show_coverage = (widget != BDSW_LT_OFF);
00448         this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00449         SndPlayFx(SND_15_BEEP);
00450         this->SetDirty();
00451         break;
00452     }
00453   }
00454 
00455   virtual void OnTick()
00456   {
00457     CheckRedrawStationCoverage(this);
00458   }
00459 };
00460 
00462 static const NWidgetPart _nested_build_dock_station_widgets[] = {
00463   NWidget(NWID_HORIZONTAL),
00464     NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00465     NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00466   EndContainer(),
00467   NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND),
00468     NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00469     NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetMinimalSize(148, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL),
00470     NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14),
00471       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),
00472       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),
00473     EndContainer(),
00474     NWidget(NWID_SPACER), SetMinimalSize(0, 20), SetResize(0, 1),
00475   EndContainer(),
00476 };
00477 
00478 static const WindowDesc _build_dock_station_desc(
00479   WDP_AUTO, 0, 0,
00480   WC_BUILD_STATION, WC_BUILD_TOOLBAR,
00481   WDF_CONSTRUCTION,
00482   _nested_build_dock_station_widgets, lengthof(_nested_build_dock_station_widgets)
00483 );
00484 
00485 static void ShowBuildDockStationPicker(Window *parent)
00486 {
00487   new BuildDocksStationWindow(&_build_dock_station_desc, parent);
00488 }
00489 
00491 enum BuildDockDepotWidgets {
00492   BDDW_BACKGROUND,
00493   BDDW_X,
00494   BDDW_Y,
00495 };
00496 
00497 struct BuildDocksDepotWindow : public PickerWindowBase {
00498 private:
00499   static void UpdateDocksDirection()
00500   {
00501     if (_ship_depot_direction != AXIS_X) {
00502       SetTileSelectSize(1, 2);
00503     } else {
00504       SetTileSelectSize(2, 1);
00505     }
00506   }
00507 
00508 public:
00509   BuildDocksDepotWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00510   {
00511     this->InitNested(desc, TRANSPORT_WATER);
00512     this->LowerWidget(_ship_depot_direction + BDDW_X);
00513     UpdateDocksDirection();
00514   }
00515 
00516   virtual void OnPaint()
00517   {
00518     this->DrawWidgets();
00519 
00520     DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_X)->pos_x + 64, this->GetWidget<NWidgetBase>(BDDW_X)->pos_y + 18, 0);
00521     DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_X)->pos_x + 32, this->GetWidget<NWidgetBase>(BDDW_X)->pos_y + 34, 1);
00522     DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_Y)->pos_x + 32, this->GetWidget<NWidgetBase>(BDDW_Y)->pos_y + 18, 2);
00523     DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_Y)->pos_x + 64, this->GetWidget<NWidgetBase>(BDDW_Y)->pos_y + 34, 3);
00524   }
00525 
00526   virtual void OnClick(Point pt, int widget, int click_count)
00527   {
00528     switch (widget) {
00529       case BDDW_X:
00530       case BDDW_Y:
00531         this->RaiseWidget(_ship_depot_direction + BDDW_X);
00532         _ship_depot_direction = (widget == BDDW_X ? AXIS_X : AXIS_Y);
00533         this->LowerWidget(_ship_depot_direction + BDDW_X);
00534         SndPlayFx(SND_15_BEEP);
00535         UpdateDocksDirection();
00536         this->SetDirty();
00537         break;
00538     }
00539   }
00540 };
00541 
00542 static const NWidgetPart _nested_build_docks_depot_widgets[] = {
00543   NWidget(NWID_HORIZONTAL),
00544     NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00545     NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00546   EndContainer(),
00547   NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDDW_BACKGROUND),
00548     NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00549     NWidget(NWID_HORIZONTAL_LTR),
00550       NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00551       NWidget(WWT_PANEL, COLOUR_GREY, BDDW_X), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00552       EndContainer(),
00553       NWidget(NWID_SPACER), SetMinimalSize(2, 0),
00554       NWidget(WWT_PANEL, COLOUR_GREY, BDDW_Y), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00555       EndContainer(),
00556       NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00557     EndContainer(),
00558     NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00559   EndContainer(),
00560 };
00561 
00562 static const WindowDesc _build_docks_depot_desc(
00563   WDP_AUTO, 0, 0,
00564   WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
00565   WDF_CONSTRUCTION,
00566   _nested_build_docks_depot_widgets, lengthof(_nested_build_docks_depot_widgets)
00567 );
00568 
00569 
00570 static void ShowBuildDocksDepotPicker(Window *parent)
00571 {
00572   new BuildDocksDepotWindow(&_build_docks_depot_desc, parent);
00573 }
00574 
00575 
00576 void InitializeDockGui()
00577 {
00578   _ship_depot_direction = AXIS_X;
00579 }

Generated on Sun Jan 9 16:01:54 2011 for OpenTTD by  doxygen 1.6.1