/ src / Ryujinx / UI / ViewModels / UserSaveManagerViewModel.cs
UserSaveManagerViewModel.cs
  1  using DynamicData;
  2  using DynamicData.Binding;
  3  using Ryujinx.Ava.Common.Locale;
  4  using Ryujinx.Ava.UI.Models;
  5  using Ryujinx.HLE.HOS.Services.Account.Acc;
  6  using System.Collections.Generic;
  7  using System.Collections.ObjectModel;
  8  
  9  namespace Ryujinx.Ava.UI.ViewModels
 10  {
 11      public class UserSaveManagerViewModel : BaseModel
 12      {
 13          private int _sortIndex;
 14          private int _orderIndex;
 15          private string _search;
 16          private ObservableCollection<SaveModel> _saves = new();
 17          private ObservableCollection<SaveModel> _views = new();
 18          private readonly AccountManager _accountManager;
 19  
 20          public string SaveManagerHeading => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SaveManagerHeading, _accountManager.LastOpenedUser.Name, _accountManager.LastOpenedUser.UserId);
 21  
 22          public int SortIndex
 23          {
 24              get => _sortIndex;
 25              set
 26              {
 27                  _sortIndex = value;
 28                  OnPropertyChanged();
 29                  Sort();
 30              }
 31          }
 32  
 33          public int OrderIndex
 34          {
 35              get => _orderIndex;
 36              set
 37              {
 38                  _orderIndex = value;
 39                  OnPropertyChanged();
 40                  Sort();
 41              }
 42          }
 43  
 44          public string Search
 45          {
 46              get => _search;
 47              set
 48              {
 49                  _search = value;
 50                  OnPropertyChanged();
 51                  Sort();
 52              }
 53          }
 54  
 55          public ObservableCollection<SaveModel> Saves
 56          {
 57              get => _saves;
 58              set
 59              {
 60                  _saves = value;
 61                  OnPropertyChanged();
 62                  Sort();
 63              }
 64          }
 65  
 66          public ObservableCollection<SaveModel> Views
 67          {
 68              get => _views;
 69              set
 70              {
 71                  _views = value;
 72                  OnPropertyChanged();
 73              }
 74          }
 75  
 76          public UserSaveManagerViewModel(AccountManager accountManager)
 77          {
 78              _accountManager = accountManager;
 79          }
 80  
 81          public void Sort()
 82          {
 83              Saves.AsObservableChangeSet()
 84                  .Filter(Filter)
 85                  .Sort(GetComparer())
 86                  .Bind(out var view).AsObservableList();
 87  
 88              _views.Clear();
 89              _views.AddRange(view);
 90              OnPropertyChanged(nameof(Views));
 91          }
 92  
 93          private bool Filter(object arg)
 94          {
 95              if (arg is SaveModel save)
 96              {
 97                  return string.IsNullOrWhiteSpace(_search) || save.Title.ToLower().Contains(_search.ToLower());
 98              }
 99  
100              return false;
101          }
102  
103          private IComparer<SaveModel> GetComparer()
104          {
105              return SortIndex switch
106              {
107                  0 => OrderIndex == 0
108                      ? SortExpressionComparer<SaveModel>.Ascending(save => save.Title)
109                      : SortExpressionComparer<SaveModel>.Descending(save => save.Title),
110                  1 => OrderIndex == 0
111                      ? SortExpressionComparer<SaveModel>.Ascending(save => save.Size)
112                      : SortExpressionComparer<SaveModel>.Descending(save => save.Size),
113                  _ => null,
114              };
115          }
116      }
117  }