Allow WidgetResizeHandler to act on global event filter

Needed for widgets which are not top-levels
This commit is contained in:
Sergio Martins
2020-12-17 19:32:59 +00:00
parent c481875e55
commit 4635405fb5
3 changed files with 25 additions and 12 deletions

View File

@@ -229,7 +229,7 @@ void FloatingWindow::maybeCreateResizeHandler()
{
if (!KDDockWidgets::usesNativeDraggingAndResizing()) {
setFlag(Qt::FramelessWindowHint, true);
setWidgetResizeHandler(new WidgetResizeHandler(this));
setWidgetResizeHandler(new WidgetResizeHandler(false, this));
}
}

View File

@@ -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<QWidgetOrQuick*>(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

View File

@@ -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;
};
}