diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 227d9b3b..8755072d 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -51,6 +51,19 @@ DockRegistry::DockRegistry(QObject *parent) #endif } +QStringList DockRegistry::affinitiesForMainWindowNames(const QStringList &names) const +{ + QStringList affinities; + + for (auto mw : qAsConst(m_mainWindows)) { + if (names.contains(mw->uniqueName()) && !mw->affinityName().isEmpty()) { + affinities.append(mw->affinityName()); + } + } + + return affinities; +} + DockRegistry::~DockRegistry() { } @@ -311,32 +324,24 @@ void DockRegistry::clear(bool deleteStaticAnchors) void DockRegistry::clear(const QStringList &mainWindowsUniqueNames, bool deleteStaticAnchors) { - QStringList affinities; - auto shouldClearDockWidget = [&affinities](const QString &affinityName) { - return affinities.isEmpty() || affinities.contains(affinityName) || affinityName.isEmpty(); - }; - - auto shouldClearMainWindow = [&mainWindowsUniqueNames](MainWindowBase *mw) { - return mainWindowsUniqueNames.isEmpty() || mainWindowsUniqueNames.contains(mw->uniqueName()); - }; - - // first need to find the affinity names for the requested main windows - for (auto mw : qAsConst(m_mainWindows)) { - if (shouldClearMainWindow(mw)) { - if (!mw->affinityName().isEmpty()) - affinities.append(mw->affinityName()); - } + if (mainWindowsUniqueNames.isEmpty()) { + // Just clear everything + clear(deleteStaticAnchors); + return; } + const QStringList affinities = QStringList() << affinitiesForMainWindowNames(mainWindowsUniqueNames) + << QString(); // empty affinity also matches and will be closed + for (auto dw : qAsConst(m_dockWidgets)) { - if (shouldClearDockWidget(dw->affinityName())) { + if (affinities.contains(dw->affinityName())) { dw->forceClose(); dw->lastPosition()->removePlaceholders(); } } for (auto mw : qAsConst(m_mainWindows)) { - if (shouldClearMainWindow(mw)) { + if (mainWindowsUniqueNames.contains(mw->uniqueName())) { mw->multiSplitterLayout()->clear(deleteStaticAnchors); } } diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index 372c532d..e7db8287 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -145,6 +145,7 @@ protected: bool eventFilter(QObject *watched, QEvent *event) override; private: explicit DockRegistry(QObject *parent = nullptr); + QStringList affinitiesForMainWindowNames(const QStringList &names) const; void maybeDelete(); bool m_isProcessingAppQuitEvent = false; DockWidgetBase::List m_dockWidgets;