aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs')
-rw-r--r--Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs297
1 files changed, 49 insertions, 248 deletions
diff --git a/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs b/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
index 2dab1d35..6dc99fb5 100644
--- a/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
+++ b/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
@@ -1,314 +1,115 @@
-using Avalonia.Collections;
using Avalonia.Controls;
-using Avalonia.Threading;
-using LibHac.Common;
-using LibHac.Fs;
-using LibHac.Fs.Fsa;
-using LibHac.FsSystem;
-using LibHac.Tools.Fs;
-using LibHac.Tools.FsSystem;
-using LibHac.Tools.FsSystem.NcaUtils;
+using Avalonia.Interactivity;
+using Avalonia.Styling;
+using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Models;
-using Ryujinx.Common.Configuration;
-using Ryujinx.Common.Utilities;
+using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.HLE.FileSystem;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reactive.Linq;
-using System.Text;
+using Ryujinx.Ui.Common.Helper;
using System.Threading.Tasks;
-using Path = System.IO.Path;
+using Button = Avalonia.Controls.Button;
namespace Ryujinx.Ava.UI.Windows
{
- public partial class DownloadableContentManagerWindow : StyleableWindow
+ public partial class DownloadableContentManagerWindow : UserControl
{
- private readonly List<DownloadableContentContainer> _downloadableContentContainerList;
- private readonly string _downloadableContentJsonPath;
-
- private VirtualFileSystem _virtualFileSystem { get; }
- private AvaloniaList<DownloadableContentModel> _downloadableContents { get; set; }
-
- private ulong _titleId { get; }
- private string _titleName { get; }
+ public DownloadableContentManagerViewModel ViewModel;
public DownloadableContentManagerWindow()
{
DataContext = this;
InitializeComponent();
-
- Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.DlcWindowTitle]} - {_titleName} ({_titleId:X16})";
}
public DownloadableContentManagerWindow(VirtualFileSystem virtualFileSystem, ulong titleId, string titleName)
{
- _virtualFileSystem = virtualFileSystem;
- _downloadableContents = new AvaloniaList<DownloadableContentModel>();
-
- _titleId = titleId;
- _titleName = titleName;
-
- _downloadableContentJsonPath = Path.Combine(AppDataManager.GamesDirPath, titleId.ToString("x16"), "dlc.json");
-
- try
- {
- _downloadableContentContainerList = JsonHelper.DeserializeFromFile<List<DownloadableContentContainer>>(_downloadableContentJsonPath);
- }
- catch
- {
- _downloadableContentContainerList = new List<DownloadableContentContainer>();
- }
-
- DataContext = this;
+ DataContext = ViewModel = new DownloadableContentManagerViewModel(virtualFileSystem, titleId, titleName);
InitializeComponent();
+ }
- RemoveButton.IsEnabled = false;
+ public static async Task Show(VirtualFileSystem virtualFileSystem, ulong titleId, string titleName)
+ {
+ ContentDialog contentDialog = new()
+ {
+ PrimaryButtonText = "",
+ SecondaryButtonText = "",
+ CloseButtonText = "",
+ Content = new DownloadableContentManagerWindow(virtualFileSystem, titleId, titleName),
+ Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], titleName, titleId.ToString("X16"))
+ };
- DlcDataGrid.SelectionChanged += DlcDataGrid_SelectionChanged;
+ Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
+ bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false));
- Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.DlcWindowTitle]} - {_titleName} ({_titleId:X16})";
+ contentDialog.Styles.Add(bottomBorder);
- LoadDownloadableContents();
- PrintHeading();
+ await ContentDialogHelper.ShowAsync(contentDialog);
}
- private void DlcDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ private void SaveAndClose(object sender, RoutedEventArgs routedEventArgs)
{
- RemoveButton.IsEnabled = (DlcDataGrid.SelectedItems.Count > 0);
+ ViewModel.Save();
+ ((ContentDialog)Parent).Hide();
}
- private void PrintHeading()
+ private void Close(object sender, RoutedEventArgs e)
{
- Heading.Text = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DlcWindowHeading, _downloadableContents.Count, _titleName, _titleId.ToString("X16"));
+ ((ContentDialog)Parent).Hide();
}
- private void LoadDownloadableContents()
+ private void RemoveDLC(object sender, RoutedEventArgs e)
{
- foreach (DownloadableContentContainer downloadableContentContainer in _downloadableContentContainerList)
+ if (sender is Button button)
{
- if (File.Exists(downloadableContentContainer.ContainerPath))
+ if (button.DataContext is DownloadableContentModel model)
{
- using FileStream containerFile = File.OpenRead(downloadableContentContainer.ContainerPath);
-
- PartitionFileSystem partitionFileSystem = new(containerFile.AsStorage());
-
- _virtualFileSystem.ImportTickets(partitionFileSystem);
-
- foreach (DownloadableContentNca downloadableContentNca in downloadableContentContainer.DownloadableContentNcaList)
- {
- using UniqueRef<IFile> ncaFile = new();
-
- partitionFileSystem.OpenFile(ref ncaFile.Ref, downloadableContentNca.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure();
-
- Nca nca = TryOpenNca(ncaFile.Get.AsStorage(), downloadableContentContainer.ContainerPath);
- if (nca != null)
- {
- _downloadableContents.Add(new DownloadableContentModel(nca.Header.TitleId.ToString("X16"),
- downloadableContentContainer.ContainerPath,
- downloadableContentNca.FullPath,
- downloadableContentNca.Enabled));
- }
- }
+ ViewModel.Remove(model);
}
}
-
- // NOTE: Save the list again to remove leftovers.
- Save();
}
- private Nca TryOpenNca(IStorage ncaStorage, string containerPath)
+ private void OpenLocation(object sender, RoutedEventArgs e)
{
- try
- {
- return new Nca(_virtualFileSystem.KeySet, ncaStorage);
- }
- catch (Exception ex)
+ if (sender is Button button)
{
- Dispatcher.UIThread.InvokeAsync(async () =>
+ if (button.DataContext is DownloadableContentModel model)
{
- await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogLoadNcaErrorMessage, ex.Message, containerPath));
- });
+ OpenHelper.LocateFile(model.ContainerPath);
+ }
}
-
- return null;
}
- private async Task AddDownloadableContent(string path)
+ private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
- if (!File.Exists(path) || _downloadableContents.FirstOrDefault(x => x.ContainerPath == path) != null)
+ foreach (var content in e.AddedItems)
{
- return;
- }
-
- using FileStream containerFile = File.OpenRead(path);
-
- PartitionFileSystem partitionFileSystem = new(containerFile.AsStorage());
- bool containsDownloadableContent = false;
-
- _virtualFileSystem.ImportTickets(partitionFileSystem);
-
- foreach (DirectoryEntryEx fileEntry in partitionFileSystem.EnumerateEntries("/", "*.nca"))
- {
- using var ncaFile = new UniqueRef<IFile>();
-
- partitionFileSystem.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure();
-
- Nca nca = TryOpenNca(ncaFile.Get.AsStorage(), path);
- if (nca == null)
+ if (content is DownloadableContentModel model)
{
- continue;
- }
+ var index = ViewModel.DownloadableContents.IndexOf(model);
- if (nca.Header.ContentType == NcaContentType.PublicData)
- {
- if ((nca.Header.TitleId & 0xFFFFFFFFFFFFE000) != _titleId)
+ if (index != -1)
{
- break;
+ ViewModel.DownloadableContents[index].Enabled = true;
}
-
- _downloadableContents.Add(new DownloadableContentModel(nca.Header.TitleId.ToString("X16"), path, fileEntry.FullPath, true));
-
- containsDownloadableContent = true;
}
}
- if (!containsDownloadableContent)
+ foreach (var content in e.RemovedItems)
{
- await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogDlcNoDlcErrorMessage]);
- }
- }
-
- private void RemoveDownloadableContents(bool removeSelectedOnly = false)
- {
- if (removeSelectedOnly)
- {
- AvaloniaList<DownloadableContentModel> removedItems = new();
-
- foreach (var item in DlcDataGrid.SelectedItems)
+ if (content is DownloadableContentModel model)
{
- removedItems.Add(item as DownloadableContentModel);
- }
-
- DlcDataGrid.SelectedItems.Clear();
+ var index = ViewModel.DownloadableContents.IndexOf(model);
- foreach (var item in removedItems)
- {
- _downloadableContents.RemoveAll(_downloadableContents.Where(x => x.TitleId == item.TitleId).ToList());
- }
- }
- else
- {
- _downloadableContents.Clear();
- }
-
- PrintHeading();
- }
-
- public void RemoveSelected()
- {
- RemoveDownloadableContents(true);
- }
-
- public void RemoveAll()
- {
- RemoveDownloadableContents();
- }
-
- public void EnableAll()
- {
- foreach(var item in _downloadableContents)
- {
- item.Enabled = true;
- }
- }
-
- public void DisableAll()
- {
- foreach (var item in _downloadableContents)
- {
- item.Enabled = false;
- }
- }
-
- public async void Add()
- {
- OpenFileDialog dialog = new OpenFileDialog()
- {
- Title = LocaleManager.Instance[LocaleKeys.SelectDlcDialogTitle],
- AllowMultiple = true
- };
-
- dialog.Filters.Add(new FileDialogFilter
- {
- Name = "NSP",
- Extensions = { "nsp" }
- });
-
- string[] files = await dialog.ShowAsync(this);
-
- if (files != null)
- {
- foreach (string file in files)
- {
- await AddDownloadableContent(file);
- }
- }
-
- PrintHeading();
- }
-
- public void Save()
- {
- _downloadableContentContainerList.Clear();
-
- DownloadableContentContainer container = default;
-
- foreach (DownloadableContentModel downloadableContent in _downloadableContents)
- {
- if (container.ContainerPath != downloadableContent.ContainerPath)
- {
- if (!string.IsNullOrWhiteSpace(container.ContainerPath))
+ if (index != -1)
{
- _downloadableContentContainerList.Add(container);
+ ViewModel.DownloadableContents[index].Enabled = false;
}
-
- container = new DownloadableContentContainer
- {
- ContainerPath = downloadableContent.ContainerPath,
- DownloadableContentNcaList = new List<DownloadableContentNca>()
- };
}
-
- container.DownloadableContentNcaList.Add(new DownloadableContentNca
- {
- Enabled = downloadableContent.Enabled,
- TitleId = Convert.ToUInt64(downloadableContent.TitleId, 16),
- FullPath = downloadableContent.FullPath
- });
- }
-
- if (!string.IsNullOrWhiteSpace(container.ContainerPath))
- {
- _downloadableContentContainerList.Add(container);
}
-
- using (FileStream downloadableContentJsonStream = File.Create(_downloadableContentJsonPath, 4096, FileOptions.WriteThrough))
- {
- downloadableContentJsonStream.Write(Encoding.UTF8.GetBytes(JsonHelper.Serialize(_downloadableContentContainerList, true)));
- }
- }
-
- public void SaveAndClose()
- {
- Save();
- Close();
}
}
} \ No newline at end of file