From 23b69d4e9e70a78743af6f3da539338300b640ae Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Fri, 18 Dec 2020 16:01:33 +0000 Subject: [PATCH] Fix overlay disappearing when we were resizing We allow the user to click 4px outside of the overlay for better resizing. But we also had code that would hide the overlay if we clicked elsewhere. So these two requirements were in conflict. So, before hidding, check if the frame accepted the press. Also for issue #118 --- src/private/DockRegistry.cpp | 33 ++++++++++++++++++++++++--------- src/private/DockRegistry_p.h | 2 +- 2 files changed, 25 insertions(+), 10 deletions(-) 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 *);