diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 89527ff9..34094dc3 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -627,12 +627,15 @@ bool DockRegistry::eventFilter(QObject *watched, QEvent *event) if (!(Config::self().flags() & Config::Flag_AutoHideSupport)) return false; + if (qobject_cast(watched)) { + // break recursion + return false; + } + auto p = watched; while (p) { - if (auto dw = qobject_cast(p)) { - onDockWidgetPressed(dw); - return false; - } + if (auto dw = qobject_cast(p)) + return onDockWidgetPressed(dw, static_cast(event)); p = p->parent(); } @@ -641,17 +644,29 @@ bool DockRegistry::eventFilter(QObject *watched, QEvent *event) return false; } -void DockRegistry::onDockWidgetPressed(DockWidgetBase *dw) +bool DockRegistry::onDockWidgetPressed(DockWidgetBase *dw, QMouseEvent *ev) { // 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; + return false; - DockWidgetBase *overlayedDockWidget = mainWindow->overlayedDockWidget(); - if (overlayedDockWidget && dw != overlayedDockWidget) { - mainWindow->clearSideBarOverlay(); + if (DockWidgetBase *overlayedDockWidget = mainWindow->overlayedDockWidget()) { + ev->ignore(); + qApp->sendEvent(overlayedDockWidget->frame(), ev); + + if (ev->isAccepted()) { + // The Frame accepted it. It means the user is resizing it. We allow for 4px outside for better resize. + return true; // don't propagate the event further + } + if (dw != overlayedDockWidget) { + // User clicked outside if the overlay, then we close the overlay. + mainWindow->clearSideBarOverlay(); + return false; + } } + + return false; } diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index 9b3df484..bec7f826 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -209,7 +209,7 @@ protected: private: friend class FocusScope; explicit DockRegistry(QObject *parent = nullptr); - void onDockWidgetPressed(DockWidgetBase *dw); + bool onDockWidgetPressed(DockWidgetBase *dw, QMouseEvent *); void onFocusObjectChanged(QObject *obj); void maybeDelete(); void setFocusedDockWidget(DockWidgetBase *);