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 /src | |
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>
Diffstat (limited to 'src')
-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 00000000..e8098450 --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs @@ -0,0 +1,43 @@ +using Ryujinx.UI.App.Common; +using System; + +namespace Ryujinx.Ava.UI.ViewModels +{ + /// <summary> + /// Implements a custom comparer which is used for sorting titles by favorite on a UI. + /// Returns a sorted list of favorites in alphabetical order, followed by all non-favorites sorted alphabetical. + /// </summary> + public readonly struct AppListFavoriteComparable : IComparable + { + /// <summary> + /// The application data being compared. + /// </summary> + private readonly ApplicationData app; + + /// <summary> + /// Constructs a new <see cref="AppListFavoriteComparable"/> with the specified application data. + /// </summary> + /// <param name="app">The app data being compared.</param> + public AppListFavoriteComparable(ApplicationData app) + { + ArgumentNullException.ThrowIfNull(app, nameof(app)); + this.app = app; + } + + /// <inheritdoc/> + public readonly int CompareTo(object o) + { + if (o is AppListFavoriteComparable other) + { + if (app.Favorite == other.app.Favorite) + { + return string.Compare(app.Name, other.app.Name, StringComparison.OrdinalIgnoreCase); + } + + return app.Favorite ? -1 : 1; + } + + throw new InvalidCastException($"Cannot cast {o.GetType()} to {nameof(AppListFavoriteComparable)}"); + } + } +} diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 134e9030..bd9f165b 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -965,8 +965,8 @@ namespace Ryujinx.Ava.UI.ViewModels : SortExpressionComparer<ApplicationData>.Descending(app => app.FileSize), ApplicationSort.Path => IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => app.Path) : SortExpressionComparer<ApplicationData>.Descending(app => app.Path), - ApplicationSort.Favorite => !IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => app.Favorite) - : SortExpressionComparer<ApplicationData>.Descending(app => app.Favorite), + ApplicationSort.Favorite => IsAscending ? SortExpressionComparer<ApplicationData>.Ascending(app => new AppListFavoriteComparable(app)) + : SortExpressionComparer<ApplicationData>.Descending(app => new AppListFavoriteComparable(app)), _ => null, #pragma warning restore IDE0055 }; |