From 4fc151f4cb9c837d412c11382993f8cf2171f67f Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 12 Sep 2019 11:22:26 +0200 Subject: [PATCH] Another fix for "dialog closing closes swift", see https://discordapp.com/channels/539048679160676382/567139633964646411/620776182027386880 The signal for the navigator dialog closed is not send or received in some cases, not clear why. Using a reference directly to the main window as workaround. --- src/blackgui/components/navigatordialog.cpp | 14 ++++++++++++++ src/blackgui/components/navigatordialog.h | 13 +++++++++---- src/swiftguistandard/swiftguistdinit.cpp | 1 + 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/blackgui/components/navigatordialog.cpp b/src/blackgui/components/navigatordialog.cpp index 77da33b3b..f1f7e9ae6 100644 --- a/src/blackgui/components/navigatordialog.cpp +++ b/src/blackgui/components/navigatordialog.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include using namespace BlackGui; @@ -57,6 +59,9 @@ namespace BlackGui m_marginMenuAction = new QWidgetAction(this); m_marginMenuAction->setDefaultWidget(m_input); + // Quit on window hack + m_originalQuitOnLastWindow = QGuiApplication::quitOnLastWindowClosed(); + // timer m_watchdog.setObjectName(this->objectName() + ":m_timer"); connect(&m_watchdog, &QTimer::timeout, this, &CNavigatorDialog::onWatchdog); @@ -118,6 +123,14 @@ namespace BlackGui void CNavigatorDialog::reject() { + // workaround to avoid "closing issue with navigator", + // https://discordapp.com/channels/539048679160676382/567139633964646411/620776182027386880 + if (m_mainWindow) + { + QGuiApplication::setQuitOnLastWindowClosed(m_originalQuitOnLastWindow); + m_mainWindow->show(); + } + this->hide(); m_watchdog.stop(); emit this->navigatorClosed(); @@ -133,6 +146,7 @@ namespace BlackGui this->setVisible(visible); CGuiUtility::stayOnTop(visible, this); this->show(); + QGuiApplication::setQuitOnLastWindowClosed(visible ? false : m_originalQuitOnLastWindow); // avoid issues with a dialog closing everything if (visible) { diff --git a/src/blackgui/components/navigatordialog.h b/src/blackgui/components/navigatordialog.h index 3b6d6ac2d..b05c85996 100644 --- a/src/blackgui/components/navigatordialog.h +++ b/src/blackgui/components/navigatordialog.h @@ -27,7 +27,7 @@ class QEvent; class QMenu; class QMouseEvent; -class QWidget; +class QMainWindow; namespace Ui { class CNavigatorDialog; } namespace BlackGui @@ -73,6 +73,9 @@ namespace BlackGui //! Save to settings void saveToSettings(); + //! The main window + void setMainWindow(QMainWindow *window) { m_mainWindow = window; } + signals: //! Navigator closed void navigatorClosed(); @@ -126,12 +129,14 @@ namespace BlackGui //! On watchdog void onWatchdog(); - QScopedPointer ui; bool m_firstBuild = true; + bool m_originalQuitOnLastWindow = false; int m_currentColumns = 1; + QScopedPointer ui; + QMainWindow *m_mainWindow = nullptr; QWidgetAction *m_marginMenuAction = nullptr; //!< menu widget(!) action for margin widget - CMarginsInput *m_input = nullptr; //!< margins widget - QTimer m_watchdog; //!< navigator watchdog + CMarginsInput *m_input = nullptr; //!< margins widget + QTimer m_watchdog; //!< navigator watchdog BlackMisc::CSetting m_settings { this, &CNavigatorDialog::onSettingsChanged }; }; } // ns diff --git a/src/swiftguistandard/swiftguistdinit.cpp b/src/swiftguistandard/swiftguistdinit.cpp index a136d842b..92ca60573 100644 --- a/src/swiftguistandard/swiftguistdinit.cpp +++ b/src/swiftguistandard/swiftguistdinit.cpp @@ -228,6 +228,7 @@ void SwiftGuiStd::initGuiSignals() connect(ui->menu_ModelBrowser, &QAction::triggered, this, &SwiftGuiStd::startModelBrowser, Qt::QueuedConnection); connect(m_navigator.data(), &CNavigatorDialog::navigatorClosed, this, &SwiftGuiStd::onNavigatorClosed, Qt::QueuedConnection); + m_navigator->setMainWindow(this); // settings (GUI component), styles connect(ui->comp_MainInfoArea->getSettingsComponent(), &CSettingsComponent::changedWindowsOpacity, this, &SwiftGuiStd::onChangedWindowOpacity);