diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index 2c8cbd51..267b73c4 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -126,7 +126,9 @@ namespace Vocaluxe.Base { [DefaultValue(CSettings.FallbackLanguage)] public string Language; public string[] SongFolder; + // ReSharper disable MemberHidesStaticFromOuterClass [DefaultValue(ESongMenu.TR_CONFIG_TILE_BOARD)] public ESongMenu SongMenu; + // ReSharper restore MemberHidesStaticFromOuterClass [DefaultValue(ESongSorting.TR_CONFIG_ARTIST)] public ESongSorting SongSorting; [DefaultValue(EOffOn.TR_CONFIG_ON)] public EOffOn IgnoreArticles; [DefaultValue(10)] public float ScoreAnimationTime; @@ -181,6 +183,7 @@ namespace Vocaluxe.Base public static SConfig Config; public static bool LoadOldThemeFiles; + public static event OnSongMenuChanged SongMenuChanged; //Folders public static readonly List SongFolders = new List @@ -273,6 +276,19 @@ namespace Vocaluxe.Base } } + public static ESongMenu SongMenu + { + get { return Config.Game.SongMenu; } + set + { + if (Config.Game.SongMenu == value) + return; + Config.Game.SongMenu = value; + if (SongMenuChanged != null) + SongMenuChanged(); + } + } + public static void Init() { if (_Initialized) diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index 320b8697..58f140bc 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -88,7 +88,7 @@ namespace Vocaluxe.Base public ESongMenu GetSongMenuType() { - return CConfig.Config.Game.SongMenu; + return CConfig.SongMenu; } public EOffOn GetVideosToBackground() @@ -155,6 +155,11 @@ namespace Vocaluxe.Base { return CConfig.LoadOldThemeFiles; } + + public void AddSongMenuListener(OnSongMenuChanged onSongMenuChanged) + { + CConfig.SongMenuChanged += onSongMenuChanged; + } } class CBsettings : ISettings diff --git a/Vocaluxe/Screens/CScreenOptionsGame.cs b/Vocaluxe/Screens/CScreenOptionsGame.cs index ce71f532..40729730 100644 --- a/Vocaluxe/Screens/CScreenOptionsGame.cs +++ b/Vocaluxe/Screens/CScreenOptionsGame.cs @@ -56,7 +56,7 @@ namespace Vocaluxe.Screens _SelectSlides[_SelectSlideLanguage].Selection = CLanguage.LanguageId; _SelectSlides[_SelectSlideDebugLevel].SetValues((int)CConfig.Config.Debug.DebugLevel); - _SelectSlides[_SelectSlideSongMenu].SetValues((int)CConfig.Config.Game.SongMenu); + _SelectSlides[_SelectSlideSongMenu].SetValues((int)CConfig.SongMenu); _SelectSlides[_SelectSlideSongSorting].SetValues((int)CConfig.Config.Game.SongSorting); _SelectSlides[_SelectSlideTabs].SetValues((int)CConfig.Config.Game.Tabs); _SelectSlides[_SelectSlideTimerMode].SetValues((int)CConfig.Config.Game.TimerMode); @@ -136,7 +136,7 @@ namespace Vocaluxe.Screens CLanguage.LanguageId = _SelectSlides[_SelectSlideLanguage].Selection; CConfig.Config.Game.Language = _SelectSlides[_SelectSlideLanguage].Value; CConfig.Config.Debug.DebugLevel = (EDebugLevel)_SelectSlides[_SelectSlideDebugLevel].Selection; - CConfig.Config.Game.SongMenu = (ESongMenu)_SelectSlides[_SelectSlideSongMenu].Selection; + CConfig.SongMenu = (ESongMenu)_SelectSlides[_SelectSlideSongMenu].Selection; CConfig.Config.Game.SongSorting = (ESongSorting)_SelectSlides[_SelectSlideSongSorting].Selection; CConfig.Config.Game.Tabs = (EOffOn)_SelectSlides[_SelectSlideTabs].Selection; CConfig.Config.Game.TimerMode = (ETimerMode)_SelectSlides[_SelectSlideTimerMode].Selection; diff --git a/VocaluxeLib/IBasic.cs b/VocaluxeLib/IBasic.cs index 5262668b..c3f1fbc1 100644 --- a/VocaluxeLib/IBasic.cs +++ b/VocaluxeLib/IBasic.cs @@ -27,6 +27,7 @@ using VocaluxeLib.Songs; namespace VocaluxeLib { + public delegate void OnSongMenuChanged(); public interface IConfig { EOffOn GetSaveModifiedSongs(); @@ -58,6 +59,7 @@ namespace VocaluxeLib int GetMaxNumMics(); bool GetLoadOldThemeFiles(); + void AddSongMenuListener(OnSongMenuChanged onSongMenuChanged); } public interface ISettings diff --git a/VocaluxeLib/Menu/CMenu.cs b/VocaluxeLib/Menu/CMenu.cs index dfc66cce..4c100a12 100644 --- a/VocaluxeLib/Menu/CMenu.cs +++ b/VocaluxeLib/Menu/CMenu.cs @@ -201,7 +201,7 @@ namespace VocaluxeLib.Menu _AddSingNote(new CSingNotes(sb, PartyModeID), sb.Name); foreach (SThemeSongMenu sm in Theme.SongMenus) - _AddSongMenu(CSongMenuFactory.CreateSongMenu(sm, PartyModeID), sm.Name); + _AddSongMenu(new CSongMenu(sm, PartyModeID), sm.Name); foreach (SThemeStatic st in Theme.Statics) _AddStatic(new CStatic(st, PartyModeID), st.Name); @@ -258,14 +258,7 @@ namespace VocaluxeLib.Menu _LoadThemeElement(_ThemeTexts, _AddText, xmlReader); _LoadThemeElement(_ThemeButtons, _AddButton, xmlReader); _LoadThemeElement(_ThemeSelectSlides, _AddSelectSlide, xmlReader); - foreach (string elName in _ThemeSongMenus) - { - ISongMenu element = CSongMenuFactory.CreateSongMenu(PartyModeID); - if (element.LoadTheme("//root/" + ThemeName, elName, xmlReader)) - _AddSongMenu(element, elName); - else - CBase.Log.LogError("Can't load songmenu \"" + elName + "\" in screen " + ThemeName); - } + _LoadThemeElement(_ThemeSongMenus, _AddSongMenu, xmlReader); _LoadThemeElement(_ThemeSongMenus, _AddSongMenu, xmlReader); _LoadThemeElement(_ThemeLyrics, _AddLyric, xmlReader); _LoadThemeElement(_ThemeSingNotes, _AddSingNote, xmlReader); diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenu.cs b/VocaluxeLib/Menu/SongMenu/CSongMenu.cs new file mode 100644 index 00000000..7dfd0dad --- /dev/null +++ b/VocaluxeLib/Menu/SongMenu/CSongMenu.cs @@ -0,0 +1,238 @@ +#region license +// This file is part of Vocaluxe. +// +// Vocaluxe is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Vocaluxe is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Vocaluxe. If not, see . +#endregion + +using System; +using VocaluxeLib.PartyModes; +using VocaluxeLib.Xml; + +namespace VocaluxeLib.Menu.SongMenu +{ + public class CSongMenu : ISongMenu + { + private readonly int _PartyModeID; + private ISongMenu _SongMenu; + + /// + /// Deprecated! Only used for old theme loading. + /// + /// + public CSongMenu(int partyModeID) + { + _PartyModeID = partyModeID; + _SongMenu = new CSongMenuTileBoard(partyModeID); + } + + public CSongMenu(SThemeSongMenu theme, int partyModeID) + { + _PartyModeID = partyModeID; + _CreateSongMenu(theme); + CBase.Config.AddSongMenuListener(_OnSongMenuChanged); + } + + #region ISongMenu + public bool SmallView + { + get { return _SongMenu.SmallView; } + set { _SongMenu.SmallView = value; } + } + + public void Update(SScreenSongOptions songOptions) + { + _SongMenu.Update(songOptions); + } + + public void OnShow() + { + _SongMenu.OnShow(); + } + + public void OnHide() + { + _SongMenu.OnHide(); + } + + public bool HandleInput(ref SKeyEvent keyEvent, SScreenSongOptions options) + { + return _SongMenu.HandleInput(ref keyEvent, options); + } + + public bool HandleMouse(ref SMouseEvent mouseEvent, SScreenSongOptions songOptions) + { + return _SongMenu.HandleMouse(ref mouseEvent, songOptions); + } + + public void Draw() + { + _SongMenu.Draw(); + } + + public bool IsMouseOverSelectedSong(SMouseEvent mEvent) + { + return _SongMenu.IsMouseOverSelectedSong(mEvent); + } + + public int GetPreviewSongNr() + { + return _SongMenu.GetPreviewSongNr(); + } + + public int GetSelectedSongNr() + { + return _SongMenu.GetSelectedSongNr(); + } + + public CStatic GetSelectedSongCover() + { + return _SongMenu.GetSelectedSongCover(); + } + + public void SetSelectedSong(int visibleSongNr) + { + _SongMenu.SetSelectedSong(visibleSongNr); + } + + public int GetSelectedCategory() + { + return _SongMenu.GetSelectedCategory(); + } + + public void SetSelectedCategory(int categoryNr) + { + _SongMenu.SetSelectedCategory(categoryNr); + } + + public bool EnterSelectedCategory() + { + return _SongMenu.EnterSelectedCategory(); + } + + public int GetPreviewSong() + { + return _SongMenu.GetPreviewSong(); + } + #endregion ISongMenu + + #region IMenuElement + public bool Highlighted + { + get { return _SongMenu.Highlighted; } + set { _SongMenu.Highlighted = value; } + } + public bool Selected + { + get { return _SongMenu.Selected; } + set { _SongMenu.Selected = value; } + } + + public bool Selectable + { + get { return _SongMenu.Selectable; } + } + public bool Visible + { + get { return _SongMenu.Visible; } + set { _SongMenu.Visible = value; } + } + + public SRectF Rect + { + get { return _SongMenu.Rect; } + } + public SRectF MaxRect + { + get { return _SongMenu.MaxRect; } + set { _SongMenu.MaxRect = value; } + } + #endregion IMenuElement + + #region IThemeable + public string GetThemeName() + { + return _SongMenu.GetThemeName(); + } + + public object GetTheme() + { + return _SongMenu.GetTheme(); + } + + public bool ThemeLoaded + { + get { return _SongMenu.ThemeLoaded; } + } + + public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader) + { + return _SongMenu.LoadTheme(xmlPath, elementName, xmlReader); + } + + public void UnloadSkin() + { + _SongMenu.UnloadSkin(); + } + + public void LoadSkin() + { + _SongMenu.LoadSkin(); + } + + public void ReloadSkin() + { + _SongMenu.ReloadSkin(); + } + + public void MoveElement(int stepX, int stepY) + { + _SongMenu.MoveElement(stepX, stepY); + } + + public void ResizeElement(int stepW, int stepH) + { + _SongMenu.ResizeElement(stepW, stepH); + } + #endregion IThemeable + + private void _OnSongMenuChanged() + { + _CreateSongMenu((SThemeSongMenu)_SongMenu.GetTheme()); + _SongMenu.LoadSkin(); + } + + private void _CreateSongMenu(SThemeSongMenu theme) + { + switch (CBase.Config.GetSongMenuType()) + { + case ESongMenu.TR_CONFIG_LIST: + _SongMenu = new CSongMenuList(theme, _PartyModeID); + break; + + //case ESongMenu.TR_CONFIG_DREIDEL: + // _SongMenu = new CSongMenuDreidel(); + // break; + case ESongMenu.TR_CONFIG_TILE_BOARD: + _SongMenu = new CSongMenuTileBoard(theme, _PartyModeID); + break; + + //case ESongMenu.TR_CONFIG_BOOK: + // _SongMenu = new CSongMenuBook(); + // break; + default: + throw new ArgumentException("Invalid songmenu type: " + CBase.Config.GetSongMenuType()); + } + } + } +} \ No newline at end of file diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs deleted file mode 100644 index a74d4913..00000000 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFactory.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region license -// This file is part of Vocaluxe. -// -// Vocaluxe is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Vocaluxe is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Vocaluxe. If not, see . -#endregion - -using System; - -namespace VocaluxeLib.Menu.SongMenu -{ - public static class CSongMenuFactory - { - public static ISongMenu CreateSongMenu(SThemeSongMenu theme, int partyModeID) - { - switch (CBase.Config.GetSongMenuType()) - { - case ESongMenu.TR_CONFIG_LIST: - return new CSongMenuList(theme, partyModeID); - - //case ESongMenu.TR_CONFIG_DREIDEL: - // _SongMenu = new CSongMenuDreidel(); - // break; - case ESongMenu.TR_CONFIG_TILE_BOARD: - return new CSongMenuTileBoard(theme, partyModeID); - - //case ESongMenu.TR_CONFIG_BOOK: - // _SongMenu = new CSongMenuBook(); - // break; - } - throw new ArgumentException("Invalid songmenu type: " + CBase.Config.GetSongMenuType()); - } - - /// - /// Deprecated! Only used for old theme loading. - /// - /// - /// - public static ISongMenu CreateSongMenu(int partyModeID) - { - switch (CBase.Config.GetSongMenuType()) - { - //case ESongMenu.TR_CONFIG_LIST: - // _SongMenu = new CSongMenuList(); - // break; - - //case ESongMenu.TR_CONFIG_DREIDEL: - // _SongMenu = new CSongMenuDreidel(); - // break; - case ESongMenu.TR_CONFIG_TILE_BOARD: - return new CSongMenuTileBoard(partyModeID); - - //case ESongMenu.TR_CONFIG_BOOK: - // _SongMenu = new CSongMenuBook(); - // break; - } - throw new ArgumentException("Invalid songmenu type: " + CBase.Config.GetSongMenuType()); - } - } -} \ No newline at end of file diff --git a/VocaluxeLib/VocaluxeLib.csproj b/VocaluxeLib/VocaluxeLib.csproj index 3eb458fa..5b6cec3f 100644 --- a/VocaluxeLib/VocaluxeLib.csproj +++ b/VocaluxeLib/VocaluxeLib.csproj @@ -108,6 +108,7 @@ + @@ -128,7 +129,6 @@ -