diff --git a/Shoko.Commons b/Shoko.Commons index 25da883..27a7999 160000 --- a/Shoko.Commons +++ b/Shoko.Commons @@ -1 +1 @@ -Subproject commit 25da88394351a583139c4fd355a1278619236f1e +Subproject commit 27a7999272e045a18c80e425cee5f1189fd174cc diff --git a/Shoko.MyAnime3/ViewModel/Helpers/ShokoServerHelper.cs b/Shoko.MyAnime3/ViewModel/Helpers/ShokoServerHelper.cs index f4fb521..c400db5 100644 --- a/Shoko.MyAnime3/ViewModel/Helpers/ShokoServerHelper.cs +++ b/Shoko.MyAnime3/ViewModel/Helpers/ShokoServerHelper.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.IO; using System.Linq; +using System.Linq.Expressions; using System.Threading; using Shoko.Commons.Extensions; using Shoko.Commons.Utils; @@ -310,15 +311,94 @@ public static List GetChildGroupFilters(VM_GroupFilter grpf) gfs.Sort(); return gfs; } + public static IQueryable SortGroups(CL_GroupFilter gf, IQueryable list) where T : VM_AnimeGroup_User + { + + BaseConfig.MyAnimeLog.Write("Criteria Orig: " + gf.SortingCriteria); + List criterias = GroupFilterSortingCriteria.Create(gf.GroupFilterID, gf.SortingCriteria); + foreach (GroupFilterSortingCriteria f in criterias) + { + BaseConfig.MyAnimeLog.Write("Criteria: " + f.SortType.ToString() + " " + f.SortDirection); + list = GeneratePredicate(list, f.SortType, f.SortDirection); + } + return list; + } + + public static IQueryable GeneratePredicate(IQueryable lst, GroupFilterSorting sortType, GroupFilterSortDirection sortDirection) where T : VM_AnimeGroup_User + { + Expression> selector; + + switch (sortType) + { + case GroupFilterSorting.AniDBRating: + selector = c => c.Stat_AniDBRating; + break; + case GroupFilterSorting.EpisodeAddedDate: + selector = c => c.EpisodeAddedDate; + break; + case GroupFilterSorting.EpisodeAirDate: + selector = c => c.LatestEpisodeAirDate; + break; + case GroupFilterSorting.EpisodeWatchedDate: + selector = c => c.WatchedDate; + break; + case GroupFilterSorting.GroupName: + selector = c => c.GroupName; + break; + case GroupFilterSorting.SortName: + selector = c => c.SortName; + break; + case GroupFilterSorting.MissingEpisodeCount: + selector = c => c.MissingEpisodeCount; + break; + case GroupFilterSorting.SeriesAddedDate: + selector = c => c.Stat_SeriesCreatedDate; + break; + case GroupFilterSorting.SeriesCount: + selector = c => c.Stat_SeriesCount; + break; + case GroupFilterSorting.UnwatchedEpisodeCount: + selector = c => c.UnwatchedEpisodeCount; + break; + case GroupFilterSorting.UserRating: + selector = c => c.Stat_UserVoteOverall; + break; + case GroupFilterSorting.Year: + if (sortDirection == GroupFilterSortDirection.Asc) + selector = c => c.Stat_AirDate_Min; + else + selector = c => c.Stat_AirDate_Max; + break; + default: + selector = c => c.GroupName; + break; + } + if (lst.GetType().IsAssignableFrom(typeof(IOrderedQueryable))) + { + IOrderedQueryable n = (IOrderedQueryable)lst; + if (sortDirection != GroupFilterSortDirection.Asc) + return n.ThenByDescending(selector); + return n.ThenBy(selector); + } + if (sortDirection != GroupFilterSortDirection.Asc) + return lst.OrderByDescending(selector); + return lst.OrderBy(selector); + + + } public static List GetAnimeGroupsForFilter(VM_GroupFilter groupFilter) { try { List rawGrps = VM_ShokoServer.Instance.ShokoServices.GetAnimeGroupsForFilter(groupFilter.GroupFilterID, VM_ShokoServer.Instance.CurrentUser.JMMUserID, false).CastList() ?? new List(); - BaseConfig.MyAnimeLog.Write("Group Sort of "+groupFilter.GroupFilterName+" Criterias: "+groupFilter.SortingCriteria); - return groupFilter.SortGroups(rawGrps.AsQueryable()).ToList(); + if (string.IsNullOrEmpty(groupFilter.SortingCriteria)) + groupFilter.SortingCriteria = "5;1"; + + IQueryable qr = rawGrps.AsQueryable(); + qr = SortGroups(groupFilter, qr); + return qr.ToList(); } catch (Exception ex) { diff --git a/Shoko.MyAnime3/Windows/MainWindow.cs b/Shoko.MyAnime3/Windows/MainWindow.cs index 6e0f335..996ef87 100644 --- a/Shoko.MyAnime3/Windows/MainWindow.cs +++ b/Shoko.MyAnime3/Windows/MainWindow.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Timers; @@ -1087,6 +1088,9 @@ private Listlevel LevelFromItem(IVM ivm) return listlevel; } */ + + + void bgLoadFacade() { try @@ -1188,7 +1192,7 @@ void bgLoadFacade() { BaseConfig.MyAnimeLog.Write("APPLYING QUICK SORT"); QuickSort srt = GroupFilterQuickSorts[gf.GroupFilterID]; - groups = groups.AsQueryable().GeneratePredicate(GroupFilterHelper.GetEnumForText_Sorting(srt.SortType), srt.SortDirection).ToList(); + groups = ShokoServerHelper.GeneratePredicate(groups.AsQueryable(),GroupFilterHelper.GetEnumForText_Sorting(srt.SortType), srt.SortDirection).ToList(); }