WX: Add the ability to uninstall WADs from the game list

Simple quality-of-life addition that allows "uninstalling" WADs
(removing the corresponding installed title) from the NAND.

The option is only enabled when the WAD can be uninstalled

The motivation for this is actually to encourage proper usage of the
WAD launch feature (installing it to the NAND first), so we can
drop the "direct WAD title launch" hack.
This commit is contained in:
Léo Lam 2017-04-25 23:29:48 +02:00
parent 4d52df150b
commit 3124f3c4d8
5 changed files with 60 additions and 3 deletions

View File

@ -244,6 +244,7 @@ EVT_MENU_RANGE(IDM_FLOAT_LOG_WINDOW, IDM_FLOAT_CODE_WINDOW, CFrame::OnFloatWindo
// Game list context menu // Game list context menu
EVT_MENU(IDM_LIST_INSTALL_WAD, CFrame::OnInstallWAD) EVT_MENU(IDM_LIST_INSTALL_WAD, CFrame::OnInstallWAD)
EVT_MENU(IDM_LIST_UNINSTALL_WAD, CFrame::OnUninstallWAD)
// Other // Other
EVT_ACTIVATE(CFrame::OnActive) EVT_ACTIVATE(CFrame::OnActive)

View File

@ -316,6 +316,7 @@ private:
void OnShowCheatsWindow(wxCommandEvent& event); void OnShowCheatsWindow(wxCommandEvent& event);
void OnLoadWiiMenu(wxCommandEvent& event); void OnLoadWiiMenu(wxCommandEvent& event);
void OnInstallWAD(wxCommandEvent& event); void OnInstallWAD(wxCommandEvent& event);
void OnUninstallWAD(wxCommandEvent& event);
void OnImportBootMiiBackup(wxCommandEvent& event); void OnImportBootMiiBackup(wxCommandEvent& event);
void OnExtractCertificates(wxCommandEvent& event); void OnExtractCertificates(wxCommandEvent& event);
void OnFifoPlayer(wxCommandEvent& event); void OnFifoPlayer(wxCommandEvent& event);

View File

@ -53,6 +53,8 @@
#include "DiscIO/NANDContentLoader.h" #include "DiscIO/NANDContentLoader.h"
#include "DiscIO/NANDImporter.h" #include "DiscIO/NANDImporter.h"
#include "DiscIO/VolumeCreator.h"
#include "DiscIO/VolumeWad.h"
#include "DolphinWX/AboutDolphin.h" #include "DolphinWX/AboutDolphin.h"
#include "DolphinWX/Cheats/CheatsWindow.h" #include "DolphinWX/Cheats/CheatsWindow.h"
@ -1228,6 +1230,31 @@ void CFrame::OnInstallWAD(wxCommandEvent& event)
} }
} }
void CFrame::OnUninstallWAD(wxCommandEvent&)
{
const GameListItem* file = m_GameListCtrl->GetSelectedISO();
if (!file)
return;
if (!AskYesNoT("Uninstalling the WAD will remove the currently installed version "
"of this title from the NAND without deleting its save data. Continue?"))
{
return;
}
const auto volume = DiscIO::CreateVolumeFromFilename(file->GetFileName());
u64 title_id;
volume->GetTitleID(&title_id);
if (!DiscIO::CNANDContentManager::Access().RemoveTitle(title_id, Common::FROM_CONFIGURED_ROOT))
{
PanicAlertT("Failed to remove this title from the NAND.");
return;
}
if (title_id == TITLEID_SYSMENU)
UpdateLoadWiiMenuItem();
}
void CFrame::OnImportBootMiiBackup(wxCommandEvent& WXUNUSED(event)) void CFrame::OnImportBootMiiBackup(wxCommandEvent& WXUNUSED(event))
{ {
if (!AskYesNoT("Merging a new NAND over your currently selected NAND will overwrite any channels " if (!AskYesNoT("Merging a new NAND over your currently selected NAND will overwrite any channels "

View File

@ -956,6 +956,27 @@ void CGameListCtrl::OnLeftClick(wxMouseEvent& event)
event.Skip(); event.Skip();
} }
static bool IsWADInstalled(const std::string& wad_path)
{
const auto volume = DiscIO::CreateVolumeFromFilename(wad_path);
u64 title_id;
if (!volume || !volume->GetTitleID(&title_id))
return false;
const std::string content_dir =
Common::GetTitleContentPath(title_id, Common::FromWhichRoot::FROM_CONFIGURED_ROOT);
if (!File::IsDirectory(content_dir))
return false;
// Since this isn't IOS and we only need a simple way to figure out if a title is installed,
// we make the (reasonable) assumption that having more than just the TMD in the content
// directory means that the title is installed.
const auto entries = File::ScanDirectoryTree(content_dir, false);
return std::any_of(entries.children.begin(), entries.children.end(),
[](const auto& file) { return file.virtualName != "title.tmd"; });
}
void CGameListCtrl::OnRightClick(wxMouseEvent& event) void CGameListCtrl::OnRightClick(wxMouseEvent& event)
{ {
// Focus the clicked item. // Focus the clicked item.
@ -1024,9 +1045,15 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event)
if (platform == DiscIO::Platform::WII_WAD) if (platform == DiscIO::Platform::WII_WAD)
{ {
auto* const install_wad_item = auto* const install_wad_item =
popupMenu.Append(IDM_LIST_INSTALL_WAD, _("Install to Wii Menu")); popupMenu.Append(IDM_LIST_INSTALL_WAD, _("Install to the NAND"));
// This should not be allowed while emulation is running, just like the Install WAD option. auto* const uninstall_wad_item =
install_wad_item->Enable(!Core::IsRunning() || !SConfig::GetInstance().bWii); popupMenu.Append(IDM_LIST_UNINSTALL_WAD, _("Uninstall from the NAND"));
// These should not be allowed while emulation is running for safety reasons.
for (auto* menu_item : {install_wad_item, uninstall_wad_item})
menu_item->Enable(!Core::IsRunning() || !SConfig::GetInstance().bWii);
if (!IsWADInstalled(selected_iso->GetFileName()))
uninstall_wad_item->Enable(false);
} }
popupMenu.Append(IDM_START_NETPLAY, _("Host with Netplay")); popupMenu.Append(IDM_START_NETPLAY, _("Host with Netplay"));

View File

@ -101,6 +101,7 @@ enum
IDM_LOAD_WII_MENU, IDM_LOAD_WII_MENU,
IDM_MENU_INSTALL_WAD, IDM_MENU_INSTALL_WAD,
IDM_LIST_INSTALL_WAD, IDM_LIST_INSTALL_WAD,
IDM_LIST_UNINSTALL_WAD,
IDM_IMPORT_NAND, IDM_IMPORT_NAND,
IDM_EXTRACT_CERTIFICATES, IDM_EXTRACT_CERTIFICATES,
IDM_FIFOPLAYER, IDM_FIFOPLAYER,