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_LOAD_HEIGHTMAP,
00360 SLEME_EXIT_TOINTRO,
00361 SLEME_EXIT_GAME = 5,
00362 SLEME_MENUCOUNT,
00363 };
00364
00365 enum SaveLoadNormalMenuEntries {
00366 SLNME_SAVE_GAME = 0,
00367 SLNME_LOAD_GAME,
00368 SLNME_EXIT_TOINTRO,
00369 SLNME_EXIT_GAME,
00370 SLNME_MENUCOUNT,
00371 };
00372
00373 static CallBackFunction ToolbarSaveClick(Window *w)
00374 {
00375 PopupMainToolbMenu(w, TBN_SAVEGAME, STR_FILE_MENU_SAVE_GAME, SLNME_MENUCOUNT);
00376 return CBF_NONE;
00377 }
00378
00379 static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
00380 {
00381 PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, SLEME_MENUCOUNT);
00382 return CBF_NONE;
00383 }
00384
00385 static CallBackFunction MenuClickSaveLoad(int index = 0)
00386 {
00387 if (_game_mode == GM_EDITOR) {
00388 switch (index) {
00389 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break;
00390 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
00391 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
00392 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00393 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
00394 }
00395 } else {
00396 switch (index) {
00397 case SLNME_SAVE_GAME: ShowSaveLoadDialog(SLD_SAVE_GAME); break;
00398 case SLNME_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
00399 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00400 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
00401 }
00402 }
00403 return CBF_NONE;
00404 }
00405
00406
00407
00408 enum MapMenuEntries {
00409 MME_SHOW_SMALLMAP = 0,
00410 MME_SHOW_EXTRAVIEWPORTS,
00411 MME_SHOW_LINKGRAPH,
00412 MME_SHOW_SIGNLISTS,
00413 MME_SHOW_TOWNDIRECTORY,
00414 MME_MENUCOUNT_NORMAL = 4,
00415 MME_MENUCOUNT_EDITOR = 5,
00416 };
00417
00418 static CallBackFunction ToolbarMapClick(Window *w)
00419 {
00420 PopupMainToolbMenu(w, TBN_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_NORMAL);
00421 return CBF_NONE;
00422 }
00423
00424 static CallBackFunction ToolbarScenMapTownDir(Window *w)
00425 {
00426 PopupMainToolbMenu(w, TBSE_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_EDITOR);
00427 return CBF_NONE;
00428 }
00429
00430 static CallBackFunction MenuClickMap(int index)
00431 {
00432 switch (index) {
00433 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
00434 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewPortWindow(); break;
00435 case MME_SHOW_LINKGRAPH: ShowLinkGraphLegend(); 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, 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, PC_VERY_DARK_RED);
01140 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);
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
01493 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01494 {
01495 if (!gui_scope) return;
01496 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBN_ZOOMIN, TBN_ZOOMOUT);
01497 }
01498
01499 static Hotkey<MainToolbarWindow> maintoolbar_hotkeys[];
01500 };
01501
01502 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
01503 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
01504 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
01505 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4, 'M', 0};
01506
01507 Hotkey<MainToolbarWindow> MainToolbarWindow::maintoolbar_hotkeys[] = {
01508 Hotkey<MainToolbarWindow>(_maintoolbar_pause_keys, "pause", MTHK_PAUSE),
01509 Hotkey<MainToolbarWindow>((uint16)0, "fastforward", MTHK_FASTFORWARD),
01510 Hotkey<MainToolbarWindow>(WKC_F2, "settings", MTHK_SETTINGS),
01511 Hotkey<MainToolbarWindow>(WKC_F3, "saveload", MTHK_SAVEGAME),
01512 Hotkey<MainToolbarWindow>((uint16)0, "load_game", MTHK_LOADGAME),
01513 Hotkey<MainToolbarWindow>(_maintoolbar_smallmap_keys, "smallmap", MTHK_SMALLMAP),
01514 Hotkey<MainToolbarWindow>(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
01515 Hotkey<MainToolbarWindow>(WKC_F6, "subsidies", MTHK_SUBSIDIES),
01516 Hotkey<MainToolbarWindow>(WKC_F7, "station_list", MTHK_STATIONS),
01517 Hotkey<MainToolbarWindow>(WKC_F8, "finances", MTHK_FINANCES),
01518 Hotkey<MainToolbarWindow>(WKC_F9, "companies", MTHK_COMPANIES),
01519 Hotkey<MainToolbarWindow>(WKC_F10, "graphs", MTHK_GRAPHS),
01520 Hotkey<MainToolbarWindow>(WKC_F11, "league", MTHK_LEAGUE),
01521 Hotkey<MainToolbarWindow>(WKC_F12, "industry_list", MTHK_INDUSTRIES),
01522 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
01523 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
01524 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
01525 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
01526 Hotkey<MainToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTHK_ZOOM_IN),
01527 Hotkey<MainToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTHK_ZOOM_OUT),
01528 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
01529 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
01530 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
01531 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
01532 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
01533 Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
01534 Hotkey<MainToolbarWindow>((uint16)0, "ai_debug", MTHK_AI_DEBUG),
01535 Hotkey<MainToolbarWindow>(WKC_CTRL | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
01536 Hotkey<MainToolbarWindow>(WKC_CTRL | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
01537 Hotkey<MainToolbarWindow>((uint16)0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
01538 Hotkey<MainToolbarWindow>(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
01539 Hotkey<MainToolbarWindow>('L', "terraform", MTHK_TERRAFORM),
01540 Hotkey<MainToolbarWindow>('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
01541 #ifdef ENABLE_NETWORK
01542 Hotkey<MainToolbarWindow>((uint16)0, "client_list", MTHK_CLIENT_LIST),
01543 #endif
01544 Hotkey<MainToolbarWindow>((uint16)0, "sign_list", MTHK_SIGN_LIST),
01545 HOTKEY_LIST_END(MainToolbarWindow)
01546 };
01547 Hotkey<MainToolbarWindow> *_maintoolbar_hotkeys = MainToolbarWindow::maintoolbar_hotkeys;
01548
01549 static NWidgetBase *MakeMainToolbar(int *biggest_index)
01550 {
01552 static const SpriteID toolbar_button_sprites[] = {
01553 SPR_IMG_PAUSE,
01554 SPR_IMG_FASTFORWARD,
01555 SPR_IMG_SETTINGS,
01556 SPR_IMG_SAVE,
01557 SPR_IMG_SMALLMAP,
01558 SPR_IMG_TOWN,
01559 SPR_IMG_SUBSIDIES,
01560 SPR_IMG_COMPANY_LIST,
01561 SPR_IMG_COMPANY_FINANCE,
01562 SPR_IMG_COMPANY_GENERAL,
01563 SPR_IMG_GRAPHS,
01564 SPR_IMG_COMPANY_LEAGUE,
01565 SPR_IMG_INDUSTRY,
01566 SPR_IMG_TRAINLIST,
01567 SPR_IMG_TRUCKLIST,
01568 SPR_IMG_SHIPLIST,
01569 SPR_IMG_AIRPLANESLIST,
01570 SPR_IMG_ZOOMIN,
01571 SPR_IMG_ZOOMOUT,
01572 SPR_IMG_BUILDRAIL,
01573 SPR_IMG_BUILDROAD,
01574 SPR_IMG_BUILDWATER,
01575 SPR_IMG_BUILDAIR,
01576 SPR_IMG_LANDSCAPING,
01577 SPR_IMG_MUSIC,
01578 SPR_IMG_MESSAGES,
01579 SPR_IMG_QUERY,
01580 SPR_IMG_SWITCH_TOOLBAR,
01581 };
01582
01583 NWidgetMainToolbarContainer *hor = new NWidgetMainToolbarContainer();
01584 for (uint i = 0; i < TBN_END; i++) {
01585 switch (i) {
01586 case 4: case 8: case 13: case 17: case 19: case 24: hor->Add(new NWidgetSpacer(0, 0)); break;
01587 }
01588 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));
01589 }
01590
01591 *biggest_index = max<int>(*biggest_index, TBN_SWITCHBAR);
01592 return hor;
01593 }
01594
01595 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
01596 NWidgetFunction(MakeMainToolbar),
01597 };
01598
01599 static WindowDesc _toolb_normal_desc(
01600 WDP_MANUAL, 640, 22,
01601 WC_MAIN_TOOLBAR, WC_NONE,
01602 WDF_NO_FOCUS,
01603 _nested_toolbar_normal_widgets, lengthof(_nested_toolbar_normal_widgets)
01604 );
01605
01606
01607
01608
01609 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
01610 ToolbarPauseClick,
01611 ToolbarFastForwardClick,
01612 ToolbarOptionsClick,
01613 ToolbarScenSaveOrLoad,
01614 ToolbarBtn_NULL,
01615 ToolbarScenDatePanel,
01616 ToolbarScenDateBackward,
01617 ToolbarScenDateForward,
01618 ToolbarScenMapTownDir,
01619 ToolbarZoomInClick,
01620 ToolbarZoomOutClick,
01621 ToolbarScenGenLand,
01622 ToolbarScenGenTown,
01623 ToolbarScenGenIndustry,
01624 ToolbarScenBuildRoad,
01625 ToolbarScenBuildDocks,
01626 ToolbarScenPlantTrees,
01627 ToolbarScenPlaceSign,
01628 ToolbarBtn_NULL,
01629 NULL,
01630 NULL,
01631 NULL,
01632 NULL,
01633 NULL,
01634 ToolbarMusicClick,
01635 NULL,
01636 ToolbarHelpClick,
01637 ToolbarSwitchClick,
01638 };
01639
01640 enum MainToolbarEditorHotkeys {
01641 MTEHK_PAUSE,
01642 MTEHK_FASTFORWARD,
01643 MTEHK_SETTINGS,
01644 MTEHK_SAVEGAME,
01645 MTEHK_GENLAND,
01646 MTEHK_GENTOWN,
01647 MTEHK_GENINDUSTRY,
01648 MTEHK_BUILD_ROAD,
01649 MTEHK_BUILD_DOCKS,
01650 MTEHK_BUILD_TREES,
01651 MTEHK_SIGN,
01652 MTEHK_MUSIC,
01653 MTEHK_LANDINFO,
01654 MTEHK_SMALL_SCREENSHOT,
01655 MTEHK_ZOOMEDIN_SCREENSHOT,
01656 MTEHK_GIANT_SCREENSHOT,
01657 MTEHK_ZOOM_IN,
01658 MTEHK_ZOOM_OUT,
01659 MTEHK_TERRAFORM,
01660 MTEHK_SMALLMAP,
01661 MTEHK_EXTRA_VIEWPORT,
01662 };
01663
01664 struct ScenarioEditorToolbarWindow : Window {
01665 CallBackFunction last_started_action;
01666
01667 ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window()
01668 {
01669 this->InitNested(desc, 0);
01670
01671 this->last_started_action = CBF_NONE;
01672 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01673 PositionMainToolbar(this);
01674 DoZoomInOutWindow(ZOOM_NONE, this);
01675 }
01676
01677 virtual void OnPaint()
01678 {
01679 this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
01680 this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
01681
01682 this->DrawWidgets();
01683 }
01684
01685 virtual void DrawWidget(const Rect &r, int widget) const
01686 {
01687 switch (widget) {
01688 case TBSE_DATEPANEL:
01689 SetDParam(0, ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
01690 DrawString(r.left, r.right, (this->height - FONT_HEIGHT_NORMAL) / 2, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER);
01691 break;
01692
01693 case TBSE_SPACERPANEL: {
01694 int height = r.bottom - r.top;
01695 if (height > 2 * FONT_HEIGHT_NORMAL) {
01696 DrawString(r.left, r.right, (height + 1) / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
01697 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01698 } else {
01699 DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01700 }
01701 break;
01702 }
01703 }
01704 }
01705
01706 virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
01707 {
01708 switch (widget) {
01709 case TBSE_SPACERPANEL:
01710 size->width = max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
01711 break;
01712
01713 case TBSE_DATEPANEL:
01714 SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1));
01715 *size = GetStringBoundingBox(STR_WHITE_DATE_LONG);
01716 size->height = max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
01717 break;
01718 }
01719 }
01720
01721 virtual void OnClick(Point pt, int widget, int click_count)
01722 {
01723 if (_game_mode == GM_MENU) return;
01724 CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
01725 if (cbf != CBF_NONE) this->last_started_action = cbf;
01726 }
01727
01728 virtual void OnDropdownSelect(int widget, int index)
01729 {
01730
01731
01732 if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP;
01733 CallBackFunction cbf = _menu_clicked_procs[widget](index);
01734 if (cbf != CBF_NONE) this->last_started_action = cbf;
01735 SndPlayFx(SND_15_BEEP);
01736 }
01737
01738 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01739 {
01740 CallBackFunction cbf = CBF_NONE;
01741 switch (CheckHotkeyMatch(scenedit_maintoolbar_hotkeys, keycode, this)) {
01742 case MTEHK_PAUSE: ToolbarPauseClick(this); break;
01743 case MTEHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
01744 case MTEHK_SETTINGS: ShowGameOptions(); break;
01745 case MTEHK_SAVEGAME: MenuClickSaveLoad(); break;
01746 case MTEHK_GENLAND: ToolbarScenGenLand(this); break;
01747 case MTEHK_GENTOWN: ToolbarScenGenTown(this); break;
01748 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(this); break;
01749 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoad(this); break;
01750 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
01751 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
01752 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
01753 case MTEHK_MUSIC: ShowMusicWindow(); break;
01754 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
01755 case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break;
01756 case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
01757 case MTEHK_GIANT_SCREENSHOT: MenuClickWorldScreenshot(); break;
01758 case MTEHK_ZOOM_IN: ToolbarZoomInClick(this); break;
01759 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
01760 case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break;
01761 case MTEHK_SMALLMAP: ShowSmallMap(); break;
01762 case MTEHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break;
01763 default: return ES_NOT_HANDLED;
01764 }
01765 if (cbf != CBF_NONE) this->last_started_action = cbf;
01766 return ES_HANDLED;
01767 }
01768
01769 virtual void OnPlaceObject(Point pt, TileIndex tile)
01770 {
01771 switch (this->last_started_action) {
01772 case CBF_PLACE_SIGN:
01773 PlaceProc_Sign(tile);
01774 break;
01775
01776 case CBF_PLACE_LANDINFO:
01777 ShowLandInfo(tile);
01778 break;
01779
01780 default: NOT_REACHED();
01781 }
01782 }
01783
01784 virtual void OnTimeout()
01785 {
01786 this->SetWidgetsLoweredState(false, TBSE_DATEBACKWARD, TBSE_DATEFORWARD, WIDGET_LIST_END);
01787 this->SetWidgetDirty(TBSE_DATEBACKWARD);
01788 this->SetWidgetDirty(TBSE_DATEFORWARD);
01789 }
01790
01791 virtual void OnTick()
01792 {
01793 if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_mode) {
01794 this->ToggleWidgetLoweredState(TBSE_PAUSE);
01795 this->SetDirty();
01796 }
01797
01798 if (this->IsWidgetLowered(TBSE_FASTFORWARD) != !!_fast_forward) {
01799 this->ToggleWidgetLoweredState(TBSE_FASTFORWARD);
01800 this->SetDirty();
01801 }
01802 }
01803
01809 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01810 {
01811 if (!gui_scope) return;
01812 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBSE_ZOOMIN, TBSE_ZOOMOUT);
01813 }
01814
01815 virtual void OnQueryTextFinished(char *str)
01816 {
01817
01818 if (str == NULL) return;
01819
01820 int32 value;
01821 if (!StrEmpty(str)) {
01822 value = atoi(str);
01823 } else {
01824
01825 value = DEF_START_YEAR;
01826 }
01827 _settings_game.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
01828 SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
01829
01830 this->SetDirty();
01831 }
01832
01833 static Hotkey<ScenarioEditorToolbarWindow> scenedit_maintoolbar_hotkeys[];
01834 };
01835
01836 Hotkey<ScenarioEditorToolbarWindow> ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys[] = {
01837 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_pause_keys, "pause", MTEHK_PAUSE),
01838 Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "fastforward", MTEHK_FASTFORWARD),
01839 Hotkey<ScenarioEditorToolbarWindow>(WKC_F2, "settings", MTEHK_SETTINGS),
01840 Hotkey<ScenarioEditorToolbarWindow>(WKC_F3, "saveload", MTEHK_SAVEGAME),
01841 Hotkey<ScenarioEditorToolbarWindow>(WKC_F4, "gen_land", MTEHK_GENLAND),
01842 Hotkey<ScenarioEditorToolbarWindow>(WKC_F5, "gen_town", MTEHK_GENTOWN),
01843 Hotkey<ScenarioEditorToolbarWindow>(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
01844 Hotkey<ScenarioEditorToolbarWindow>(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
01845 Hotkey<ScenarioEditorToolbarWindow>(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
01846 Hotkey<ScenarioEditorToolbarWindow>(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
01847 Hotkey<ScenarioEditorToolbarWindow>(WKC_F10, "build_sign", MTEHK_SIGN),
01848 Hotkey<ScenarioEditorToolbarWindow>(WKC_F11, "music", MTEHK_MUSIC),
01849 Hotkey<ScenarioEditorToolbarWindow>(WKC_F12, "land_info", MTEHK_LANDINFO),
01850 Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
01851 Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
01852 Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
01853 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTEHK_ZOOM_IN),
01854 Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTEHK_ZOOM_OUT),
01855 Hotkey<ScenarioEditorToolbarWindow>('L', "terraform", MTEHK_TERRAFORM),
01856 Hotkey<ScenarioEditorToolbarWindow>('M', "smallmap", MTEHK_SMALLMAP),
01857 Hotkey<ScenarioEditorToolbarWindow>('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
01858 HOTKEY_LIST_END(ScenarioEditorToolbarWindow)
01859 };
01860 Hotkey<ScenarioEditorToolbarWindow> *_scenedit_maintoolbar_hotkeys = ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys;
01861
01862 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
01863 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
01864 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_FASTFORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
01865 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
01866 NWidget(WWT_IMGBTN_2, COLOUR_GREY, TBSE_SAVESCENARIO), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
01867 NWidget(NWID_SPACER),
01868 NWidget(WWT_PANEL, COLOUR_GREY, TBSE_SPACERPANEL), EndContainer(),
01869 NWidget(NWID_SPACER),
01870 NWidget(WWT_PANEL, COLOUR_GREY, TBSE_DATEPANEL_CONTAINER),
01871 NWidget(NWID_HORIZONTAL), SetPIP(3, 2, 3),
01872 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEBACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD),
01873 NWidget(WWT_EMPTY, COLOUR_GREY, TBSE_DATEPANEL), SetDataTip(STR_NULL, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE),
01874 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEFORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD),
01875 EndContainer(),
01876 EndContainer(),
01877 NWidget(NWID_SPACER),
01878 NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SMALLMAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
01879 NWidget(NWID_SPACER),
01880 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMIN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
01881 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMOUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
01882 NWidget(NWID_SPACER),
01883 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_LANDGENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
01884 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_TOWNGENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
01885 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_INDUSTRYGENERATE), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
01886 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDROAD), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
01887 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDDOCKS), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
01888 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLANTTREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
01889 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLACESIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
01890 NWidget(NWID_SPACER),
01891 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_MUSICSOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
01892 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
01893 NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_SWITCHBAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
01894 };
01895
01896 static NWidgetBase *MakeScenarioToolbar(int *biggest_index)
01897 {
01898 return MakeNWidgets(_nested_toolb_scen_inner_widgets, lengthof(_nested_toolb_scen_inner_widgets), biggest_index, new NWidgetScenarioToolbarContainer());
01899 }
01900
01901 static const NWidgetPart _nested_toolb_scen_widgets[] = {
01902 NWidgetFunction(MakeScenarioToolbar),
01903 };
01904
01905 static WindowDesc _toolb_scen_desc(
01906 WDP_MANUAL, 640, 22,
01907 WC_MAIN_TOOLBAR, WC_NONE,
01908 WDF_UNCLICK_BUTTONS | WDF_NO_FOCUS,
01909 _nested_toolb_scen_widgets, lengthof(_nested_toolb_scen_widgets)
01910 );
01911
01913 void AllocateToolbar()
01914 {
01915
01916 _last_built_roadtype = ROADTYPE_ROAD;
01917
01918 if (_game_mode == GM_EDITOR) {
01919 _preferred_toolbar_size = &_toolb_scen_desc.default_width;
01920 new ScenarioEditorToolbarWindow(&_toolb_scen_desc);
01921 } else {
01922 _preferred_toolbar_size = &_toolb_normal_desc.default_width;
01923 new MainToolbarWindow(&_toolb_normal_desc);
01924 }
01925 }