diff options
author | Logan Stromberg <loganstromberg@gmail.com> | 2024-08-13 06:23:11 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-13 15:23:11 +0200 |
commit | 23fa5f4c9c0ee865dd0a4def3be1822e598c9a91 (patch) | |
tree | df67652eb1ffb666526d39f59c9206380d5df2f7 | |
parent | 4f75e26ec7e61e606f812bd0149eef69bdc8a4ea (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.cs | 43 | ||||
-rw-r--r-- | src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs | 4 |
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 @@ | |||
1 | using Ryujinx.UI.App.Common; | ||
2 | using System; | ||
3 | |||
4 | namespace 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 | }; |