SaveModel.cs 3.8 KB

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