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 *);