From 4635405fb574780fd88b4aab3f5df3b043c251d3 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Thu, 17 Dec 2020 19:32:59 +0000 Subject: [PATCH] Allow WidgetResizeHandler to act on global event filter Needed for widgets which are not top-levels --- src/private/FloatingWindow.cpp | 2 +- src/private/WidgetResizeHandler.cpp | 32 ++++++++++++++++++++--------- src/private/WidgetResizeHandler_p.h | 3 ++- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index 1345cd1d..31a9f3e3 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -229,7 +229,7 @@ void FloatingWindow::maybeCreateResizeHandler() { if (!KDDockWidgets::usesNativeDraggingAndResizing()) { setFlag(Qt::FramelessWindowHint, true); - setWidgetResizeHandler(new WidgetResizeHandler(this)); + setWidgetResizeHandler(new WidgetResizeHandler(false, this)); } } diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index f151c994..222e2b7c 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -40,8 +40,9 @@ int widgetResizeHandlerMargin = 4; //4 pixel using namespace KDDockWidgets; bool WidgetResizeHandler::s_disableAllHandlers = false; -WidgetResizeHandler::WidgetResizeHandler(QWidgetOrQuick *target) +WidgetResizeHandler::WidgetResizeHandler(bool filterIsGlobal, QWidgetOrQuick *target) : QObject(target) + , mFilterIsGlobal(filterIsGlobal) { setTarget(target); } @@ -52,14 +53,15 @@ WidgetResizeHandler::~WidgetResizeHandler() bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) { - if (s_disableAllHandlers || o != mTarget) { + if (s_disableAllHandlers) return false; - } auto widget = qobject_cast(o); - if (!widget || !widget->isTopLevel()) { + if (!widget) + return false; + + if (!mFilterIsGlobal && (!widget->isTopLevel() || o != mTarget)) return false; - } switch (e->type()) { case QEvent::MouseButtonPress: { @@ -101,9 +103,9 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) mResizeWidget = mResizeWidget && (mouseEvent->buttons() & Qt::LeftButton); const bool state = mResizeWidget; mResizeWidget = ((o == mTarget) && mResizeWidget); - mouseMoveEvent(mouseEvent); + const bool consumed = mouseMoveEvent(mouseEvent); mResizeWidget = state; - return true; + return consumed; } default: break; @@ -320,7 +322,11 @@ void WidgetResizeHandler::setTarget(QWidgetOrQuick *w) if (w) { mTarget = w; mTarget->setMouseTracking(true); - mTarget->installEventFilter(this); + if (mFilterIsGlobal) { + qApp->installEventFilter(this); + } else { + mTarget->installEventFilter(this); + } } else { qWarning() << "Target widget is null!"; } @@ -366,12 +372,18 @@ void WidgetResizeHandler::updateCursor(CursorPosition m) void WidgetResizeHandler::setMouseCursor(Qt::CursorShape cursor) { - mTarget->setCursor(cursor); + if (mFilterIsGlobal) + qApp->setOverrideCursor(cursor); + else + mTarget->setCursor(cursor); } void WidgetResizeHandler::restoreMouseCursor() { - mTarget->setCursor(Qt::ArrowCursor); + if (mFilterIsGlobal) + qApp->restoreOverrideCursor(); + else + mTarget->setCursor(Qt::ArrowCursor); } WidgetResizeHandler::CursorPosition WidgetResizeHandler::cursorPosition(QPoint globalPos) const diff --git a/src/private/WidgetResizeHandler_p.h b/src/private/WidgetResizeHandler_p.h index 894c2e89..eea32241 100644 --- a/src/private/WidgetResizeHandler_p.h +++ b/src/private/WidgetResizeHandler_p.h @@ -47,7 +47,7 @@ public: * @brief CTOR * @param target The target widget that will be resized. Also acts as parent QObject. */ - explicit WidgetResizeHandler(QWidgetOrQuick *target = nullptr); + explicit WidgetResizeHandler(bool filterIsGlobal, QWidgetOrQuick *target); ~WidgetResizeHandler() override; #ifdef Q_OS_WIN @@ -68,6 +68,7 @@ private: CursorPosition mCursorPos = CursorPosition_Undefined; QPoint mNewPosition; bool mResizeWidget = false; + const bool mFilterIsGlobal; }; }