00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "gui.h"
00014 #include "window_gui.h"
00015 #include "window_func.h"
00016 #include "viewport_func.h"
00017 #include "command_func.h"
00018 #include "vehicle_gui.h"
00019 #include "rail_gui.h"
00020 #include "road_gui.h"
00021 #include "date_func.h"
00022 #include "vehicle_func.h"
00023 #include "sound_func.h"
00024 #include "terraform_gui.h"
00025 #include "transparency.h"
00026 #include "strings_func.h"
00027 #include "company_func.h"
00028 #include "company_gui.h"
00029 #include "vehicle_base.h"
00030 #include "cheat_func.h"
00031 #include "transparency_gui.h"
00032 #include "screenshot.h"
00033 #include "signs_func.h"
00034 #include "fios.h"
00035 #include "console_gui.h"
00036 #include "news_gui.h"
00037 #include "ai/ai_gui.hpp"
00038 #include "tilehighlight_func.h"
00039 #include "smallmap_gui.h"
00040 #include "graph_gui.h"
00041 #include "textbuf_gui.h"
00042 #include "linkgraph_gui.h"
00043 #include "newgrf_debug.h"
00044 #include "hotkeys.h"
00045 #include "engine_base.h"
00046
00047 #include "network/network.h"
00048 #include "network/network_gui.h"
00049 #include "network/network_func.h"
00050
00051 #include "table/strings.h"
00052 #include "table/sprites.h"
00053
00054 RailType _last_built_railtype;
00055 RoadType _last_built_roadtype;
00056
00057 enum ToolbarMode {
00058 TB_NORMAL,
00059 TB_UPPER,
00060 TB_LOWER
00061 };
00062
00064 enum CallBackFunction {
00065 CBF_NONE,
00066 CBF_PLACE_SIGN,
00067 CBF_PLACE_LANDINFO,
00068 };
00069
00070 enum ToolbarNormalWidgets {
00071 TBN_PAUSE = 0,
00072 TBN_FASTFORWARD,
00073 TBN_SETTINGS,
00074 TBN_SAVEGAME,
00075 TBN_SMALLMAP,
00076 TBN_TOWNDIRECTORY,
00077 TBN_SUBSIDIES,
00078 TBN_STATIONS,
00079 TBN_FINANCES,
00080 TBN_COMPANIES,
00081 TBN_GRAPHICS,
00082 TBN_LEAGUE,
00083 TBN_INDUSTRIES,
00084 TBN_VEHICLESTART,
00085 TBN_TRAINS = TBN_VEHICLESTART,
00086 TBN_ROADVEHS,
00087 TBN_SHIPS,
00088 TBN_AIRCRAFTS,
00089 TBN_ZOOMIN,
00090 TBN_ZOOMOUT,
00091 TBN_RAILS,
00092 TBN_ROADS,
00093 TBN_WATER,
00094 TBN_AIR,
00095 TBN_LANDSCAPE,
00096 TBN_MUSICSOUND,
00097 TBN_NEWSREPORT,
00098 TBN_HELP,
00099 TBN_SWITCHBAR,
00100 TBN_END
00101 };
00102
00103 enum ToolbarScenEditorWidgets {
00104 TBSE_PAUSE = 0,
00105 TBSE_FASTFORWARD,
00106 TBSE_SETTINGS,
00107 TBSE_SAVESCENARIO,
00108 TBSE_SPACERPANEL,
00109 TBSE_DATEPANEL,
00110 TBSE_DATEBACKWARD,
00111 TBSE_DATEFORWARD,
00112 TBSE_SMALLMAP,
00113 TBSE_ZOOMIN,
00114 TBSE_ZOOMOUT,
00115 TBSE_LANDGENERATE,
00116 TBSE_TOWNGENERATE,
00117 TBSE_INDUSTRYGENERATE,
00118 TBSE_BUILDROAD,
00119 TBSE_BUILDDOCKS,
00120 TBSE_PLANTTREES,
00121 TBSE_PLACESIGNS,
00122 TBSE_DATEPANEL_CONTAINER,
00123 };
00124
00128 class DropDownListCheckedItem : public DropDownListStringItem {
00129 uint checkmark_width;
00130 public:
00131 bool checked;
00132
00133 DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked)
00134 {
00135 this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + 3;
00136 }
00137
00138 virtual ~DropDownListCheckedItem() {}
00139
00140 uint Width() const
00141 {
00142 return DropDownListStringItem::Width() + this->checkmark_width;
00143 }
00144
00145 void Draw(int left, int right, int top, int bottom, bool sel, int bg_colour) const
00146 {
00147 bool rtl = _current_text_dir == TD_RTL;
00148 if (this->checked) {
00149 DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK);
00150 }
00151 DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : this->checkmark_width), right - WD_FRAMERECT_RIGHT - (rtl ? this->checkmark_width : 0), top, this->String(), sel ? TC_WHITE : TC_BLACK);
00152 }
00153 };
00154
00158 class DropDownListCompanyItem : public DropDownListItem {
00159 uint icon_width;
00160 public:
00161 bool greyed;
00162
00163 DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed)
00164 {
00165 this->icon_width = GetSpriteSize(SPR_COMPANY_ICON).width;
00166 }
00167
00168 virtual ~DropDownListCompanyItem() {}
00169
00170 bool Selectable() const
00171 {
00172 return true;
00173 }
00174
00175 uint Width() const
00176 {
00177 CompanyID company = (CompanyID)this->result;
00178 SetDParam(0, company);
00179 SetDParam(1, company);
00180 return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_width + 3;
00181 }
00182
00183 void Draw(int left, int right, int top, int bottom, bool sel, int bg_colour) const
00184 {
00185 CompanyID company = (CompanyID)this->result;
00186 bool rtl = _current_text_dir == TD_RTL;
00187
00188
00189 if (!Company::IsValidID(company)) return;
00190
00191 DrawCompanyIcon(company, rtl ? right - this->icon_width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, top + 1 + (FONT_HEIGHT_NORMAL - 10) / 2);
00192
00193 SetDParam(0, company);
00194 SetDParam(1, company);
00195 TextColour col;
00196 if (this->greyed) {
00197 col = TC_GREY;
00198 } else {
00199 col = sel ? TC_WHITE : TC_BLACK;
00200 }
00201 DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : 3 + this->icon_width), right - WD_FRAMERECT_RIGHT - (rtl ? 3 + this->icon_width : 0), top, STR_COMPANY_NAME_COMPANY_NUM, col);
00202 }
00203 };
00204
00208 static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count)
00209 {
00210 DropDownList *list = new DropDownList();
00211 for (int i = 0; i < count; i++) {
00212 list->push_back(new DropDownListStringItem(string + i, i, false));
00213 }
00214 ShowDropDownList(w, list, 0, widget, 140, true, true);
00215 SndPlayFx(SND_15_BEEP);
00216 }
00217
00219 static const int CTMN_CLIENT_LIST = -1;
00220 static const int CTMN_NEW_COMPANY = -2;
00221 static const int CTMN_SPECTATE = -3;
00222
00226 static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0)
00227 {
00228 DropDownList *list = new DropDownList();
00229
00230 #ifdef ENABLE_NETWORK
00231 if (widget == TBN_COMPANIES && _networking) {
00232
00233 list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST, false));
00234
00235 if (_local_company == COMPANY_SPECTATOR) {
00236 list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_NEW_COMPANY, CTMN_NEW_COMPANY, NetworkMaxCompaniesReached()));
00237 } else {
00238 list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, NetworkMaxSpectatorsReached()));
00239 }
00240 }
00241 #endif
00242
00243 for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
00244 if (!Company::IsValidID(c)) continue;
00245 list->push_back(new DropDownListCompanyItem(c, false, HasBit(grey, c)));
00246 }
00247
00248 ShowDropDownList(w, list, _local_company == COMPANY_SPECTATOR ? CTMN_CLIENT_LIST : (int)_local_company, widget, 240, true, true);
00249 SndPlayFx(SND_15_BEEP);
00250 }
00251
00252
00253 static ToolbarMode _toolbar_mode;
00254
00255 static CallBackFunction SelectSignTool()
00256 {
00257 if (_cursor.sprite == SPR_CURSOR_SIGN) {
00258 ResetObjectToPlace();
00259 return CBF_NONE;
00260 } else {
00261 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
00262 return CBF_PLACE_SIGN;
00263 }
00264 }
00265
00266
00267
00268 static CallBackFunction ToolbarPauseClick(Window *w)
00269 {
00270 if (_networking && !_network_server) return CBF_NONE;
00271
00272 if (DoCommandP(0, PM_PAUSED_NORMAL, _pause_mode == PM_UNPAUSED, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
00273 return CBF_NONE;
00274 }
00275
00276
00277
00278 static CallBackFunction ToolbarFastForwardClick(Window *w)
00279 {
00280 _fast_forward ^= true;
00281 SndPlayFx(SND_15_BEEP);
00282 return CBF_NONE;
00283 }
00284
00285
00286
00287 enum OptionMenuEntries {
00288 OME_GAMEOPTIONS,
00289 OME_DIFFICULTIES,
00290 OME_SETTINGS,
00291 OME_AI_SETTINGS,
00292 OME_NEWGRFSETTINGS,
00293 OME_TRANSPARENCIES,
00294 OME_SHOW_TOWNNAMES,
00295 OME_SHOW_STATIONNAMES,
00296 OME_SHOW_WAYPOINTNAMES,
00297 OME_SHOW_SIGNS,
00298 OME_FULL_ANIMATION,
00299 OME_FULL_DETAILS,
00300 OME_TRANSPARENTBUILDINGS,
00301 OME_SHOW_STATIONSIGNS,
00302 };
00303
00304 static CallBackFunction ToolbarOptionsClick(Window *w)
00305 {
00306 DropDownList *list = new DropDownList();
00307 list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS, OME_GAMEOPTIONS, false));
00308 list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_DIFFICULTY_SETTINGS, OME_DIFFICULTIES, false));
00309 list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS, OME_SETTINGS, false));
00310
00311
00312
00313 if (!_networking || _network_server) list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS, false));
00314 list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false));
00315 list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false));
00316 list->push_back(new DropDownListItem(-1, false));
00317 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES)));
00318 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES)));
00319 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES)));
00320 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS)));
00321 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_ANIMATION, OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION)));
00322 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_DETAIL, OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL)));
00323 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES)));
00324 list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS)));
00325
00326 ShowDropDownList(w, list, 0, TBN_SETTINGS, 140, true, true);
00327 SndPlayFx(SND_15_BEEP);
00328 return CBF_NONE;
00329 }
00330
00331 static CallBackFunction MenuClickSettings(int index)
00332 {
00333 switch (index) {
00334 case OME_GAMEOPTIONS: ShowGameOptions(); return CBF_NONE;
00335 case OME_DIFFICULTIES: ShowGameDifficulty(); return CBF_NONE;
00336 case OME_SETTINGS: ShowGameSettings(); return CBF_NONE;
00337 case OME_AI_SETTINGS: ShowAIConfigWindow(); return CBF_NONE;
00338 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE;
00339 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
00340
00341 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
00342 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
00343 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
00344 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
00345 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); break;
00346 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
00347 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
00348 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
00349 }
00350 MarkWholeScreenDirty();
00351 return CBF_NONE;
00352 }
00353
00354
00355
00356 enum SaveLoadEditorMenuEntries {
00357 SLEME_SAVE_SCENARIO = 0,
00358 SLEME_LOAD_SCENARIO,
00359 SLEME_SAVE_HEIGHTMAP,
00360 SLEME_LOAD_HEIGHTMAP,
00361 SLEME_EXIT_TOINTRO,
00362 SLEME_EXIT_GAME = 6,
00363 SLEME_MENUCOUNT,
00364 };
00365
00366 enum SaveLoadNormalMenuEntries {
00367 SLNME_SAVE_GAME = 0,
00368 SLNME_LOAD_GAME,
00369 SLNME_EXIT_TOINTRO,
00370 SLNME_EXIT_GAME,
00371 SLNME_MENUCOUNT,
00372 };
00373
00374 static CallBackFunction ToolbarSaveClick(Window *w)
00375 {
00376 PopupMainToolbMenu(w, TBN_SAVEGAME, STR_FILE_MENU_SAVE_GAME, SLNME_MENUCOUNT);
00377 return CBF_NONE;
00378 }
00379
00380 static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
00381 {
00382 PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, SLEME_MENUCOUNT);
00383 return CBF_NONE;
00384 }
00385
00386 static CallBackFunction MenuClickSaveLoad(int index = 0)
00387 {
00388 if (_game_mode == GM_EDITOR) {
00389 switch (index) {
00390 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break;
00391 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
00392 case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(SLD_SAVE_HEIGHTMAP); break;
00393 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
00394 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00395 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
00396 }
00397 } else {
00398 switch (index) {
00399 case SLNME_SAVE_GAME: ShowSaveLoadDialog(SLD_SAVE_GAME); break;
00400 case SLNME_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
00401 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00402 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
00403 }
00404 }
00405 return CBF_NONE;
00406 }
00407
00408
00409
00410 enum MapMenuEntries {
00411 MME_SHOW_SMALLMAP = 0,
00412 MME_SHOW_EXTRAVIEWPORTS,
00413 MME_SHOW_LINKGRAPH,
00414 MME_SHOW_SIGNLISTS,
00415 MME_SHOW_TOWNDIRECTORY,
00416 MME_MENUCOUNT_NORMAL = 4,
00417 MME_MENUCOUNT_EDITOR = 5,
00418 };
00419
00420 static CallBackFunction ToolbarMapClick(Window *w)
00421 {
00422 PopupMainToolbMenu(w, TBN_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_NORMAL);
00423 return CBF_NONE;
00424 }
00425
00426 static CallBackFunction ToolbarScenMapTownDir(Window *w)
00427 {
00428 PopupMainToolbMenu(w, TBSE_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_EDITOR);
00429 return CBF_NONE;
00430 }
00431
00432 static CallBackFunction MenuClickMap(int index)
00433 {
00434 switch (index) {
00435 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
00436 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewPortWindow(); break;
00437 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); break;
00438 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
00439 case MME_SHOW_TOWNDIRECTORY: if (_game_mode == GM_EDITOR) ShowTownDirectory(); break;
00440 }
00441 return CBF_NONE;
00442 }
00443
00444
00445
00446 static CallBackFunction ToolbarTownClick(Window *w)
00447 {
00448 PopupMainToolbMenu(w, TBN_TOWNDIRECTORY, STR_TOWN_MENU_TOWN_DIRECTORY, (_settings_game.economy.found_town == TF_FORBIDDEN) ? 1 : 2);
00449 return CBF_NONE;
00450 }
00451
00452 static CallBackFunction MenuClickTown(int index)
00453 {
00454 switch (index) {
00455 case 0: ShowTownDirectory(); break;
00456 case 1:
00457 if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
00458 break;
00459 }
00460 return CBF_NONE;
00461 }
00462
00463
00464
00465 static CallBackFunction ToolbarSubsidiesClick(Window *w)
00466 {
00467 PopupMainToolbMenu(w, TBN_SUBSIDIES, STR_SUBSIDIES_MENU_SUBSIDIES, 1);
00468 return CBF_NONE;
00469 }
00470
00471 static CallBackFunction MenuClickSubsidies(int index)
00472 {
00473 ShowSubsidiesList();
00474 return CBF_NONE;
00475 }
00476
00477
00478
00479 static CallBackFunction ToolbarStationsClick(Window *w)
00480 {
00481 PopupMainCompanyToolbMenu(w, TBN_STATIONS);
00482 return CBF_NONE;
00483 }
00484
00485 static CallBackFunction MenuClickStations(int index)
00486 {
00487 ShowCompanyStations((CompanyID)index);
00488 return CBF_NONE;
00489 }
00490
00491
00492
00493 static CallBackFunction ToolbarFinancesClick(Window *w)
00494 {
00495 PopupMainCompanyToolbMenu(w, TBN_FINANCES);
00496 return CBF_NONE;
00497 }
00498
00499 static CallBackFunction MenuClickFinances(int index)
00500 {
00501 ShowCompanyFinances((CompanyID)index);
00502 return CBF_NONE;
00503 }
00504
00505
00506
00507 static CallBackFunction ToolbarCompaniesClick(Window *w)
00508 {
00509 PopupMainCompanyToolbMenu(w, TBN_COMPANIES);
00510 return CBF_NONE;
00511 }
00512
00513 static CallBackFunction MenuClickCompany(int index)
00514 {
00515 #ifdef ENABLE_NETWORK
00516 if (_networking) {
00517 switch (index) {
00518 case CTMN_CLIENT_LIST:
00519 ShowClientList();
00520 return CBF_NONE;
00521
00522 case CTMN_NEW_COMPANY:
00523 if (_network_server) {
00524 DoCommandP(0, 0, _network_own_client_id, CMD_COMPANY_CTRL);
00525 } else {
00526 NetworkSendCommand(0, 0, 0, CMD_COMPANY_CTRL, NULL, NULL, _local_company);
00527 }
00528 return CBF_NONE;
00529
00530 case CTMN_SPECTATE:
00531 if (_network_server) {
00532 NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR);
00533 MarkWholeScreenDirty();
00534 } else {
00535 NetworkClientRequestMove(COMPANY_SPECTATOR);
00536 }
00537 return CBF_NONE;
00538 }
00539 }
00540 #endif
00541 ShowCompany((CompanyID)index);
00542 return CBF_NONE;
00543 }
00544
00545
00546
00547 static CallBackFunction ToolbarGraphsClick(Window *w)
00548 {
00549 PopupMainToolbMenu(w, TBN_GRAPHICS, STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8);
00550 return CBF_NONE;
00551 }
00552
00553 static CallBackFunction MenuClickGraphs(int index)
00554 {
00555 switch (index) {
00556 case 0: ShowOperatingProfitGraph(); break;
00557 case 1: ShowIncomeGraph(); break;
00558 case 2: ShowDeliveredCargoGraph(); break;
00559 case 3: ShowPerformanceHistoryGraph(); break;
00560 case 4: ShowCompanyValueGraph(); break;
00561 case 5: ShowCargoPaymentRates(); break;
00562
00563 case 6: ShowCompanyLeagueTable(); break;
00564 case 7: ShowPerformanceRatingDetail(); break;
00565 }
00566 return CBF_NONE;
00567 }
00568
00569
00570
00571 static CallBackFunction ToolbarLeagueClick(Window *w)
00572 {
00573 PopupMainToolbMenu(w, TBN_LEAGUE, STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, 2);
00574 return CBF_NONE;
00575 }
00576
00577 static CallBackFunction MenuClickLeague(int index)
00578 {
00579 switch (index) {
00580 case 0: ShowCompanyLeagueTable(); break;
00581 case 1: ShowPerformanceRatingDetail(); break;
00582 }
00583 return CBF_NONE;
00584 }
00585
00586
00587
00588 static CallBackFunction ToolbarIndustryClick(Window *w)
00589 {
00590
00591 PopupMainToolbMenu(w, TBN_INDUSTRIES, STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, (_local_company == COMPANY_SPECTATOR) ? 1 : 2);
00592 return CBF_NONE;
00593 }
00594
00595 static CallBackFunction MenuClickIndustry(int index)
00596 {
00597 switch (index) {
00598 case 0: ShowIndustryDirectory(); break;
00599 case 1: ShowBuildIndustryWindow(); break;
00600 }
00601 return CBF_NONE;
00602 }
00603
00604
00605
00606 static void ToolbarVehicleClick(Window *w, VehicleType veh)
00607 {
00608 const Vehicle *v;
00609 int dis = ~0;
00610
00611 FOR_ALL_VEHICLES(v) {
00612 if (v->type == veh && v->IsPrimaryVehicle()) ClrBit(dis, v->owner);
00613 }
00614 PopupMainCompanyToolbMenu(w, TBN_VEHICLESTART + veh, dis);
00615 }
00616
00617
00618 static CallBackFunction ToolbarTrainClick(Window *w)
00619 {
00620 ToolbarVehicleClick(w, VEH_TRAIN);
00621 return CBF_NONE;
00622 }
00623
00624 static CallBackFunction MenuClickShowTrains(int index)
00625 {
00626 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
00627 return CBF_NONE;
00628 }
00629
00630
00631
00632 static CallBackFunction ToolbarRoadClick(Window *w)
00633 {
00634 ToolbarVehicleClick(w, VEH_ROAD);
00635 return CBF_NONE;
00636 }
00637
00638 static CallBackFunction MenuClickShowRoad(int index)
00639 {
00640 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
00641 return CBF_NONE;
00642 }
00643
00644
00645
00646 static CallBackFunction ToolbarShipClick(Window *w)
00647 {
00648 ToolbarVehicleClick(w, VEH_SHIP);
00649 return CBF_NONE;
00650 }
00651
00652 static CallBackFunction MenuClickShowShips(int index)
00653 {
00654 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
00655 return CBF_NONE;
00656 }
00657
00658
00659
00660 static CallBackFunction ToolbarAirClick(Window *w)
00661 {
00662 ToolbarVehicleClick(w, VEH_AIRCRAFT);
00663 return CBF_NONE;
00664 }
00665
00666 static CallBackFunction MenuClickShowAir(int index)
00667 {
00668 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
00669 return CBF_NONE;
00670 }
00671
00672
00673
00674 static CallBackFunction ToolbarZoomInClick(Window *w)
00675 {
00676 if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
00677 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMIN : (byte)TBN_ZOOMIN);
00678 SndPlayFx(SND_15_BEEP);
00679 }
00680 return CBF_NONE;
00681 }
00682
00683
00684
00685 static CallBackFunction ToolbarZoomOutClick(Window *w)
00686 {
00687 if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
00688 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMOUT : (byte)TBN_ZOOMOUT);
00689 SndPlayFx(SND_15_BEEP);
00690 }
00691 return CBF_NONE;
00692 }
00693
00694
00695
00696 static CallBackFunction ToolbarBuildRailClick(Window *w)
00697 {
00698 ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, TBN_RAILS, 140, true, true);
00699 SndPlayFx(SND_15_BEEP);
00700 return CBF_NONE;
00701 }
00702
00703 static CallBackFunction MenuClickBuildRail(int index)
00704 {
00705 _last_built_railtype = (RailType)index;
00706 ShowBuildRailToolbar(_last_built_railtype);
00707 return CBF_NONE;
00708 }
00709
00710
00711
00712 static CallBackFunction ToolbarBuildRoadClick(Window *w)
00713 {
00714 const Company *c = Company::Get(_local_company);
00715 DropDownList *list = new DropDownList();
00716
00717
00718 list->push_back(new DropDownListStringItem(STR_ROAD_MENU_ROAD_CONSTRUCTION, ROADTYPE_ROAD, false));
00719
00720
00721 Engine *e;
00722 FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
00723 if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
00724 if (!HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
00725
00726 list->push_back(new DropDownListStringItem(STR_ROAD_MENU_TRAM_CONSTRUCTION, ROADTYPE_TRAM, !HasBit(c->avail_roadtypes, ROADTYPE_TRAM)));
00727 break;
00728 }
00729 ShowDropDownList(w, list, _last_built_roadtype, TBN_ROADS, 140, true, true);
00730 SndPlayFx(SND_15_BEEP);
00731 return CBF_NONE;
00732 }
00733
00734 static CallBackFunction MenuClickBuildRoad(int index)
00735 {
00736 _last_built_roadtype = (RoadType)index;
00737 ShowBuildRoadToolbar(_last_built_roadtype);
00738 return CBF_NONE;
00739 }
00740
00741
00742
00743 static CallBackFunction ToolbarBuildWaterClick(Window *w)
00744 {
00745 PopupMainToolbMenu(w, TBN_WATER, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 1);
00746 return CBF_NONE;
00747 }
00748
00749 static CallBackFunction MenuClickBuildWater(int index)
00750 {
00751 ShowBuildDocksToolbar();
00752 return CBF_NONE;
00753 }
00754
00755
00756
00757 static CallBackFunction ToolbarBuildAirClick(Window *w)
00758 {
00759 PopupMainToolbMenu(w, TBN_AIR, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 1);
00760 return CBF_NONE;
00761 }
00762
00763 static CallBackFunction MenuClickBuildAir(int index)
00764 {
00765 ShowBuildAirToolbar();
00766 return CBF_NONE;
00767 }
00768
00769
00770
00771 static CallBackFunction ToolbarForestClick(Window *w)
00772 {
00773 PopupMainToolbMenu(w, TBN_LANDSCAPE, STR_LANDSCAPING_MENU_LANDSCAPING, 3);
00774 return CBF_NONE;
00775 }
00776
00777 static CallBackFunction MenuClickForest(int index)
00778 {
00779 switch (index) {
00780 case 0: ShowTerraformToolbar(); break;
00781 case 1: ShowBuildTreesToolbar(); break;
00782 case 2: return SelectSignTool();
00783 }
00784 return CBF_NONE;
00785 }
00786
00787
00788
00789 static CallBackFunction ToolbarMusicClick(Window *w)
00790 {
00791 PopupMainToolbMenu(w, TBN_MUSICSOUND, STR_TOOLBAR_SOUND_MUSIC, 1);
00792 return CBF_NONE;
00793 }
00794
00795 static CallBackFunction MenuClickMusicWindow(int index)
00796 {
00797 ShowMusicWindow();
00798 return CBF_NONE;
00799 }
00800
00801
00802
00803 static CallBackFunction ToolbarNewspaperClick(Window *w)
00804 {
00805 PopupMainToolbMenu(w, TBN_NEWSREPORT, STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, 3);
00806 return CBF_NONE;
00807 }
00808
00809 static CallBackFunction MenuClickNewspaper(int index)
00810 {
00811 switch (index) {
00812 case 0: ShowLastNewsMessage(); break;
00813 case 1: ShowMessageOptions(); break;
00814 case 2: ShowMessageHistory(); break;
00815 }
00816 return CBF_NONE;
00817 }
00818
00819
00820
00821 static CallBackFunction PlaceLandBlockInfo()
00822 {
00823 if (_cursor.sprite == SPR_CURSOR_QUERY) {
00824 ResetObjectToPlace();
00825 return CBF_NONE;
00826 } else {
00827 SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
00828 return CBF_PLACE_LANDINFO;
00829 }
00830 }
00831
00832 static CallBackFunction ToolbarHelpClick(Window *w)
00833 {
00834 PopupMainToolbMenu(w, TBN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 9 : 8);
00835 return CBF_NONE;
00836 }
00837
00838 static void MenuClickSmallScreenshot()
00839 {
00840 MakeScreenshot(SC_VIEWPORT, NULL);
00841 }
00842
00843 static void MenuClickZoomedInScreenshot()
00844 {
00845 MakeScreenshot(SC_ZOOMEDIN, NULL);
00846 }
00847
00848 static void MenuClickWorldScreenshot()
00849 {
00850 MakeScreenshot(SC_WORLD, NULL);
00851 }
00852
00853 static CallBackFunction MenuClickHelp(int index)
00854 {
00855 switch (index) {
00856 case 0: return PlaceLandBlockInfo();
00857 case 2: IConsoleSwitch(); break;
00858 case 3: ShowAIDebugWindow(); break;
00859 case 4: MenuClickSmallScreenshot(); break;
00860 case 5: MenuClickZoomedInScreenshot(); break;
00861 case 6: MenuClickWorldScreenshot(); break;
00862 case 7: ShowAboutWindow(); break;
00863 case 8: ShowSpriteAlignerWindow(); break;
00864 }
00865 return CBF_NONE;
00866 }
00867
00868
00869
00870 static CallBackFunction ToolbarSwitchClick(Window *w)
00871 {
00872 if (_toolbar_mode != TB_LOWER) {
00873 _toolbar_mode = TB_LOWER;
00874 } else {
00875 _toolbar_mode = TB_UPPER;
00876 }
00877
00878 w->ReInit();
00879 w->SetWidgetLoweredState(TBN_SWITCHBAR, _toolbar_mode == TB_LOWER);
00880 SndPlayFx(SND_15_BEEP);
00881 return CBF_NONE;
00882 }
00883
00884
00885
00889 static CallBackFunction ToolbarScenDatePanel(Window *w)
00890 {
00891 SetDParam(0, _settings_game.game_creation.starting_year);
00892 ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
00893 _left_button_clicked = false;
00894 return CBF_NONE;
00895 }
00896
00897 static CallBackFunction ToolbarScenDateBackward(Window *w)
00898 {
00899
00900 if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00901 w->HandleButtonClick(TBSE_DATEBACKWARD);
00902 w->SetDirty();
00903
00904 _settings_game.game_creation.starting_year = Clamp(_settings_game.game_creation.starting_year - 1, MIN_YEAR, MAX_YEAR);
00905 SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
00906 }
00907 _left_button_clicked = false;
00908 return CBF_NONE;
00909 }
00910
00911 static CallBackFunction ToolbarScenDateForward(Window *w)
00912 {
00913
00914 if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00915 w->HandleButtonClick(TBSE_DATEFORWARD);
00916 w->SetDirty();
00917
00918 _settings_game.game_creation.starting_year = Clamp(_settings_game.game_creation.starting_year + 1, MIN_YEAR, MAX_YEAR);
00919 SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
00920 }
00921 _left_button_clicked = false;
00922 return CBF_NONE;
00923 }
00924
00925 static CallBackFunction ToolbarScenGenLand(Window *w)
00926 {
00927 w->HandleButtonClick(TBSE_LANDGENERATE);
00928 SndPlayFx(SND_15_BEEP);
00929
00930 ShowEditorTerraformToolbar();
00931 return CBF_NONE;
00932 }
00933
00934
00935 static CallBackFunction ToolbarScenGenTown(Window *w)
00936 {
00937 w->HandleButtonClick(TBSE_TOWNGENERATE);
00938 SndPlayFx(SND_15_BEEP);
00939 ShowFoundTownWindow();
00940 return CBF_NONE;
00941 }
00942
00943 static CallBackFunction ToolbarScenGenIndustry(Window *w)
00944 {
00945 w->HandleButtonClick(TBSE_INDUSTRYGENERATE);
00946 SndPlayFx(SND_15_BEEP);
00947 ShowBuildIndustryWindow();
00948 return CBF_NONE;
00949 }
00950
00951 static CallBackFunction ToolbarScenBuildRoad(Window *w)
00952 {
00953 w->HandleButtonClick(TBSE_BUILDROAD);
00954 SndPlayFx(SND_15_BEEP);
00955 ShowBuildRoadScenToolbar();
00956 return CBF_NONE;
00957 }
00958
00959 static CallBackFunction ToolbarScenBuildDocks(Window *w)
00960 {
00961 w->HandleButtonClick(TBSE_BUILDDOCKS);
00962 SndPlayFx(SND_15_BEEP);
00963 ShowBuildDocksScenToolbar();
00964 return CBF_NONE;
00965 }
00966
00967 static CallBackFunction ToolbarScenPlantTrees(Window *w)
00968 {
00969 w->HandleButtonClick(TBSE_PLANTTREES);
00970 SndPlayFx(SND_15_BEEP);
00971 ShowBuildTreesToolbar();
00972 return CBF_NONE;
00973 }
00974
00975 static CallBackFunction ToolbarScenPlaceSign(Window *w)
00976 {
00977 w->HandleButtonClick(TBSE_PLACESIGNS);
00978 SndPlayFx(SND_15_BEEP);
00979 return SelectSignTool();
00980 }
00981
00982 static CallBackFunction ToolbarBtn_NULL(Window *w)
00983 {
00984 return CBF_NONE;
00985 }
00986
00987 typedef CallBackFunction MenuClickedProc(int index);
00988
00989 static MenuClickedProc * const _menu_clicked_procs[] = {
00990 NULL,
00991 NULL,
00992 MenuClickSettings,
00993 MenuClickSaveLoad,
00994 MenuClickMap,
00995 MenuClickTown,
00996 MenuClickSubsidies,
00997 MenuClickStations,
00998 MenuClickFinances,
00999 MenuClickCompany,
01000 MenuClickGraphs,
01001 MenuClickLeague,
01002 MenuClickIndustry,
01003 MenuClickShowTrains,
01004 MenuClickShowRoad,
01005 MenuClickShowShips,
01006 MenuClickShowAir,
01007 MenuClickMap,
01008 NULL,
01009 MenuClickBuildRail,
01010 MenuClickBuildRoad,
01011 MenuClickBuildWater,
01012 MenuClickBuildAir,
01013 MenuClickForest,
01014 MenuClickMusicWindow,
01015 MenuClickNewspaper,
01016 MenuClickHelp,
01017 };
01018
01019 int16 *_preferred_toolbar_size = NULL;
01020
01022 class NWidgetToolbarContainer : public NWidgetContainer {
01023 bool visible[TBN_END];
01024 protected:
01025 uint spacers;
01026
01027 public:
01028 NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
01029 {
01030 }
01031
01037 bool IsButton(WidgetType type) const
01038 {
01039 return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
01040 }
01041
01042 void SetupSmallestSize(Window *w, bool init_array)
01043 {
01044 this->smallest_x = 0;
01045 this->smallest_y = 0;
01046 this->fill_x = 1;
01047 this->fill_y = 0;
01048 this->resize_x = 1;
01049 this->resize_y = 0;
01050 this->spacers = 0;
01051
01052 uint nbuttons = 0;
01053
01054 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01055 child_wid->SetupSmallestSize(w, init_array);
01056 this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
01057 if (this->IsButton(child_wid->type)) {
01058 nbuttons++;
01059 this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
01060 } else if (child_wid->type == NWID_SPACER) {
01061 this->spacers++;
01062 }
01063 }
01064
01065
01066 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01067 child_wid->current_y = this->smallest_y;
01068 if (!this->IsButton(child_wid->type)) {
01069 child_wid->current_x = child_wid->smallest_x;
01070 }
01071 }
01072 *_preferred_toolbar_size = nbuttons * this->smallest_x;
01073 }
01074
01075 void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
01076 {
01077 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
01078
01079 this->pos_x = x;
01080 this->pos_y = y;
01081 this->current_x = given_width;
01082 this->current_y = given_height;
01083
01084
01085 memset(this->visible, 0, sizeof(this->visible));
01086 uint arrangable_count, button_count, spacer_count;
01087 const byte *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
01088 for (uint i = 0; i < arrangable_count; i++) {
01089 this->visible[arrangement[i]] = true;
01090 }
01091
01092
01093 NWidgetBase *widgets[TBN_END];
01094 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01095 if (child_wid->type == NWID_SPACER) continue;
01096 widgets[((NWidgetCore*)child_wid)->index] = child_wid;
01097 }
01098
01099
01100 uint position = 0;
01101 uint spacer_space = max(0, (int)given_width - (int)(button_count * this->smallest_x));
01102 uint button_space = given_width - spacer_space;
01103 uint spacer_i = 0;
01104 uint button_i = 0;
01105
01106
01107 const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
01108 for (uint i = 0; i < arrangable_count; i++) {
01109 NWidgetBase *child_wid = widgets[*cur_wid];
01110
01111 if (spacer_space != 0) {
01112 NWidgetBase *possible_spacer = rtl ? child_wid->next : child_wid->prev;
01113 if (possible_spacer != NULL && possible_spacer->type == NWID_SPACER) {
01114 uint add = spacer_space / (spacer_count - spacer_i);
01115 position += add;
01116 spacer_space -= add;
01117 spacer_i++;
01118 }
01119 }
01120
01121
01122 if (this->IsButton(child_wid->type)) {
01123 child_wid->current_x = button_space / (button_count - button_i);
01124 button_space -= child_wid->current_x;
01125 button_i++;
01126 }
01127 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
01128 position += child_wid->current_x;
01129
01130 if (rtl) {
01131 cur_wid--;
01132 } else {
01133 cur_wid++;
01134 }
01135 }
01136 }
01137
01138 void Draw(const Window *w)
01139 {
01140
01141 GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_VERY_DARK_RED);
01142 GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_DARK_RED, FILLRECT_CHECKER);
01143
01144 bool rtl = _current_text_dir == TD_RTL;
01145 for (NWidgetBase *child_wid = rtl ? this->tail : this->head; child_wid != NULL; child_wid = rtl ? child_wid->prev : child_wid->next) {
01146 if (child_wid->type == NWID_SPACER) continue;
01147 if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
01148
01149 child_wid->Draw(w);
01150 }
01151 }
01152
01153 NWidgetCore *GetWidgetFromPos(int x, int y)
01154 {
01155 if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
01156
01157 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01158 if (child_wid->type == NWID_SPACER) continue;
01159 if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
01160
01161 NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
01162 if (nwid != NULL) return nwid;
01163 }
01164 return NULL;
01165 }
01166
01175 virtual const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
01176 };
01177
01179 class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
01180 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const
01181 {
01182 static const uint SMALLEST_ARRANGEMENT = 14;
01183 static const uint BIGGEST_ARRANGEMENT = 19;
01184 static const byte arrange14[] = {
01185 0, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
01186 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
01187 };
01188 static const byte arrange15[] = {
01189 0, 1, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01190 0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
01191 };
01192 static const byte arrange16[] = {
01193 0, 1, 2, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01194 0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
01195 };
01196 static const byte arrange17[] = {
01197 0, 1, 2, 4, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01198 0, 1, 3, 4, 6, 5, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
01199 };
01200 static const byte arrange18[] = {
01201 0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
01202 0, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
01203 };
01204 static const byte arrange19[] = {
01205 0, 1, 2, 4, 5, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
01206 0, 1, 3, 4, 7, 8, 9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
01207 };
01208 static const byte arrange_all[] = {
01209 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
01210 };
01211
01212
01213 uint full_buttons = max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
01214 if (full_buttons > BIGGEST_ARRANGEMENT) {
01215 button_count = arrangable_count = lengthof(arrange_all);
01216 spacer_count = this->spacers;
01217 return arrange_all;
01218 }
01219
01220
01221 static const byte * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
01222
01223 button_count = arrangable_count = full_buttons;
01224 spacer_count = this->spacers;
01225 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
01226 }
01227 };
01228
01230 class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
01231 uint panel_widths[2];
01232
01233 void SetupSmallestSize(Window *w, bool init_array)
01234 {
01235 this->NWidgetToolbarContainer::SetupSmallestSize(w, init_array);
01236
01237
01238 uint i = 0;
01239 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01240 if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
01241
01242 assert(i < lengthof(this->panel_widths));
01243 this->panel_widths[i++] = child_wid->current_x;
01244 *_preferred_toolbar_size += child_wid->current_x;
01245 }
01246 }
01247
01248 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const
01249 {
01250 static const byte arrange_all[] = {
01251 0, 1, 2, 3, 4, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 24, 26,
01252 };
01253 static const byte arrange_nopanel[] = {
01254 0, 1, 2, 3, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 24, 26,
01255 };
01256 static const byte arrange_switch[] = {
01257 18, 8, 11, 12, 13, 14, 15, 16, 17, 27,
01258 0, 1, 2, 3, 18, 9, 10, 24, 26, 27,
01259 };
01260
01261
01262 uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
01263 if (width >= min_full_width) {
01264 width -= this->panel_widths[0] + this->panel_widths[1];
01265 arrangable_count = lengthof(arrange_all);
01266 button_count = arrangable_count - 2;
01267 spacer_count = this->spacers;
01268 return arrange_all;
01269 }
01270
01271
01272 uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
01273 if (width > min_small_width) {
01274 width -= this->panel_widths[1];
01275 arrangable_count = lengthof(arrange_nopanel);
01276 button_count = arrangable_count - 1;
01277 spacer_count = this->spacers - 1;
01278 return arrange_nopanel;
01279 }
01280
01281
01282 width -= this->panel_widths[1];
01283 arrangable_count = lengthof(arrange_switch) / 2;
01284 button_count = arrangable_count - 1;
01285 spacer_count = 0;
01286 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
01287 }
01288 };
01289
01290
01291
01292 typedef CallBackFunction ToolbarButtonProc(Window *w);
01293
01294 static ToolbarButtonProc * const _toolbar_button_procs[] = {
01295 ToolbarPauseClick,
01296 ToolbarFastForwardClick,
01297 ToolbarOptionsClick,
01298 ToolbarSaveClick,
01299 ToolbarMapClick,
01300 ToolbarTownClick,
01301 ToolbarSubsidiesClick,
01302 ToolbarStationsClick,
01303 ToolbarFinancesClick,
01304 ToolbarCompaniesClick,
01305 ToolbarGraphsClick,
01306 ToolbarLeagueClick,
01307 ToolbarIndustryClick,
01308 ToolbarTrainClick,
01309 ToolbarRoadClick,
01310 ToolbarShipClick,
01311 ToolbarAirClick,
01312 ToolbarZoomInClick,
01313 ToolbarZoomOutClick,
01314 ToolbarBuildRailClick,
01315 ToolbarBuildRoadClick,
01316 ToolbarBuildWaterClick,
01317 ToolbarBuildAirClick,
01318 ToolbarForestClick,
01319 ToolbarMusicClick,
01320 ToolbarNewspaperClick,
01321 ToolbarHelpClick,
01322 ToolbarSwitchClick,
01323 };
01324
01325 enum MainToolbarHotkeys {
01326 MTHK_PAUSE,
01327 MTHK_FASTFORWARD,
01328 MTHK_SETTINGS,
01329 MTHK_SAVEGAME,
01330 MTHK_LOADGAME,
01331 MTHK_SMALLMAP,
01332 MTHK_TOWNDIRECTORY,
01333 MTHK_SUBSIDIES,
01334 MTHK_STATIONS,
01335 MTHK_FINANCES,
01336 MTHK_COMPANIES,
01337 MTHK_GRAPHS,
01338 MTHK_LEAGUE,
01339 MTHK_INDUSTRIES,
01340 MTHK_TRAIN_LIST,
01341 MTHK_ROADVEH_LIST,
01342 MTHK_SHIP_LIST,
01343 MTHK_AIRCRAFT_LIST,
01344 MTHK_ZOOM_IN,
01345 MTHK_ZOOM_OUT,
01346 MTHK_BUILD_RAIL,
01347 MTHK_BUILD_ROAD,
01348 MTHK_BUILD_DOCKS,
01349 MTHK_BUILD_AIRPORT,
01350 MTHK_BUILD_TREES,
01351 MTHK_MUSIC,
01352 MTHK_AI_DEBUG,
01353 MTHK_SMALL_SCREENSHOT,
01354 MTHK_ZOOMEDIN_SCREENSHOT,
01355 MTHK_GIANT_SCREENSHOT,
01356 MTHK_CHEATS,
01357 MTHK_TERRAFORM,
01358 MTHK_EXTRA_VIEWPORT,
01359 MTHK_CLIENT_LIST,
01360 MTHK_SIGN_LIST,
01361 };
01362
01364 struct MainToolbarWindow : Window {
01365 CallBackFunction last_started_action;
01366
01367 MainToolbarWindow(const WindowDesc *desc) : Window()
01368 {
01369 this->InitNested(desc, 0);
01370
01371 this->last_started_action = CBF_NONE;
01372 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01373 this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server);
01374 this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking);
01375 PositionMainToolbar(this);
01376 DoZoomInOutWindow(ZOOM_NONE, this);
01377 }
01378
01379 virtual void OnPaint()
01380 {
01381
01382
01383
01384 this->SetWidgetsDisabledState(_local_company == COMPANY_SPECTATOR, TBN_RAILS, TBN_ROADS, TBN_WATER, TBN_AIR, TBN_LANDSCAPE, WIDGET_LIST_END);
01385
01386 this->SetWidgetsDisabledState(Company::GetNumItems() == 0, TBN_STATIONS, TBN_FINANCES, TBN_TRAINS, TBN_ROADVEHS, TBN_SHIPS, TBN_AIRCRAFTS, WIDGET_LIST_END);
01387
01388 this->SetWidgetDisabledState(TBN_RAILS, !CanBuildVehicleInfrastructure(VEH_TRAIN));
01389 this->SetWidgetDisabledState(TBN_AIR, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
01390
01391 this->DrawWidgets();
01392 }
01393
01394 virtual void OnClick(Point pt, int widget, int click_count)
01395 {
01396 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
01397 }
01398
01399 virtual void OnDropdownSelect(int widget, int index)
01400 {
01401 CallBackFunction cbf = _menu_clicked_procs[widget](index);
01402 if (cbf != CBF_NONE) this->last_started_action = cbf;
01403 }
01404
01405 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01406 {
01407 switch (CheckHotkeyMatch(maintoolbar_hotkeys, keycode, this)) {
01408 case MTHK_PAUSE: ToolbarPauseClick(this); break;
01409 case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
01410 case MTHK_SETTINGS: ShowGameOptions(); break;
01411 case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
01412 case MTHK_LOADGAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
01413 case MTHK_SMALLMAP: ShowSmallMap(); break;
01414 case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
01415 case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
01416 case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
01417 case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
01418 case MTHK_COMPANIES: ShowCompany(_local_company); break;
01419 case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
01420 case MTHK_LEAGUE: ShowCompanyLeagueTable(); break;
01421 case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
01422 case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
01423 case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
01424 case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
01425 case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
01426 case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
01427 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
01428 case MTHK_BUILD_RAIL: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype); break;
01429 case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
01430 case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
01431 case MTHK_BUILD_AIRPORT: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
01432 case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
01433 case MTHK_MUSIC: ShowMusicWindow(); break;
01434 case MTHK_AI_DEBUG: ShowAIDebugWindow(); break;
01435 case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break;
01436 case MTHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
01437 case MTHK_GIANT_SCREENSHOT: MenuClickWorldScreenshot(); break;
01438 case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
01439 case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
01440 case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break;
01441 #ifdef ENABLE_NETWORK
01442 case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
01443 #endif
01444 case MTHK_SIGN_LIST: ShowSignList(); break;
01445 default: return ES_NOT_HANDLED;
01446 }
01447 return ES_HANDLED;
01448 }
01449
01450 virtual void OnPlaceObject(Point pt, TileIndex tile)
01451 {
01452 switch (this->last_started_action) {
01453 case CBF_PLACE_SIGN:
01454 PlaceProc_Sign(tile);
01455 break;
01456
01457 case CBF_PLACE_LANDINFO:
01458 ShowLandInfo(tile);
01459 break;
01460
01461 default: NOT_REACHED();
01462 }
01463 }
01464
01465 virtual void OnTick()
01466 {
01467 if (this->IsWidgetLowered(TBN_PAUSE) != !!_pause_mode) {
01468 this->ToggleWidgetLoweredState(TBN_PAUSE);
01469 this->SetWidgetDirty(TBN_PAUSE);
01470 }
01471
01472 if (this->IsWidgetLowered(TBN_FASTFORWARD) != !!_fast_forward) {
01473 this->ToggleWidgetLoweredState(TBN_FASTFORWARD);
01474 this->SetWidgetDirty(TBN_FASTFORWARD);
01475 }
01476 }
01477
01478 virtual void OnTimeout()
01479 {
01480
01481
01482 for (uint i = TBN_SETTINGS; i < TBN_SWITCHBAR; i++) {
01483 if (this->IsWidgetLowered(i)) {
01484 this->RaiseWidget(i);
01485 this->SetWidgetDirty(i);
01486 }
01487 }
01488 }
01489
01495 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01496 {
01497 if (!gui_scope) return;
01498 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBN_ZOOMIN, TBN_ZOOMOUT);
01499 }
01500
01501 static Hotkey<MainToolbarWindow> maintoolbar_hotkeys[];
01502 };
01503
01504 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
01505 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
01506 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
01507 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4, 'M', 0};
01508
01509 Hotkey<MainToolbarWindow> MainToolbarWindow::maintoolbar_hotkeys[] = {
01510 Hotkey<MainToolbarWindow>(_maintoolbar_pause_keys, "pause", MTHK_PAUSE),
01511 Hotkey<MainToolbarWindow>((uint16)0, "fastforward", MTHK_FASTFORWARD),
01512 Hotkey<MainToolbarWindow>(WKC_F2, "settings", MTHK_SETTINGS),
01513 Hotkey<MainToolbarWindow>(WKC_F3, "saveload", MTHK_SAVEGAME),
01514 Hotkey<MainToolbarWindow>((uint16)0, "load_game", MTHK_LOADGAME),
01515 Hotkey<MainToolbarWindow>(_maintoolbar_smallmap_keys, "smallmap", MTHK_SMALLMAP),
01516 Hotkey<MainToolbarWindow>(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
01517 Hotkey<MainToolbarWindow>(WKC_F6, "subsidies", MTHK_SUBSIDIES),
01518 Hotkey<MainToolbarWindow>(WKC_F7, "station_list", MTHK_STATIONS),
01519 Hotkey<MainToolbarWindow>(WKC_F8, "finances", MTHK_FINANCES),
01520 Hotkey<MainToolbarWindow>(WKC_F9, "companies", MTHK_COMPANIES),
01521 Hotkey<MainToolbarWindow>(WKC_F10, "graphs", MTHK_GRAPHS),
01522 Hotkey<MainToolbarWindow>(WKC_F11, "league", MTHK_LEAGUE),
01523 Hotkey<MainToolbarWindow>(WKC_F12, "industry_list", MTHK_INDUSTRIES),
01524 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
01525 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
01526 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
01527 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
01528 Hotkey<MainToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTHK_ZOOM_IN),
01529 Hotkey<MainToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTHK_ZOOM_OUT),
01530 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
01531 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
01532 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
01533 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
01534 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
01535 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
01536 Hotkey<MainToolbarWindow>((uint16)0, "ai_debug", MTHK_AI_DEBUG),
01537 Hotkey<MainToolbarWindow>(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
01538 Hotkey<MainToolbarWindow>(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
01539 Hotkey<MainToolbarWindow>((uint16)0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
01540 Hotkey<MainToolbarWindow>(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
01541 Hotkey<MainToolbarWindow>('L', "terraform", MTHK_TERRAFORM),
01542 Hotkey<MainToolbarWindow>('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
01543 #ifdef ENABLE_NETWORK
01544 Hotkey<MainToolbarWindow>((uint16)0, "client_list", MTHK_CLIENT_LIST),
01545 #endif
01546 Hotkey<MainToolbarWindow>((uint16)0, "sign_list", MTHK_SIGN_LIST),
01547 HOTKEY_LIST_END(MainToolbarWindow)
01548 };
01549 Hotkey<MainToolbarWindow> *_maintoolbar_hotkeys = MainToolbarWindow::maintoolbar_hotkeys;
01550
01551 static NWidgetBase *MakeMainToolbar(int *biggest_index)
01552 {
01554 static const SpriteID toolbar_button_sprites[] = {
01555 SPR_IMG_PAUSE,
01556 SPR_IMG_FASTFORWARD,
01557 SPR_IMG_SETTINGS,
01558 SPR_IMG_SAVE,
01559 SPR_IMG_SMALLMAP,
01560 SPR_IMG_TOWN,
01561 SPR_IMG_SUBSIDIES,
01562 SPR_IMG_COMPANY_LIST,
01563 SPR_IMG_COMPANY_FINANCE,
01564 SPR_IMG_COMPANY_GENERAL,
01565 SPR_IMG_GRAPHS,
01566 SPR_IMG_COMPANY_LEAGUE,
01567 SPR_IMG_INDUSTRY,
01568 SPR_IMG_TRAINLIST,
01569 SPR_IMG_TRUCKLIST,
01570 SPR_IMG_SHIPLIST,
01571 SPR_IMG_AIRPLANESLIST,
01572 SPR_IMG_ZOOMIN,
01573 SPR_IMG_ZOOMOUT,
01574 SPR_IMG_BUILDRAIL,
01575 SPR_IMG_BUILDROAD,
01576 SPR_IMG_BUILDWATER,
01577 SPR_IMG_BUILDAIR,
01578 SPR_IMG_LANDSCAPING,
01579 SPR_IMG_MUSIC,
01580 SPR_IMG_MESSAGES,
01581 SPR_IMG_QUERY,
01582 SPR_IMG_SWITCH_TOOLBAR,
01583 };
01584
01585 NWidgetMainToolbarContainer *hor = new NWidgetMainToolbarContainer();
01586 for (uint i = 0; i < TBN_END; i++) {
01587 switch (i) {
01588 case 4: case 8: case 13: case 17: case 19: case 24: hor->Add(new NWidgetSpacer(0, 0)); break;
01589 }
01590 hor->Add(new NWidgetLeaf(i == TBN_SAVEGAME ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i));
01591 }
01592
01593 *biggest_index = max<int>(*biggest_index, TBN_SWITCHBAR);
01594 return hor;
01595 }
01596
01597 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
01598 NWidgetFunction(MakeMainToolbar),
01599 };
01600
01601 static WindowDesc _toolb_normal_desc(
01602 WDP_MANUAL, 640, 22,
01603 WC_MAIN_TOOLBAR, WC_NONE,
01604 WDF_NO_FOCUS,
01605 _nested_toolbar_normal_widgets, lengthof(_nested_toolbar_normal_widgets)
01606 );
01607
01608
01609
01610
01611 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
01612 ToolbarPauseClick,
01613 ToolbarFastForwardClick,
01614 ToolbarOptionsClick,
01615 ToolbarScenSaveOrLoad,
01616 ToolbarBtn_NULL,
01617 ToolbarScenDatePanel,
01618 ToolbarScenDateBackward,
01619 ToolbarScenDateForward,
01620 ToolbarScenMapTownDir,
01621 ToolbarZoomInClick,
01622 ToolbarZoomOutClick,
01623 ToolbarScenGenLand,
01624 ToolbarScenGenTown,
01625 ToolbarScenGenIndustry,
01626 ToolbarScenBuildRoad,
01627 ToolbarScenBuildDocks,
01628 ToolbarScenPlantTrees,
01629 ToolbarScenPlaceSign,
01630 ToolbarBtn_NULL,
01631 NULL,
01632 NULL,
01633 NULL,
01634 NULL,
01635 NULL,
01636 ToolbarMusicClick,
01637 NULL,
01638 ToolbarHelpClick,
01639 ToolbarSwitchClick,
01640 };
01641
01642 enum MainToolbarEditorHotkeys {
01643 MTEHK_PAUSE,
01644 MTEHK_FASTFORWARD,
01645 MTEHK_SETTINGS,
01646 MTEHK_SAVEGAME,
01647 MTEHK_GENLAND,
01648 MTEHK_GENTOWN,
01649 MTEHK_GENINDUSTRY,
01650 MTEHK_BUILD_ROAD,
01651 MTEHK_BUILD_DOCKS,
01652 MTEHK_BUILD_TREES,
01653 MTEHK_SIGN,
01654 MTEHK_MUSIC,
01655 MTEHK_LANDINFO,
01656 MTEHK_SMALL_SCREENSHOT,
01657 MTEHK_ZOOMEDIN_SCREENSHOT,
01658 MTEHK_GIANT_SCREENSHOT,
01659 MTEHK_ZOOM_IN,
01660 MTEHK_ZOOM_OUT,
01661 MTEHK_TERRAFORM,
01662 MTEHK_SMALLMAP,
01663 MTEHK_EXTRA_VIEWPORT,
01664 };
01665
01666 struct ScenarioEditorToolbarWindow : Window {
01667 CallBackFunction last_started_action;
01668
01669 ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window()
01670 {
01671 this->InitNested(desc, 0);
01672
01673 this->last_started_action = CBF_NONE;
01674 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01675 PositionMainToolbar(this);
01676 DoZoomInOutWindow(ZOOM_NONE, this);
01677 }
01678
01679 virtual void OnPaint()
01680 {
01681 this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
01682 this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
01683
01684 this->DrawWidgets();
01685 }
01686
01687 virtual void DrawWidget(const Rect &r, int widget) const
01688 {
01689 switch (widget) {
01690 case TBSE_DATEPANEL:
01691 SetDParam(0, ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
01692 DrawString(r.left, r.right, (this->height - FONT_HEIGHT_NORMAL) / 2, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER);
01693 break;
01694
01695 case TBSE_SPACERPANEL: {
01696 int height = r.bottom - r.top;
01697 if (height > 2 * FONT_HEIGHT_NORMAL) {
01698 DrawString(r.left, r.right, (height + 1) / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
01699 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01700 } else {
01701 DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01702 }
01703 break;
01704 }
01705 }
01706 }
01707
01708 virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
01709 {
01710 switch (widget) {
01711 case TBSE_SPACERPANEL:
01712 size->width = max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
01713 break;
01714
01715 case TBSE_DATEPANEL:
01716 SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1));
01717 *size = GetStringBoundingBox(STR_WHITE_DATE_LONG);
01718 size->height = max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
01719 break;
01720 }
01721 }
01722
01723 virtual void OnClick(Point pt, int widget, int click_count)
01724 {
01725 if (_game_mode == GM_MENU) return;
01726 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
01727 if (cbf != CBF_NONE) this->last_started_action = cbf;
01728 }
01729
01730 virtual void OnDropdownSelect(int widget, int index)
01731 {
01732
01733
01734 if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP;
01735 CallBackFunction cbf = _menu_clicked_procs[widget](index);
01736 if (cbf != CBF_NONE) this->last_started_action = cbf;
01737 SndPlayFx(SND_15_BEEP);
01738 }
01739
01740 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01741 {
01742 CallBackFunction cbf = CBF_NONE;
01743 switch (CheckHotkeyMatch(scenedit_maintoolbar_hotkeys, keycode, this)) {
01744 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
01745 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
01746 case MTEHK_SETTINGS: ShowGameOptions(); break;
01747 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
01748 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
01749 case MTEHK_GENTOWN: ToolbarScenGenTown(this); break;
01750 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
01751 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoad(this); break;
01752 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
01753 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
01754 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
01755 case MTEHK_MUSIC: ShowMusicWindow(); break;
01756 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
01757 case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break;
01758 case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
01759 case MTEHK_GIANT_SCREENSHOT: MenuClickWorldScreenshot(); break;
01760 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
01761 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
01762 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
01763 case MTEHK_SMALLMAP: ShowSmallMap(); break;
01764 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break;
01765 default: return ES_NOT_HANDLED;
01766 }
01767 if (cbf != CBF_NONE) this->last_started_action = cbf;
01768 return ES_HANDLED;
01769 }
01770
01771 virtual void OnPlaceObject(Point pt, TileIndex tile)
01772 {
01773 switch (this->last_started_action) {
01774 case CBF_PLACE_SIGN:
01775 PlaceProc_Sign(tile);
01776 break;
01777
01778 case CBF_PLACE_LANDINFO:
01779 ShowLandInfo(tile);
01780 break;
01781
01782 default: NOT_REACHED();
01783 }
01784 }
01785
01786 virtual void OnTimeout()
01787 {
01788 this->SetWidgetsLoweredState(false, TBSE_DATEBACKWARD, TBSE_DATEFORWARD, WIDGET_LIST_END);
01789 this->SetWidgetDirty(TBSE_DATEBACKWARD);
01790 this->SetWidgetDirty(TBSE_DATEFORWARD);
01791 }
01792
01793 virtual void OnTick()
01794 {
01795 if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_mode) {
01796 this->ToggleWidgetLoweredState(TBSE_PAUSE);
01797 this->SetDirty();
01798 }
01799
01800 if (this->IsWidgetLowered(TBSE_FASTFORWARD) != !!_fast_forward) {
01801 this->ToggleWidgetLoweredState(TBSE_FASTFORWARD);
01802 this->SetDirty();
01803 }
01804 }
01805
01811 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01812 {
01813 if (!gui_scope) return;
01814 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBSE_ZOOMIN, TBSE_ZOOMOUT);
01815 }
01816
01817 virtual void OnQueryTextFinished(char *str)
01818 {
01819
01820 if (str == NULL) return;
01821
01822 int32 value;
01823 if (!StrEmpty(str)) {
01824 value = atoi(str);
01825 } else {
01826
01827 value = DEF_START_YEAR;
01828 }
01829 _settings_game.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
01830 SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
01831
01832 this->SetDirty();
01833 }
01834
01835 static Hotkey<ScenarioEditorToolbarWindow> scenedit_maintoolbar_hotkeys[];
01836 };
01837
01838 Hotkey<ScenarioEditorToolbarWindow> ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys[] = {
01839 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_pause_keys, "pause", MTEHK_PAUSE),
01840 Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "fastforward", MTEHK_FASTFORWARD),
01841 Hotkey<ScenarioEditorToolbarWindow>(WKC_F2, "settings", MTEHK_SETTINGS),
01842 Hotkey<ScenarioEditorToolbarWindow>(WKC_F3, "saveload", MTEHK_SAVEGAME),
01843 Hotkey<ScenarioEditorToolbarWindow>(WKC_F4, "gen_land", MTEHK_GENLAND),
01844 Hotkey<ScenarioEditorToolbarWindow>(WKC_F5, "gen_town", MTEHK_GENTOWN),
01845 Hotkey<ScenarioEditorToolbarWindow>(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
01846 Hotkey<ScenarioEditorToolbarWindow>(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
01847 Hotkey<ScenarioEditorToolbarWindow>(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
01848 Hotkey<ScenarioEditorToolbarWindow>(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
01849 Hotkey<ScenarioEditorToolbarWindow>(WKC_F10, "build_sign", MTEHK_SIGN),
01850 Hotkey<ScenarioEditorToolbarWindow>(WKC_F11, "music", MTEHK_MUSIC),
01851 Hotkey<ScenarioEditorToolbarWindow>(WKC_F12, "land_info", MTEHK_LANDINFO),
01852 Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
01853 Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
01854 Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
01855 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTEHK_ZOOM_IN),
01856 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTEHK_ZOOM_OUT),
01857 Hotkey<ScenarioEditorToolbarWindow>('L', "terraform", MTEHK_TERRAFORM),
01858 Hotkey<ScenarioEditorToolbarWindow>('M', "smallmap", MTEHK_SMALLMAP),
01859 Hotkey<ScenarioEditorToolbarWindow>('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
01860 HOTKEY_LIST_END(ScenarioEditorToolbarWindow)
01861 };
01862 Hotkey<ScenarioEditorToolbarWindow> *_scenedit_maintoolbar_hotkeys = ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys;
01863
01864 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
01865 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
01866 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_FASTFORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
01867 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
01868 NWidget(WWT_IMGBTN_2, COLOUR_GREY, TBSE_SAVESCENARIO), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
01869 NWidget(NWID_SPACER),
01870 NWidget(WWT_PANEL, COLOUR_GREY, TBSE_SPACERPANEL), EndContainer(),
01871 NWidget(NWID_SPACER),
01872 NWidget(WWT_PANEL, COLOUR_GREY, TBSE_DATEPANEL_CONTAINER),
01873 NWidget(NWID_HORIZONTAL), SetPIP(3, 2, 3),
01874 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEBACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD),
01875 NWidget(WWT_EMPTY, COLOUR_GREY, TBSE_DATEPANEL), SetDataTip(STR_NULL, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE),
01876 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEFORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD),
01877 EndContainer(),
01878 EndContainer(),
01879 NWidget(NWID_SPACER),
01880 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SMALLMAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
01881 NWidget(NWID_SPACER),
01882 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMIN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
01883 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMOUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
01884 NWidget(NWID_SPACER),
01885 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_LANDGENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
01886 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_TOWNGENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
01887 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_INDUSTRYGENERATE), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
01888 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDROAD), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
01889 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDDOCKS), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
01890 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLANTTREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
01891 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLACESIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
01892 NWidget(NWID_SPACER),
01893 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_MUSICSOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
01894 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
01895 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_SWITCHBAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
01896 };
01897
01898 static NWidgetBase *MakeScenarioToolbar(int *biggest_index)
01899 {
01900 return MakeNWidgets(_nested_toolb_scen_inner_widgets, lengthof(_nested_toolb_scen_inner_widgets), biggest_index, new NWidgetScenarioToolbarContainer());
01901 }
01902
01903 static const NWidgetPart _nested_toolb_scen_widgets[] = {
01904 NWidgetFunction(MakeScenarioToolbar),
01905 };
01906
01907 static WindowDesc _toolb_scen_desc(
01908 WDP_MANUAL, 640, 22,
01909 WC_MAIN_TOOLBAR, WC_NONE,
01910 WDF_UNCLICK_BUTTONS | WDF_NO_FOCUS,
01911 _nested_toolb_scen_widgets, lengthof(_nested_toolb_scen_widgets)
01912 );
01913
01915 void AllocateToolbar()
01916 {
01917
01918 _last_built_roadtype = ROADTYPE_ROAD;
01919
01920 if (_game_mode == GM_EDITOR) {
01921 _preferred_toolbar_size = &_toolb_scen_desc.default_width;
01922 new ScenarioEditorToolbarWindow(&_toolb_scen_desc);
01923 } else {
01924 _preferred_toolbar_size = &_toolb_normal_desc.default_width;
01925 new MainToolbarWindow(&_toolb_normal_desc);
01926 }
01927 }