aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs
blob: e80984508ed14095be4c6d906e9a2db9d5c6634d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)}");
        }
    }
}