Load saves on UIThread

This commit is contained in:
Isaac Marovitz 2022-12-29 18:58:41 +01:00
parent e422766413
commit 9195477e0b
No known key found for this signature in database
GPG key ID: 97250B2B09A132E1

View file

@ -1,5 +1,6 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Threading;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
using FluentAvalonia.UI.Navigation; using FluentAvalonia.UI.Navigation;
using LibHac; using LibHac;
@ -60,38 +61,41 @@ namespace Ryujinx.Ava.UI.Views.User
public void LoadSaves() public void LoadSaves()
{ {
ViewModel.Saves.Clear(); Dispatcher.UIThread.Post((() =>
var saveDataFilter = SaveDataFilter.Make(programId: default, saveType: SaveDataType.Account,
new UserId((ulong)_accountManager.LastOpenedUser.UserId.High, (ulong)_accountManager.LastOpenedUser.UserId.Low), saveDataId: default, index: default);
using var saveDataIterator = new UniqueRef<SaveDataIterator>();
_horizonClient.Fs.OpenSaveDataIterator(ref saveDataIterator.Ref(), SaveDataSpaceId.User, in saveDataFilter).ThrowIfFailure();
Span<SaveDataInfo> saveDataInfo = stackalloc SaveDataInfo[10];
while (true)
{ {
saveDataIterator.Get.ReadSaveDataInfo(out long readCount, saveDataInfo).ThrowIfFailure(); ViewModel.Saves.Clear();
var saveDataFilter = SaveDataFilter.Make(programId: default, saveType: SaveDataType.Account,
new UserId((ulong)_accountManager.LastOpenedUser.UserId.High, (ulong)_accountManager.LastOpenedUser.UserId.Low), saveDataId: default, index: default);
if (readCount == 0) using var saveDataIterator = new UniqueRef<SaveDataIterator>();
{
break;
}
for (int i = 0; i < readCount; i++) _horizonClient.Fs.OpenSaveDataIterator(ref saveDataIterator.Ref(), SaveDataSpaceId.User, in saveDataFilter).ThrowIfFailure();
Span<SaveDataInfo> saveDataInfo = stackalloc SaveDataInfo[10];
while (true)
{ {
var save = saveDataInfo[i]; saveDataIterator.Get.ReadSaveDataInfo(out long readCount, saveDataInfo).ThrowIfFailure();
if (save.ProgramId.Value != 0)
if (readCount == 0)
{ {
var saveModel = new SaveModel(save, _horizonClient, _virtualFileSystem); break;
ViewModel.Saves.Add(saveModel);
saveModel.DeleteAction = () => { ViewModel.Saves.Remove(saveModel); };
} }
ViewModel.Sort(); for (int i = 0; i < readCount; i++)
{
var save = saveDataInfo[i];
if (save.ProgramId.Value != 0)
{
var saveModel = new SaveModel(save, _horizonClient, _virtualFileSystem);
ViewModel.Saves.Add(saveModel);
saveModel.DeleteAction = () => { ViewModel.Saves.Remove(saveModel); };
}
ViewModel.Sort();
}
} }
} }));
} }
private void GoBack(object sender, RoutedEventArgs e) private void GoBack(object sender, RoutedEventArgs e)