aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLogan Stromberg <loganstromberg@gmail.com>2024-08-13 06:23:11 -0700
committerGitHub <noreply@github.com>2024-08-13 15:23:11 +0200
commit23fa5f4c9c0ee865dd0a4def3be1822e598c9a91 (patch)
treedf67652eb1ffb666526d39f59c9206380d5df2f7
parent4f75e26ec7e61e606f812bd0149eef69bdc8a4ea (diff)
Fix arbitrary game ordering when sorting by Favorites (#7170)1.1.1375
* Fix arbitrary sorting by "Favorite" in the UI by making it the same as sorting alphabetically while giving favorites priority. * Use a more engineered solution rather than string hacks. * Address code style warnings. Add null checking. Make title name comparison case insensitive. * one more style fix --------- Co-authored-by: Logan Stromberg <lostromb@microsoft.com>
-rw-r--r--src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs43
-rw-r--r--src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs4
2 files changed, 45 insertions, 2 deletions
diff --git a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs
new file mode 100644
index 000000000..e80984508
--- /dev/null
+++ b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs
@@ -0,0 +1,43 @@
1using Ryujinx.UI.App.Common;
2using System;
3
4namespace Ryujinx.Ava.UI.ViewModels
5{
6 /// <summary>
7 /// Implements a custom comparer which is used for sorting titles by favorite on a UI.
8 /// Returns a sorted list of favorites in alphabetical order, followed by all non-favorites sorted alphabetical.
9 /// </summary>
10 public readonly struct AppListFavoriteComparable : IComparable
11 {
12 /// <summary>
13 /// The application data being compared.
14 /// </summary>
15 private readonly ApplicationData app;
16
17 /// <summary>
18 /// Constructs a new <see cref="AppListFavoriteComparable"/> with the specified application data.
19 /// </summary>
20 /// <param name="app">The app data being compared.</param>
21 public AppListFavoriteComparable(ApplicationData app)
22 {
23 ArgumentNullException.ThrowIfNull(app, nameof(app));
24 this.app = app;
25 }
26
27 /// <inheritdoc/>
28 public readonly int CompareTo(object o)
29 {
30 if (o is AppListFavoriteComparable other)
31 {
32 if (app.Favorite == other.app.Favorite)
33 {
34 return string.Compare(app.Name, other.app.Name, StringComparison.OrdinalIgnoreCase);
35 }
36
37 return app.Favorite ? -1 : 1;
38 }
39
40 throw new InvalidCastException($"Cannot cast {o.GetType()} to {nameof(AppListFavoriteComparable)}");
41 }
42 }
43}
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 134e90300..bd9f165b9 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -965,8 +965,8 @@ namespace Ryujinx.Ava.UI.ViewModels
965 : SortExpressionComparer<ApplicationData>.Descending(app => app.FileSize), 965 : SortExpressionComparer<ApplicationData>.Descending(app => app.FileSize),
966 ApplicationSort.Path => IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => app.Path) 966 ApplicationSort.Path => IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => app.Path)
967 : SortExpressionComparer<ApplicationData>.Descending(app => app.Path), 967 : SortExpressionComparer<ApplicationData>.Descending(app => app.Path),
968 ApplicationSort.Favorite => !IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => app.Favorite) 968 ApplicationSort.Favorite => IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => new AppListFavoriteComparable(app))
969 : SortExpressionComparer<ApplicationData>.Descending(app => app.Favorite), 969 : SortExpressionComparer<ApplicationData>.Descending(app => new AppListFavoriteComparable(app)),
970 _ => null, 970 _ => null,
971#pragma warning restore IDE0055 971#pragma warning restore IDE0055
972 }; 972 };