123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- #include <QActionGroup>
- #include <QDesktopServices>
- #include <QFileDialog>
- #include <QMessageBox>
- #include <QUrl>
- #include "ui_MainWindow.h"
- #include "Common/StdMakeUnique.h"
- #include "Core/BootManager.h"
- #include "Core/ConfigManager.h"
- #include "Core/HW/ProcessorInterface.h"
- #include "DolphinQt/AboutDialog.h"
- #include "DolphinQt/MainWindow.h"
- #include "DolphinQt/SystemInfo.h"
- #include "DolphinQt/Utils/Resources.h"
- #include "DolphinQt/Utils/Utils.h"
- #include "VideoCommon/VideoConfig.h"
- DMainWindow* g_main_window = nullptr;
- DMainWindow::DMainWindow(QWidget* parent_widget)
- : QMainWindow(parent_widget)
- {
- m_ui = std::make_unique<Ui::DMainWindow>();
- m_ui->setupUi(this);
- Resources::Init();
- UpdateIcons();
- setWindowIcon(Resources::GetIcon(Resources::DOLPHIN_LOGO));
-
- m_game_tracker = new DGameTracker(this);
- m_ui->centralWidget->addWidget(m_game_tracker);
- m_game_tracker->ScanForGames();
- m_game_tracker->SelectLastBootedGame();
-
- QActionGroup* gamelistGroup = new QActionGroup(this);
- gamelistGroup->addAction(m_ui->actionListView);
- gamelistGroup->addAction(m_ui->actionTreeView);
- gamelistGroup->addAction(m_ui->actionGridView);
- gamelistGroup->addAction(m_ui->actionIconView);
-
- m_ui->actionListView->setChecked(true);
- OnGameListStyleChanged();
-
- connect(this, SIGNAL(CoreStateChanged(Core::EState)), this, SLOT(OnCoreStateChanged(Core::EState)));
- connect(m_ui->actionOpen, SIGNAL(triggered()), this, SLOT(OnOpen()));
- connect(m_ui->actionBrowse, SIGNAL(triggered()), this, SLOT(OnBrowse()));
- connect(m_ui->actionExit, SIGNAL(triggered()), this, SLOT(OnExit()));
- connect(m_ui->actionListView, SIGNAL(triggered()), this, SLOT(OnGameListStyleChanged()));
- connect(m_ui->actionTreeView, SIGNAL(triggered()), this, SLOT(OnGameListStyleChanged()));
- connect(m_ui->actionGridView, SIGNAL(triggered()), this, SLOT(OnGameListStyleChanged()));
- connect(m_ui->actionIconView, SIGNAL(triggered()), this, SLOT(OnGameListStyleChanged()));
- connect(m_ui->actionPlay, SIGNAL(triggered()), this, SLOT(OnPlay()));
- connect(m_ui->actionPlay_mnu, SIGNAL(triggered()), this, SLOT(OnPlay()));
- connect(m_game_tracker, SIGNAL(StartGame()), this, SLOT(OnPlay()));
- connect(m_ui->actionStop, SIGNAL(triggered()), this, SLOT(OnStop()));
- connect(m_ui->actionStop_mnu, SIGNAL(triggered()), this, SLOT(OnStop()));
- connect(m_ui->actionReset, SIGNAL(triggered()), this, SLOT(OnReset()));
- connect(m_ui->actionWebsite, SIGNAL(triggered()), this, SLOT(OnOpenWebsite()));
- connect(m_ui->actionOnlineDocs, SIGNAL(triggered()), this, SLOT(OnOpenDocs()));
- connect(m_ui->actionGitHub, SIGNAL(triggered()), this, SLOT(OnOpenGitHub()));
- connect(m_ui->actionSystemInfo, SIGNAL(triggered()), this, SLOT(OnOpenSystemInfo()));
- connect(m_ui->actionAbout, SIGNAL(triggered()), this, SLOT(OnOpenAbout()));
- connect(m_ui->actionAboutQt, SIGNAL(triggered()), this, SLOT(OnOpenAboutQt()));
-
- emit CoreStateChanged(Core::CORE_UNINITIALIZED);
-
- #ifdef Q_OS_MACX
- m_ui->toolbar->setMovable(false);
- #endif
- }
- DMainWindow::~DMainWindow()
- {
- }
- void DMainWindow::closeEvent(QCloseEvent* ce)
- {
- Stop();
- }
- void DMainWindow::StartGame(const QString filename)
- {
- m_render_widget = std::make_unique<DRenderWidget>();
- m_render_widget->setWindowTitle(tr("Dolphin"));
- m_render_widget->setWindowIcon(windowIcon());
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen)
- {
- m_render_widget->setWindowFlags(m_render_widget->windowFlags() | Qt::BypassWindowManagerHint);
- g_Config.bFullscreen = !g_Config.bBorderlessFullscreen;
- m_render_widget->showFullScreen();
- }
- else
- {
- m_ui->centralWidget->addWidget(m_render_widget.get());
- m_ui->centralWidget->setCurrentWidget(m_render_widget.get());
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize)
- {
-
- m_render_widget->setMinimumSize(SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowWidth,
- SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowHeight);
- qApp->processEvents();
- m_render_widget->setMinimumSize(0, 0);
- }
- m_render_widget->adjustSize();
- }
- if (!BootManager::BootCore(filename.toStdString()))
- {
- QMessageBox::critical(this, tr("Fatal error"), tr("Failed to init Core"), QMessageBox::Ok);
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen)
- m_render_widget->close();
- else
- m_ui->centralWidget->removeWidget(m_render_widget.get());
- m_render_widget.reset();
- }
- else
- {
-
- emit CoreStateChanged(Core::CORE_RUN);
- }
- }
- QString DMainWindow::RequestBootFilename()
- {
-
- if (m_game_tracker->SelectedGame() != nullptr)
- return m_game_tracker->SelectedGame()->GetFileName();
- return ShowFileDialog();
- }
- QString DMainWindow::ShowFileDialog()
- {
- return QFileDialog::getOpenFileName(this, tr("Open File"), QString(),
- tr("All supported ROMs (%1);;All files (*)")
- .arg(SL("*.gcm *.iso *.ciso *.gcz *.wbfs *.elf *.dol *.dff *.tmd *.wad")));
- }
- QString DMainWindow::ShowFolderDialog()
- {
- return QFileDialog::getExistingDirectory(this, tr("Browse for a directory to add"),
- QDir::homePath(),
- QFileDialog::ShowDirsOnly);
- }
- void DMainWindow::DoStartPause()
- {
- if (Core::GetState() == Core::CORE_RUN)
- {
- Core::SetState(Core::CORE_PAUSE);
- emit CoreStateChanged(Core::CORE_PAUSE);
- }
- else
- {
- Core::SetState(Core::CORE_RUN);
- emit CoreStateChanged(Core::CORE_RUN);
- }
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)
- m_render_widget->setCursor(Qt::BlankCursor);
- }
- void DMainWindow::OnOpen()
- {
- QString filename = ShowFileDialog();
- if (!filename.isNull())
- StartGame(filename);
- }
- void DMainWindow::OnBrowse()
- {
- std::string path = ShowFolderDialog().toStdString();
- std::vector<std::string>& iso_folder = SConfig::GetInstance().m_ISOFolder;
- if (!path.empty())
- {
- auto itResult = std::find(iso_folder.begin(), iso_folder.end(), path);
- if (itResult == iso_folder.end())
- {
- iso_folder.push_back(path);
- SConfig::GetInstance().SaveSettings();
- }
- }
- m_game_tracker->ScanForGames();
- }
- void DMainWindow::OnExit()
- {
- close();
- if (Core::GetState() == Core::CORE_UNINITIALIZED || m_isStopping)
- return;
- Stop();
- }
- void DMainWindow::OnPlay()
- {
- if (Core::GetState() != Core::CORE_UNINITIALIZED)
- {
- DoStartPause();
- }
- else
- {
-
- QString filename = RequestBootFilename();
- if (!filename.isNull())
- StartGame(filename);
- }
- }
- bool DMainWindow::OnStop()
- {
- if (Core::GetState() == Core::CORE_UNINITIALIZED || m_isStopping)
- return true;
-
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bConfirmStop)
- {
-
- Core::SetState(Core::CORE_PAUSE);
- emit CoreStateChanged(Core::CORE_PAUSE);
- QMessageBox::StandardButton ret = QMessageBox::question(m_render_widget.get(), tr("Please confirm..."),
- tr("Do you want to stop the current emulation?"),
- QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
- if (ret == QMessageBox::No)
- {
- DoStartPause();
- return false;
- }
- }
- return Stop();
- }
- bool DMainWindow::Stop()
- {
- m_isStopping = true;
-
-
- BootManager::Stop();
-
-
-
-
-
-
- if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen)
- m_render_widget->close();
- else
- m_ui->centralWidget->removeWidget(m_render_widget.get());
- m_render_widget.reset();
- emit CoreStateChanged(Core::CORE_UNINITIALIZED);
- m_isStopping = false;
- return true;
- }
- void DMainWindow::OnReset()
- {
-
- ProcessorInterface::ResetButton_Tap();
- }
- void DMainWindow::OnGameListStyleChanged()
- {
- if (m_ui->actionListView->isChecked())
- m_game_tracker->SetViewStyle(STYLE_LIST);
- else if (m_ui->actionTreeView->isChecked())
- m_game_tracker->SetViewStyle(STYLE_TREE);
- else if (m_ui->actionGridView->isChecked())
- m_game_tracker->SetViewStyle(STYLE_GRID);
- else if (m_ui->actionIconView->isChecked())
- m_game_tracker->SetViewStyle(STYLE_ICON);
- }
- void DMainWindow::OnCoreStateChanged(Core::EState state)
- {
- bool is_not_initialized = (state == Core::CORE_UNINITIALIZED);
- bool is_running = (state == Core::CORE_RUN);
- bool is_paused = (state == Core::CORE_PAUSE);
-
- m_ui->actionPlay->setEnabled(is_not_initialized || is_running || is_paused);
- if (is_running)
- {
- m_ui->actionPlay->setIcon(Resources::GetIcon(Resources::TOOLBAR_PAUSE));
- m_ui->actionPlay->setText(tr("Pause"));
- m_ui->actionPlay_mnu->setText(tr("Pause"));
- }
- else if (is_paused || is_not_initialized)
- {
- m_ui->actionPlay->setIcon(Resources::GetIcon(Resources::TOOLBAR_PLAY));
- m_ui->actionPlay->setText(tr("Play"));
- m_ui->actionPlay_mnu->setText(tr("Play"));
- }
- m_ui->actionStop->setEnabled(!is_not_initialized);
- m_ui->actionOpen->setEnabled(is_not_initialized);
- m_game_tracker->setEnabled(is_not_initialized);
- }
- void DMainWindow::UpdateIcons()
- {
-
- m_ui->actionStop->setIcon(Resources::GetIcon(Resources::TOOLBAR_STOP));
- }
- void DMainWindow::OnOpenWebsite()
- {
- QDesktopServices::openUrl(QUrl(SL("https://dolphin-emu.org/")));
- }
- void DMainWindow::OnOpenDocs()
- {
- QDesktopServices::openUrl(QUrl(SL("https://dolphin-emu.org/docs/guides/")));
- }
- void DMainWindow::OnOpenGitHub()
- {
- QDesktopServices::openUrl(QUrl(SL("https://github.com/dolphin-emu/dolphin")));
- }
- void DMainWindow::OnOpenSystemInfo()
- {
- DSystemInfo* dlg = new DSystemInfo(this);
- dlg->open();
- }
- void DMainWindow::OnOpenAbout()
- {
- DAboutDialog* dlg = new DAboutDialog(this);
- dlg->open();
- }
- void DMainWindow::OnOpenAboutQt()
- {
- QApplication::aboutQt();
- }
|