diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index eb103b3562912cc7ce5c8d6b05f83c0f0ada3565..1c9853f3a4ed5cd18ffa857f5babb82a0714c2b9 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2703,6 +2703,29 @@ void OBSBasic::CloseDialogs() } } +void OBSBasic::EnumDialogs() +{ + visDialogs.clear(); + modalDialogs.clear(); + visMsgBoxes.clear(); + + /* fill list of Visible dialogs and Modal dialogs */ + QList dialogs = findChildren(); + for (QDialog *dialog : dialogs) { + if (dialog->isVisible()) + visDialogs.append(dialog); + if (dialog->isModal()) + modalDialogs.append(dialog); + } + + /* fill list of Visible message boxes */ + QList msgBoxes = findChildren(); + for (QMessageBox *msgbox : msgBoxes) { + if (msgbox->isVisible()) + visMsgBoxes.append(msgbox); + } +} + void OBSBasic::ClearSceneData() { disableSaving++; @@ -2817,11 +2840,9 @@ void OBSBasic::on_actionRemux_triggered() void OBSBasic::on_action_Settings_triggered() { - disableHiding = true; OBSBasicSettings settings(this); settings.exec(); SystemTray(false); - disableHiding = false; } void OBSBasic::on_actionAdvAudioProperties_triggered() @@ -4893,6 +4914,15 @@ void OBSBasic::SetShowing(bool showing) "BasicWindow", "geometry", saveGeometry().toBase64().constData()); + /* hide all visible child dialogs */ + visDlgPositions.clear(); + if (!visDialogs.isEmpty()) { + for (QDialog *dlg : visDialogs) { + visDlgPositions.append(dlg->pos()); + dlg->hide(); + } + } + if (showHide) showHide->setText(QTStr("Basic.SystemTray.Show")); QTimer::singleShot(250, this, SLOT(hide())); @@ -4912,6 +4942,15 @@ void OBSBasic::SetShowing(bool showing) setVisible(true); + /* show all child dialogs that was visible earlier */ + if (!visDialogs.isEmpty()) { + for (int i = 0; i < visDialogs.size(); ++i) { + QDialog *dlg = visDialogs[i]; + dlg->move(visDlgPositions[i]); + dlg->show(); + } + } + /* Unminimize window if it was hidden to tray instead of task * bar. */ if (sysTrayMinimizeToTray()) { @@ -4923,6 +4962,18 @@ void OBSBasic::SetShowing(bool showing) } } +void OBSBasic::ToggleShowHide() +{ + bool showing = isVisible(); + if (showing) { + /* check for modal dialogs */ + EnumDialogs(); + if (!modalDialogs.isEmpty() || !visMsgBoxes.isEmpty()) + return; + } + SetShowing(!showing); +} + void OBSBasic::SystemTrayInit() { trayIcon = new QSystemTrayIcon(QIcon(":/res/images/obs.png"), diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 531090aebe485551ec1804aa92c47f8955cb9d0b..ad1238a13e3eb3d0e1e8bf50af4c8e673297339b 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -38,6 +38,7 @@ #include +class QMessageBox; class QListWidgetItem; class VolControl; class QNetworkReply; @@ -162,7 +163,6 @@ private: QPointer showHide; QPointer exit; QPointer trayMenu; - bool disableHiding = false; void DrawBackdrop(float cx, float cy); @@ -323,6 +323,14 @@ private: bool sysTrayMinimizeToTray(); + void EnumDialogs(); + + QList visDialogs; + QList modalDialogs; + QList visMsgBoxes; + + QList visDlgPositions; + public slots: void StartStreaming(); void StopStreaming(); @@ -393,15 +401,7 @@ private slots: void IconActivated(QSystemTrayIcon::ActivationReason reason); void SetShowing(bool showing); - inline void ToggleShowHide() - { - bool showing = isVisible(); - if (disableHiding && showing) - return; - if (showing) - CloseDialogs(); - SetShowing(!showing); - } + void ToggleShowHide(); private: /* OBS Callbacks */