Implement dlc management window (#1313)

* Implement dlc management window

* reduce repetition

* Implement per NCA toggling of DLC rather than per container
This commit is contained in:
Xpl0itR 2020-06-23 01:32:07 +01:00 committed by GitHub
parent fcd187ce42
commit 2ed9db1fcd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 581 additions and 164 deletions

View file

@ -8,7 +8,6 @@ using LibHac.FsSystem;
using LibHac.FsSystem.NcaUtils;
using LibHac.Ncm;
using LibHac.Ns;
using LibHac.Spl;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
@ -20,64 +19,97 @@ using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading;
using static LibHac.Fs.ApplicationSaveDataManagement;
using GUI = Gtk.Builder.ObjectAttribute;
namespace Ryujinx.Ui
{
public class GameTableContextMenu : Menu
{
private ListStore _gameTableStore;
private TreeIter _rowIter;
private VirtualFileSystem _virtualFileSystem;
private MessageDialog _dialog;
private bool _cancel;
private readonly ListStore _gameTableStore;
private readonly TreeIter _rowIter;
private readonly VirtualFileSystem _virtualFileSystem;
private BlitStruct<ApplicationControlProperty> _controlData;
private readonly BlitStruct<ApplicationControlProperty> _controlData;
#pragma warning disable CS0649
#pragma warning disable IDE0044
[GUI] MenuItem _openSaveUserDir;
[GUI] MenuItem _openSaveDeviceDir;
[GUI] MenuItem _openSaveBcatDir;
[GUI] MenuItem _manageTitleUpdates;
[GUI] MenuItem _extractRomFs;
[GUI] MenuItem _extractExeFs;
[GUI] MenuItem _extractLogo;
#pragma warning restore CS0649
#pragma warning restore IDE0044
private MessageDialog _dialog;
private bool _cancel;
public GameTableContextMenu(ListStore gameTableStore, BlitStruct<ApplicationControlProperty> controlData, TreeIter rowIter, VirtualFileSystem virtualFileSystem)
: this(new Builder("Ryujinx.Ui.GameTableContextMenu.glade"), gameTableStore, controlData, rowIter, virtualFileSystem) { }
private GameTableContextMenu(Builder builder, ListStore gameTableStore, BlitStruct<ApplicationControlProperty> controlData, TreeIter rowIter, VirtualFileSystem virtualFileSystem) : base(builder.GetObject("_contextMenu").Handle)
{
builder.Autoconnect(this);
_gameTableStore = gameTableStore;
_rowIter = rowIter;
_virtualFileSystem = virtualFileSystem;
_controlData = controlData;
_openSaveUserDir.Activated += OpenSaveUserDir_Clicked;
_openSaveDeviceDir.Activated += OpenSaveDeviceDir_Clicked;
_openSaveBcatDir.Activated += OpenSaveBcatDir_Clicked;
_manageTitleUpdates.Activated += ManageTitleUpdates_Clicked;
_extractRomFs.Activated += ExtractRomFs_Clicked;
_extractExeFs.Activated += ExtractExeFs_Clicked;
_extractLogo.Activated += ExtractLogo_Clicked;
_openSaveUserDir.Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.UserAccountSaveDataSize > 0;
_openSaveDeviceDir.Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.DeviceSaveDataSize > 0;
_openSaveBcatDir.Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.BcatDeliveryCacheStorageSize > 0;
string ext = System.IO.Path.GetExtension(_gameTableStore.GetValue(_rowIter, 9).ToString()).ToLower();
if (ext != ".nca" && ext != ".nsp" && ext != ".pfs0" && ext != ".xci")
MenuItem openSaveUserDir = new MenuItem("Open User Save Directory")
{
_extractRomFs.Sensitive = false;
_extractExeFs.Sensitive = false;
_extractLogo.Sensitive = false;
}
Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.UserAccountSaveDataSize > 0,
TooltipText = "Open the folder where the User save for the application is loaded"
};
MenuItem openSaveDeviceDir = new MenuItem("Open Device Save Directory")
{
Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.DeviceSaveDataSize > 0,
TooltipText = "Open the folder where the Device save for the application is loaded"
};
MenuItem openSaveBcatDir = new MenuItem("Open BCAT Save Directory")
{
Sensitive = !Util.IsEmpty(controlData.ByteSpan) && controlData.Value.BcatDeliveryCacheStorageSize > 0,
TooltipText = "Open the folder where the BCAT save for the application is loaded"
};
MenuItem manageTitleUpdates = new MenuItem("Manage Title Updates")
{
TooltipText = "Open the title update management window"
};
MenuItem manageDlc = new MenuItem("Manage DLC")
{
TooltipText = "Open the DLC management window"
};
string ext = System.IO.Path.GetExtension(_gameTableStore.GetValue(_rowIter, 9).ToString()).ToLower();
bool hasNca = ext == ".nca" || ext == ".nsp" || ext == ".pfs0" || ext == ".xci";
MenuItem extractRomFs = new MenuItem("Extract RomFS Section")
{
Sensitive = hasNca,
TooltipText = "Exctact the RomFs section present in the main NCA"
};
MenuItem extractExeFs = new MenuItem("Extract ExeFS Section")
{
Sensitive = hasNca,
TooltipText = "Exctact the ExeFs section present in the main NCA"
};
MenuItem extractLogo = new MenuItem("Extract Logo Section")
{
Sensitive = hasNca,
TooltipText = "Exctact the Logo section present in the main NCA"
};
openSaveUserDir.Activated += OpenSaveUserDir_Clicked;
openSaveDeviceDir.Activated += OpenSaveDeviceDir_Clicked;
openSaveBcatDir.Activated += OpenSaveBcatDir_Clicked;
manageTitleUpdates.Activated += ManageTitleUpdates_Clicked;
manageDlc.Activated += ManageDlc_Clicked;
extractRomFs.Activated += ExtractRomFs_Clicked;
extractExeFs.Activated += ExtractExeFs_Clicked;
extractLogo.Activated += ExtractLogo_Clicked;
this.Add(openSaveUserDir);
this.Add(openSaveDeviceDir);
this.Add(openSaveBcatDir);
this.Add(new SeparatorMenuItem());
this.Add(manageTitleUpdates);
this.Add(manageDlc);
this.Add(new SeparatorMenuItem());
this.Add(extractRomFs);
this.Add(extractExeFs);
this.Add(extractLogo);
}
private bool TryFindSaveData(string titleName, ulong titleId, BlitStruct<ApplicationControlProperty> controlHolder, SaveDataFilter filter, out ulong saveDataId)
@ -478,7 +510,7 @@ namespace Ryujinx.Ui
string saveDir = GetSaveDataDirectory(saveDataId);
Process.Start(new ProcessStartInfo()
Process.Start(new ProcessStartInfo
{
FileName = saveDir,
UseShellExecute = true,
@ -531,6 +563,15 @@ namespace Ryujinx.Ui
titleUpdateWindow.Show();
}
private void ManageDlc_Clicked(object sender, EventArgs args)
{
string titleName = _gameTableStore.GetValue(_rowIter, 2).ToString().Split("\n")[0];
string titleId = _gameTableStore.GetValue(_rowIter, 2).ToString().Split("\n")[1].ToLower();
DlcWindow dlcWindow = new DlcWindow(titleId, titleName, _virtualFileSystem);
dlcWindow.Show();
}
private void ExtractRomFs_Clicked(object sender, EventArgs args)
{
ExtractSection(NcaSectionType.Data);