diff --git a/src/Config.cpp b/src/Config.cpp index c035e84d..78117cf6 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -84,7 +84,7 @@ Config::Flags Config::flags() const void Config::setFlags(Flags f) { auto dr = DockRegistry::self(); - if (!dr->isEmpty()) { + if (!dr->isEmpty(/*excludeBeingDeleted=*/ true)) { qWarning() << Q_FUNC_INFO << "Only use this function at startup before creating any DockWidget or MainWindow" << "; These are already created: " << dr->mainWindowsNames() << dr->dockWidgetNames() << dr->floatingWindows(); @@ -138,7 +138,7 @@ int Config::separatorThickness() const void Config::setSeparatorThickness(int value) { - if (!DockRegistry::self()->isEmpty()) { + if (!DockRegistry::self()->isEmpty(/*excludeBeingDeleted=*/ true)) { qWarning() << Q_FUNC_INFO << "Only use this function at startup before creating any DockWidget or MainWindow"; return; } diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 802dcf9e..95a38569 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -100,9 +100,13 @@ void DockRegistry::onFocusObjectChanged(QObject *obj) Q_EMIT m_focusedDockWidget->isFocusedChanged(true); } -bool DockRegistry::isEmpty() const +bool DockRegistry::isEmpty(bool excludeBeingDeleted) const { - return m_dockWidgets.isEmpty() && m_mainWindows.isEmpty() && m_floatingWindows.isEmpty(); + if (!m_dockWidgets.isEmpty() || !m_mainWindows.isEmpty()) + return false; + + return excludeBeingDeleted ? !hasFloatingWindows() + : m_floatingWindows.isEmpty(); } void DockRegistry::checkSanityAll(bool dumpLayout) @@ -474,6 +478,13 @@ const QVector DockRegistry::floatingQWindows() const return windows; } +bool DockRegistry::hasFloatingWindows() const +{ + return std::any_of(m_floatingWindows.begin(), m_floatingWindows.end(), [] (FloatingWindow *fw) { + return !fw->beingDeleted(); + }); +} + FloatingWindow *DockRegistry::floatingWindowForHandle(QWindow *windowHandle) const { for (FloatingWindow *fw : m_floatingWindows) { diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index 7da4e17c..89d69bf5 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -89,6 +89,9 @@ public: ///@brief overload that returns list of QWindow. This is more friendly for supporting both QtWidgets and QtQuick const QVector floatingQWindows() const; + ///@brief returns whether if there's at least one floating window + bool hasFloatingWindows() const; + ///@brief returns the FloatingWindow with handle @p windowHandle FloatingWindow *floatingWindowForHandle(QWindow *windowHandle) const; @@ -127,8 +130,10 @@ public: /** * @brief returns true if there's 0 dockwidgets, 0 main windows + * + * @param excludeBeingDeleted if true, any window currently being deleted won't count */ - bool isEmpty() const; + bool isEmpty(bool excludeBeingDeleted = false) const; /** * @brief Calls MultiSplitter::checkSanity() on all layouts.