using DynamicData; using DynamicData.Binding; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Models; using Ryujinx.HLE.HOS.Services.Account.Acc; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Ryujinx.Ava.UI.ViewModels { public class UserSaveManagerViewModel : BaseModel { private int _sortIndex; private int _orderIndex; private string _search; private ObservableCollection _saves = new(); private ObservableCollection _views = new(); private AccountManager _accountManager; public string SaveManagerHeading => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SaveManagerHeading, _accountManager.LastOpenedUser.Name, _accountManager.LastOpenedUser.UserId); public int SortIndex { get => _sortIndex; set { _sortIndex = value; OnPropertyChanged(); Sort(); } } public int OrderIndex { get => _orderIndex; set { _orderIndex = value; OnPropertyChanged(); Sort(); } } public string Search { get => _search; set { _search = value; OnPropertyChanged(); Sort(); } } public ObservableCollection Saves { get => _saves; set { _saves = value; OnPropertyChanged(); Sort(); } } public ObservableCollection Views { get => _views; set { _views = value; OnPropertyChanged(); } } public UserSaveManagerViewModel(AccountManager accountManager) { _accountManager = accountManager; } public void Sort() { Saves.AsObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) .Bind(out var view).AsObservableList(); _views.Clear(); _views.AddRange(view); OnPropertyChanged(nameof(Views)); } private bool Filter(object arg) { if (arg is SaveModel save) { return string.IsNullOrWhiteSpace(_search) || save.Title.ToLower().Contains(_search.ToLower()); } return false; } private IComparer GetComparer() { switch (SortIndex) { case 0: return OrderIndex == 0 ? SortExpressionComparer.Ascending(save => save.Title) : SortExpressionComparer.Descending(save => save.Title); case 1: return OrderIndex == 0 ? SortExpressionComparer.Ascending(save => save.Size) : SortExpressionComparer.Descending(save => save.Size); default: return null; } } } }