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