rubidium@8723: /* $Id$ */ rubidium@8723: rubidium@8723: /** @file toolbar_gui.cpp Code related to the (main) toolbar. */ rubidium@8723: rubidium@8723: #include "stdafx.h" rubidium@8723: #include "openttd.h" rubidium@8723: #include "gui.h" rubidium@8723: #include "window_gui.h" rubidium@8723: #include "window_func.h" rubidium@8723: #include "viewport_func.h" rubidium@8723: #include "command_func.h" rubidium@8723: #include "variables.h" rubidium@8723: #include "train.h" rubidium@8723: #include "roadveh.h" rubidium@8723: #include "vehicle_gui.h" rubidium@8723: #include "rail_gui.h" rubidium@8723: #include "road_gui.h" rubidium@8723: #include "date_func.h" rubidium@8723: #include "vehicle_func.h" rubidium@8723: #include "sound_func.h" rubidium@8723: #include "terraform_gui.h" rubidium@8723: #include "transparency.h" rubidium@8723: #include "strings_func.h" rubidium@10208: #include "company_base.h" rubidium@10208: #include "company_func.h" rubidium@10208: #include "company_gui.h" rubidium@8723: #include "settings_type.h" rubidium@8723: #include "toolbar_gui.h" rubidium@8723: #include "vehicle_base.h" rubidium@8723: #include "gfx_func.h" rubidium@8965: #include "cheat_func.h" rubidium@8975: #include "transparency_gui.h" rubidium@8975: #include "screenshot.h" rubidium@8975: #include "newgrf_config.h" rubidium@8975: #include "signs_func.h" rubidium@8975: #include "fios.h" rubidium@8975: #include "functions.h" rubidium@9336: #include "console_gui.h" rubidium@8977: #include "news_gui.h" rubidium@9127: #include "tilehighlight_func.h" peter1138@10016: #include "rail.h" peter1138@10016: #include "widgets/dropdown_func.h" peter1138@10016: #include "widgets/dropdown_type.h" rubidium@8723: rubidium@8723: #include "network/network.h" rubidium@8975: #include "network/network_gui.h" rubidium@8723: rubidium@8723: #include "table/strings.h" rubidium@8723: #include "table/sprites.h" rubidium@8723: rubidium@9425: static void SplitToolbar(Window *w); rubidium@8723: rubidium@8975: RailType _last_built_railtype; rubidium@8975: RoadType _last_built_roadtype; rubidium@8975: belugas@9601: /** This enum gathers properties of both toolbars */ belugas@9601: enum ToolBarProperties { belugas@9601: TBP_BUTTONWIDTH = 22, ///< width of a button belugas@9604: TBP_BUTTONHEIGHT = 22, ///< height of a button as well as the toolbars belugas@9601: TBP_DATEPANELWIDTH = 130, ///< used in scenario editor to calculate width of the toolbar. belugas@9601: belugas@9601: TBP_TOOLBAR_MINBUTTON = 14, ///< references both toolbars belugas@9601: TBP_NORMAL_MAXBUTTON = 19, ///< normal toolbar has this many buttons belugas@9601: TBP_SCENARIO_MAXBUTTON = 16, ///< while the scenario has these belugas@9601: }; belugas@9601: rubidium@9425: enum ToolbarMode { rubidium@9425: TB_NORMAL, rubidium@9425: TB_UPPER, rubidium@9425: TB_LOWER rubidium@9425: }; rubidium@9425: belugas@9539: enum ToolbarNormalWidgets { belugas@9539: TBN_PAUSE = 0, belugas@9539: TBN_FASTFORWARD, belugas@9539: TBN_SETTINGS, belugas@9539: TBN_SAVEGAME, belugas@9539: TBN_SMALLMAP, belugas@9539: TBN_TOWNDIRECTORY, belugas@9539: TBN_SUBSIDIES, belugas@9539: TBN_STATIONS, belugas@9539: TBN_FINANCES, rubidium@10207: TBN_COMPANIES, belugas@9539: TBN_GRAPHICS, belugas@9539: TBN_LEAGUE, belugas@9539: TBN_INDUSTRIES, belugas@9539: TBN_VEHICLESTART, ///< trains, actually. So following are trucks, boats and planes belugas@9539: TBN_TRAINS = TBN_VEHICLESTART, belugas@9539: TBN_ROADVEHS, belugas@9539: TBN_SHIPS, belugas@9539: TBN_AIRCRAFTS, belugas@9539: TBN_ZOOMIN, belugas@9539: TBN_ZOOMOUT, belugas@9539: TBN_RAILS, belugas@9539: TBN_ROADS, belugas@9539: TBN_WATER, belugas@9539: TBN_AIR, belugas@9539: TBN_LANDSCAPE, belugas@9539: TBN_MUSICSOUND, belugas@9539: TBN_NEWSREPORT, belugas@9539: TBN_HELP, belugas@9539: TBN_SWITCHBAR, ///< only available when toolbar has been split belugas@9539: }; belugas@9539: belugas@9519: enum ToolbarScenEditorWidgets { belugas@9519: TBSE_PAUSE = 0, belugas@9519: TBSE_FASTFORWARD, belugas@9539: TBSE_SAVESCENARIO = 3, belugas@9539: TBSE_SPACERPANEL, belugas@9599: TBSE_DATEPANEL, belugas@9546: TBSE_DATEBACKWARD, belugas@9519: TBSE_DATEFORWARD, belugas@9547: TBSE_SMALLMAP, belugas@9547: TBSE_ZOOMIN, belugas@9519: TBSE_ZOOMOUT, belugas@9519: TBSE_LANDGENERATE, belugas@9519: TBSE_TOWNGENERATE, belugas@9519: TBSE_INDUSTRYGENERATE, belugas@9519: TBSE_BUILDROAD, skidd13@9588: TBSE_BUILDDOCKS, belugas@9519: TBSE_PLANTTREES, belugas@9519: TBSE_PLACESIGNS, belugas@9519: }; belugas@9519: peter1138@10016: /** peter1138@10016: * Drop down list entry for showing a checked/unchecked toggle item. peter1138@10016: */ peter1138@10016: class DropDownListCheckedItem : public DropDownListStringItem { peter1138@10016: public: peter1138@10016: bool checked; peter1138@10016: peter1138@10016: DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked) {} peter1138@10016: peter1138@10016: virtual ~DropDownListCheckedItem() {} peter1138@10016: peter1138@10016: void Draw(int x, int y, uint width, uint height, bool sel, int bg_colour) const peter1138@10016: { peter1138@10016: if (checked) { peter1138@10016: DrawString(x + 2, y, STR_CHECKMARK, sel ? TC_WHITE : TC_BLACK); peter1138@10016: } peter1138@10016: DrawStringTruncated(x + 2, y, this->String(), sel ? TC_WHITE : TC_BLACK, width); peter1138@10016: } belugas@9547: }; belugas@9547: peter1138@10016: /** rubidium@10207: * Drop down list entry for showing a company entry, with companies 'blob'. peter1138@10016: */ peter1138@10016: class DropDownListCompanyItem : public DropDownListItem { peter1138@10016: public: peter1138@10016: bool greyed; peter1138@10016: peter1138@10016: DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed) {} peter1138@10016: peter1138@10016: virtual ~DropDownListCompanyItem() {} peter1138@10016: peter1138@10016: bool Selectable() const peter1138@10016: { peter1138@10016: return true; peter1138@10016: } peter1138@10016: peter1138@10016: uint Width() const peter1138@10016: { peter1138@10016: char buffer[512]; rubidium@10207: CompanyID company = (CompanyID)result; rubidium@10207: SetDParam(0, company); rubidium@10207: SetDParam(1, company); peter1138@10016: GetString(buffer, STR_7021, lastof(buffer)); peter1138@10016: return GetStringBoundingBox(buffer).width + 19; peter1138@10016: } peter1138@10016: peter1138@10016: void Draw(int x, int y, uint width, uint height, bool sel, int bg_colour) const peter1138@10016: { rubidium@10207: CompanyID company = (CompanyID)result; rubidium@10207: DrawCompanyIcon(company, x + 2, y + 1); peter1138@10016: rubidium@10207: SetDParam(0, company); rubidium@10207: SetDParam(1, company); peter1138@10016: int col; peter1138@10016: if (this->greyed) { peter1138@10016: col = TC_GREY; peter1138@10016: } else { peter1138@10016: col = sel ? TC_WHITE : TC_BLACK; peter1138@10016: } peter1138@10016: DrawStringTruncated(x + 19, y, STR_7021, col, width - 17); peter1138@10016: } peter1138@10016: }; peter1138@10016: peter1138@10016: /** peter1138@10016: * Pop up a generic text only menu. peter1138@10016: */ peter1138@10016: static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count) peter1138@10016: { peter1138@10016: DropDownList *list = new DropDownList(); peter1138@10016: for (int i = 0; i < count; i++) { peter1138@10016: list->push_back(new DropDownListStringItem(string + i, i, false)); peter1138@10016: } peter1138@10016: ShowDropDownList(w, list, 0, widget, 140, true, true); peter1138@10016: SndPlayFx(SND_15_BEEP); peter1138@10016: } peter1138@10016: peter1138@10016: /** peter1138@10016: * Pop up a generic company list menu. peter1138@10016: */ rubidium@10207: static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0) peter1138@10016: { peter1138@10016: DropDownList *list = new DropDownList(); peter1138@10016: rubidium@10207: if (widget == TBN_COMPANIES && _networking) { rubidium@10207: /* Add the client list button for the companies menu */ peter1138@10016: list->push_back(new DropDownListStringItem(STR_NETWORK_CLIENT_LIST, -1, false)); peter1138@10016: } peter1138@10016: rubidium@10207: for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { rubidium@10207: if (!IsValidCompanyID(c)) continue; rubidium@10207: list->push_back(new DropDownListCompanyItem(c, false, HasBit(grey, c))); peter1138@10016: } peter1138@10016: rubidium@10207: ShowDropDownList(w, list, _local_company == COMPANY_SPECTATOR ? -1 : _local_company, widget, 240, true, true); peter1138@10016: SndPlayFx(SND_15_BEEP); peter1138@10016: } peter1138@10016: peter1138@10016: rubidium@9425: static ToolbarMode _toolbar_mode; rubidium@9425: rubidium@8975: static void SelectSignTool() rubidium@8975: { rubidium@8975: if (_cursor.sprite == SPR_CURSOR_SIGN) { rubidium@8975: ResetObjectToPlace(); rubidium@8975: } else { rubidium@8975: SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, VHM_RECT, WC_MAIN_TOOLBAR, 0); rubidium@8975: _place_proc = PlaceProc_Sign; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Pausing --- */ rubidium@8723: rubidium@8723: static void ToolbarPauseClick(Window *w) rubidium@8723: { rubidium@8723: if (_networking && !_network_server) return; // only server can pause the game rubidium@8723: rubidium@8723: if (DoCommandP(0, _pause_game ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP); rubidium@8723: } rubidium@8723: rubidium@8975: /* --- Fast forwarding --- */ rubidium@8975: rubidium@8723: static void ToolbarFastForwardClick(Window *w) rubidium@8723: { rubidium@8723: _fast_forward ^= true; rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: } rubidium@8723: rubidium@8975: /* --- Options button menu --- */ rubidium@8723: belugas@9544: enum OptionMenuEntries { peter1138@10016: OME_GAMEOPTIONS, belugas@9544: OME_DIFFICULTIES, belugas@9544: OME_PATCHES, belugas@9544: OME_NEWGRFSETTINGS, belugas@9544: OME_TRANSPARENCIES, peter1138@10016: OME_SHOW_TOWNNAMES, belugas@9544: OME_SHOW_STATIONNAMES, belugas@9544: OME_SHOW_SIGNS, belugas@9544: OME_SHOW_WAYPOINTNAMES, belugas@9544: OME_FULL_ANIMATION, belugas@9544: OME_FULL_DETAILS, belugas@9544: OME_TRANSPARENTBUILDINGS, belugas@9544: OME_SHOW_STATIONSIGNS, belugas@9544: }; belugas@9544: rubidium@8723: static void ToolbarOptionsClick(Window *w) rubidium@8723: { peter1138@10016: DropDownList *list = new DropDownList(); peter1138@10016: list->push_back(new DropDownListStringItem(STR_02C4_GAME_OPTIONS, OME_GAMEOPTIONS, false)); peter1138@10016: list->push_back(new DropDownListStringItem(STR_02C6_DIFFICULTY_SETTINGS, OME_DIFFICULTIES, false)); peter1138@10016: list->push_back(new DropDownListStringItem(STR_MENU_CONFIG_PATCHES, OME_PATCHES, false)); peter1138@10016: list->push_back(new DropDownListStringItem(STR_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false)); peter1138@10016: list->push_back(new DropDownListStringItem(STR_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false)); peter1138@10016: list->push_back(new DropDownListItem(-1, false)); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02CA_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02CC_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02CE_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_WAYPOINTS_DISPLAYED2, OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_WAYPOINTS))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02D0_FULL_ANIMATION, OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02D2_FULL_DETAIL, OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_02D4_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES))); peter1138@10016: list->push_back(new DropDownListCheckedItem(STR_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS))); rubidium@9240: peter1138@10016: ShowDropDownList(w, list, 0, TBN_SETTINGS, 140, true, true); peter1138@10016: SndPlayFx(SND_15_BEEP); rubidium@8723: } rubidium@8723: rubidium@8975: static void MenuClickSettings(int index) rubidium@8975: { rubidium@8975: switch (index) { belugas@9544: case OME_GAMEOPTIONS: ShowGameOptions(); return; belugas@9544: case OME_DIFFICULTIES: ShowGameDifficulty(); return; belugas@9544: case OME_PATCHES: ShowPatchesSelection(); return; belugas@9544: case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking, true, true, &_grfconfig); return; belugas@9544: case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break; rubidium@8975: belugas@9544: case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break; belugas@9544: case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break; belugas@9544: case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break; belugas@9544: case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_WAYPOINTS); break; belugas@9544: case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); break; belugas@9544: case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break; belugas@9544: case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break; belugas@9544: case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break; rubidium@8975: } rubidium@8975: MarkWholeScreenDirty(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Saving/loading button menu --- */ rubidium@8975: belugas@9566: enum SaveLoadEditorMenuEntries { belugas@9566: SLEME_SAVE_SCENARIO = 0, belugas@9566: SLEME_LOAD_SCENARIO, belugas@9566: SLEME_LOAD_HEIGHTMAP, belugas@9566: SLEME_EXIT_TOINTRO, belugas@9566: SLEME_EXIT_GAME = 5, belugas@9566: SLEME_MENUCOUNT, belugas@9566: }; belugas@9566: belugas@9566: enum SaveLoadNormalMenuEntries { belugas@9566: SLNME_SAVE_GAME = 0, belugas@9566: SLNME_LOAD_GAME, belugas@9566: SLNME_EXIT_TOINTRO, belugas@9566: SLNME_EXIT_GAME, belugas@9566: SLNME_MENUCOUNT, belugas@9566: }; belugas@9566: rubidium@8975: static void ToolbarSaveClick(Window *w) rubidium@8975: { belugas@9566: PopupMainToolbMenu(w, TBN_SAVEGAME, STR_015C_SAVE_GAME, SLNME_MENUCOUNT); rubidium@8975: } rubidium@8723: rubidium@8723: static void ToolbarScenSaveOrLoad(Window *w) rubidium@8723: { belugas@9566: PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_0292_SAVE_SCENARIO, SLEME_MENUCOUNT); rubidium@8723: } rubidium@8723: belugas@9610: static void MenuClickSaveLoad(int index = 0) rubidium@8975: { rubidium@8975: if (_game_mode == GM_EDITOR) { rubidium@8975: switch (index) { belugas@9566: case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break; belugas@9566: case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break; belugas@9566: case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break; belugas@9566: case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break; belugas@9566: case SLEME_EXIT_GAME: HandleExitGameRequest(); break; rubidium@8975: } rubidium@8975: } else { rubidium@8975: switch (index) { belugas@9566: case SLNME_SAVE_GAME: ShowSaveLoadDialog(SLD_SAVE_GAME); break; belugas@9566: case SLNME_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break; belugas@9566: case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break; belugas@9566: case SLNME_EXIT_GAME: HandleExitGameRequest(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Map button menu --- */ rubidium@8975: belugas@9571: enum MapMenuEntries { belugas@9571: MME_SHOW_SMALLMAP = 0, belugas@9571: MME_SHOW_EXTRAVIEWPORTS, belugas@9571: MME_SHOW_SIGNLISTS, belugas@9571: MME_SHOW_TOWNDIRECTORY, ///< This entry is only used in Editor mode belugas@9604: MME_MENUCOUNT_NORMAL = 3, belugas@9604: MME_MENUCOUNT_EDITOR = 4, belugas@9571: }; belugas@9571: rubidium@8975: static void ToolbarMapClick(Window *w) rubidium@8975: { belugas@9571: PopupMainToolbMenu(w, TBN_SMALLMAP, STR_02DE_MAP_OF_WORLD, MME_MENUCOUNT_NORMAL); belugas@9571: } belugas@9571: belugas@9571: static void ToolbarScenMapTownDir(Window *w) belugas@9571: { peter1138@10016: PopupMainToolbMenu(w, TBSE_SMALLMAP, STR_02DE_MAP_OF_WORLD, MME_MENUCOUNT_EDITOR); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickMap(int index) rubidium@8975: { rubidium@8975: switch (index) { belugas@9571: case MME_SHOW_SMALLMAP: ShowSmallMap(); break; belugas@9571: case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewPortWindow(); break; belugas@9571: case MME_SHOW_SIGNLISTS: ShowSignList(); break; belugas@9571: case MME_SHOW_TOWNDIRECTORY: if (_game_mode == GM_EDITOR) ShowTownDirectory(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Town button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarTownClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_TOWNDIRECTORY, STR_02BB_TOWN_DIRECTORY, 1); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickTown(int index) rubidium@8975: { rubidium@8975: ShowTownDirectory(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Subidies button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarSubsidiesClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_SUBSIDIES, STR_02DD_SUBSIDIES, 1); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickSubsidies(int index) rubidium@8975: { rubidium@8975: ShowSubsidiesList(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Stations button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarStationsClick(Window *w) rubidium@8975: { rubidium@10207: PopupMainCompanyToolbMenu(w, TBN_STATIONS); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickStations(int index) rubidium@8975: { rubidium@10207: ShowCompanyStations((CompanyID)index); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Finances button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarFinancesClick(Window *w) rubidium@8975: { rubidium@10207: PopupMainCompanyToolbMenu(w, TBN_FINANCES); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickFinances(int index) rubidium@8975: { rubidium@10207: ShowCompanyFinances((CompanyID)index); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Company's button menu --- */ rubidium@8975: rubidium@10207: static void ToolbarCompaniesClick(Window *w) rubidium@8975: { rubidium@10207: PopupMainCompanyToolbMenu(w, TBN_COMPANIES); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickCompany(int index) rubidium@8975: { peter1138@10016: if (_networking && index == -1) { rubidium@8975: ShowClientList(); rubidium@8975: } else { rubidium@10207: ShowCompany((CompanyID)index); rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Graphs button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarGraphsClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_GRAPHICS, STR_0154_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickGraphs(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: ShowOperatingProfitGraph(); break; rubidium@8975: case 1: ShowIncomeGraph(); break; rubidium@8975: case 2: ShowDeliveredCargoGraph(); break; rubidium@8975: case 3: ShowPerformanceHistoryGraph(); break; rubidium@8975: case 4: ShowCompanyValueGraph(); break; rubidium@8975: case 5: ShowCargoPaymentRates(); break; rubidium@9425: /* functions for combined graphs/league button */ rubidium@9425: case 6: ShowCompanyLeagueTable(); break; rubidium@9425: case 7: ShowPerformanceRatingDetail(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- League button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarLeagueClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_LEAGUE, STR_015A_COMPANY_LEAGUE_TABLE, 2); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickLeague(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: ShowCompanyLeagueTable(); break; rubidium@8975: case 1: ShowPerformanceRatingDetail(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Industries button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarIndustryClick(Window *w) rubidium@8975: { rubidium@8975: /* Disable build-industry menu if we are a spectator */ rubidium@10207: PopupMainToolbMenu(w, TBN_INDUSTRIES, STR_INDUSTRY_DIR, (_current_company == COMPANY_SPECTATOR) ? 1 : 2); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickIndustry(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: ShowIndustryDirectory(); break; rubidium@8975: case 1: ShowBuildIndustryWindow(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Trains button menu + 1 helper function for all vehicles. --- */ rubidium@8975: rubidium@8975: static void ToolbarVehicleClick(Window *w, VehicleType veh) rubidium@8975: { rubidium@8975: const Vehicle *v; rubidium@8975: int dis = ~0; rubidium@8975: rubidium@8975: FOR_ALL_VEHICLES(v) { rubidium@9053: if (v->type == veh && v->IsPrimaryVehicle()) ClrBit(dis, v->owner); rubidium@8975: } rubidium@10207: PopupMainCompanyToolbMenu(w, TBN_VEHICLESTART + veh, dis); rubidium@8975: } rubidium@8975: rubidium@8975: rubidium@8975: static void ToolbarTrainClick(Window *w) rubidium@8975: { rubidium@8975: ToolbarVehicleClick(w, VEH_TRAIN); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickShowTrains(int index) rubidium@8975: { rubidium@10207: ShowVehicleListWindow((CompanyID)index, VEH_TRAIN); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Road vehicle button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarRoadClick(Window *w) rubidium@8975: { rubidium@8975: ToolbarVehicleClick(w, VEH_ROAD); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickShowRoad(int index) rubidium@8975: { rubidium@10207: ShowVehicleListWindow((CompanyID)index, VEH_ROAD); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Ship button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarShipClick(Window *w) rubidium@8975: { rubidium@8975: ToolbarVehicleClick(w, VEH_SHIP); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickShowShips(int index) rubidium@8975: { rubidium@10207: ShowVehicleListWindow((CompanyID)index, VEH_SHIP); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Aircraft button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarAirClick(Window *w) rubidium@8975: { rubidium@8975: ToolbarVehicleClick(w, VEH_AIRCRAFT); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickShowAir(int index) rubidium@8975: { rubidium@10207: ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Zoom in button --- */ rubidium@8975: rubidium@8975: static void ToolbarZoomInClick(Window *w) rubidium@8975: { rubidium@8975: if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) { belugas@9616: w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMIN : (byte)TBN_ZOOMIN); rubidium@8975: SndPlayFx(SND_15_BEEP); rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Zoom out button --- */ rubidium@8975: rubidium@8975: static void ToolbarZoomOutClick(Window *w) rubidium@8975: { rubidium@8975: if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) { belugas@9616: w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMOUT : (byte)TBN_ZOOMOUT); rubidium@8975: SndPlayFx(SND_15_BEEP); rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Rail button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarBuildRailClick(Window *w) rubidium@8975: { rubidium@10207: const Company *c = GetCompany(_local_company); peter1138@10016: DropDownList *list = new DropDownList(); peter1138@10016: for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { peter1138@10016: const RailtypeInfo *rti = GetRailTypeInfo(rt); rubidium@10207: list->push_back(new DropDownListStringItem(rti->strings.menu_text, rt, !HasBit(c->avail_railtypes, rt))); peter1138@10016: } peter1138@10016: ShowDropDownList(w, list, _last_built_railtype, TBN_RAILS, 140, true, true); peter1138@10016: SndPlayFx(SND_15_BEEP); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickBuildRail(int index) rubidium@8975: { rubidium@8975: _last_built_railtype = (RailType)index; rubidium@8975: ShowBuildRailToolbar(_last_built_railtype, -1); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Road button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarBuildRoadClick(Window *w) rubidium@8975: { rubidium@10207: const Company *c = GetCompany(_local_company); peter1138@10016: DropDownList *list = new DropDownList(); peter1138@10016: for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { peter1138@10016: /* Highways don't exist */ peter1138@10016: if (rt == ROADTYPE_HWAY) continue; peter1138@10016: peter1138@10016: /* The standard road button is *always* available */ rubidium@10207: list->push_back(new DropDownListStringItem(STR_180A_ROAD_CONSTRUCTION + rt, rt, !(HasBit(c->avail_roadtypes, rt) || rt == ROADTYPE_ROAD))); peter1138@10016: } peter1138@10016: ShowDropDownList(w, list, _last_built_roadtype, TBN_ROADS, 140, true, true); peter1138@10016: SndPlayFx(SND_15_BEEP); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickBuildRoad(int index) rubidium@8975: { rubidium@8975: _last_built_roadtype = (RoadType)index; rubidium@8975: ShowBuildRoadToolbar(_last_built_roadtype); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Water button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarBuildWaterClick(Window *w) rubidium@8975: { skidd13@9588: PopupMainToolbMenu(w, TBN_WATER, STR_9800_WATERWAYS_CONSTRUCTION, 1); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickBuildWater(int index) rubidium@8975: { rubidium@8975: ShowBuildDocksToolbar(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Airport button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarBuildAirClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_AIR, STR_A01D_AIRPORT_CONSTRUCTION, 1); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickBuildAir(int index) rubidium@8975: { rubidium@8975: ShowBuildAirToolbar(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Forest button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarForestClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_LANDSCAPE, STR_LANDSCAPING, 3); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickForest(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: ShowTerraformToolbar(); break; rubidium@8975: case 1: ShowBuildTreesToolbar(); break; rubidium@8975: case 2: SelectSignTool(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Music button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarMusicClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_MUSICSOUND, STR_01D3_SOUND_MUSIC, 1); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickMusicWindow(int index) rubidium@8975: { rubidium@8975: ShowMusicWindow(); rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Newspaper button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarNewspaperClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_NEWSREPORT, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickNewspaper(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: ShowLastNewsMessage(); break; rubidium@8975: case 1: ShowMessageOptions(); break; rubidium@8975: case 2: ShowMessageHistory(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@8975: /* --- Help button menu --- */ rubidium@8975: rubidium@8975: static void ToolbarHelpClick(Window *w) rubidium@8975: { belugas@9539: PopupMainToolbMenu(w, TBN_HELP, STR_02D5_LAND_BLOCK_INFO, 6); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickSmallScreenshot() rubidium@8975: { rubidium@8975: SetScreenshotType(SC_VIEWPORT); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickWorldScreenshot() rubidium@8975: { rubidium@8975: SetScreenshotType(SC_WORLD); rubidium@8975: } rubidium@8975: rubidium@8975: static void MenuClickHelp(int index) rubidium@8975: { rubidium@8975: switch (index) { rubidium@8975: case 0: PlaceLandBlockInfo(); break; rubidium@8975: case 2: IConsoleSwitch(); break; rubidium@8975: case 3: MenuClickSmallScreenshot(); break; rubidium@8975: case 4: MenuClickWorldScreenshot(); break; rubidium@8975: case 5: ShowAboutWindow(); break; rubidium@8975: } rubidium@8975: } rubidium@8975: rubidium@9425: /* --- Switch toolbar button --- */ rubidium@9425: rubidium@9425: static void ToolbarSwitchClick(Window *w) rubidium@9425: { rubidium@9425: if (_toolbar_mode != TB_LOWER) { rubidium@9425: _toolbar_mode = TB_LOWER; rubidium@9425: } else { rubidium@9425: _toolbar_mode = TB_UPPER; rubidium@9425: } rubidium@9425: rubidium@9425: SplitToolbar(w); belugas@9539: w->HandleButtonClick(TBN_SWITCHBAR); rubidium@9425: SetWindowDirty(w); rubidium@9425: SndPlayFx(SND_15_BEEP); rubidium@9425: } rubidium@9425: rubidium@8975: /* --- Scenario editor specific handlers. */ rubidium@8975: rubidium@8723: static void ToolbarScenDateBackward(Window *w) rubidium@8723: { rubidium@8723: /* don't allow too fast scrolling */ rubidium@10180: if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) { belugas@9519: w->HandleButtonClick(TBSE_DATEBACKWARD); rubidium@9116: w->SetDirty(); rubidium@8723: rubidium@9354: _settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year - 1, MIN_YEAR, MAX_YEAR); rubidium@9354: SetDate(ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); rubidium@8723: } rubidium@8723: _left_button_clicked = false; rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarScenDateForward(Window *w) rubidium@8723: { rubidium@8723: /* don't allow too fast scrolling */ rubidium@10180: if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) { belugas@9519: w->HandleButtonClick(TBSE_DATEFORWARD); rubidium@9116: w->SetDirty(); rubidium@8723: rubidium@9354: _settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year + 1, MIN_YEAR, MAX_YEAR); rubidium@9354: SetDate(ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); rubidium@8723: } rubidium@8723: _left_button_clicked = false; rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarScenGenLand(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_LANDGENERATE); rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: rubidium@8723: ShowEditorTerraformToolbar(); rubidium@8723: } rubidium@8723: rubidium@8723: rubidium@8723: static void ToolbarScenGenTown(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_TOWNGENERATE); rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: ShowBuildTownWindow(); rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarScenGenIndustry(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_INDUSTRYGENERATE); rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: ShowBuildIndustryWindow(); rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarScenBuildRoad(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_BUILDROAD); rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: ShowBuildRoadScenToolbar(); rubidium@8723: } rubidium@8723: skidd13@9588: static void ToolbarScenBuildDocks(Window *w) skidd13@9588: { skidd13@9588: w->HandleButtonClick(TBSE_BUILDDOCKS); skidd13@9588: SndPlayFx(SND_15_BEEP); skidd13@9588: ShowBuildDocksScenToolbar(); skidd13@9588: } skidd13@9588: rubidium@8723: static void ToolbarScenPlantTrees(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_PLANTTREES); rubidium@8723: SndPlayFx(SND_15_BEEP); glx@9195: ShowBuildTreesToolbar(); rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarScenPlaceSign(Window *w) rubidium@8723: { belugas@9519: w->HandleButtonClick(TBSE_PLACESIGNS); rubidium@8723: SndPlayFx(SND_15_BEEP); rubidium@8723: SelectSignTool(); rubidium@8723: } rubidium@8723: rubidium@8723: static void ToolbarBtn_NULL(Window *w) rubidium@8723: { rubidium@8723: } rubidium@8723: rubidium@9425: /* --- Resizing the toolbar */ rubidium@9425: rubidium@9425: static void ResizeToolbar(Window *w) rubidium@9425: { rubidium@9425: /* There are 27 buttons plus some spacings if the space allows it */ rubidium@9425: uint button_width; rubidium@9425: uint spacing; belugas@9541: uint widgetcount = w->widget_count - 1; belugas@9541: belugas@9601: if (w->width >= (int)widgetcount * TBP_BUTTONWIDTH) { belugas@9601: button_width = TBP_BUTTONWIDTH; belugas@9541: spacing = w->width - (widgetcount * button_width); rubidium@9425: } else { belugas@9541: button_width = w->width / widgetcount; rubidium@9425: spacing = 0; rubidium@9425: } belugas@9538: belugas@9601: static const uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 }; belugas@9538: uint i = 0; belugas@9541: for (uint x = 0, j = 0; i < widgetcount; i++) { rubidium@9425: if (extra_spacing_at[j] == i) { rubidium@9425: j++; rubidium@9425: uint add = spacing / (lengthof(extra_spacing_at) - j); rubidium@9425: spacing -= add; rubidium@9425: x += add; rubidium@9425: } rubidium@9425: rubidium@9425: w->widget[i].type = WWT_IMGBTN; rubidium@9425: w->widget[i].left = x; belugas@9541: x += (spacing != 0) ? button_width : (w->width - x) / (widgetcount - i); rubidium@9425: w->widget[i].right = x - 1; rubidium@9425: } rubidium@9425: belugas@9538: w->widget[i].type = WWT_EMPTY; // i now points to the last item rubidium@9425: _toolbar_mode = TB_NORMAL; rubidium@9425: } rubidium@9425: rubidium@9425: /* --- Split the toolbar */ rubidium@9425: rubidium@9425: static void SplitToolbar(Window *w) rubidium@9425: { rubidium@9425: static const byte arrange14[] = { rubidium@9425: 0, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27, rubidium@9425: 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27, rubidium@9425: }; rubidium@9425: static const byte arrange15[] = { rubidium@9425: 0, 1, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27, rubidium@9425: 0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27, rubidium@9425: }; rubidium@9425: static const byte arrange16[] = { rubidium@9425: 0, 1, 2, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27, rubidium@9425: 0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27, rubidium@9425: }; rubidium@9425: static const byte arrange17[] = { rubidium@9425: 0, 1, 2, 4, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27, rubidium@9425: 0, 1, 3, 4, 6, 5, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27, rubidium@9425: }; rubidium@9425: static const byte arrange18[] = { rubidium@9425: 0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 19, 20, 21, 22, 23, 17, 18, 27, rubidium@9425: 0, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27, rubidium@9425: }; rubidium@9425: static const byte arrange19[] = { rubidium@9425: 0, 1, 2, 4, 5, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27, rubidium@9425: 0, 1, 3, 4, 7, 8, 9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27, rubidium@9425: }; rubidium@9425: rubidium@9425: static const byte *arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 }; rubidium@9425: belugas@9602: uint max_icons = max(TBP_TOOLBAR_MINBUTTON, (ToolBarProperties)((w->width + TBP_BUTTONWIDTH / 2) / TBP_BUTTONWIDTH)); rubidium@9425: belugas@9601: assert(max_icons >= TBP_TOOLBAR_MINBUTTON && max_icons <= TBP_NORMAL_MAXBUTTON); rubidium@9425: rubidium@9425: /* first hide all icons */ belugas@9541: for (uint i = 0; i < w->widget_count - 1; i++) { rubidium@9425: w->widget[i].type = WWT_EMPTY; rubidium@9425: } rubidium@9425: rubidium@9425: /* now activate them all on their proper positions */ belugas@9601: for (uint i = 0, x = 0, n = max_icons - TBP_TOOLBAR_MINBUTTON; i < max_icons; i++) { rubidium@9425: uint icon = arrangements[n][i + ((_toolbar_mode == TB_LOWER) ? max_icons : 0)]; rubidium@9425: w->widget[icon].type = WWT_IMGBTN; rubidium@9425: w->widget[icon].left = x; rubidium@9425: x += (w->width - x) / (max_icons - i); rubidium@9425: w->widget[icon].right = x - 1; rubidium@9425: } rubidium@9425: } rubidium@8723: peter1138@10016: typedef void MenuClickedProc(int index); peter1138@10016: peter1138@10016: static MenuClickedProc * const _menu_clicked_procs[] = { peter1138@10016: NULL, /* 0 */ peter1138@10016: NULL, /* 1 */ peter1138@10016: MenuClickSettings, /* 2 */ peter1138@10016: MenuClickSaveLoad, /* 3 */ peter1138@10016: MenuClickMap, /* 4 */ peter1138@10016: MenuClickTown, /* 5 */ peter1138@10016: MenuClickSubsidies, /* 6 */ peter1138@10016: MenuClickStations, /* 7 */ peter1138@10016: MenuClickFinances, /* 8 */ peter1138@10016: MenuClickCompany, /* 9 */ peter1138@10016: MenuClickGraphs, /* 10 */ peter1138@10016: MenuClickLeague, /* 11 */ peter1138@10016: MenuClickIndustry, /* 12 */ peter1138@10016: MenuClickShowTrains, /* 13 */ peter1138@10016: MenuClickShowRoad, /* 14 */ peter1138@10016: MenuClickShowShips, /* 15 */ peter1138@10016: MenuClickShowAir, /* 16 */ peter1138@10016: MenuClickMap, /* 17 */ peter1138@10016: NULL, /* 18 */ peter1138@10016: MenuClickBuildRail, /* 19 */ peter1138@10016: MenuClickBuildRoad, /* 20 */ peter1138@10016: MenuClickBuildWater, /* 21 */ peter1138@10016: MenuClickBuildAir, /* 22 */ peter1138@10016: MenuClickForest, /* 23 */ peter1138@10016: MenuClickMusicWindow, /* 24 */ peter1138@10016: MenuClickNewspaper, /* 25 */ peter1138@10016: MenuClickHelp, /* 26 */ peter1138@10016: }; peter1138@10016: rubidium@8975: /* --- Toolbar handling for the 'normal' case */ rubidium@8975: rubidium@8723: typedef void ToolbarButtonProc(Window *w); rubidium@8723: rubidium@8723: static ToolbarButtonProc * const _toolbar_button_procs[] = { rubidium@8723: ToolbarPauseClick, rubidium@8723: ToolbarFastForwardClick, rubidium@8723: ToolbarOptionsClick, rubidium@8723: ToolbarSaveClick, rubidium@8723: ToolbarMapClick, rubidium@8723: ToolbarTownClick, rubidium@8723: ToolbarSubsidiesClick, rubidium@8723: ToolbarStationsClick, rubidium@8975: ToolbarFinancesClick, rubidium@10207: ToolbarCompaniesClick, rubidium@8723: ToolbarGraphsClick, rubidium@8723: ToolbarLeagueClick, rubidium@8723: ToolbarIndustryClick, rubidium@8723: ToolbarTrainClick, rubidium@8723: ToolbarRoadClick, rubidium@8723: ToolbarShipClick, rubidium@8723: ToolbarAirClick, rubidium@8723: ToolbarZoomInClick, rubidium@8723: ToolbarZoomOutClick, rubidium@8723: ToolbarBuildRailClick, rubidium@8723: ToolbarBuildRoadClick, rubidium@8723: ToolbarBuildWaterClick, rubidium@8723: ToolbarBuildAirClick, rubidium@8723: ToolbarForestClick, rubidium@8723: ToolbarMusicClick, rubidium@8723: ToolbarNewspaperClick, rubidium@8723: ToolbarHelpClick, rubidium@9425: ToolbarSwitchClick, rubidium@8723: }; rubidium@8723: rubidium@9305: struct MainToolbarWindow : Window { rubidium@9305: MainToolbarWindow(const WindowDesc *desc) : Window(desc) rubidium@9305: { belugas@9539: this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server); // if not server, disable pause button belugas@9539: this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking); // if networking, disable fast-forward button rubidium@8723: rubidium@9305: CLRBITS(this->flags4, WF_WHITE_BORDER_MASK); rubidium@8723: smatz@9310: this->FindWindowPlacementAndResize(desc); rubidium@9305: PositionMainToolbar(this); rubidium@9305: DoZoomInOutWindow(ZOOM_NONE, this); rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnPaint() rubidium@9305: { rubidium@9305: /* Draw brown-red toolbar bg. */ rubidium@9305: GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2); frosch@9607: GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER); rubidium@8723: rubidium@9305: /* If spectator, disable all construction buttons rubidium@9305: * ie : Build road, rail, ships, airports and landscaping rubidium@9305: * Since enabled state is the default, just disable when needed */ rubidium@10207: this->SetWidgetsDisabledState(_current_company == COMPANY_SPECTATOR, TBN_RAILS, TBN_ROADS, TBN_WATER, TBN_AIR, TBN_LANDSCAPE, WIDGET_LIST_END); rubidium@9305: /* disable company list drop downs, if there are no companies */ rubidium@10207: this->SetWidgetsDisabledState(ActiveCompanyCount() == TBN_PAUSE, TBN_STATIONS, TBN_FINANCES, TBN_TRAINS, TBN_ROADVEHS, TBN_SHIPS, TBN_AIRCRAFTS, WIDGET_LIST_END); rubidium@9305: belugas@9539: this->SetWidgetDisabledState(TBN_RAILS, !CanBuildVehicleInfrastructure(VEH_TRAIN)); belugas@9539: this->SetWidgetDisabledState(TBN_AIR, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT)); rubidium@9305: rubidium@9305: this->DrawWidgets(); rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnClick(Point pt, int widget) rubidium@9305: { rubidium@9305: if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this); rubidium@9305: } rubidium@9305: peter1138@10016: virtual void OnDropdownSelect(int widget, int index) peter1138@10016: { peter1138@10016: _menu_clicked_procs[widget](index); peter1138@10016: } peter1138@10016: rubidium@9305: virtual EventState OnKeyPress(uint16 key, uint16 keycode) rubidium@9305: { rubidium@9305: switch (keycode) { rubidium@9305: case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break; rubidium@9305: case WKC_F2: ShowGameOptions(); break; belugas@9610: case WKC_F3: MenuClickSaveLoad(); break; rubidium@9305: case WKC_F4: ShowSmallMap(); break; rubidium@9305: case WKC_F5: ShowTownDirectory(); break; rubidium@9305: case WKC_F6: ShowSubsidiesList(); break; rubidium@10207: case WKC_F7: ShowCompanyStations(_local_company); break; rubidium@10207: case WKC_F8: ShowCompanyFinances(_local_company); break; rubidium@10207: case WKC_F9: ShowCompany(_local_company); break; rubidium@9305: case WKC_F10: ShowOperatingProfitGraph(); break; rubidium@9305: case WKC_F11: ShowCompanyLeagueTable(); break; rubidium@9305: case WKC_F12: ShowBuildIndustryWindow(); break; rubidium@10207: case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_company, VEH_TRAIN); break; rubidium@10207: case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_company, VEH_ROAD); break; rubidium@10207: case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_company, VEH_SHIP); break; rubidium@10207: case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break; rubidium@9305: case WKC_NUM_PLUS: // Fall through rubidium@9305: case WKC_EQUALS: // Fall through rubidium@9305: case WKC_SHIFT | WKC_EQUALS: // Fall through rubidium@9305: case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break; rubidium@9305: case WKC_NUM_MINUS: // Fall through rubidium@9305: case WKC_MINUS: // Fall through rubidium@9305: case WKC_SHIFT | WKC_MINUS: // Fall through rubidium@9305: case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break; rubidium@9305: case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break; rubidium@9305: case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break; rubidium@9305: case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break; rubidium@9305: case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break; rubidium@9305: case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break; rubidium@9305: case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break; rubidium@9305: case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; rubidium@9305: case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; rubidium@9305: case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break; rubidium@9305: case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail rubidium@9305: case 'L': ShowTerraformToolbar(); break; rubidium@9305: case 'M': ShowSmallMap(); break; rubidium@9305: case 'V': ShowExtraViewPortWindow(); break; rubidium@9305: default: return ES_NOT_HANDLED; rubidium@9305: } rubidium@9305: return ES_HANDLED; rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnPlaceObject(Point pt, TileIndex tile) rubidium@9305: { rubidium@9305: _place_proc(tile); rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnTick() rubidium@9305: { belugas@9539: if (this->IsWidgetLowered(TBN_PAUSE) != !!_pause_game) { belugas@9539: this->ToggleWidgetLoweredState(TBN_PAUSE); belugas@9539: this->InvalidateWidget(TBN_PAUSE); rubidium@9305: } rubidium@9305: belugas@9539: if (this->IsWidgetLowered(TBN_FASTFORWARD) != !!_fast_forward) { belugas@9539: this->ToggleWidgetLoweredState(TBN_FASTFORWARD); belugas@9539: this->InvalidateWidget(TBN_FASTFORWARD); rubidium@9305: } rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnResize(Point new_size, Point delta) rubidium@9305: { belugas@9601: if (this->width <= TBP_NORMAL_MAXBUTTON * TBP_BUTTONWIDTH) { rubidium@9425: SplitToolbar(this); rubidium@9305: } else { rubidium@9425: ResizeToolbar(this); rubidium@9305: } rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnTimeout() rubidium@9305: { belugas@9541: for (uint i = TBN_SETTINGS; i < this->widget_count - 1; i++) { rubidium@9305: if (this->IsWidgetLowered(i)) { rubidium@9305: this->RaiseWidget(i); rubidium@9305: this->InvalidateWidget(i); rubidium@8723: } rubidium@9305: } rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnInvalidateData(int data) rubidium@9305: { belugas@9539: if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBN_ZOOMIN, TBN_ZOOMOUT); rubidium@8723: } rubidium@9305: }; rubidium@8723: rubidium@8723: static const Widget _toolb_normal_widgets[] = { belugas@9778: { WWT_IMGBTN, RESIZE_LEFT, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, // TBN_PAUSE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, // TBN_FASTFORWARD belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, // TBN_SETTINGS belugas@9778: { WWT_IMGBTN_2, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME}, // TBN_SAVEGAME rubidium@8723: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP}, // TBN_SMALLMAP belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY}, // TBN_TOWNDIRECTORY belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES}, // TBN_SUBSIDIES belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY}, // TBN_STATIONS belugas@9600: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES}, // TBN_FINANCES rubidium@10207: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL}, // TBN_COMPANIES belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS}, // TBN_GRAPHICS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE}, // TBN_LEAGUE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW}, // TBN_INDUSTRIES belugas@9600: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY}, // TBN_TRAINS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY}, // TBN_ROADVEHS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY}, // TBN_SHIPS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY}, // TBN_AIRCRAFTS belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, // TBN_ZOOMIN belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, // TBN_ZOOMOUT belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK}, // TBN_RAILS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS}, // TBN_ROADS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, // TBN_WATER belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS}, // TBN_AIR belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // TBN_LANDSCAPE tree icon is SPR_IMG_PLANTTREES belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, // TBN_MUSICSOUND belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS}, // TBN_NEWSREPORT belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, // TBN_HELP belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_SWITCH_TOOLBAR, STR_EMPTY}, // TBN_SWITCHBAR rubidium@8723: { WIDGETS_END}, rubidium@8723: }; rubidium@8723: rubidium@8723: static const WindowDesc _toolb_normal_desc = { belugas@9601: 0, 0, 0, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT, rubidium@8723: WC_MAIN_TOOLBAR, WC_NONE, rubidium@8723: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET, rubidium@8723: _toolb_normal_widgets, rubidium@8723: }; rubidium@8723: rubidium@8723: rubidium@8975: /* --- Toolbar handling for the scenario editor */ rubidium@8975: rubidium@8723: static ToolbarButtonProc * const _scen_toolbar_button_procs[] = { rubidium@8723: ToolbarPauseClick, rubidium@8723: ToolbarFastForwardClick, rubidium@8723: ToolbarOptionsClick, rubidium@8723: ToolbarScenSaveOrLoad, rubidium@8723: ToolbarBtn_NULL, rubidium@8723: ToolbarBtn_NULL, rubidium@8723: ToolbarScenDateBackward, rubidium@8723: ToolbarScenDateForward, rubidium@8723: ToolbarScenMapTownDir, belugas@9614: ToolbarZoomInClick, belugas@9614: ToolbarZoomOutClick, rubidium@8723: ToolbarScenGenLand, rubidium@8723: ToolbarScenGenTown, rubidium@8723: ToolbarScenGenIndustry, rubidium@8723: ToolbarScenBuildRoad, skidd13@9588: ToolbarScenBuildDocks, rubidium@8723: ToolbarScenPlantTrees, rubidium@8723: ToolbarScenPlaceSign, rubidium@8723: NULL, rubidium@8723: NULL, rubidium@8723: NULL, rubidium@8723: NULL, rubidium@8723: NULL, rubidium@8723: NULL, rubidium@8723: ToolbarMusicClick, rubidium@8723: NULL, rubidium@8723: ToolbarHelpClick, rubidium@8723: }; rubidium@8723: rubidium@9305: struct ScenarioEditorToolbarWindow : Window { belugas@9513: public: rubidium@9305: ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window(desc) rubidium@9305: { rubidium@9305: CLRBITS(this->flags4, WF_WHITE_BORDER_MASK); rubidium@8723: smatz@9311: this->FindWindowPlacementAndResize(desc); rubidium@9305: PositionMainToolbar(this); rubidium@9305: DoZoomInOutWindow(ZOOM_NONE, this); rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnPaint() rubidium@9305: { belugas@9513: this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_newgame.game_creation.starting_year <= MIN_YEAR); belugas@9513: this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_newgame.game_creation.starting_year >= MAX_YEAR); rubidium@8723: rubidium@9305: /* Draw brown-red toolbar bg. */ rubidium@9305: GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2); frosch@9607: GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER); rubidium@9305: rubidium@9305: this->DrawWidgets(); rubidium@9305: rubidium@9354: SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); belugas@9513: DrawStringCenteredTruncated(this->widget[TBSE_DATEBACKWARD].right, this->widget[TBSE_DATEFORWARD].left, 6, STR_00AF, TC_FROMSTRING); rubidium@9305: rubidium@9305: /* We hide this panel when the toolbar space gets too small */ belugas@9513: const Widget *panel = &this->widget[TBSE_SPACERPANEL]; belugas@9513: if (panel->left != panel->right) { belugas@9513: DrawStringCenteredTruncated(panel->left + 1, panel->right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING); belugas@9513: DrawStringCenteredTruncated(panel->left + 1, panel->right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING); rubidium@9305: } rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnClick(Point pt, int widget) rubidium@9305: { rubidium@9305: if (_game_mode == GM_MENU) return; rubidium@9305: _scen_toolbar_button_procs[widget](this); rubidium@9305: } rubidium@9305: peter1138@10016: virtual void OnDropdownSelect(int widget, int index) peter1138@10016: { peter1138@10016: /* The map button is in a different location on the scenario peter1138@10016: * editor toolbar, so we need to adjust for it. */ peter1138@10016: if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP; peter1138@10016: _menu_clicked_procs[widget](index); peter1138@10016: SndPlayFx(SND_15_BEEP); peter1138@10016: } peter1138@10016: rubidium@9305: virtual EventState OnKeyPress(uint16 key, uint16 keycode) rubidium@9305: { rubidium@9305: switch (keycode) { rubidium@9305: case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break; rubidium@9305: case WKC_F2: ShowGameOptions(); break; belugas@9610: case WKC_F3: MenuClickSaveLoad(); break; rubidium@9305: case WKC_F4: ToolbarScenGenLand(this); break; rubidium@9305: case WKC_F5: ToolbarScenGenTown(this); break; rubidium@9305: case WKC_F6: ToolbarScenGenIndustry(this); break; rubidium@9305: case WKC_F7: ToolbarScenBuildRoad(this); break; skidd13@9588: case WKC_F8: ToolbarScenBuildDocks(this); break; skidd13@9588: case WKC_F9: ToolbarScenPlantTrees(this); break; skidd13@9588: case WKC_F10: ToolbarScenPlaceSign(this); break; skidd13@9588: case WKC_F11: ShowMusicWindow(); break; skidd13@9588: case WKC_F12: PlaceLandBlockInfo(); break; rubidium@9305: case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; rubidium@9305: case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; rubidium@9305: rubidium@9305: /* those following are all fall through */ rubidium@9305: case WKC_NUM_PLUS: rubidium@9305: case WKC_EQUALS: rubidium@9305: case WKC_SHIFT | WKC_EQUALS: belugas@9614: case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break; rubidium@9305: rubidium@9305: /* those following are all fall through */ rubidium@9305: case WKC_NUM_MINUS: rubidium@9305: case WKC_MINUS: rubidium@9305: case WKC_SHIFT | WKC_MINUS: belugas@9614: case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break; rubidium@9305: rubidium@9305: case 'L': ShowEditorTerraformToolbar(); break; rubidium@9305: case 'M': ShowSmallMap(); break; rubidium@9305: case 'V': ShowExtraViewPortWindow(); break; rubidium@9305: default: return ES_NOT_HANDLED; rubidium@9305: } rubidium@9305: return ES_HANDLED; rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnPlaceObject(Point pt, TileIndex tile) rubidium@9305: { rubidium@9305: _place_proc(tile); rubidium@9305: } rubidium@9305: rubidium@9305: virtual void OnResize(Point new_size, Point delta) rubidium@9305: { belugas@9601: /* There are 16 buttons plus some spacings if the space allows it. rubidium@9305: * Furthermore there are two panels of which one is non - essential belugas@9601: * and that one can be removed if the space is too small. */ rubidium@9305: uint buttons_width; rubidium@9305: uint spacing; rubidium@9305: belugas@9601: static const int normal_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + (2 * TBP_DATEPANELWIDTH); belugas@9601: static const int one_less_panel_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + TBP_DATEPANELWIDTH; rubidium@9305: rubidium@9305: if (this->width >= one_less_panel_min_width) { belugas@9601: buttons_width = TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH; rubidium@9305: spacing = this->width - ((this->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width); rubidium@9305: } else { belugas@9601: buttons_width = this->width - TBP_DATEPANELWIDTH; rubidium@9305: spacing = 0; rubidium@9305: } skidd13@9588: static const uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 17, 0 }; rubidium@9305: belugas@9545: for (uint i = 0, x = 0, j = 0, b = 0; i < this->widget_count; i++) { rubidium@9305: switch (i) { belugas@9546: case TBSE_SPACERPANEL: rubidium@9305: this->widget[i].left = x; rubidium@9305: if (this->width < normal_min_width) { rubidium@9305: this->widget[i].right = x; rubidium@9305: j++; rubidium@9305: continue; rubidium@9305: } rubidium@9305: belugas@9601: x += TBP_DATEPANELWIDTH; rubidium@9305: this->widget[i].right = x - 1; rubidium@9305: break; rubidium@9305: belugas@9599: case TBSE_DATEPANEL: { rubidium@9305: int offset = x - this->widget[i].left; rubidium@9305: this->widget[i + 1].left += offset; rubidium@9305: this->widget[i + 1].right += offset; rubidium@9305: this->widget[i + 2].left += offset; rubidium@9305: this->widget[i + 2].right += offset; rubidium@9305: this->widget[i].left = x; belugas@9601: x += TBP_DATEPANELWIDTH; rubidium@9305: this->widget[i].right = x - 1; rubidium@9305: i += 2; rubidium@9305: } break; rubidium@9305: rubidium@9305: default: rubidium@9305: if (this->widget[i].bottom == 0) continue; rubidium@9305: rubidium@9305: this->widget[i].left = x; belugas@9601: x += buttons_width / (TBP_SCENARIO_MAXBUTTON - b); rubidium@9305: this->widget[i].right = x - 1; belugas@9601: buttons_width -= buttons_width / (TBP_SCENARIO_MAXBUTTON - b); rubidium@9305: b++; rubidium@9305: break; rubidium@8723: } rubidium@8723: rubidium@9305: if (extra_spacing_at[j] == i) { rubidium@9305: j++; rubidium@9305: uint add = spacing / (lengthof(extra_spacing_at) - j); rubidium@9305: spacing -= add; rubidium@9305: x += add; rubidium@8723: } rubidium@9305: } rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnTick() rubidium@9305: { belugas@9513: if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_game) { belugas@9513: this->ToggleWidgetLoweredState(TBSE_PAUSE); rubidium@9305: this->SetDirty(); rubidium@9305: } rubidium@8723: belugas@9513: if (this->IsWidgetLowered(TBSE_FASTFORWARD) != !!_fast_forward) { belugas@9513: this->ToggleWidgetLoweredState(TBSE_FASTFORWARD); rubidium@9305: this->SetDirty(); rubidium@9305: } rubidium@9305: } rubidium@8723: rubidium@9305: virtual void OnInvalidateData(int data) rubidium@9305: { belugas@9513: if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBSE_ZOOMIN, TBSE_ZOOMOUT); rubidium@8723: } rubidium@9305: }; rubidium@8723: rubidium@8723: static const Widget _toolb_scen_widgets[] = { belugas@9778: { WWT_IMGBTN, RESIZE_LEFT, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, // TBSE_PAUSE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, // TBSE_FASTFORWARD belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, belugas@9778: {WWT_IMGBTN_2, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO}, // TBSE_SAVESCENARIO belugas@9600: belugas@9778: { WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, 0x0, STR_NULL}, // TBSE_SPACERPANEL rubidium@8723: belugas@9778: { WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 129, 0, 21, 0x0, STR_NULL}, // TBSE_DATEPANEL belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE}, // TBSE_DATEBACKWARD belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE}, // TBSE_DATEFORWARD belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY}, // TBSE_SMALLMAP belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, // TBSE_ZOOMIN belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, // TBSE_ZOOMOUT belugas@9778: belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION}, // TBSE_LANDGENERATE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION}, // TBSE_TOWNGENERATE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION}, // TBSE_INDUSTRYGENERATE belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION}, // TBSE_BUILDROAD belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, // TBSE_BUILDDOCKS belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES}, // TBSE_PLANTTREES belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN}, // TBSE_PLACESIGNS belugas@9778: belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, belugas@9778: { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, belugas@9778: { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, rubidium@8723: {WIDGETS_END}, rubidium@8723: }; rubidium@8723: rubidium@8723: static const WindowDesc _toolb_scen_desc = { belugas@9601: 0, 0, 130, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT, rubidium@8723: WC_MAIN_TOOLBAR, WC_NONE, rubidium@8723: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, rubidium@8723: _toolb_scen_widgets, rubidium@8723: }; rubidium@8723: rubidium@8975: /* --- Allocating the toolbar --- */ rubidium@8975: rubidium@9240: void AllocateToolbar() rubidium@8723: { rubidium@9014: /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */ rubidium@8975: _last_built_roadtype = ROADTYPE_ROAD; rubidium@8975: rubidium@9305: if (_game_mode == GM_EDITOR) { rubidium@9305: new ScenarioEditorToolbarWindow(&_toolb_scen_desc);; rubidium@9305: } else { rubidium@9305: new MainToolbarWindow(&_toolb_normal_desc); rubidium@9305: } rubidium@8723: }