From af92a88aa083c4cecf3486bb3b8108b8059b1904 Mon Sep 17 00:00:00 2001 From: Silent Date: Sun, 10 Nov 2019 23:57:43 +0100 Subject: [PATCH 1/2] UI: Allow to specify modality of ready ModalMessageBoxes --- .../DolphinQt/QtUtils/ModalMessageBox.cpp | 29 ++++++++++++------- .../Core/DolphinQt/QtUtils/ModalMessageBox.h | 12 +++++--- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp index 752cfb3af7..462a0295f7 100644 --- a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp +++ b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp @@ -19,9 +19,10 @@ ModalMessageBox::ModalMessageBox(QWidget* parent, Qt::WindowModality modality) static inline int ExecMessageBox(ModalMessageBox::Icon icon, QWidget* parent, const QString& title, const QString& text, ModalMessageBox::StandardButtons buttons, - ModalMessageBox::StandardButton default_button) + ModalMessageBox::StandardButton default_button, + Qt::WindowModality modality) { - ModalMessageBox msg(parent); + ModalMessageBox msg(parent, modality); msg.setIcon(icon); msg.setWindowTitle(title); msg.setText(text); @@ -32,25 +33,33 @@ static inline int ExecMessageBox(ModalMessageBox::Icon icon, QWidget* parent, co } int ModalMessageBox::critical(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons, StandardButton default_button) + StandardButtons buttons, StandardButton default_button, + Qt::WindowModality modality) { - return ExecMessageBox(QMessageBox::Critical, parent, title, text, buttons, default_button); + return ExecMessageBox(QMessageBox::Critical, parent, title, text, buttons, default_button, + modality); } int ModalMessageBox::information(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons, StandardButton default_button) + StandardButtons buttons, StandardButton default_button, + Qt::WindowModality modality) { - return ExecMessageBox(QMessageBox::Information, parent, title, text, buttons, default_button); + return ExecMessageBox(QMessageBox::Information, parent, title, text, buttons, default_button, + modality); } int ModalMessageBox::question(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons, StandardButton default_button) + StandardButtons buttons, StandardButton default_button, + Qt::WindowModality modality) { - return ExecMessageBox(QMessageBox::Warning, parent, title, text, buttons, default_button); + return ExecMessageBox(QMessageBox::Warning, parent, title, text, buttons, default_button, + modality); } int ModalMessageBox::warning(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons, StandardButton default_button) + StandardButtons buttons, StandardButton default_button, + Qt::WindowModality modality) { - return ExecMessageBox(QMessageBox::Warning, parent, title, text, buttons, default_button); + return ExecMessageBox(QMessageBox::Warning, parent, title, text, buttons, default_button, + modality); } diff --git a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.h b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.h index 14a7838968..ff329865ae 100644 --- a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.h +++ b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.h @@ -13,11 +13,15 @@ public: explicit ModalMessageBox(QWidget* parent, Qt::WindowModality modality = Qt::WindowModal); static int critical(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons = Ok, StandardButton default_button = NoButton); + StandardButtons buttons = Ok, StandardButton default_button = NoButton, + Qt::WindowModality modality = Qt::WindowModal); static int information(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons = Ok, StandardButton default_button = NoButton); + StandardButtons buttons = Ok, StandardButton default_button = NoButton, + Qt::WindowModality modality = Qt::WindowModal); static int question(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons = Yes | No, StandardButton default_button = NoButton); + StandardButtons buttons = Yes | No, StandardButton default_button = NoButton, + Qt::WindowModality modality = Qt::WindowModal); static int warning(QWidget* parent, const QString& title, const QString& text, - StandardButtons buttons = Ok, StandardButton default_button = NoButton); + StandardButtons buttons = Ok, StandardButton default_button = NoButton, + Qt::WindowModality modality = Qt::WindowModal); }; From 85c284164339500929b9c42fcdac8e0dcc8b5ec3 Mon Sep 17 00:00:00 2001 From: Silent Date: Sun, 10 Nov 2019 23:58:39 +0100 Subject: [PATCH 2/2] Make "Do you want to stop emulation?" application modal and disallow multiple instances at once Fixes numerous issues with this dialog spawning multiple times and putting Dolphin in a weird state. --- Source/Core/DolphinQt/MainWindow.cpp | 9 ++++++++- Source/Core/DolphinQt/MainWindow.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index bd1bbce1df..7216b00206 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -30,6 +30,7 @@ #include #endif +#include "Common/ScopeGuard.h" #include "Common/Version.h" #include "Common/WindowSystemInfo.h" @@ -785,6 +786,11 @@ bool MainWindow::RequestStop() if (SConfig::GetInstance().bConfirmStop) { + if (std::exchange(m_stop_confirm_showing, true)) + return true; + + Common::ScopeGuard confirm_lock([this] { m_stop_confirm_showing = false; }); + const Core::State state = Core::GetState(); // Only pause the game, if NetPlay is not running @@ -798,7 +804,8 @@ bool MainWindow::RequestStop() m_stop_requested ? tr("A shutdown is already in progress. Unsaved data " "may be lost if you stop the current emulation " "before it completes. Force stop?") : - tr("Do you want to stop the current emulation?")); + tr("Do you want to stop the current emulation?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton, Qt::ApplicationModal); if (confirm != QMessageBox::Yes) { diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h index 4443b7f651..5c1ae69f72 100644 --- a/Source/Core/DolphinQt/MainWindow.h +++ b/Source/Core/DolphinQt/MainWindow.h @@ -198,6 +198,7 @@ private: GameList* m_game_list; RenderWidget* m_render_widget = nullptr; bool m_rendering_to_main; + bool m_stop_confirm_showing = false; bool m_stop_requested = false; bool m_exit_requested = false; bool m_fullscreen_requested = false;