SaveModel.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using LibHac;
  2. using LibHac.Fs;
  3. using LibHac.Fs.Shim;
  4. using LibHac.Ncm;
  5. using Ryujinx.Ava.Common;
  6. using Ryujinx.Ava.Common.Locale;
  7. using Ryujinx.Ava.Ui.Controls;
  8. using Ryujinx.Ava.Ui.ViewModels;
  9. using Ryujinx.Ava.Ui.Windows;
  10. using Ryujinx.HLE.FileSystem;
  11. using Ryujinx.Ui.App.Common;
  12. using System;
  13. using System.IO;
  14. using System.Linq;
  15. using System.Threading.Tasks;
  16. namespace Ryujinx.Ava.Ui.Models
  17. {
  18. public class SaveModel : BaseModel
  19. {
  20. private readonly HorizonClient _horizonClient;
  21. private long _size;
  22. public Action DeleteAction { get; set; }
  23. public ulong SaveId { get; }
  24. public ProgramId TitleId { get; }
  25. public string TitleIdString => $"{TitleId.Value:X16}";
  26. public UserId UserId { get; }
  27. public bool InGameList { get; }
  28. public string Title { get; }
  29. public byte[] Icon { get; }
  30. public long Size
  31. {
  32. get => _size; set
  33. {
  34. _size = value;
  35. SizeAvailable = true;
  36. OnPropertyChanged();
  37. OnPropertyChanged(nameof(SizeString));
  38. OnPropertyChanged(nameof(SizeAvailable));
  39. }
  40. }
  41. public bool SizeAvailable { get; set; }
  42. public string SizeString => $"{((float)_size * 0.000000954):0.###}MB";
  43. public SaveModel(SaveDataInfo info, HorizonClient horizonClient, VirtualFileSystem virtualFileSystem)
  44. {
  45. _horizonClient = horizonClient;
  46. SaveId = info.SaveDataId;
  47. TitleId = info.ProgramId;
  48. UserId = info.UserId;
  49. var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.TitleId.ToUpper() == TitleIdString);
  50. InGameList = appData != null;
  51. if (InGameList)
  52. {
  53. Icon = appData.Icon;
  54. Title = appData.TitleName;
  55. }
  56. else
  57. {
  58. var appMetadata = MainWindow.MainWindowViewModel.ApplicationLibrary.LoadAndSaveMetaData(TitleIdString);
  59. Title = appMetadata.Title ?? TitleIdString;
  60. }
  61. Task.Run(() =>
  62. {
  63. var saveRoot = System.IO.Path.Combine(virtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}");
  64. long total_size = GetDirectorySize(saveRoot);
  65. long GetDirectorySize(string path)
  66. {
  67. long size = 0;
  68. if (Directory.Exists(path))
  69. {
  70. var directories = Directory.GetDirectories(path);
  71. foreach (var directory in directories)
  72. {
  73. size += GetDirectorySize(directory);
  74. }
  75. var files = Directory.GetFiles(path);
  76. foreach (var file in files)
  77. {
  78. size += new FileInfo(file).Length;
  79. }
  80. }
  81. return size;
  82. }
  83. Size = total_size;
  84. });
  85. }
  86. public void OpenLocation()
  87. {
  88. ApplicationHelper.OpenSaveDir(SaveId);
  89. }
  90. public async void Delete()
  91. {
  92. var result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance["DeleteUserSave"],
  93. LocaleManager.Instance["IrreversibleActionNote"],
  94. LocaleManager.Instance["InputDialogYes"],
  95. LocaleManager.Instance["InputDialogNo"], "");
  96. if (result == UserResult.Yes)
  97. {
  98. _horizonClient.Fs.DeleteSaveData(SaveDataSpaceId.User, SaveId);
  99. DeleteAction?.Invoke();
  100. }
  101. }
  102. }
  103. }