From d2b2ced5bfc6808f4c26708f3243b1329b746f2f Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 6 May 2023 01:19:23 +0200 Subject: [PATCH] Add support for non modal dialogs for DisplayMessage() helper --- src/utils/utility.cpp | 88 +++++++++++++++++++++++++++++++++++-------- src/utils/utility.hpp | 3 +- 2 files changed, 75 insertions(+), 16 deletions(-) diff --git a/src/utils/utility.cpp b/src/utils/utility.cpp index 4ac9c1bb..07373149 100644 --- a/src/utils/utility.cpp +++ b/src/utils/utility.cpp @@ -444,25 +444,83 @@ bool SaveTransformState(obs_data_t *obj, const struct obs_transform_info &info, return true; } -bool DisplayMessage(const QString &msg, bool question) -{ - if (question) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question( - nullptr, "Advanced Scene Switcher", msg, - QMessageBox::Yes | QMessageBox::No); - if (reply == QMessageBox::Yes) { - return true; +class NonModalMessageDialog : public QDialog { +public: + NonModalMessageDialog(const QString &message, bool question) + : QDialog(static_cast( + obs_frontend_get_main_window())), + _answer(QMessageBox::No) + { + setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); + setWindowFlags(windowFlags() & + ~Qt::WindowContextHelpButtonHint); + setAttribute(Qt::WA_DeleteOnClose); + + auto layout = new QVBoxLayout(this); + layout->addWidget(new QLabel(message, this)); + + if (question) { + auto buttonbox = new QDialogButtonBox( + QDialogButtonBox::Yes | QDialogButtonBox::No); + connect(buttonbox, &QDialogButtonBox::accepted, this, + &NonModalMessageDialog::YesClicked); + connect(buttonbox, &QDialogButtonBox::rejected, this, + &NonModalMessageDialog::NoClicked); + layout->addWidget(buttonbox); } else { - return false; + auto buttonbox = + new QDialogButtonBox(QDialogButtonBox::Ok); + connect(buttonbox, &QDialogButtonBox::accepted, this, + &NonModalMessageDialog::YesClicked); + layout->addWidget(buttonbox); } - } else { - QMessageBox Msgbox; - Msgbox.setWindowTitle("Advanced Scene Switcher"); - Msgbox.setText(msg); - Msgbox.exec(); } + QMessageBox::StandardButton ShowMessage() + { + // Use separate QEventLoop to not block rest of the UI + show(); + QEventLoop loop; + connect(this, &NonModalMessageDialog::finished, &loop, + &QEventLoop::quit); + loop.exec(); + return _answer; + } + +private slots: + void YesClicked() + { + _answer = QMessageBox::Yes; + accept(); + } + void NoClicked() + { + _answer = QMessageBox::No; + accept(); + } + +private: + QMessageBox::StandardButton _answer; +}; + +bool DisplayMessage(const QString &msg, bool question, bool modal) +{ + if (!modal) { + auto dialog = new NonModalMessageDialog(msg, question); + QMessageBox::StandardButton answer = dialog->ShowMessage(); + return (answer == QMessageBox::Yes); + } else if (question && modal) { + auto answer = QMessageBox::question( + nullptr, + obs_module_text("AdvSceneSwitcher.windowTitle"), msg, + QMessageBox::Yes | QMessageBox::No); + return answer == QMessageBox::Yes; + } + + QMessageBox Msgbox; + Msgbox.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); + Msgbox.setText(msg); + Msgbox.exec(); return false; } diff --git a/src/utils/utility.hpp b/src/utils/utility.hpp index d9a6bef4..9e493913 100644 --- a/src/utils/utility.hpp +++ b/src/utils/utility.hpp @@ -99,7 +99,8 @@ int FindIdxInRagne(QComboBox *list, int start, int stop, /* UI helpers */ -bool DisplayMessage(const QString &msg, bool question = false); +bool DisplayMessage(const QString &msg, bool question = false, + bool modal = true); void DisplayTrayMessage(const QString &title, const QString &msg, const QIcon &icon = QIcon()); bool WindowPosValid(QPoint pos);