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