diff --git a/Vocaluxe/Base/CCover.cs b/Vocaluxe/Base/CCover.cs index 2ebc6963..e4cebe8e 100644 --- a/Vocaluxe/Base/CCover.cs +++ b/Vocaluxe/Base/CCover.cs @@ -17,16 +17,14 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks; -using System.Windows.Forms; -using System.Xml.Serialization; +using System.Xml; +using System.Linq; using VocaluxeLib; using VocaluxeLib.Draw; -using VocaluxeLib.Menu; using VocaluxeLib.Songs; using VocaluxeLib.Xml; @@ -61,14 +59,7 @@ namespace Vocaluxe.Base /// public static string[] CoverThemes { - get - { - var coverThemes = new List(); - for (int i = 0; i < _CoverThemes.Count; i++) - coverThemes.Add(_CoverThemes[i].Name); - - return coverThemes.ToArray(); - } + get { return _CoverThemes.Select(th => th.Info.Name).ToArray(); } } /// @@ -79,7 +70,7 @@ namespace Vocaluxe.Base { for (int i = 0; i < _CoverThemes.Count; i++) { - if (_CoverThemes[i].Name == CConfig.Config.Theme.CoverTheme) + if (_CoverThemes[i].Info.Name == CConfig.Config.Theme.CoverTheme) return i; } return -1; @@ -164,48 +155,12 @@ namespace Vocaluxe.Base { for (int i = 0; i < _CoverThemes.Count; i++) { - if (_CoverThemes[i].Name == coverThemeName) + if (_CoverThemes[i].Info.Name == coverThemeName) return _CoverThemes[i]; } return new SThemeCover(); } - private static void Foo(SThemeScreen a, SThemeScreen b) - { - a = b; - } - - private static void _TestNewLoad(string path) - { - SThemeCover themeCover; - var xml = new CXmlSerializer(); - themeCover = xml.Deserialize(path); - string cover = themeCover.Info.Author; - SThemeScreen theme = new SThemeScreen(); - SThemeScreen theme2 = new SThemeScreen(); - Stopwatch watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < 1; i++) - theme = xml.Deserialize(Path.Combine(CBase.Themes.GetThemeScreensPath(-1), "ScreenMain.xml")); - watch.Stop(); - xml.Serialize(Path.Combine(CBase.Themes.GetThemeScreensPath(-1), "ScreenMain2.xml"), theme); - return; - Stopwatch watch2 = new Stopwatch(); - watch2.Start(); - for (int i = 0; i < 100; i++) - { - using (TextReader textReader = new StreamReader(Path.Combine(CBase.Themes.GetThemeScreensPath(-1), "ScreenMain.xml"))) - { - XmlSerializer deserializer = new XmlSerializer(typeof(STheme)); - - theme2 = (SThemeScreen)deserializer.Deserialize(textReader); - } - } - watch2.Stop(); - Foo(theme, theme2); - MessageBox.Show(watch.ElapsedMilliseconds + "ms/5000=" + watch.ElapsedMilliseconds / 1000 + "ms vs " + watch2.ElapsedMilliseconds / 100); - } - /// /// Loads all cover-themes to list. /// @@ -213,27 +168,27 @@ namespace Vocaluxe.Base { _CoverThemes.Clear(); - string path = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameCover); - List files = CHelper.ListFiles(path, "*.xml"); + string folderPath = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameCover); + List files = CHelper.ListFiles(folderPath, "*.xml"); + var xml = new CXmlDeserializer(); foreach (string file in files) { - _TestNewLoad(Path.Combine(path, file)); - CXMLReader xmlReader = CXMLReader.OpenFile(Path.Combine(path, file)); - - if (xmlReader != null) + SThemeCover theme; + try { - var coverTheme = new SThemeCover(); + theme = xml.Deserialize(Path.Combine(folderPath, file)); + } + catch (XmlException e) + { + CLog.LogError("Error loading cover theme " + file + ": " + e.Message); + continue; + } - xmlReader.GetValue("//root/Info/Name", out coverTheme.Name, String.Empty); - xmlReader.GetValue("//root/Info/Folder", out coverTheme.Folder, String.Empty); - - if (coverTheme.Folder != "" && coverTheme.Name != "") - { - coverTheme.FilePath = xmlReader.FilePath; - - _CoverThemes.Add(coverTheme); - } + if (theme.Info.Folder != "" && theme.Info.Name != "") + { + theme.FolderPath = Path.Combine(folderPath, theme.Info.Folder); + _CoverThemes.Add(theme); } } } @@ -245,11 +200,10 @@ namespace Vocaluxe.Base { SThemeCover coverTheme = _CoverTheme(coverThemeName); - if (String.IsNullOrEmpty(coverTheme.Name)) + if (String.IsNullOrEmpty(coverTheme.Info.Name)) return; - string coverPath = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameCover, coverTheme.Folder); - List files = CHelper.ListImageFiles(coverPath, true, true); + List files = CHelper.ListImageFiles(coverTheme.FolderPath, true, true); lock (_Covers) { @@ -297,22 +251,14 @@ namespace Vocaluxe.Base private static void _LoadCoverGenerators(SThemeCover coverTheme) { - CXMLReader xmlReader = CXMLReader.OpenFile(coverTheme.FilePath); - string coverPath = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameCover, coverTheme.Folder); lock (_CoverGenerators) { - int i = 1; - while (xmlReader.ItemExists("//root/CoverGenerator" + i)) + foreach (SThemeCoverGenerator theme in coverTheme.CoverGenerators) { - SThemeCoverGenerator theme; - if (xmlReader.Read("//root/CoverGenerator" + i, out theme)) - { - if (_CoverGenerators.ContainsKey(theme.Type)) - continue; - CCoverGenerator el = new CCoverGenerator(theme, coverPath); - _CoverGenerators.Add(theme.Type, el); - } - i++; + if (_CoverGenerators.ContainsKey(theme.Type)) + continue; + CCoverGenerator el = new CCoverGenerator(theme, coverTheme.FolderPath); + _CoverGenerators.Add(theme.Type, el); } } } diff --git a/Vocaluxe/Base/CLanguage.cs b/Vocaluxe/Base/CLanguage.cs index 9f529b4f..d6b1cbe4 100644 --- a/Vocaluxe/Base/CLanguage.cs +++ b/Vocaluxe/Base/CLanguage.cs @@ -27,7 +27,7 @@ namespace Vocaluxe.Base struct SLanguage { public string Name; - public string LanguageFilePath; + public string FilePath; public Dictionary Texts; public List PartyModeTexts; @@ -41,7 +41,7 @@ namespace Vocaluxe.Base static class CLanguage { - private static List _Languages; + private static readonly List _Languages = new List(); private static int _CurrentLanguage = -1; private static int _FallbackLanguage; @@ -55,11 +55,6 @@ namespace Vocaluxe.Base } } - public static string GetLanguageName(int lang) - { - return _Languages[lang].Name; - } - public static IEnumerable GetLanguageNames() { var languages = new string[_Languages.Count]; @@ -72,8 +67,6 @@ namespace Vocaluxe.Base public static bool Init() { - _Languages = new List(); - var files = new List(); files.AddRange(CHelper.ListFiles(CSettings.FolderNameLanguages, "*.xml", true, true)); @@ -84,7 +77,7 @@ namespace Vocaluxe.Base public static bool SetLanguage(string language) { - int nr = GetLanguageNr(language); + int nr = _GetLanguageNr(language); if (nr != -1) { _CurrentLanguage = nr; @@ -93,7 +86,7 @@ namespace Vocaluxe.Base return false; } - public static int GetLanguageNr(string language) + private static int _GetLanguageNr(string language) { for (int i = 0; i < _Languages.Count; i++) { @@ -103,59 +96,58 @@ namespace Vocaluxe.Base return -1; } - public static string Translate(string keyWord, int partyModeID = -1) + /// + /// Checks if a translation exists and returns it + /// + /// Word to translate + /// + /// Translated word or keyWord if translation does not exist + /// True if word was translated + private static bool _GetTranslation(string keyWord, int partyModeID, out string translation) { if (keyWord == null) - return "Error"; - - if (keyWord.Length < 3 || keyWord.Substring(0, 3) != "TR_") - return keyWord; - - string result; - if (partyModeID != -1) { - int partyModeNr = _GetPartyModeNr(partyModeID, _CurrentLanguage); - if (partyModeNr != -1 && _Languages[_CurrentLanguage].PartyModeTexts[partyModeNr].Texts.TryGetValue(keyWord, out result)) - return result; - - partyModeNr = _GetPartyModeNr(partyModeID, _FallbackLanguage); - if (partyModeNr != -1 && _Languages[_CurrentLanguage].PartyModeTexts[partyModeNr].Texts.TryGetValue(keyWord, out result)) - return result; + translation = "Error"; + return false; } - if (_Languages[_CurrentLanguage].Texts.TryGetValue(keyWord, out result)) - return result; - if (_Languages[_FallbackLanguage].Texts.TryGetValue(keyWord, out result)) - return result; + if (keyWord.Length < 3 || keyWord.Substring(0, 3) != "TR_") + { + translation = keyWord; + return false; + } - return keyWord; + if (partyModeID != -1) + { + Dictionary partyModeTexts = _GetPartyModeTexts(_CurrentLanguage, partyModeID); + if (partyModeTexts != null && partyModeTexts.TryGetValue(keyWord, out translation)) + return true; + + partyModeTexts = _GetPartyModeTexts(_FallbackLanguage, partyModeID); + if (partyModeTexts != null && partyModeTexts.TryGetValue(keyWord, out translation)) + return true; + } + + if (_Languages[_CurrentLanguage].Texts.TryGetValue(keyWord, out translation)) + return true; + if (_Languages[_FallbackLanguage].Texts.TryGetValue(keyWord, out translation)) + return true; + + translation = keyWord; + return false; + } + + public static string Translate(string keyWord, int partyModeID = -1) + { + string translation; + _GetTranslation(keyWord, partyModeID, out translation); + return translation; } public static bool TranslationExists(string keyWord, int partyModeID = -1) { - if (keyWord == null) - return false; - - if (keyWord.Length < 3 || keyWord.Substring(0, 3) != "TR_") - return false; - - if (partyModeID != -1) - { - int partyModeNr = _GetPartyModeNr(partyModeID, _CurrentLanguage); - if (partyModeNr != -1 && _Languages[_CurrentLanguage].PartyModeTexts[partyModeNr].Texts.ContainsKey(keyWord)) - return true; - - partyModeNr = _GetPartyModeNr(partyModeID, _FallbackLanguage); - if (partyModeNr != -1 && _Languages[_CurrentLanguage].PartyModeTexts[partyModeNr].Texts.ContainsKey(keyWord)) - return true; - } - - if (_Languages[_CurrentLanguage].Texts.ContainsKey(keyWord)) - return true; - if (_Languages[_FallbackLanguage].Texts.ContainsKey(keyWord)) - return true; - - return false; + string translation; + return _GetTranslation(keyWord, partyModeID, out translation); } public static bool LoadPartyLanguageFiles(int partyModeID, string path) @@ -166,89 +158,60 @@ namespace Vocaluxe.Base return files.All(file => _LoadPartyLanguageFile(partyModeID, file)); } - private static bool _LoadLanguageEntries(CXMLReader xmlReader, out Dictionary texts) + private static bool _LoadLanguageEntries(string filePath, out Dictionary texts) { - texts = new Dictionary(); - IEnumerable names = xmlReader.GetAttributes("//resources/string", "name"); - foreach (string name in names) + var deser = new CXmlDeserializer(); + try { - string value; - if (!xmlReader.GetValue("//resources/string[@name='" + name + "']", out value, "")) - continue; - try - { - texts.Add(name, value); - } - catch (Exception e) - { - CLog.LogError("Error reading language file " + xmlReader.FilePath + ": " + e.Message); - return false; - } + texts = deser.Deserialize>(filePath); + string language; + if (!texts.TryGetValue("language", out language)) + throw new Exception("'language' entry is missing"); + } + catch (Exception e) + { + CLog.LogError("Error reading language file " + filePath + ": " + e.Message); + texts = null; + return false; } return true; } - private static bool _LoadPartyLanguageFile(int partyModeID, string file) + private static bool _LoadPartyLanguageFile(int partyModeID, string filePath) { - CXMLReader xmlReader = CXMLReader.OpenFile(file); - if (xmlReader == null) + var lang = new SPartyLanguage {PartyModeID = partyModeID}; + + if (!_LoadLanguageEntries(filePath, out lang.Texts)) return false; - string value = string.Empty; - if (xmlReader.GetValue("//resources/string[@name='language']", out value, value)) - { - int nr = GetLanguageNr(value); - - if (nr == -1) - return true; - - var lang = new SPartyLanguage {PartyModeID = partyModeID}; - if (!_LoadLanguageEntries(xmlReader, out lang.Texts)) - return false; + int nr = _GetLanguageNr(lang.Texts["language"]); + if (nr >= 0) _Languages[nr].PartyModeTexts.Add(lang); - return true; - } - CLog.LogError("Error reading Party Language File " + file); - return false; + return true; } private static void _LoadLanguageFile(string fileName) { - var lang = new SLanguage {LanguageFilePath = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameLanguages, fileName)}; - - CXMLReader xmlReader = CXMLReader.OpenFile(lang.LanguageFilePath); - if (xmlReader == null) + var lang = new SLanguage {FilePath = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameLanguages, fileName), PartyModeTexts = new List()}; + if (!_LoadLanguageEntries(lang.FilePath, out lang.Texts)) return; - string value = string.Empty; - if (xmlReader.GetValue("//resources/string[@name='language']", out value, value)) + lang.Name = lang.Texts["language"]; + if (lang.Name == CSettings.FallbackLanguage) { - lang.Name = value; - - if (lang.Name == CSettings.FallbackLanguage) - { - _FallbackLanguage = _Languages.Count; - if (_CurrentLanguage < 0) - _CurrentLanguage = _FallbackLanguage; - } - - lang.PartyModeTexts = new List(); - - _LoadLanguageEntries(xmlReader, out lang.Texts); - - _Languages.Add(lang); + _FallbackLanguage = _Languages.Count; + if (_CurrentLanguage < 0) + _CurrentLanguage = _FallbackLanguage; } + + _Languages.Add(lang); } - private static int _GetPartyModeNr(int partyModeID, int language) + private static Dictionary _GetPartyModeTexts(int language, int partyModeID) { - for (int i = 0; i < _Languages[language].PartyModeTexts.Count; i++) - { - if (_Languages[language].PartyModeTexts[i].PartyModeID == partyModeID) - return i; - } - return -1; + return + _Languages[language].PartyModeTexts.Where(partyLanguage => partyLanguage.PartyModeID == partyModeID).Select(partyLanguage => partyLanguage.Texts).FirstOrDefault(); } } } \ No newline at end of file diff --git a/Vocaluxe/Base/CParty.cs b/Vocaluxe/Base/CParty.cs index 14b6d61e..a04949eb 100644 --- a/Vocaluxe/Base/CParty.cs +++ b/Vocaluxe/Base/CParty.cs @@ -28,24 +28,6 @@ using VocaluxeLib.Xml; namespace Vocaluxe.Base { - - #region Structs - struct SPartyMode - { - public int PartyModeSystemVersion; - public string Name; - public string Description; - public string Author; - public string Folder; - public string PartyModeFile; - public List ScreenFiles; - public int PartyModeVersionMajor; - public int PartyModeVersionMinor; - public string TargetAudience; - public IPartyMode PartyMode; - } - #endregion Structs - static class CParty { private const int _PartyModeSystemVersion = 1; @@ -113,26 +95,7 @@ namespace Vocaluxe.Base foreach (KeyValuePair kvp in _PartyModes) { if (kvp.Key != _NormalGameModeID) - { - SPartyMode mode = kvp.Value; - - var info = new SPartyModeInfos - { - Author = mode.Author, - Description = mode.Description, - Name = mode.Name, - PartyModeID = mode.PartyMode.ID, - VersionMajor = mode.PartyModeVersionMajor, - VersionMinor = mode.PartyModeVersionMinor, - TargetAudience = mode.TargetAudience, - MaxPlayers = mode.PartyMode.GetMaxPlayer(), - MinPlayers = mode.PartyMode.GetMinPlayer(), - MaxTeams = mode.PartyMode.GetMaxTeams(), - MinTeams = mode.PartyMode.GetMinTeams() - }; - - infos.Add(info); - } + infos.Add(kvp.Value.Info); } return infos; } @@ -233,48 +196,26 @@ namespace Vocaluxe.Base } } - private static bool _LoadPartyMode(string file, out SPartyMode pm) + private static bool _LoadPartyMode(string filePath, out SPartyMode pm) { - pm = new SPartyMode {ScreenFiles = new List()}; - - CXMLReader xmlReader = CXMLReader.OpenFile(file); - - //Error... - if (xmlReader == null) - return false; - - bool loaded = true; - - loaded &= xmlReader.TryGetIntValue("//root/PartyModeSystemVersion", ref pm.PartyModeSystemVersion); - loaded &= xmlReader.GetValue("//root/Info/Name", out pm.Name); - loaded &= xmlReader.GetValue("//root/Info/Description", out pm.Description); - loaded &= xmlReader.GetValue("//root/Info/Author", out pm.Author); - loaded &= xmlReader.GetValue("//root/Info/Folder", out pm.Folder); - loaded &= xmlReader.GetValue("//root/Info/PartyModeFile", out pm.PartyModeFile); - loaded &= xmlReader.TryGetIntValue("//root/Info/PartyModeVersionMajor", ref pm.PartyModeVersionMajor); - loaded &= xmlReader.TryGetIntValue("//root/Info/PartyModeVersionMinor", ref pm.PartyModeVersionMinor); - loaded &= xmlReader.GetValue("//root/Info/TargetAudience", out pm.TargetAudience); - loaded &= xmlReader.GetValues("//root/PartyScreens/*", ref pm.ScreenFiles); - - if (!loaded) + CXmlDeserializer deser = new CXmlDeserializer(); + try { - CLog.LogError("Error loading PartyMode file: " + file); + pm = deser.Deserialize(filePath); + if (pm.PartyModeSystemVersion != _PartyModeSystemVersion) + throw new Exception("Wrong PartyModeSystemVersion " + pm.PartyModeSystemVersion + " expected: " + _PartyModeSystemVersion); + + if (pm.ScreenFiles.Count == 0) + throw new Exception("No ScreenFiles found"); + } + catch (Exception e) + { + pm = new SPartyMode(); + CLog.LogError("Error loading PartyMode file " + filePath + ": " + e.Message); return false; } - if (pm.PartyModeSystemVersion != _PartyModeSystemVersion) - { - CLog.LogError("Error loading PartyMode file (wrong PartyModeSystemVersion): " + file); - return false; - } - - if (pm.ScreenFiles.Count == 0) - { - CLog.LogError("Error loading PartyMode file (no ScreenFiles found): " + file); - return false; - } - - string pathToPm = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNamePartyModes, pm.Folder); + string pathToPm = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNamePartyModes, pm.Info.Folder); string pathToCode = Path.Combine(pathToPm, CSettings.FolderNamePartyModeCode); var filesToCompile = new List(); @@ -284,11 +225,11 @@ namespace Vocaluxe.Base if (output == null) return false; - object instance = output.CreateInstance(typeof(IPartyMode).Namespace + "." + pm.Folder + "." + pm.PartyModeFile, false, + object instance = output.CreateInstance(typeof(IPartyMode).Namespace + "." + pm.Info.Folder + "." + pm.Info.PartyModeFile, false, BindingFlags.Public | BindingFlags.Instance, null, new object[] {_NextID++, pathToPm}, null, null); if (instance == null) { - CLog.LogError("Error creating Instance of PartyMode file: " + file); + CLog.LogError("Error creating Instance of PartyMode file: " + filePath); return false; } @@ -298,13 +239,13 @@ namespace Vocaluxe.Base } catch (Exception e) { - CLog.LogError("Error casting PartyMode file: " + file + "; " + e.Message); + CLog.LogError("Error casting PartyMode file: " + filePath + "; " + e.Message); return false; } if (!CLanguage.LoadPartyLanguageFiles(pm.PartyMode.ID, Path.Combine(pathToPm, CSettings.FolderNamePartyModeLanguages))) { - CLog.LogError("Error loading language files for PartyMode: " + file); + CLog.LogError("Error loading language files for PartyMode: " + filePath); return false; } @@ -316,7 +257,7 @@ namespace Vocaluxe.Base foreach (string screenfile in pm.ScreenFiles) { - CMenuParty screen = _GetPartyScreenInstance(output, screenfile, pm.Folder); + CMenuParty screen = _GetPartyScreenInstance(output, screenfile, pm.Info.Folder); if (screen != null) { @@ -327,7 +268,7 @@ namespace Vocaluxe.Base return false; } pm.PartyMode.LoadTheme(); - + pm.Info.LoadData(pm.PartyMode); return true; } diff --git a/Vocaluxe/Base/ThemeSystem/CBaseSkin.cs b/Vocaluxe/Base/ThemeSystem/CBaseSkin.cs index 563b4744..91d36113 100644 --- a/Vocaluxe/Base/ThemeSystem/CBaseSkin.cs +++ b/Vocaluxe/Base/ThemeSystem/CBaseSkin.cs @@ -40,9 +40,9 @@ namespace Vocaluxe.Base.ThemeSystem private bool _CheckRequiredElements() { - List missingTextures = _RequiredTextures.FindAll(name => !_Textures.ContainsKey(name)); - List missingVideos = _RequiredVideos.FindAll(name => !_Videos.ContainsKey(name)); - List missingColors = _RequiredColors.FindAll(name => !_Data.Colors.ContainsKey(name)); + List missingTextures = _Required.Textures.FindAll(name => !_Textures.ContainsKey(name)); + List missingVideos = _Required.Videos.FindAll(name => !_Videos.ContainsKey(name)); + List missingColors = _Required.Colors.FindAll(name => !_Data.Colors.ContainsKey(name)); if (missingTextures.Count + missingVideos.Count + missingColors.Count == 0) return true; string msg = "The skin \"" + this + "\" is missing the following elements: "; diff --git a/Vocaluxe/Base/ThemeSystem/CPartySkin.cs b/Vocaluxe/Base/ThemeSystem/CPartySkin.cs index 95090087..16484bfc 100644 --- a/Vocaluxe/Base/ThemeSystem/CPartySkin.cs +++ b/Vocaluxe/Base/ThemeSystem/CPartySkin.cs @@ -43,21 +43,21 @@ namespace Vocaluxe.Base.ThemeSystem public override bool GetColor(string name, out SColorF color) { - if (_Parent.Name == "Default" && !_RequiredColors.Contains(name)) + if (_Parent.Name == "Default" && !_Required.Colors.Contains(name)) CLog.LogDebug("Non-Default color: " + name); return base.GetColor(name, out color) || _BaseSkin.GetColor(name, out color); } public override CVideoStream GetVideo(string name, bool loop) { - if (_Parent.Name == "Default" && !_RequiredVideos.Contains(name)) + if (_Parent.Name == "Default" && !_Required.Videos.Contains(name)) CLog.LogDebug("Non-Default color: " + name); return base.GetVideo(name, loop) ?? _BaseSkin.GetVideo(name, loop); } public override CTextureRef GetTexture(string name) { - if (_Parent.Name == "Default" && !_RequiredTextures.Contains(name)) + if (_Parent.Name == "Default" && !_Required.Textures.Contains(name)) CLog.LogDebug("Non-Default color: " + name); return base.GetTexture(name) ?? _BaseSkin.GetTexture(name); } diff --git a/Vocaluxe/Base/ThemeSystem/CSkin.cs b/Vocaluxe/Base/ThemeSystem/CSkin.cs index af21ec0c..80c799d4 100644 --- a/Vocaluxe/Base/ThemeSystem/CSkin.cs +++ b/Vocaluxe/Base/ThemeSystem/CSkin.cs @@ -19,9 +19,12 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Xml; +using System.Xml.Serialization; using VocaluxeLib; using VocaluxeLib.Draw; using VocaluxeLib.Xml; +using System.Linq; namespace Vocaluxe.Base.ThemeSystem { @@ -34,9 +37,43 @@ namespace Vocaluxe.Base.ThemeSystem abstract class CSkin { private const int _SkinSystemVersion = 4; - protected static readonly List _RequiredTextures = new List(); - protected static readonly List _RequiredVideos = new List(); - protected static readonly List _RequiredColors = new List(); + + protected struct SRequiredElements + { + [XmlIgnore] public List Textures, Videos, Colors; + [XmlElement("Textures")] + public string TexturesStr + { + get { return string.Join("\r\n", Textures); } + set + { + string[] entries = value.Split(new string[] {"\r\n", "\n"}, StringSplitOptions.RemoveEmptyEntries); + Textures = entries.Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList(); + } + } + [XmlElement("Videos")] + public string VideosStr + { + get { return string.Join("\r\n", Videos); } + set + { + string[] entries = value.Split(new string[] {"\r\n", "\n"}, StringSplitOptions.RemoveEmptyEntries); + Videos = entries.Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList(); + } + } + [XmlElement("Colors")] + public string ColorsStr + { + get { return string.Join("\r\n", Colors); } + set + { + string[] entries = value.Split(new string[] {"\r\n", "\n"}, StringSplitOptions.RemoveEmptyEntries); + Colors = entries.Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList(); + } + } + } + + protected static SRequiredElements _Required; private readonly string _Folder; private readonly string _FileName; @@ -56,26 +93,32 @@ namespace Vocaluxe.Base.ThemeSystem public static bool InitRequiredElements() { string path = Path.Combine(CSettings.ProgramFolder, CSettings.FileNameRequiredSkinElements); - CXMLReader xmlReader = CXMLReader.OpenFile(path); - if (xmlReader == null) + var xml = new CXmlDeserializer(); + try + { + _Required = xml.Deserialize(path); + } + catch (XmlException e) + { + CLog.LogError("Error reading required elements: " + e.Message); return false; - bool ok = xmlReader.Read("//root/Textures", _RequiredTextures); - ok &= xmlReader.Read("//root/Videos", _RequiredVideos); - ok &= xmlReader.Read("//root/Colors", _RequiredColors); + } for (int i = 1; i <= CSettings.MaxNumPlayer; i++) { string name = "Player" + i; - if (!_RequiredColors.Contains(name)) - _RequiredColors.Add(name); + if (!_Required.Colors.Contains(name)) + _Required.Colors.Add(name); } - return ok; + return true; } public static void Close() { - _RequiredTextures.Clear(); - _RequiredVideos.Clear(); - _RequiredColors.Clear(); + if (_Required.Textures == null) + return; + _Required.Textures.Clear(); + _Required.Videos.Clear(); + _Required.Colors.Clear(); } protected CSkin(string folder, string file, CTheme parent) @@ -94,7 +137,7 @@ namespace Vocaluxe.Base.ThemeSystem { try { - var xml = new CXmlSerializer(); + var xml = new CXmlDeserializer(); _Data = xml.Deserialize(Path.Combine(_Folder, _FileName)); if (_Data.SkinSystemVersion != _SkinSystemVersion) { diff --git a/Vocaluxe/Base/XmlStructs.cs b/Vocaluxe/Base/XmlStructs.cs index e3bcd3b8..e9ee97d2 100644 --- a/Vocaluxe/Base/XmlStructs.cs +++ b/Vocaluxe/Base/XmlStructs.cs @@ -20,6 +20,7 @@ using System.ComponentModel; using System.Xml.Serialization; using Vocaluxe.Base.Fonts; using VocaluxeLib; +using VocaluxeLib.PartyModes; using VocaluxeLib.Xml; namespace Vocaluxe.Base @@ -108,4 +109,37 @@ namespace Vocaluxe.Base public SPlaylistInfo Info; [XmlArray] public SPlaylistSong[] Songs; } + + #region Partymode + struct SPartyModeInfos + { + public string Name; + public string Description; + public string Author; + public string Folder; + public string PartyModeFile; + [XmlAltName("PartyModeVersionMajor")] public int VersionMajor; + [XmlAltName("PartyModeVersionMinor")] public int VersionMinor; + public string TargetAudience; + [XmlIgnore] public int MaxPlayers, MinPlayers, MaxTeams, MinTeams; + [XmlIgnore] public int PartyModeID; + + public void LoadData(IPartyMode pm) + { + MaxPlayers = pm.GetMaxPlayer(); + MinPlayers = pm.GetMinPlayer(); + MaxTeams = pm.GetMaxTeams(); + MinTeams = pm.GetMinTeams(); + PartyModeID = pm.ID; + } + } + + struct SPartyMode + { + public int PartyModeSystemVersion; + [XmlArray("PartyScreens"), XmlArrayItem("ScreenFile")] public List ScreenFiles; + [XmlIgnore] public IPartyMode PartyMode; + public SPartyModeInfos Info; + } + #endregion Partymode } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenOptionsGame.cs b/Vocaluxe/Screens/CScreenOptionsGame.cs index d25f77a8..248a2d55 100644 --- a/Vocaluxe/Screens/CScreenOptionsGame.cs +++ b/Vocaluxe/Screens/CScreenOptionsGame.cs @@ -134,7 +134,7 @@ namespace Vocaluxe.Screens private void _SaveConfig() { CLanguage.LanguageId = _SelectSlides[_SelectSlideLanguage].Selection; - CConfig.Config.Game.Language = CLanguage.GetLanguageName(CLanguage.LanguageId); + CConfig.Config.Game.Language = _SelectSlides[_SelectSlideLanguage].Value; CConfig.Config.Debug.DebugLevel = (EDebugLevel)_SelectSlides[_SelectSlideDebugLevel].Selection; CConfig.Config.Game.SongMenu = (ESongMenu)_SelectSlides[_SelectSlideSongMenu].Selection; CConfig.Config.Game.SongSorting = (ESongSorting)_SelectSlides[_SelectSlideSongSorting].Selection; diff --git a/VocaluxeLib/Structs.cs b/VocaluxeLib/Structs.cs index b5b046b7..67b85d9a 100644 --- a/VocaluxeLib/Structs.cs +++ b/VocaluxeLib/Structs.cs @@ -67,7 +67,7 @@ namespace VocaluxeLib [XmlRoot("root")] public struct SThemeCover { - [XmlIgnore] public string Name, Folder, FilePath; + [XmlIgnore] public string FolderPath; public SThemeCoverInfo Info; [XmlElement("CoverGenerator", IsNullable = false)] public List CoverGenerators; } @@ -366,21 +366,5 @@ namespace VocaluxeLib public int VoiceNr; public int ID; } - - public struct SPartyModeInfos - { - public int PartyModeID; - public string Name; - public string Description; - public string TargetAudience; - public int MaxPlayers; - public int MinPlayers; - public int MaxTeams; - public int MinTeams; - - public string Author; - public int VersionMajor; - public int VersionMinor; - } #endregion Game } \ No newline at end of file