diff options
| author | JMC47 <JMC4789@gmail.com> | 2019-01-15 13:01:36 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-01-15 13:01:36 -0500 |
| commit | 1d3e3de44b177eb7bdd07a02afefb83ac9ba5812 (patch) | |
| tree | 6ee0e26269ff43d5587713e57b8614c2aec96690 /Source/Core/DolphinQt/MainWindow.cpp | |
| parent | e2535254ad2ad6d4f627570ec0b69ebc974f000e (diff) | |
| parent | 0c622929ba0cf1d9c7030029ad86505024e5bbaa (diff) | |
Merge pull request #7629 from JosJuice/auto-disc-change
Automatic disc change for 2-disc games
Diffstat (limited to 'Source/Core/DolphinQt/MainWindow.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/MainWindow.cpp | 126 |
1 files changed, 88 insertions, 38 deletions
diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 1b57cbe96c..bab9e280da 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -168,6 +168,17 @@ static WindowSystemInfo GetWindowSystemInfo(QWindow* window) return wsi; } +static std::vector<std::string> StringListToStdVector(QStringList list) +{ + std::vector<std::string> result; + result.reserve(list.size()); + + for (const QString& s : list) + result.push_back(s.toStdString()); + + return result; +} + MainWindow::MainWindow(std::unique_ptr<BootParameters> boot_parameters) : QMainWindow(nullptr) { setWindowTitle(QString::fromStdString(Common::scm_rev_str)); @@ -387,7 +398,7 @@ void MainWindow::ConnectMenuBar() connect(m_menu_bar, &MenuBar::EjectDisc, this, &MainWindow::EjectDisc); connect(m_menu_bar, &MenuBar::ChangeDisc, this, &MainWindow::ChangeDisc); connect(m_menu_bar, &MenuBar::BootDVDBackup, this, - [this](const QString& drive) { StartGame(drive); }); + [this](const QString& drive) { StartGame(drive, ScanForSecondDisc::No); }); // Emulation connect(m_menu_bar, &MenuBar::Pause, this, &MainWindow::Pause); @@ -610,30 +621,30 @@ void MainWindow::RefreshGameList() Settings::Instance().RefreshGameList(); } -QString MainWindow::PromptFileName() +QStringList MainWindow::PromptFileNames() { auto& settings = Settings::Instance().GetQSettings(); - QString path = QFileDialog::getOpenFileName( + QStringList paths = QFileDialog::getOpenFileNames( this, tr("Select a File"), settings.value(QStringLiteral("mainwindow/lastdir"), QStringLiteral("")).toString(), - tr("All GC/Wii files (*.elf *.dol *.gcm *.iso *.tgc *.wbfs *.ciso *.gcz *.wad *.dff);;" + tr("All GC/Wii files (*.elf *.dol *.gcm *.iso *.tgc *.wbfs *.ciso *.gcz *.wad *.dff *.m3u);;" "All Files (*)")); - if (!path.isEmpty()) + if (!paths.isEmpty()) { settings.setValue(QStringLiteral("mainwindow/lastdir"), - QFileInfo(path).absoluteDir().absolutePath()); + QFileInfo(paths.front()).absoluteDir().absolutePath()); } - return path; + return paths; } void MainWindow::ChangeDisc() { - QString file = PromptFileName(); + std::vector<std::string> paths = StringListToStdVector(PromptFileNames()); - if (!file.isEmpty()) - Core::RunAsCPUThread([&file] { DVDInterface::ChangeDisc(file.toStdString()); }); + if (!paths.empty()) + Core::RunAsCPUThread([&paths] { DVDInterface::ChangeDisc(paths); }); } void MainWindow::EjectDisc() @@ -643,9 +654,9 @@ void MainWindow::EjectDisc() void MainWindow::Open() { - QString file = PromptFileName(); - if (!file.isEmpty()) - StartGame(file); + QStringList files = PromptFileNames(); + if (!files.isEmpty()) + StartGame(StringListToStdVector(files)); } void MainWindow::Play(const std::optional<std::string>& savestate_path) @@ -664,7 +675,7 @@ void MainWindow::Play(const std::optional<std::string>& savestate_path) std::shared_ptr<const UICommon::GameFile> selection = m_game_list->GetSelectedGame(); if (selection) { - StartGame(selection->GetFilePath(), savestate_path); + StartGame(selection->GetFilePath(), ScanForSecondDisc::Yes, savestate_path); EnableScreenSaver(false); } else @@ -672,7 +683,7 @@ void MainWindow::Play(const std::optional<std::string>& savestate_path) const QString default_path = QString::fromStdString(Config::Get(Config::MAIN_DEFAULT_ISO)); if (!default_path.isEmpty() && QFile::exists(default_path)) { - StartGame(default_path, savestate_path); + StartGame(default_path, ScanForSecondDisc::Yes, savestate_path); EnableScreenSaver(false); } else @@ -833,17 +844,46 @@ void MainWindow::ScreenShot() Core::SaveScreenShot(); } -void MainWindow::StartGame(const QString& path, const std::optional<std::string>& savestate_path) +void MainWindow::ScanForSecondDiscAndStartGame(const UICommon::GameFile& game, + const std::optional<std::string>& savestate_path) { - StartGame(path.toStdString(), savestate_path); + auto second_game = m_game_list->FindSecondDisc(game); + + std::vector<std::string> paths = {game.GetFilePath()}; + if (second_game != nullptr) + paths.push_back(second_game->GetFilePath()); + + StartGame(paths, savestate_path); } -void MainWindow::StartGame(const std::string& path, +void MainWindow::StartGame(const QString& path, ScanForSecondDisc scan, const std::optional<std::string>& savestate_path) { + StartGame(path.toStdString(), scan, savestate_path); +} + +void MainWindow::StartGame(const std::string& path, ScanForSecondDisc scan, + const std::optional<std::string>& savestate_path) +{ + if (scan == ScanForSecondDisc::Yes) + { + std::shared_ptr<const UICommon::GameFile> game = m_game_list->FindGame(path); + if (game != nullptr) + { + ScanForSecondDiscAndStartGame(*game, savestate_path); + return; + } + } + StartGame(BootParameters::GenerateFromFile(path, savestate_path)); } +void MainWindow::StartGame(const std::vector<std::string>& paths, + const std::optional<std::string>& savestate_path) +{ + StartGame(BootParameters::GenerateFromFile(paths, savestate_path)); +} + void MainWindow::StartGame(std::unique_ptr<BootParameters>&& parameters) { // If we're running, only start a new game once we've stopped the last. @@ -1075,7 +1115,7 @@ void MainWindow::ShowFIFOPlayer() { m_fifo_window = new FIFOPlayerWindow(this); connect(m_fifo_window, &FIFOPlayerWindow::LoadFIFORequested, this, - [this](const QString& path) { StartGame(path); }); + [this](const QString& path) { StartGame(path, ScanForSecondDisc::No); }); } m_fifo_window->show(); @@ -1170,7 +1210,7 @@ void MainWindow::NetPlayInit() #endif connect(m_netplay_dialog, &NetPlayDialog::Boot, this, - [this](const QString& path) { StartGame(path); }); + [this](const QString& path) { StartGame(path, ScanForSecondDisc::Yes); }); connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::ForceStop); connect(m_netplay_dialog, &NetPlayDialog::rejected, this, &MainWindow::NetPlayQuit); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Join, this, &MainWindow::NetPlayJoin); @@ -1346,38 +1386,48 @@ void MainWindow::dragEnterEvent(QDragEnterEvent* event) void MainWindow::dropEvent(QDropEvent* event) { - const auto& urls = event->mimeData()->urls(); + const QList<QUrl>& urls = event->mimeData()->urls(); if (urls.empty()) return; - const auto& url = urls[0]; - QFileInfo file_info(url.toLocalFile()); + QStringList files; + QStringList folders; - auto path = file_info.filePath(); - - if (!file_info.exists() || !file_info.isReadable()) + for (const QUrl& url : urls) { - QMessageBox::critical(this, tr("Error"), tr("Failed to open '%1'").arg(path)); - return; + QFileInfo file_info(url.toLocalFile()); + QString path = file_info.filePath(); + + if (!file_info.exists() || !file_info.isReadable()) + { + QMessageBox::critical(this, tr("Error"), tr("Failed to open '%1'").arg(path)); + return; + } + + (file_info.isFile() ? files : folders).append(path); } - if (file_info.isFile()) + if (!files.isEmpty()) { - StartGame(path); + StartGame(StringListToStdVector(files)); } else { - auto& settings = Settings::Instance(); + Settings& settings = Settings::Instance(); + const bool show_confirm = settings.GetPaths().size() != 0; - if (settings.GetPaths().size() != 0) + for (const QString& folder : folders) { - if (QMessageBox::question( - this, tr("Confirm"), - tr("Do you want to add \"%1\" to the list of Game Paths?").arg(path)) != - QMessageBox::Yes) - return; + if (show_confirm) + { + if (QMessageBox::question( + this, tr("Confirm"), + tr("Do you want to add \"%1\" to the list of Game Paths?").arg(folder)) != + QMessageBox::Yes) + return; + } + settings.AddPath(folder); } - settings.AddPath(path); } } |
