From 94d27b171797c0ba211b169caeb6757b388c7490 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Thu, 14 Jun 2018 12:02:32 -0400 Subject: [PATCH 1/4] Recognize main files in game list --- src/yuzu/game_list.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index bbd681eaeb..6b0f077573 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include #include @@ -363,6 +364,19 @@ static bool HasSupportedFileExtension(const std::string& file_name) { return GameList::supported_file_extensions.contains(file.suffix(), Qt::CaseInsensitive); } +static bool IsExtractedNCAMain(const std::string& file_name) { + return QFileInfo(file_name.c_str()).fileName() == "main"; +} + +static QString FormatGameName(std::string physical_name) { + QFileInfo fileInfo(physical_name.c_str()); + if (IsExtractedNCAMain(physical_name)) { + return fileInfo.dir().dirName(); + } else { + return QString::fromStdString(physical_name); + } +} + void GameList::RefreshGameDirectory() { if (!UISettings::values.gamedir.isEmpty() && current_worker != nullptr) { NGLOG_INFO(Frontend, "Change detected in the games directory. Reloading game list."); @@ -380,7 +394,8 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign return false; // Breaks the callback loop. bool is_dir = FileUtil::IsDirectory(physical_name); - if (!is_dir && HasSupportedFileExtension(physical_name)) { + if (!is_dir && + (HasSupportedFileExtension(physical_name) || IsExtractedNCAMain(physical_name))) { std::unique_ptr loader = Loader::GetLoader(physical_name); if (!loader) return true; @@ -392,7 +407,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign loader->ReadProgramId(program_id); emit EntryReady({ - new GameListItemPath(QString::fromStdString(physical_name), smdh, program_id), + new GameListItemPath(FormatGameName(physical_name), smdh, program_id), new GameListItem( QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))), new GameListItemSize(FileUtil::GetSize(physical_name)), From 9f8fbce35b08961b2780e90ac029bc68b88e4c3d Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Thu, 14 Jun 2018 12:16:56 -0400 Subject: [PATCH 2/4] Add support for main files in file picker --- src/yuzu/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index aa9028399b..2e525b5be3 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -550,6 +550,8 @@ void GMainWindow::OnMenuLoadFile() { for (const auto& piece : game_list->supported_file_extensions) extensions += "*." + piece + " "; + extensions += "main "; + QString file_filter = tr("Switch Executable") + " (" + extensions + ")"; file_filter += ";;" + tr("All Files (*.*)"); From f969ddb54eb251539de82c00e083482b1cc309f4 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Thu, 14 Jun 2018 12:27:29 -0400 Subject: [PATCH 3/4] Add 'Load Folder' menu option --- src/yuzu/main.cpp | 10 ++++++++++ src/yuzu/main.h | 1 + src/yuzu/main.ui | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 2e525b5be3..e2afe21314 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -278,6 +278,7 @@ void GMainWindow::ConnectWidgetEvents() { void GMainWindow::ConnectMenuEvents() { // File connect(ui.action_Load_File, &QAction::triggered, this, &GMainWindow::OnMenuLoadFile); + connect(ui.action_Load_Folder, &QAction::triggered, this, &GMainWindow::OnMenuLoadFolder); connect(ui.action_Select_Game_List_Root, &QAction::triggered, this, &GMainWindow::OnMenuSelectGameListRoot); connect(ui.action_Exit, &QAction::triggered, this, &QMainWindow::close); @@ -564,6 +565,15 @@ void GMainWindow::OnMenuLoadFile() { } } +void GMainWindow::OnMenuLoadFolder() { + QDir dir = QFileDialog::getExistingDirectory(this, tr("Open Extracted ROM Directory")); + + QStringList matchingMain = dir.entryList(QStringList() << "main", QDir::Files); + if (matchingMain.size() == 1) { + BootGame(matchingMain[0]); + } +} + void GMainWindow::OnMenuSelectGameListRoot() { QString dir_path = QFileDialog::getExistingDirectory(this, tr("Select Directory")); if (!dir_path.isEmpty()) { diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 3e29d5fc4c..074bba3f9c 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -123,6 +123,7 @@ private slots: void OnGameListLoadFile(QString game_path); void OnGameListOpenSaveFolder(u64 program_id); void OnMenuLoadFile(); + void OnMenuLoadFolder(); /// Called whenever a user selects the "File->Select Game List Root" menu item void OnMenuSelectGameListRoot(); void OnMenuRecentFile(); diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 0fcd93cc25..22c4cad08c 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -58,6 +58,7 @@ + @@ -106,6 +107,11 @@ Load File... + + + Load Folder... + + Load Symbol Map... From acc8fe5a2a2d46c0f89642a9eccaedcea47c6c4f Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Thu, 14 Jun 2018 17:25:40 -0400 Subject: [PATCH 4/4] Bug fixes, testing, and review changes --- src/yuzu/game_list.cpp | 17 +++++++++++++---- src/yuzu/main.cpp | 10 +++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 6b0f077573..9e585b082a 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -265,8 +265,17 @@ void GameList::ValidateEntry(const QModelIndex& item) { if (file_path.isEmpty()) return; std::string std_file_path(file_path.toStdString()); - if (!FileUtil::Exists(std_file_path) || FileUtil::IsDirectory(std_file_path)) + if (!FileUtil::Exists(std_file_path)) return; + if (FileUtil::IsDirectory(std_file_path)) { + QDir dir(std_file_path.c_str()); + QStringList matching_main = dir.entryList(QStringList("main"), QDir::Files); + if (matching_main.size() == 1) { + emit GameChosen(dir.path() + DIR_SEP + matching_main[0]); + } + return; + } + // Users usually want to run a diffrent game after closing one search_field->clear(); emit GameChosen(file_path); @@ -368,10 +377,10 @@ static bool IsExtractedNCAMain(const std::string& file_name) { return QFileInfo(file_name.c_str()).fileName() == "main"; } -static QString FormatGameName(std::string physical_name) { - QFileInfo fileInfo(physical_name.c_str()); +static QString FormatGameName(const std::string& physical_name) { + QFileInfo file_info(physical_name.c_str()); if (IsExtractedNCAMain(physical_name)) { - return fileInfo.dir().dirName(); + return file_info.dir().path(); } else { return QString::fromStdString(physical_name); } diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index e2afe21314..97be548d73 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "common/common_paths.h" #include "common/logging/backend.h" #include "common/logging/filter.h" #include "common/logging/log.h" @@ -568,9 +569,12 @@ void GMainWindow::OnMenuLoadFile() { void GMainWindow::OnMenuLoadFolder() { QDir dir = QFileDialog::getExistingDirectory(this, tr("Open Extracted ROM Directory")); - QStringList matchingMain = dir.entryList(QStringList() << "main", QDir::Files); - if (matchingMain.size() == 1) { - BootGame(matchingMain[0]); + QStringList matching_main = dir.entryList(QStringList("main"), QDir::Files); + if (matching_main.size() == 1) { + BootGame(dir.path() + DIR_SEP + matching_main[0]); + } else { + QMessageBox::warning(this, tr("Invalid Directory Selected"), + tr("The directory you have selected does not contain a 'main' file.")); } }