summaryrefslogtreecommitdiffstats
path: root/src/widgets/widgets/qwidgetresizehandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/widgets/qwidgetresizehandler.cpp')
-rw-r--r--src/widgets/widgets/qwidgetresizehandler.cpp186
1 files changed, 43 insertions, 143 deletions
diff --git a/src/widgets/widgets/qwidgetresizehandler.cpp b/src/widgets/widgets/qwidgetresizehandler.cpp
index e8d435429f..b7ee494e99 100644
--- a/src/widgets/widgets/qwidgetresizehandler.cpp
+++ b/src/widgets/widgets/qwidgetresizehandler.cpp
@@ -1,48 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwidgetresizehandler_p.h"
#include "qframe.h"
#include "qapplication.h"
-#include "qdesktopwidget.h"
-#include <private/qdesktopwidget_p.h>
+#include "private/qwidget_p.h"
#include "qcursor.h"
#if QT_CONFIG(sizegrip)
#include "qsizegrip.h"
@@ -53,51 +16,44 @@
QT_BEGIN_NAMESPACE
+using namespace Qt::StringLiterals;
+
#define RANGE 4
static bool resizeHorizontalDirectionFixed = false;
static bool resizeVerticalDirectionFixed = false;
-// ### fixme: Qt 6: No longer export QWidgetResizeHandler and remove "Move"
-// functionality. Currently, only the resize functionality is used by QDockWidget.
-// Historically, the class was used in Qt 3's QWorkspace (predecessor to QMdiArea).
-
QWidgetResizeHandler::QWidgetResizeHandler(QWidget *parent, QWidget *cw)
: QObject(parent), widget(parent), childWidget(cw ? cw : parent),
- fw(0), extrahei(0), buttonDown(false), moveResizeMode(false), sizeprotect(true), movingEnabled(true)
+ fw(0), extrahei(0), buttonDown(false), active(false)
{
mode = Nowhere;
widget->setMouseTracking(true);
QFrame *frame = qobject_cast<QFrame*>(widget);
range = frame ? frame->frameWidth() : RANGE;
range = qMax(RANGE, range);
- activeForMove = activeForResize = true;
+ enabled = true;
widget->installEventFilter(this);
}
-void QWidgetResizeHandler::setActive(Action ac, bool b)
+void QWidgetResizeHandler::setEnabled(bool b)
{
- if (ac & Move)
- activeForMove = b;
- if (ac & Resize)
- activeForResize = b;
+ if (b == enabled)
+ return;
- if (!isActive())
+ enabled = b;
+ if (!enabled)
setMouseCursor(Nowhere);
}
-bool QWidgetResizeHandler::isActive(Action ac) const
+bool QWidgetResizeHandler::isEnabled() const
{
- bool b = false;
- if (ac & Move) b = activeForMove;
- if (ac & Resize) b |= activeForResize;
-
- return b;
+ return enabled;
}
bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
{
- if (!isActive()
+ if (!isEnabled()
|| (ee->type() != QEvent::MouseButtonPress
&& ee->type() != QEvent::MouseButtonRelease
&& ee->type() != QEvent::MouseMove
@@ -120,56 +76,30 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
if (w->isMaximized())
break;
const QRect widgetRect = widget->rect().marginsAdded(QMargins(range, range, range, range));
- const QPoint cursorPoint = widget->mapFromGlobal(e->globalPos());
+ const QPoint cursorPoint = widget->mapFromGlobal(e->globalPosition().toPoint());
if (!widgetRect.contains(cursorPoint))
return false;
if (e->button() == Qt::LeftButton) {
-#if 0 // Used to be included in Qt4 for Q_WS_X11
- /*
- Implicit grabs do not stop the X server from changing
- the cursor in children, which looks *really* bad when
- doing resizingk, so we grab the cursor. Note that we do
- not do this on Windows since double clicks are lost due
- to the grab (see change 198463).
- */
- if (e->spontaneous())
-# if !defined(QT_NO_CURSOR)
- widget->grabMouse(widget->cursor());
-# else
- widget->grabMouse();
-# endif // QT_NO_CURSOR
-#endif
buttonDown = false;
emit activate();
- bool me = movingEnabled;
- movingEnabled = (me && o == widget);
mouseMoveEvent(e);
- movingEnabled = me;
buttonDown = true;
- moveOffset = widget->mapFromGlobal(e->globalPos());
+ moveOffset = widget->mapFromGlobal(e->globalPosition().toPoint());
invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
}
} break;
case QEvent::MouseButtonRelease:
if (w->isMaximized())
break;
if (static_cast<QMouseEvent *>(ee)->button() == Qt::LeftButton) {
- moveResizeMode = false;
+ active = false;
buttonDown = false;
widget->releaseMouse();
widget->releaseKeyboard();
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
}
break;
case QEvent::MouseMove: {
@@ -177,16 +107,9 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
break;
QMouseEvent *e = static_cast<QMouseEvent *>(ee);
buttonDown = buttonDown && (e->buttons() & Qt::LeftButton); // safety, state machine broken!
- bool me = movingEnabled;
- movingEnabled = (me && o == widget && (buttonDown || moveResizeMode));
mouseMoveEvent(e);
- movingEnabled = me;
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
} break;
case QEvent::KeyPress:
keyPressEvent(static_cast<QKeyEvent *>(ee));
@@ -207,8 +130,8 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
{
- QPoint pos = widget->mapFromGlobal(e->globalPos());
- if (!moveResizeMode && !buttonDown) {
+ QPoint pos = widget->mapFromGlobal(e->globalPosition().toPoint());
+ if (!active && !buttonDown) {
if (pos.y() <= range && pos.x() <= range)
mode = TopLeft;
else if (pos.y() >= widget->height()-range && pos.x() >= widget->width()-range)
@@ -230,7 +153,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
else
mode = Nowhere;
- if (widget->isMinimized() || !isActive(Resize))
+ if (widget->isMinimized() || !isEnabled())
mode = Center;
#ifndef QT_NO_CURSOR
setMouseCursor(mode);
@@ -238,7 +161,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
return;
}
- if (mode == Center && !movingEnabled)
+ if (mode == Center)
return;
if (widget->testAttribute(Qt::WA_WState_ConfigPending))
@@ -246,15 +169,15 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
QPoint globalPos = (!widget->isWindow() && widget->parentWidget()) ?
- widget->parentWidget()->mapFromGlobal(e->globalPos()) : e->globalPos();
+ widget->parentWidget()->mapFromGlobal(e->globalPosition().toPoint()) : e->globalPosition().toPoint();
if (!widget->isWindow() && !widget->parentWidget()->rect().contains(globalPos)) {
if (globalPos.x() < 0)
globalPos.rx() = 0;
if (globalPos.y() < 0)
globalPos.ry() = 0;
- if (sizeprotect && globalPos.x() > widget->parentWidget()->width())
+ if (globalPos.x() > widget->parentWidget()->width())
globalPos.rx() = widget->parentWidget()->width();
- if (sizeprotect && globalPos.y() > widget->parentWidget()->height())
+ if (globalPos.y() > widget->parentWidget()->height())
globalPos.ry() = widget->parentWidget()->height();
}
@@ -262,8 +185,8 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
QPoint pp = globalPos - moveOffset;
// Workaround for window managers which refuse to move a tool window partially offscreen.
- if (QGuiApplication::platformName() == QLatin1String("xcb")) {
- const QRect desktop = QDesktopWidgetPrivate::availableGeometry(widget);
+ if (QGuiApplication::platformName() == "xcb"_L1) {
+ const QRect desktop = QWidgetPrivate::availableScreenGeometry(widget);
pp.rx() = qMax(pp.x(), desktop.left());
pp.ry() = qMax(pp.y(), desktop.top());
p.rx() = qMin(p.x(), desktop.right());
@@ -315,9 +238,6 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
case Right:
geom = QRect(widget->geometry().topLeft(), QPoint(p.x(), widget->geometry().bottom())) ;
break;
- case Center:
- geom.moveTopLeft(pp);
- break;
default:
break;
}
@@ -329,10 +249,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
if (geom != widget->geometry() &&
(widget->isWindow() || widget->parentWidget()->rect().intersects(geom))) {
- if (mode == Center)
- widget->move(geom.topLeft());
- else
- widget->setGeometry(geom);
+ widget->setGeometry(geom);
}
}
@@ -376,7 +293,7 @@ void QWidgetResizeHandler::setMouseCursor(MousePosition m)
void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
{
- if (!isMove() && !isResize())
+ if (!isResizing())
return;
bool is_control = e->modifiers() & Qt::ControlModifier;
int delta = is_control?1:8;
@@ -384,7 +301,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
switch (e->key()) {
case Qt::Key_Left:
pos.rx() -= delta;
- if (pos.x() <= QDesktopWidgetPrivate::geometry().left()) {
+ if (pos.x() <= QGuiApplication::primaryScreen()->virtualGeometry().left()) {
if (mode == TopLeft || mode == BottomLeft) {
moveOffset.rx() += delta;
invertedMoveOffset.rx() += delta;
@@ -393,7 +310,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.rx() -= delta;
}
}
- if (isResize() && !resizeHorizontalDirectionFixed) {
+ if (isResizing() && !resizeHorizontalDirectionFixed) {
resizeHorizontalDirectionFixed = true;
if (mode == BottomRight)
mode = BottomLeft;
@@ -409,7 +326,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
break;
case Qt::Key_Right:
pos.rx() += delta;
- if (pos.x() >= QDesktopWidgetPrivate::geometry().right()) {
+ if (pos.x() >= QGuiApplication::primaryScreen()->virtualGeometry().right()) {
if (mode == TopRight || mode == BottomRight) {
moveOffset.rx() += delta;
invertedMoveOffset.rx() += delta;
@@ -418,7 +335,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.rx() -= delta;
}
}
- if (isResize() && !resizeHorizontalDirectionFixed) {
+ if (isResizing() && !resizeHorizontalDirectionFixed) {
resizeHorizontalDirectionFixed = true;
if (mode == BottomLeft)
mode = BottomRight;
@@ -434,7 +351,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
break;
case Qt::Key_Up:
pos.ry() -= delta;
- if (pos.y() <= QDesktopWidgetPrivate::geometry().top()) {
+ if (pos.y() <= QGuiApplication::primaryScreen()->virtualGeometry().top()) {
if (mode == TopLeft || mode == TopRight) {
moveOffset.ry() += delta;
invertedMoveOffset.ry() += delta;
@@ -443,7 +360,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.ry() -= delta;
}
}
- if (isResize() && !resizeVerticalDirectionFixed) {
+ if (isResizing() && !resizeVerticalDirectionFixed) {
resizeVerticalDirectionFixed = true;
if (mode == BottomLeft)
mode = TopLeft;
@@ -459,7 +376,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
break;
case Qt::Key_Down:
pos.ry() += delta;
- if (pos.y() >= QDesktopWidgetPrivate::geometry().bottom()) {
+ if (pos.y() >= QGuiApplication::primaryScreen()->virtualGeometry().bottom()) {
if (mode == BottomLeft || mode == BottomRight) {
moveOffset.ry() += delta;
invertedMoveOffset.ry() += delta;
@@ -468,7 +385,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.ry() -= delta;
}
}
- if (isResize() && !resizeVerticalDirectionFixed) {
+ if (isResizing() && !resizeVerticalDirectionFixed) {
resizeVerticalDirectionFixed = true;
if (mode == TopLeft)
mode = BottomLeft;
@@ -486,7 +403,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
case Qt::Key_Return:
case Qt::Key_Enter:
case Qt::Key_Escape:
- moveResizeMode = false;
+ active = false;
widget->releaseMouse();
widget->releaseKeyboard();
buttonDown = false;
@@ -500,10 +417,10 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
void QWidgetResizeHandler::doResize()
{
- if (!activeForResize)
+ if (!enabled)
return;
- moveResizeMode = true;
+ active = true;
moveOffset = widget->mapFromGlobal(QCursor::pos());
if (moveOffset.x() < widget->width()/2) {
if (moveOffset.y() < widget->height()/2)
@@ -528,23 +445,6 @@ void QWidgetResizeHandler::doResize()
resizeVerticalDirectionFixed = false;
}
-void QWidgetResizeHandler::doMove()
-{
- if (!activeForMove)
- return;
-
- mode = Center;
- moveResizeMode = true;
- moveOffset = widget->mapFromGlobal(QCursor::pos());
- invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
-#ifndef QT_NO_CURSOR
- widget->grabMouse(Qt::SizeAllCursor);
-#else
- widget->grabMouse();
-#endif
- widget->grabKeyboard();
-}
-
QT_END_NAMESPACE
#include "moc_qwidgetresizehandler_p.cpp"