diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 93dcd0ec..5142a811 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -541,7 +541,35 @@ bool DockRegistry::eventFilter(QObject *watched, QEvent *event) m_nestedWindows.append(fw); } } + } else if (event->type() == QEvent::MouseButtonPress) { + if (!(Config::self().flags() & Config::Flag_internal_AutoHideSupport)) + return false; + + auto p = watched; + while (p) { + if (auto dw = qobject_cast(p)) { + onDockWidgetPressed(dw); + return false; + } + + p = p->parent(); + } } return false; } + +void DockRegistry::onDockWidgetPressed(DockWidgetBase *dw) +{ + // Here we implement "auto-hide". If there's a overlayed dock widget, we hide it if some other + // dock widget is clicked. + + MainWindowBase *mainWindow = dw->mainWindow(); + if (!mainWindow) // Only docked widgets are interesting + return; + + DockWidgetBase *overlayedDockWidget = mainWindow->overlayedDockWidget(); + if (overlayedDockWidget && dw != overlayedDockWidget) { + mainWindow->clearSideBarOverlay(); + } +} diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index 186956b8..b85559f5 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -176,6 +176,7 @@ protected: bool eventFilter(QObject *watched, QEvent *event) override; private: explicit DockRegistry(QObject *parent = nullptr); + void onDockWidgetPressed(DockWidgetBase *dw); void maybeDelete(); void onFocusObjectChanged(QObject *); bool m_isProcessingAppQuitEvent = false;