diff options
Diffstat (limited to 'src/widgets/widgets/qwidgetresizehandler.cpp')
-rw-r--r-- | src/widgets/widgets/qwidgetresizehandler.cpp | 186 |
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" |