diff options
Diffstat (limited to 'Ryujinx.Ava/Ui/Models')
-rw-r--r-- | Ryujinx.Ava/Ui/Models/SaveModel.cs | 122 | ||||
-rw-r--r-- | Ryujinx.Ava/Ui/Models/TempProfile.cs | 9 | ||||
-rw-r--r-- | Ryujinx.Ava/Ui/Models/UserProfile.cs | 10 |
3 files changed, 137 insertions, 4 deletions
diff --git a/Ryujinx.Ava/Ui/Models/SaveModel.cs b/Ryujinx.Ava/Ui/Models/SaveModel.cs new file mode 100644 index 00000000..70478cea --- /dev/null +++ b/Ryujinx.Ava/Ui/Models/SaveModel.cs @@ -0,0 +1,122 @@ +using LibHac; +using LibHac.Fs; +using LibHac.Fs.Shim; +using LibHac.Ncm; +using Ryujinx.Ava.Common; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Ui.Controls; +using Ryujinx.Ava.Ui.ViewModels; +using Ryujinx.Ava.Ui.Windows; +using Ryujinx.HLE.FileSystem; +using Ryujinx.Ui.App.Common; +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.Ui.Models +{ + public class SaveModel : BaseModel + { + private readonly HorizonClient _horizonClient; + private long _size; + + public Action DeleteAction { get; set; } + public ulong SaveId { get; } + public ProgramId TitleId { get; } + public string TitleIdString => $"{TitleId.Value:X16}"; + public UserId UserId { get; } + public bool InGameList { get; } + public string Title { get; } + public byte[] Icon { get; } + + public long Size + { + get => _size; set + { + _size = value; + SizeAvailable = true; + OnPropertyChanged(); + OnPropertyChanged(nameof(SizeString)); + OnPropertyChanged(nameof(SizeAvailable)); + } + } + + public bool SizeAvailable { get; set; } + + public string SizeString => $"{((float)_size * 0.000000954):0.###}MB"; + + public SaveModel(SaveDataInfo info, HorizonClient horizonClient, VirtualFileSystem virtualFileSystem) + { + _horizonClient = horizonClient; + SaveId = info.SaveDataId; + TitleId = info.ProgramId; + UserId = info.UserId; + + var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.TitleId.ToUpper() == TitleIdString); + + InGameList = appData != null; + + if (InGameList) + { + Icon = appData.Icon; + Title = appData.TitleName; + } + else + { + var appMetadata = MainWindow.MainWindowViewModel.ApplicationLibrary.LoadAndSaveMetaData(TitleIdString); + Title = appMetadata.Title ?? TitleIdString; + } + + Task.Run(() => + { + var saveRoot = System.IO.Path.Combine(virtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}"); + + long total_size = GetDirectorySize(saveRoot); + long GetDirectorySize(string path) + { + long size = 0; + if (Directory.Exists(path)) + { + var directories = Directory.GetDirectories(path); + foreach (var directory in directories) + { + size += GetDirectorySize(directory); + } + + var files = Directory.GetFiles(path); + foreach (var file in files) + { + size += new FileInfo(file).Length; + } + } + + return size; + } + + Size = total_size; + }); + + } + + public void OpenLocation() + { + ApplicationHelper.OpenSaveDir(SaveId); + } + + public async void Delete() + { + var result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance["DeleteUserSave"], + LocaleManager.Instance["IrreversibleActionNote"], + LocaleManager.Instance["InputDialogYes"], + LocaleManager.Instance["InputDialogNo"], ""); + + if (result == UserResult.Yes) + { + _horizonClient.Fs.DeleteSaveData(SaveDataSpaceId.User, SaveId); + + DeleteAction?.Invoke(); + } + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Ava/Ui/Models/TempProfile.cs b/Ryujinx.Ava/Ui/Models/TempProfile.cs index e943687a..4e6d3446 100644 --- a/Ryujinx.Ava/Ui/Models/TempProfile.cs +++ b/Ryujinx.Ava/Ui/Models/TempProfile.cs @@ -45,9 +45,12 @@ namespace Ryujinx.Ava.Ui.Models { _profile = profile; - Image = profile.Image; - Name = profile.Name; - UserId = profile.UserId; + if (_profile != null) + { + Image = profile.Image; + Name = profile.Name; + UserId = profile.UserId; + } } public TempProfile(){} diff --git a/Ryujinx.Ava/Ui/Models/UserProfile.cs b/Ryujinx.Ava/Ui/Models/UserProfile.cs index 351ada76..c0ea9451 100644 --- a/Ryujinx.Ava/Ui/Models/UserProfile.cs +++ b/Ryujinx.Ava/Ui/Models/UserProfile.cs @@ -1,3 +1,4 @@ +using Ryujinx.Ava.Ui.Controls; using Ryujinx.Ava.Ui.ViewModels; using Ryujinx.HLE.HOS.Services.Account.Acc; using Profile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; @@ -7,6 +8,7 @@ namespace Ryujinx.Ava.Ui.Models public class UserProfile : BaseModel { private readonly Profile _profile; + private readonly NavigationDialogHost _owner; private byte[] _image; private string _name; private UserId _userId; @@ -41,9 +43,10 @@ namespace Ryujinx.Ava.Ui.Models } } - public UserProfile(Profile profile) + public UserProfile(Profile profile, NavigationDialogHost owner) { _profile = profile; + _owner = owner; Image = profile.Image; Name = profile.Name; @@ -57,5 +60,10 @@ namespace Ryujinx.Ava.Ui.Models OnPropertyChanged(nameof(IsOpened)); OnPropertyChanged(nameof(Name)); } + + public void Recover(UserProfile userProfile) + { + _owner.Navigate(typeof(UserEditor), (_owner, userProfile, true)); + } } }
\ No newline at end of file |