diff --git a/Vocaluxe/Base/CDataBase.cs b/Vocaluxe/Base/CDataBase.cs index cbd7935d..a71389c2 100644 --- a/Vocaluxe/Base/CDataBase.cs +++ b/Vocaluxe/Base/CDataBase.cs @@ -83,7 +83,7 @@ namespace Vocaluxe.Base } #region Highscores - public static bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out string dateAdded, out int highscoreID) + public static bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out DateTime dateAdded, out int highscoreID) { string sArtist; string sTitle; @@ -384,12 +384,12 @@ namespace Vocaluxe.Base return -1; } - private static bool _GetDataBaseSongInfos(int songID, out string artist, out string title, out int numPlayed, out string dateAdded, string filePath) + private static bool _GetDataBaseSongInfos(int songID, out string artist, out string title, out int numPlayed, out DateTime dateAdded, string filePath) { artist = String.Empty; title = String.Empty; numPlayed = 0; - dateAdded = String.Empty; + dateAdded = DateTime.Today; using (var connection = new SQLiteConnection()) { @@ -425,7 +425,7 @@ namespace Vocaluxe.Base artist = reader.GetString(0); title = reader.GetString(1); numPlayed = reader.GetInt32(2); - dateAdded = new DateTime(reader.GetInt64(3)).ToString("dd/MM/yyyy"); + dateAdded = new DateTime(reader.GetInt64(3)); reader.Dispose(); return true; } @@ -1036,7 +1036,8 @@ namespace Vocaluxe.Base int shortsong = source.GetInt32(7); int diff = source.GetInt32(8); - string artist, title, dateadded; + string artist, title; + DateTime dateadded; int numplayed; if (_GetDataBaseSongInfos(songid, out artist, out title, out numplayed, out dateadded, sourceDBPath)) AddScore(player, score, linenr, date, medley, duet, shortsong, diff, artist, title, numplayed, _HighscoreFilePath); diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index c0c44c4b..36e686ba 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -839,7 +839,7 @@ namespace Vocaluxe.Base return CDataBase.GetCover(fileName, ref texture, coverSize); } - public bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out string dateAdded, out int highscoreID) + public bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out DateTime dateAdded, out int highscoreID) { return CDataBase.GetDataBaseSongInfos(artist, title, out numPlayed, out dateAdded, out highscoreID); } diff --git a/Vocaluxe/Base/CSongCategorizer.cs b/Vocaluxe/Base/CSongCategorizer.cs index 74784cc2..8c68e615 100644 --- a/Vocaluxe/Base/CSongCategorizer.cs +++ b/Vocaluxe/Base/CSongCategorizer.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; -using System.Text; +using System.Diagnostics; using VocaluxeLib; using VocaluxeLib.Songs; @@ -61,36 +61,10 @@ namespace Vocaluxe.Base _SetChanged(); } - private void _CreateCategoriesLetter() + private void _CreateCategories() { - CCategory lastCategory = null; - CCategory notLetterCat = null; - foreach (CSongPointer songPointer in CSongs.Sorter.SortedSongs) - { - Char firstLetter = Char.ToUpper(songPointer.SortString.Normalize(NormalizationForm.FormD)[0]); - if (Char.IsLetter(firstLetter)) - { - if (lastCategory == null || firstLetter.ToString() != lastCategory.Name) - { - lastCategory = new CCategory(firstLetter.ToString()); - _Categories.Add(lastCategory); - } - lastCategory.Songs.Add(songPointer); - } - else - { - if (notLetterCat == null) - { - notLetterCat = new CCategory("#"); - _Categories.Add(notLetterCat); - } - notLetterCat.Songs.Add(songPointer); - } - } - } + _AdjustCategoryNames(); - private void _CreateCategoriesNormal(string noCategoryName) - { CCategory lastCategory = null; CCategory noCategory = null; foreach (CSongPointer songPointer in CSongs.Sorter.SortedSongs) @@ -108,7 +82,7 @@ namespace Vocaluxe.Base { if (noCategory == null) { - noCategory = new CCategory(noCategoryName); + noCategory = new CCategory(_GetNoCategoryName()); _Categories.Add(noCategory); } noCategory.Songs.Add(songPointer); @@ -116,37 +90,15 @@ namespace Vocaluxe.Base } } - private void _CreateCategories() + /// + /// Sets the SortStrings of the songpointers to the actual category names + /// + private static void _AdjustCategoryNames() { - string noCategoryName = ""; - ESongSorting sorting = CSongs.Sorter.SongSorting; - switch (sorting) { - case ESongSorting.TR_CONFIG_EDITION: - noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOEDITION"); - break; - case ESongSorting.TR_CONFIG_GENRE: - noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOGENRE"); - break; case ESongSorting.TR_CONFIG_DECADE: - case ESongSorting.TR_CONFIG_YEAR: - noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOYEAR"); - break; - case ESongSorting.TR_CONFIG_LANGUAGE: - noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOLANGUAGE"); - break; - case ESongSorting.TR_CONFIG_NONE: - noCategoryName = CLanguage.Translate("TR_SCREENSONG_ALLSONGS"); - break; - } - if (sorting == ESongSorting.TR_CONFIG_ARTIST_LETTER || sorting == ESongSorting.TR_CONFIG_TITLE_LETTER) - _CreateCategoriesLetter(); - else - { - if (sorting == ESongSorting.TR_CONFIG_DECADE) - { foreach (CSongPointer songPointer in CSongs.Sorter.SortedSongs) { string year = songPointer.SortString; @@ -156,11 +108,59 @@ namespace Vocaluxe.Base songPointer.SortString = year + "0 - " + year + "9"; } } - } - _CreateCategoriesNormal(noCategoryName); + break; + case ESongSorting.TR_CONFIG_TITLE_LETTER: + case ESongSorting.TR_CONFIG_ARTIST_LETTER: + foreach (CSongPointer songPointer in CSongs.Sorter.SortedSongs) + songPointer.SortString = (songPointer.SortString.Length == 0 || !Char.IsLetter(songPointer.SortString, 0)) ? "#" : songPointer.SortString[0].ToString(); + break; + case ESongSorting.TR_CONFIG_DATEADDED: + foreach (CSongPointer songPointer in CSongs.Sorter.SortedSongs) + songPointer.SortString = CSongs.GetSong(songPointer.SongID).DateAdded.ToString("dd/MM/yyyy"); + break; } } + private static string _GetNoCategoryName() + { + string noCategoryName; + switch (CSongs.Sorter.SongSorting) + { + case ESongSorting.TR_CONFIG_NONE: + noCategoryName = CLanguage.Translate("TR_SCREENSONG_ALLSONGS"); + break; + case ESongSorting.TR_CONFIG_FOLDER: + case ESongSorting.TR_CONFIG_ARTIST: + case ESongSorting.TR_CONFIG_ARTIST_LETTER: + case ESongSorting.TR_CONFIG_TITLE_LETTER: + noCategoryName = ""; + Debug.Assert(false, "Should not have an uncategorized song"); + break; + case ESongSorting.TR_CONFIG_EDITION: + noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOEDITION"); + break; + case ESongSorting.TR_CONFIG_GENRE: + noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOGENRE"); + break; + case ESongSorting.TR_CONFIG_LANGUAGE: + noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOLANGUAGE"); + break; + case ESongSorting.TR_CONFIG_DECADE: + case ESongSorting.TR_CONFIG_YEAR: + noCategoryName = CLanguage.Translate("TR_SCREENSONG_NOYEAR"); + break; + case ESongSorting.TR_CONFIG_DATEADDED: + noCategoryName = ""; + Debug.Assert(false, "Should not have an uncategorized song"); + break; + default: + noCategoryName = ""; + Debug.Assert(false, "Forgot category option"); + break; + } + return noCategoryName; + } + private void _FillCategories() { if (!_Changed) diff --git a/Vocaluxe/Base/CSongSorter.cs b/Vocaluxe/Base/CSongSorter.cs index eefb796f..f1703224 100644 --- a/Vocaluxe/Base/CSongSorter.cs +++ b/Vocaluxe/Base/CSongSorter.cs @@ -17,7 +17,8 @@ using System; using System.Collections.Generic; -using System.Reflection; +using System.Diagnostics; +using System.Linq; using VocaluxeLib; using VocaluxeLib.Songs; @@ -110,83 +111,65 @@ namespace Vocaluxe.Base return res; } - private List _CreateSortList(string fieldName) + private void _AddSongToList(CSong song, List list) { - var sortList = new List(); - if (fieldName == "") - CSongs.Filter.FilteredSongs.ForEach(song => sortList.Add(new CSongPointer(song.ID, ""))); + string value = null; + List values = null; + switch (_SongSorting) + { + case ESongSorting.TR_CONFIG_NONE: + value = ""; + break; + case ESongSorting.TR_CONFIG_FOLDER: + value = song.FolderName; + break; + case ESongSorting.TR_CONFIG_ARTIST: + case ESongSorting.TR_CONFIG_ARTIST_LETTER: + value = _IgnoreArticles == EOffOn.TR_CONFIG_ON ? song.ArtistSorting : song.Artist; + break; + case ESongSorting.TR_CONFIG_TITLE_LETTER: + value = _IgnoreArticles == EOffOn.TR_CONFIG_ON ? song.TitleSorting : song.Title; + break; + case ESongSorting.TR_CONFIG_EDITION: + values = song.Editions; + break; + case ESongSorting.TR_CONFIG_GENRE: + values = song.Genres; + break; + case ESongSorting.TR_CONFIG_LANGUAGE: + values = song.Languages; + break; + case ESongSorting.TR_CONFIG_DECADE: + case ESongSorting.TR_CONFIG_YEAR: + value = song.Year; + break; + case ESongSorting.TR_CONFIG_DATEADDED: + value = song.DateAdded.ToString("yyyyMMdd"); + break; + default: + Debug.Assert(false, "Forgot sorting option"); + break; + } + Debug.Assert(value != null || values != null, "Sorting implementation faulty"); + if (value != null) + list.Add(new CSongPointer(song.ID, value)); else { - FieldInfo field = typeof(CSong).GetField(fieldName, BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public); - if (field == null) - { - CLog.LogError("Unknow sorting field: " + fieldName); - return _CreateSortList(""); - } - bool isString = field.FieldType == typeof(string); - if (!isString && field.FieldType != typeof(List)) - throw new Exception("Unkown sort field type"); - foreach (CSong song in CSongs.Filter.FilteredSongs) - { - object value = field.GetValue(song); - if (isString) - sortList.Add(new CSongPointer(song.ID, (String)value)); - else - { - var values = (List)value; - if (values.Count == 0) - sortList.Add(new CSongPointer(song.ID, "")); - else - { - // ReSharper disable LoopCanBeConvertedToQuery - foreach (String sortString in values) - // ReSharper restore LoopCanBeConvertedToQuery - sortList.Add(new CSongPointer(song.ID, sortString)); - } - } - } + if (list.Count == 0) + list.Add(new CSongPointer(song.ID, "")); + else + list.AddRange(values.Select(val => new CSongPointer(song.ID, val))); } - return sortList; } private void _SortSongs() { if (!_Changed) return; - String fieldName; - switch (_SongSorting) - { - case ESongSorting.TR_CONFIG_EDITION: - fieldName = "Editions"; - break; - case ESongSorting.TR_CONFIG_GENRE: - fieldName = "Genres"; - break; - case ESongSorting.TR_CONFIG_FOLDER: - fieldName = "FolderName"; - break; - case ESongSorting.TR_CONFIG_ARTIST_LETTER: - case ESongSorting.TR_CONFIG_ARTIST: - fieldName = _IgnoreArticles == EOffOn.TR_CONFIG_ON ? "ArtistSorting" : "Artist"; - break; - case ESongSorting.TR_CONFIG_TITLE_LETTER: - fieldName = _IgnoreArticles == EOffOn.TR_CONFIG_ON ? "TitleSorting" : "Title"; - break; - case ESongSorting.TR_CONFIG_YEAR: - case ESongSorting.TR_CONFIG_DECADE: - fieldName = "Year"; - break; - case ESongSorting.TR_CONFIG_LANGUAGE: - fieldName = "Languages"; - break; - case ESongSorting.TR_CONFIG_DATEADDED: - fieldName = "DateAdded"; - break; - default: - fieldName = ""; - break; - } - List sortList = _CreateSortList(fieldName); + + List sortList = new List(); + foreach (CSong song in CSongs.Filter.FilteredSongs) + _AddSongToList(song, sortList); switch (_SongSorting) { case ESongSorting.TR_CONFIG_ARTIST_LETTER: diff --git a/VocaluxeLib/Enums.cs b/VocaluxeLib/Enums.cs index 5ac45bd3..015f7424 100644 --- a/VocaluxeLib/Enums.cs +++ b/VocaluxeLib/Enums.cs @@ -189,7 +189,6 @@ namespace VocaluxeLib { // ReSharper disable InconsistentNaming TR_CONFIG_NONE, - //TR_CONFIG_RANDOM, TR_CONFIG_FOLDER, TR_CONFIG_ARTIST, TR_CONFIG_ARTIST_LETTER, diff --git a/VocaluxeLib/IBasic.cs b/VocaluxeLib/IBasic.cs index 334221a0..616a8ebc 100644 --- a/VocaluxeLib/IBasic.cs +++ b/VocaluxeLib/IBasic.cs @@ -279,7 +279,7 @@ namespace VocaluxeLib public interface IDataBase { bool GetCover(string fileName, ref CTexture texture, int coverSize); - bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out string dateAdded, out int highscoreID); + bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out DateTime dateAdded, out int highscoreID); } public interface IControllers diff --git a/VocaluxeLib/Songs/CSong.cs b/VocaluxeLib/Songs/CSong.cs index a1c4ad33..1ab39a76 100644 --- a/VocaluxeLib/Songs/CSong.cs +++ b/VocaluxeLib/Songs/CSong.cs @@ -172,7 +172,7 @@ namespace VocaluxeLib.Songs public readonly List Languages = new List(); public int DataBaseSongID = -1; - public string DateAdded = ""; + public DateTime DateAdded = DateTime.Today; public int NumPlayed; public int NumPlayedSession;