UserSaveManagerViewModel.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using DynamicData;
  3. using DynamicData.Binding;
  4. using Ryujinx.Ava.Common.Locale;
  5. using Ryujinx.Ava.UI.Models;
  6. using Ryujinx.HLE.HOS.Services.Account.Acc;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. namespace Ryujinx.Ava.UI.ViewModels
  10. {
  11. public partial class UserSaveManagerViewModel : BaseModel
  12. {
  13. [ObservableProperty] private int _sortIndex;
  14. [ObservableProperty] private int _orderIndex;
  15. [ObservableProperty] private string _search;
  16. [ObservableProperty] private ObservableCollection<SaveModel> _saves = new();
  17. [ObservableProperty] private ObservableCollection<SaveModel> _views = new();
  18. private readonly AccountManager _accountManager;
  19. public string SaveManagerHeading => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SaveManagerHeading, _accountManager.LastOpenedUser.Name, _accountManager.LastOpenedUser.UserId);
  20. public UserSaveManagerViewModel(AccountManager accountManager)
  21. {
  22. _accountManager = accountManager;
  23. PropertyChanged += (_, evt) =>
  24. {
  25. if (evt.PropertyName is
  26. nameof(SortIndex) or
  27. nameof(OrderIndex) or
  28. nameof(Search) or
  29. nameof(Saves))
  30. {
  31. Sort();
  32. }
  33. };
  34. }
  35. public void Sort()
  36. {
  37. Saves.AsObservableChangeSet()
  38. .Filter(Filter)
  39. .Sort(GetComparer())
  40. .Bind(out ReadOnlyObservableCollection<SaveModel> view).AsObservableList();
  41. #pragma warning disable MVVMTK0034
  42. _views.Clear();
  43. _views.AddRange(view);
  44. #pragma warning restore MVVMTK0034
  45. OnPropertyChanged(nameof(Views));
  46. }
  47. private bool Filter(object arg)
  48. {
  49. if (arg is SaveModel save)
  50. {
  51. return string.IsNullOrWhiteSpace(Search) || save.Title.ToLower().Contains(Search.ToLower());
  52. }
  53. return false;
  54. }
  55. private IComparer<SaveModel> GetComparer()
  56. {
  57. return SortIndex switch
  58. {
  59. 0 => OrderIndex == 0
  60. ? SortExpressionComparer<SaveModel>.Ascending(save => save.Title)
  61. : SortExpressionComparer<SaveModel>.Descending(save => save.Title),
  62. 1 => OrderIndex == 0
  63. ? SortExpressionComparer<SaveModel>.Ascending(save => save.Size)
  64. : SortExpressionComparer<SaveModel>.Descending(save => save.Size),
  65. _ => null,
  66. };
  67. }
  68. }
  69. }