From 6c70c52a1fe496b9843bec17fa1f12a300c2edef Mon Sep 17 00:00:00 2001 From: Florian Kuepper Date: Wed, 30 May 2012 14:47:14 +0200 Subject: [PATCH] Added option to config.xml to ignore articles of title and artist on sorting. Do we need a entry on options screen? --- Vocaluxe/Base/CConfig.cs | 5 ++ Vocaluxe/Base/CSongs.cs | 189 ++++++++++++++++++++++++++++++++------- 2 files changed, 161 insertions(+), 33 deletions(-) diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index 0fb18b31..051e1fa7 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -210,6 +210,7 @@ namespace Vocaluxe.Base public static List SongFolder = new List(); public static ESongMenu SongMenu = ESongMenu.TR_CONFIG_TILE_BOARD; public static ESongSorting SongSorting = ESongSorting.TR_CONFIG_ARTIST; + public static EOffOn IgnoreArticles = EOffOn.TR_CONFIG_ON; public static float ScoreAnimationTime = 10; public static ETimerMode TimerMode = ETimerMode.TR_CONFIG_TIMERMODE_REMAINING; public static int NumPlayer = 2; @@ -347,6 +348,7 @@ namespace Vocaluxe.Base CHelper.TryGetEnumValueFromXML("//root/Game/SongMenu", navigator, ref SongMenu); CHelper.TryGetEnumValueFromXML("//root/Game/SongSorting", navigator, ref SongSorting); + CHelper.TryGetEnumValueFromXML("//root/Game/IgnoreArticles", navigator, ref IgnoreArticles); CHelper.TryGetFloatValueFromXML("//root/Game/ScoreAnimationTime", navigator, ref ScoreAnimationTime); CHelper.TryGetEnumValueFromXML("//root/Game/TimerMode", navigator, ref TimerMode); CHelper.TryGetIntValueFromXML("//root/Game/NumPlayer", navigator, ref NumPlayer); @@ -578,6 +580,9 @@ namespace Vocaluxe.Base writer.WriteComment("SongSorting: " + ListStrings(Enum.GetNames(typeof(ESongSorting)))); writer.WriteElementString("SongSorting", Enum.GetName(typeof(ESongSorting), SongSorting)); + writer.WriteComment("Ignore articles on song-sorting: " + ListStrings(Enum.GetNames(typeof(EOffOn)))); + writer.WriteElementString("IgnoreArticles", Enum.GetName(typeof(EOffOn), IgnoreArticles)); + writer.WriteComment("ScoreAnimationTime: Values >= 1 or 0 for no animation. Time is in seconds."); writer.WriteElementString("ScoreAnimationTime", ScoreAnimationTime.ToString()); diff --git a/Vocaluxe/Base/CSongs.cs b/Vocaluxe/Base/CSongs.cs index 8473cf25..973c3a2f 100644 --- a/Vocaluxe/Base/CSongs.cs +++ b/Vocaluxe/Base/CSongs.cs @@ -353,12 +353,28 @@ namespace Vocaluxe.Base int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -407,12 +423,28 @@ namespace Vocaluxe.Base int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -480,12 +512,28 @@ namespace Vocaluxe.Base int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -506,17 +554,33 @@ namespace Vocaluxe.Base case ESongSorting.TR_CONFIG_ARTIST: foreach (CSong song in _SongList) { - _SortList.Add(new SongPointer(song.ID, song.Artist)); + _SortList.Add(new SongPointer(song.ID, song.Artist)); } _SortList.Sort(delegate(SongPointer s1, SongPointer s2) - { - int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); - if (res == 0) + { + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(s1.SortString.ToUpper()); + string string2 = IgnoreArticle(s2.SortString.ToUpper()); + int res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; }); _SongsSortList = _SortList.ToArray(); @@ -535,7 +599,10 @@ namespace Vocaluxe.Base case ESongSorting.TR_CONFIG_ARTIST_LETTER: foreach (CSong song in _SongList) { - _SortList.Add(new SongPointer(song.ID, song.Artist)); + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) + _SortList.Add(new SongPointer(song.ID, IgnoreArticle(song.Artist))); + else + _SortList.Add(new SongPointer(song.ID, song.Artist)); } _SortList.Sort(delegate(SongPointer s1, SongPointer s2) @@ -583,7 +650,10 @@ namespace Vocaluxe.Base case ESongSorting.TR_CONFIG_TITLE_LETTER: foreach (CSong song in _SongList) { - _SortList.Add(new SongPointer(song.ID, song.Title)); + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) + _SortList.Add(new SongPointer(song.ID, IgnoreArticle(song.Title))); + else + _SortList.Add(new SongPointer(song.ID, song.Title)); } _SortList.Sort(delegate(SongPointer s1, SongPointer s2) @@ -591,7 +661,7 @@ namespace Vocaluxe.Base int res = s1.SortString.ToUpper().CompareTo(s2.SortString.ToUpper()); if (res == 0) { - return _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); } return res; }); @@ -639,12 +709,28 @@ namespace Vocaluxe.Base int res = s1.SortString.CompareTo(s2.SortString); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -686,12 +772,28 @@ namespace Vocaluxe.Base int res = s1.SortString.CompareTo(s2.SortString); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -740,12 +842,28 @@ namespace Vocaluxe.Base int res = s1.SortString.CompareTo(s2.SortString); if (res == 0) { - res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); - if (res == 0) + if (CConfig.IgnoreArticles == EOffOn.TR_CONFIG_ON) { - return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + string string1 = IgnoreArticle(_Songs[s1.SongID].Artist.ToUpper()); + string string2 = IgnoreArticle(_Songs[s2.SongID].Artist.ToUpper()); + res = string1.CompareTo(string2); + if (res == 0) + { + string1 = IgnoreArticle(_Songs[s1.SongID].Title.ToUpper()); + string2 = IgnoreArticle(_Songs[s2.SongID].Title.ToUpper()); + return string1.CompareTo(string2); + } + return res; + } + else + { + res = _Songs[s1.SongID].Artist.ToUpper().CompareTo(_Songs[s2.SongID].Artist.ToUpper()); + if (res == 0) + { + return _Songs[s1.SongID].Title.ToUpper().CompareTo(_Songs[s2.SongID].Title.ToUpper()); + } + return res; } - return res; } return res; }); @@ -920,5 +1038,10 @@ namespace Vocaluxe.Base _CoverLoaded = true; CDataBase.CommitCovers(); } + + private static string IgnoreArticle(string _string) + { + return Regex.Replace(_string, @"^\s*(de|het|de|der|die|das|des|dem|den|the|el|la|lo|los|las|le|la|les|il|lo|la|i|gli|a|az)\s+", string.Empty, RegexOptions.IgnoreCase); + } } }