| Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qwidgetresizehandler.cpp |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /**************************************************************************** | - | ||||||||||||||||||||||||
| 2 | ** | - | ||||||||||||||||||||||||
| 3 | ** Copyright (C) 2015 The Qt Company Ltd. | - | ||||||||||||||||||||||||
| 4 | ** Contact: http://www.qt.io/licensing/ | - | ||||||||||||||||||||||||
| 5 | ** | - | ||||||||||||||||||||||||
| 6 | ** This file is part of the QtWidgets module of the Qt Toolkit. | - | ||||||||||||||||||||||||
| 7 | ** | - | ||||||||||||||||||||||||
| 8 | ** $QT_BEGIN_LICENSE:LGPL21$ | - | ||||||||||||||||||||||||
| 9 | ** Commercial License Usage | - | ||||||||||||||||||||||||
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||||||||||||||
| 11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||||||||||||||
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||||||||||||||
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||||||||||||||
| 14 | ** and conditions see http://www.qt.io/terms-conditions. For further | - | ||||||||||||||||||||||||
| 15 | ** information use the contact form at http://www.qt.io/contact-us. | - | ||||||||||||||||||||||||
| 16 | ** | - | ||||||||||||||||||||||||
| 17 | ** GNU Lesser General Public License Usage | - | ||||||||||||||||||||||||
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||||||||||||||
| 19 | ** General Public License version 2.1 or version 3 as published by the Free | - | ||||||||||||||||||||||||
| 20 | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and | - | ||||||||||||||||||||||||
| 21 | ** LICENSE.LGPLv3 included in the packaging of this file. Please review the | - | ||||||||||||||||||||||||
| 22 | ** following information to ensure the GNU Lesser General Public License | - | ||||||||||||||||||||||||
| 23 | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and | - | ||||||||||||||||||||||||
| 24 | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - | ||||||||||||||||||||||||
| 25 | ** | - | ||||||||||||||||||||||||
| 26 | ** As a special exception, The Qt Company gives you certain additional | - | ||||||||||||||||||||||||
| 27 | ** rights. These rights are described in The Qt Company LGPL Exception | - | ||||||||||||||||||||||||
| 28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - | ||||||||||||||||||||||||
| 29 | ** | - | ||||||||||||||||||||||||
| 30 | ** $QT_END_LICENSE$ | - | ||||||||||||||||||||||||
| 31 | ** | - | ||||||||||||||||||||||||
| 32 | ****************************************************************************/ | - | ||||||||||||||||||||||||
| 33 | - | |||||||||||||||||||||||||
| 34 | #include "qwidgetresizehandler_p.h" | - | ||||||||||||||||||||||||
| 35 | - | |||||||||||||||||||||||||
| 36 | #ifndef QT_NO_RESIZEHANDLER | - | ||||||||||||||||||||||||
| 37 | #include "qframe.h" | - | ||||||||||||||||||||||||
| 38 | #include "qapplication.h" | - | ||||||||||||||||||||||||
| 39 | #include "qdesktopwidget.h" | - | ||||||||||||||||||||||||
| 40 | #include "qcursor.h" | - | ||||||||||||||||||||||||
| 41 | #include "qsizegrip.h" | - | ||||||||||||||||||||||||
| 42 | #include "qevent.h" | - | ||||||||||||||||||||||||
| 43 | #include "qdebug.h" | - | ||||||||||||||||||||||||
| 44 | #include "private/qlayoutengine_p.h" | - | ||||||||||||||||||||||||
| 45 | - | |||||||||||||||||||||||||
| 46 | QT_BEGIN_NAMESPACE | - | ||||||||||||||||||||||||
| 47 | - | |||||||||||||||||||||||||
| 48 | #define RANGE 4 | - | ||||||||||||||||||||||||
| 49 | - | |||||||||||||||||||||||||
| 50 | static bool resizeHorizontalDirectionFixed = false; | - | ||||||||||||||||||||||||
| 51 | static bool resizeVerticalDirectionFixed = false; | - | ||||||||||||||||||||||||
| 52 | - | |||||||||||||||||||||||||
| 53 | // ### fixme: Qt 6: No longer export QWidgetResizeHandler and remove "Move" | - | ||||||||||||||||||||||||
| 54 | // functionality. Currently, only the resize functionality is used by QDockWidget. | - | ||||||||||||||||||||||||
| 55 | // Historically, the class was used in Qt 3's QWorkspace (predecessor to QMdiArea). | - | ||||||||||||||||||||||||
| 56 | - | |||||||||||||||||||||||||
| 57 | QWidgetResizeHandler::QWidgetResizeHandler(QWidget *parent, QWidget *cw) | - | ||||||||||||||||||||||||
| 58 | : QObject(parent), widget(parent), childWidget(cw ? cw : parent), | - | ||||||||||||||||||||||||
| 59 | fw(0), extrahei(0), buttonDown(false), moveResizeMode(false), sizeprotect(true), movingEnabled(true) | - | ||||||||||||||||||||||||
| 60 | { | - | ||||||||||||||||||||||||
| 61 | mode = Nowhere; | - | ||||||||||||||||||||||||
| 62 | widget->setMouseTracking(true); | - | ||||||||||||||||||||||||
| 63 | QFrame *frame = qobject_cast<QFrame*>(widget); | - | ||||||||||||||||||||||||
| 64 | range = frame ? frame->frameWidth() : RANGE;
| 0 | ||||||||||||||||||||||||
| 65 | range = qMax(RANGE, range); | - | ||||||||||||||||||||||||
| 66 | activeForMove = activeForResize = true; | - | ||||||||||||||||||||||||
| 67 | widget->installEventFilter(this); | - | ||||||||||||||||||||||||
| 68 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 69 | - | |||||||||||||||||||||||||
| 70 | void QWidgetResizeHandler::setActive(Action ac, bool b) | - | ||||||||||||||||||||||||
| 71 | { | - | ||||||||||||||||||||||||
| 72 | if (ac & Move)
| 0 | ||||||||||||||||||||||||
| 73 | activeForMove = b; never executed: activeForMove = b; | 0 | ||||||||||||||||||||||||
| 74 | if (ac & Resize)
| 0 | ||||||||||||||||||||||||
| 75 | activeForResize = b; never executed: activeForResize = b; | 0 | ||||||||||||||||||||||||
| 76 | - | |||||||||||||||||||||||||
| 77 | if (!isActive())
| 0 | ||||||||||||||||||||||||
| 78 | setMouseCursor(Nowhere); never executed: setMouseCursor(Nowhere); | 0 | ||||||||||||||||||||||||
| 79 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 80 | - | |||||||||||||||||||||||||
| 81 | bool QWidgetResizeHandler::isActive(Action ac) const | - | ||||||||||||||||||||||||
| 82 | { | - | ||||||||||||||||||||||||
| 83 | bool b = false; | - | ||||||||||||||||||||||||
| 84 | if (ac & Move) b = activeForMove; never executed: b = activeForMove;
| 0 | ||||||||||||||||||||||||
| 85 | if (ac & Resize) b |= activeForResize; never executed: b |= activeForResize;
| 0 | ||||||||||||||||||||||||
| 86 | - | |||||||||||||||||||||||||
| 87 | return b; never executed: return b; | 0 | ||||||||||||||||||||||||
| 88 | } | - | ||||||||||||||||||||||||
| 89 | - | |||||||||||||||||||||||||
| 90 | bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee) | - | ||||||||||||||||||||||||
| 91 | { | - | ||||||||||||||||||||||||
| 92 | if (!isActive()
| 0 | ||||||||||||||||||||||||
| 93 | || (ee->type() != QEvent::MouseButtonPress
| 0 | ||||||||||||||||||||||||
| 94 | && ee->type() != QEvent::MouseButtonRelease
| 0 | ||||||||||||||||||||||||
| 95 | && ee->type() != QEvent::MouseMove
| 0 | ||||||||||||||||||||||||
| 96 | && ee->type() != QEvent::KeyPress
| 0 | ||||||||||||||||||||||||
| 97 | && ee->type() != QEvent::ShortcutOverride)
| 0 | ||||||||||||||||||||||||
| 98 | ) | - | ||||||||||||||||||||||||
| 99 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
| 100 | - | |||||||||||||||||||||||||
| 101 | Q_ASSERT(o == widget); | - | ||||||||||||||||||||||||
| 102 | QWidget *w = widget; | - | ||||||||||||||||||||||||
| 103 | if (QApplication::activePopupWidget()) {
| 0 | ||||||||||||||||||||||||
| 104 | if (buttonDown && ee->type() == QEvent::MouseButtonRelease)
| 0 | ||||||||||||||||||||||||
| 105 | buttonDown = false; never executed: buttonDown = false; | 0 | ||||||||||||||||||||||||
| 106 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
| 107 | } | - | ||||||||||||||||||||||||
| 108 | - | |||||||||||||||||||||||||
| 109 | QMouseEvent *e = (QMouseEvent*)ee; | - | ||||||||||||||||||||||||
| 110 | switch (e->type()) { | - | ||||||||||||||||||||||||
| 111 | case QEvent::MouseButtonPress: { never executed: case QEvent::MouseButtonPress: | 0 | ||||||||||||||||||||||||
| 112 | if (w->isMaximized())
| 0 | ||||||||||||||||||||||||
| 113 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 114 | if (!widget->rect().contains(widget->mapFromGlobal(e->globalPos())))
| 0 | ||||||||||||||||||||||||
| 115 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
| 116 | if (e->button() == Qt::LeftButton) {
| 0 | ||||||||||||||||||||||||
| 117 | #if defined(Q_DEAD_CODE_FROM_QT4_X11) | - | ||||||||||||||||||||||||
| 118 | /* | - | ||||||||||||||||||||||||
| 119 | Implicit grabs do not stop the X server from changing | - | ||||||||||||||||||||||||
| 120 | the cursor in children, which looks *really* bad when | - | ||||||||||||||||||||||||
| 121 | doing resizingk, so we grab the cursor. Note that we do | - | ||||||||||||||||||||||||
| 122 | not do this on Windows since double clicks are lost due | - | ||||||||||||||||||||||||
| 123 | to the grab (see change 198463). | - | ||||||||||||||||||||||||
| 124 | */ | - | ||||||||||||||||||||||||
| 125 | if (e->spontaneous()) | - | ||||||||||||||||||||||||
| 126 | # if !defined(QT_NO_CURSOR) | - | ||||||||||||||||||||||||
| 127 | widget->grabMouse(widget->cursor()); | - | ||||||||||||||||||||||||
| 128 | # else | - | ||||||||||||||||||||||||
| 129 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 130 | # endif // QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 131 | #endif // Q_DEAD_CODE_FROM_QT4_X11 | - | ||||||||||||||||||||||||
| 132 | buttonDown = false; | - | ||||||||||||||||||||||||
| 133 | emit activate(); | - | ||||||||||||||||||||||||
| 134 | bool me = movingEnabled; | - | ||||||||||||||||||||||||
| 135 | movingEnabled = (me && o == widget);
| 0 | ||||||||||||||||||||||||
| 136 | mouseMoveEvent(e); | - | ||||||||||||||||||||||||
| 137 | movingEnabled = me; | - | ||||||||||||||||||||||||
| 138 | buttonDown = true; | - | ||||||||||||||||||||||||
| 139 | moveOffset = widget->mapFromGlobal(e->globalPos()); | - | ||||||||||||||||||||||||
| 140 | invertedMoveOffset = widget->rect().bottomRight() - moveOffset; | - | ||||||||||||||||||||||||
| 141 | if (mode == Center) {
| 0 | ||||||||||||||||||||||||
| 142 | if (movingEnabled)
| 0 | ||||||||||||||||||||||||
| 143 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 144 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 145 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 146 | } | - | ||||||||||||||||||||||||
| 147 | } | - | ||||||||||||||||||||||||
| 148 | } break; never executed: break; | 0 | ||||||||||||||||||||||||
| 149 | case QEvent::MouseButtonRelease: never executed: case QEvent::MouseButtonRelease: | 0 | ||||||||||||||||||||||||
| 150 | if (w->isMaximized())
| 0 | ||||||||||||||||||||||||
| 151 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 152 | if (e->button() == Qt::LeftButton) {
| 0 | ||||||||||||||||||||||||
| 153 | moveResizeMode = false; | - | ||||||||||||||||||||||||
| 154 | buttonDown = false; | - | ||||||||||||||||||||||||
| 155 | widget->releaseMouse(); | - | ||||||||||||||||||||||||
| 156 | widget->releaseKeyboard(); | - | ||||||||||||||||||||||||
| 157 | if (mode == Center) {
| 0 | ||||||||||||||||||||||||
| 158 | if (movingEnabled)
| 0 | ||||||||||||||||||||||||
| 159 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 160 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 161 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 162 | } | - | ||||||||||||||||||||||||
| 163 | } | - | ||||||||||||||||||||||||
| 164 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 165 | case QEvent::MouseMove: { never executed: case QEvent::MouseMove: | 0 | ||||||||||||||||||||||||
| 166 | if (w->isMaximized())
| 0 | ||||||||||||||||||||||||
| 167 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 168 | buttonDown = buttonDown && (e->buttons() & Qt::LeftButton); // safety, state machine broken!
| 0 | ||||||||||||||||||||||||
| 169 | bool me = movingEnabled; | - | ||||||||||||||||||||||||
| 170 | movingEnabled = (me && o == widget && (buttonDown || moveResizeMode));
| 0 | ||||||||||||||||||||||||
| 171 | mouseMoveEvent(e); | - | ||||||||||||||||||||||||
| 172 | movingEnabled = me; | - | ||||||||||||||||||||||||
| 173 | if (mode == Center) {
| 0 | ||||||||||||||||||||||||
| 174 | if (movingEnabled)
| 0 | ||||||||||||||||||||||||
| 175 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 176 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 177 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 178 | } | - | ||||||||||||||||||||||||
| 179 | } break; never executed: break; | 0 | ||||||||||||||||||||||||
| 180 | case QEvent::KeyPress: never executed: case QEvent::KeyPress: | 0 | ||||||||||||||||||||||||
| 181 | keyPressEvent((QKeyEvent*)e); | - | ||||||||||||||||||||||||
| 182 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 183 | case QEvent::ShortcutOverride: never executed: case QEvent::ShortcutOverride: | 0 | ||||||||||||||||||||||||
| 184 | if (buttonDown) {
| 0 | ||||||||||||||||||||||||
| 185 | ((QKeyEvent*)ee)->accept(); | - | ||||||||||||||||||||||||
| 186 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
| 187 | } | - | ||||||||||||||||||||||||
| 188 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 189 | default: never executed: default: | 0 | ||||||||||||||||||||||||
| 190 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 191 | } | - | ||||||||||||||||||||||||
| 192 | - | |||||||||||||||||||||||||
| 193 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
| 194 | } | - | ||||||||||||||||||||||||
| 195 | - | |||||||||||||||||||||||||
| 196 | void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) | - | ||||||||||||||||||||||||
| 197 | { | - | ||||||||||||||||||||||||
| 198 | QPoint pos = widget->mapFromGlobal(e->globalPos()); | - | ||||||||||||||||||||||||
| 199 | if (!moveResizeMode && !buttonDown) {
| 0 | ||||||||||||||||||||||||
| 200 | if (pos.y() <= range && pos.x() <= range)
| 0 | ||||||||||||||||||||||||
| 201 | mode = TopLeft; never executed: mode = TopLeft; | 0 | ||||||||||||||||||||||||
| 202 | else if (pos.y() >= widget->height()-range && pos.x() >= widget->width()-range)
| 0 | ||||||||||||||||||||||||
| 203 | mode = BottomRight; never executed: mode = BottomRight; | 0 | ||||||||||||||||||||||||
| 204 | else if (pos.y() >= widget->height()-range && pos.x() <= range)
| 0 | ||||||||||||||||||||||||
| 205 | mode = BottomLeft; never executed: mode = BottomLeft; | 0 | ||||||||||||||||||||||||
| 206 | else if (pos.y() <= range && pos.x() >= widget->width()-range)
| 0 | ||||||||||||||||||||||||
| 207 | mode = TopRight; never executed: mode = TopRight; | 0 | ||||||||||||||||||||||||
| 208 | else if (pos.y() <= range)
| 0 | ||||||||||||||||||||||||
| 209 | mode = Top; never executed: mode = Top; | 0 | ||||||||||||||||||||||||
| 210 | else if (pos.y() >= widget->height()-range)
| 0 | ||||||||||||||||||||||||
| 211 | mode = Bottom; never executed: mode = Bottom; | 0 | ||||||||||||||||||||||||
| 212 | else if (pos.x() <= range)
| 0 | ||||||||||||||||||||||||
| 213 | mode = Left; never executed: mode = Left; | 0 | ||||||||||||||||||||||||
| 214 | else if ( pos.x() >= widget->width()-range)
| 0 | ||||||||||||||||||||||||
| 215 | mode = Right; never executed: mode = Right; | 0 | ||||||||||||||||||||||||
| 216 | else if (widget->rect().contains(pos))
| 0 | ||||||||||||||||||||||||
| 217 | mode = Center; never executed: mode = Center; | 0 | ||||||||||||||||||||||||
| 218 | else | - | ||||||||||||||||||||||||
| 219 | mode = Nowhere; never executed: mode = Nowhere; | 0 | ||||||||||||||||||||||||
| 220 | - | |||||||||||||||||||||||||
| 221 | if (widget->isMinimized() || !isActive(Resize))
| 0 | ||||||||||||||||||||||||
| 222 | mode = Center; never executed: mode = Center; | 0 | ||||||||||||||||||||||||
| 223 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 224 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 225 | #endif | - | ||||||||||||||||||||||||
| 226 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 227 | } | - | ||||||||||||||||||||||||
| 228 | - | |||||||||||||||||||||||||
| 229 | if (mode == Center && !movingEnabled)
| 0 | ||||||||||||||||||||||||
| 230 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 231 | - | |||||||||||||||||||||||||
| 232 | if (widget->testAttribute(Qt::WA_WState_ConfigPending))
| 0 | ||||||||||||||||||||||||
| 233 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 234 | - | |||||||||||||||||||||||||
| 235 | - | |||||||||||||||||||||||||
| 236 | QPoint globalPos = (!widget->isWindow() && widget->parentWidget()) ?
| 0 | ||||||||||||||||||||||||
| 237 | widget->parentWidget()->mapFromGlobal(e->globalPos()) : e->globalPos(); | - | ||||||||||||||||||||||||
| 238 | if (!widget->isWindow() && !widget->parentWidget()->rect().contains(globalPos)) {
| 0 | ||||||||||||||||||||||||
| 239 | if (globalPos.x() < 0)
| 0 | ||||||||||||||||||||||||
| 240 | globalPos.rx() = 0; never executed: globalPos.rx() = 0; | 0 | ||||||||||||||||||||||||
| 241 | if (globalPos.y() < 0)
| 0 | ||||||||||||||||||||||||
| 242 | globalPos.ry() = 0; never executed: globalPos.ry() = 0; | 0 | ||||||||||||||||||||||||
| 243 | if (sizeprotect && globalPos.x() > widget->parentWidget()->width())
| 0 | ||||||||||||||||||||||||
| 244 | globalPos.rx() = widget->parentWidget()->width(); never executed: globalPos.rx() = widget->parentWidget()->width(); | 0 | ||||||||||||||||||||||||
| 245 | if (sizeprotect && globalPos.y() > widget->parentWidget()->height())
| 0 | ||||||||||||||||||||||||
| 246 | globalPos.ry() = widget->parentWidget()->height(); never executed: globalPos.ry() = widget->parentWidget()->height(); | 0 | ||||||||||||||||||||||||
| 247 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 248 | - | |||||||||||||||||||||||||
| 249 | QPoint p = globalPos + invertedMoveOffset; | - | ||||||||||||||||||||||||
| 250 | QPoint pp = globalPos - moveOffset; | - | ||||||||||||||||||||||||
| 251 | - | |||||||||||||||||||||||||
| 252 | // Workaround for window managers which refuse to move a tool window partially offscreen. | - | ||||||||||||||||||||||||
| 253 | if (QGuiApplication::platformName() == QLatin1String("xcb")) {
| 0 | ||||||||||||||||||||||||
| 254 | const QRect desktop = QApplication::desktop()->availableGeometry(widget); | - | ||||||||||||||||||||||||
| 255 | pp.rx() = qMax(pp.x(), desktop.left()); | - | ||||||||||||||||||||||||
| 256 | pp.ry() = qMax(pp.y(), desktop.top()); | - | ||||||||||||||||||||||||
| 257 | p.rx() = qMin(p.x(), desktop.right()); | - | ||||||||||||||||||||||||
| 258 | p.ry() = qMin(p.y(), desktop.bottom()); | - | ||||||||||||||||||||||||
| 259 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 260 | - | |||||||||||||||||||||||||
| 261 | QSize ms = qSmartMinSize(childWidget); | - | ||||||||||||||||||||||||
| 262 | int mw = ms.width(); | - | ||||||||||||||||||||||||
| 263 | int mh = ms.height(); | - | ||||||||||||||||||||||||
| 264 | if (childWidget != widget) {
| 0 | ||||||||||||||||||||||||
| 265 | mw += 2 * fw; | - | ||||||||||||||||||||||||
| 266 | mh += 2 * fw + extrahei; | - | ||||||||||||||||||||||||
| 267 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 268 | - | |||||||||||||||||||||||||
| 269 | QSize maxsize(childWidget->maximumSize()); | - | ||||||||||||||||||||||||
| 270 | if (childWidget != widget)
| 0 | ||||||||||||||||||||||||
| 271 | maxsize += QSize(2 * fw, 2 * fw + extrahei); never executed: maxsize += QSize(2 * fw, 2 * fw + extrahei); | 0 | ||||||||||||||||||||||||
| 272 | QSize mpsize(widget->geometry().right() - pp.x() + 1, | - | ||||||||||||||||||||||||
| 273 | widget->geometry().bottom() - pp.y() + 1); | - | ||||||||||||||||||||||||
| 274 | mpsize = mpsize.expandedTo(widget->minimumSize()).expandedTo(QSize(mw, mh)) | - | ||||||||||||||||||||||||
| 275 | .boundedTo(maxsize); | - | ||||||||||||||||||||||||
| 276 | QPoint mp(widget->geometry().right() - mpsize.width() + 1, | - | ||||||||||||||||||||||||
| 277 | widget->geometry().bottom() - mpsize.height() + 1); | - | ||||||||||||||||||||||||
| 278 | - | |||||||||||||||||||||||||
| 279 | QRect geom = widget->geometry(); | - | ||||||||||||||||||||||||
| 280 | - | |||||||||||||||||||||||||
| 281 | switch (mode) { | - | ||||||||||||||||||||||||
| 282 | case TopLeft: never executed: case TopLeft: | 0 | ||||||||||||||||||||||||
| 283 | geom = QRect(mp, widget->geometry().bottomRight()) ; | - | ||||||||||||||||||||||||
| 284 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 285 | case BottomRight: never executed: case BottomRight: | 0 | ||||||||||||||||||||||||
| 286 | geom = QRect(widget->geometry().topLeft(), p) ; | - | ||||||||||||||||||||||||
| 287 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 288 | case BottomLeft: never executed: case BottomLeft: | 0 | ||||||||||||||||||||||||
| 289 | geom = QRect(QPoint(mp.x(), widget->geometry().y()), QPoint(widget->geometry().right(), p.y())) ; | - | ||||||||||||||||||||||||
| 290 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 291 | case TopRight: never executed: case TopRight: | 0 | ||||||||||||||||||||||||
| 292 | geom = QRect(QPoint(widget->geometry().x(), mp.y()), QPoint(p.x(), widget->geometry().bottom())) ; | - | ||||||||||||||||||||||||
| 293 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 294 | case Top: never executed: case Top: | 0 | ||||||||||||||||||||||||
| 295 | geom = QRect(QPoint(widget->geometry().left(), mp.y()), widget->geometry().bottomRight()) ; | - | ||||||||||||||||||||||||
| 296 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 297 | case Bottom: never executed: case Bottom: | 0 | ||||||||||||||||||||||||
| 298 | geom = QRect(widget->geometry().topLeft(), QPoint(widget->geometry().right(), p.y())) ; | - | ||||||||||||||||||||||||
| 299 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 300 | case Left: never executed: case Left: | 0 | ||||||||||||||||||||||||
| 301 | geom = QRect(QPoint(mp.x(), widget->geometry().top()), widget->geometry().bottomRight()) ; | - | ||||||||||||||||||||||||
| 302 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 303 | case Right: never executed: case Right: | 0 | ||||||||||||||||||||||||
| 304 | geom = QRect(widget->geometry().topLeft(), QPoint(p.x(), widget->geometry().bottom())) ; | - | ||||||||||||||||||||||||
| 305 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 306 | case Center: never executed: case Center: | 0 | ||||||||||||||||||||||||
| 307 | geom.moveTopLeft(pp); | - | ||||||||||||||||||||||||
| 308 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 309 | default: never executed: default: | 0 | ||||||||||||||||||||||||
| 310 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 311 | } | - | ||||||||||||||||||||||||
| 312 | - | |||||||||||||||||||||||||
| 313 | geom = QRect(geom.topLeft(), | - | ||||||||||||||||||||||||
| 314 | geom.size().expandedTo(widget->minimumSize()) | - | ||||||||||||||||||||||||
| 315 | .expandedTo(QSize(mw, mh)) | - | ||||||||||||||||||||||||
| 316 | .boundedTo(maxsize)); | - | ||||||||||||||||||||||||
| 317 | - | |||||||||||||||||||||||||
| 318 | if (geom != widget->geometry() &&
| 0 | ||||||||||||||||||||||||
| 319 | (widget->isWindow() || widget->parentWidget()->rect().intersects(geom))) {
| 0 | ||||||||||||||||||||||||
| 320 | if (mode == Center)
| 0 | ||||||||||||||||||||||||
| 321 | widget->move(geom.topLeft()); never executed: widget->move(geom.topLeft()); | 0 | ||||||||||||||||||||||||
| 322 | else | - | ||||||||||||||||||||||||
| 323 | widget->setGeometry(geom); never executed: widget->setGeometry(geom); | 0 | ||||||||||||||||||||||||
| 324 | } | - | ||||||||||||||||||||||||
| 325 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 326 | - | |||||||||||||||||||||||||
| 327 | void QWidgetResizeHandler::setMouseCursor(MousePosition m) | - | ||||||||||||||||||||||||
| 328 | { | - | ||||||||||||||||||||||||
| 329 | #ifdef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 330 | Q_UNUSED(m); | - | ||||||||||||||||||||||||
| 331 | #else | - | ||||||||||||||||||||||||
| 332 | QObjectList children = widget->children(); | - | ||||||||||||||||||||||||
| 333 | for (int i = 0; i < children.size(); ++i) {
| 0 | ||||||||||||||||||||||||
| 334 | if (QWidget *w = qobject_cast<QWidget*>(children.at(i))) {
| 0 | ||||||||||||||||||||||||
| 335 | if (!w->testAttribute(Qt::WA_SetCursor)) {
| 0 | ||||||||||||||||||||||||
| 336 | w->setCursor(Qt::ArrowCursor); | - | ||||||||||||||||||||||||
| 337 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 338 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 339 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 340 | - | |||||||||||||||||||||||||
| 341 | switch (m) { | - | ||||||||||||||||||||||||
| 342 | case TopLeft: never executed: case TopLeft: | 0 | ||||||||||||||||||||||||
| 343 | case BottomRight: never executed: case BottomRight: | 0 | ||||||||||||||||||||||||
| 344 | widget->setCursor(Qt::SizeFDiagCursor); | - | ||||||||||||||||||||||||
| 345 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 346 | case BottomLeft: never executed: case BottomLeft: | 0 | ||||||||||||||||||||||||
| 347 | case TopRight: never executed: case TopRight: | 0 | ||||||||||||||||||||||||
| 348 | widget->setCursor(Qt::SizeBDiagCursor); | - | ||||||||||||||||||||||||
| 349 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 350 | case Top: never executed: case Top: | 0 | ||||||||||||||||||||||||
| 351 | case Bottom: never executed: case Bottom: | 0 | ||||||||||||||||||||||||
| 352 | widget->setCursor(Qt::SizeVerCursor); | - | ||||||||||||||||||||||||
| 353 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 354 | case Left: never executed: case Left: | 0 | ||||||||||||||||||||||||
| 355 | case Right: never executed: case Right: | 0 | ||||||||||||||||||||||||
| 356 | widget->setCursor(Qt::SizeHorCursor); | - | ||||||||||||||||||||||||
| 357 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 358 | default: never executed: default: | 0 | ||||||||||||||||||||||||
| 359 | widget->setCursor(Qt::ArrowCursor); | - | ||||||||||||||||||||||||
| 360 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 361 | } | - | ||||||||||||||||||||||||
| 362 | #endif // QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 363 | } | - | ||||||||||||||||||||||||
| 364 | - | |||||||||||||||||||||||||
| 365 | void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e) | - | ||||||||||||||||||||||||
| 366 | { | - | ||||||||||||||||||||||||
| 367 | if (!isMove() && !isResize())
| 0 | ||||||||||||||||||||||||
| 368 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 369 | bool is_control = e->modifiers() & Qt::ControlModifier; | - | ||||||||||||||||||||||||
| 370 | int delta = is_control?1:8;
| 0 | ||||||||||||||||||||||||
| 371 | QPoint pos = QCursor::pos(); | - | ||||||||||||||||||||||||
| 372 | switch (e->key()) { | - | ||||||||||||||||||||||||
| 373 | case Qt::Key_Left: never executed: case Qt::Key_Left: | 0 | ||||||||||||||||||||||||
| 374 | pos.rx() -= delta; | - | ||||||||||||||||||||||||
| 375 | if (pos.x() <= QApplication::desktop()->geometry().left()) {
| 0 | ||||||||||||||||||||||||
| 376 | if (mode == TopLeft || mode == BottomLeft) {
| 0 | ||||||||||||||||||||||||
| 377 | moveOffset.rx() += delta; | - | ||||||||||||||||||||||||
| 378 | invertedMoveOffset.rx() += delta; | - | ||||||||||||||||||||||||
| 379 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 380 | moveOffset.rx() -= delta; | - | ||||||||||||||||||||||||
| 381 | invertedMoveOffset.rx() -= delta; | - | ||||||||||||||||||||||||
| 382 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 383 | } | - | ||||||||||||||||||||||||
| 384 | if (isResize() && !resizeHorizontalDirectionFixed) {
| 0 | ||||||||||||||||||||||||
| 385 | resizeHorizontalDirectionFixed = true; | - | ||||||||||||||||||||||||
| 386 | if (mode == BottomRight)
| 0 | ||||||||||||||||||||||||
| 387 | mode = BottomLeft; never executed: mode = BottomLeft; | 0 | ||||||||||||||||||||||||
| 388 | else if (mode == TopRight)
| 0 | ||||||||||||||||||||||||
| 389 | mode = TopLeft; never executed: mode = TopLeft; | 0 | ||||||||||||||||||||||||
| 390 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 391 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 392 | widget->grabMouse(widget->cursor()); | - | ||||||||||||||||||||||||
| 393 | #else | - | ||||||||||||||||||||||||
| 394 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 395 | #endif | - | ||||||||||||||||||||||||
| 396 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 397 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 398 | case Qt::Key_Right: never executed: case Qt::Key_Right: | 0 | ||||||||||||||||||||||||
| 399 | pos.rx() += delta; | - | ||||||||||||||||||||||||
| 400 | if (pos.x() >= QApplication::desktop()->geometry().right()) {
| 0 | ||||||||||||||||||||||||
| 401 | if (mode == TopRight || mode == BottomRight) {
| 0 | ||||||||||||||||||||||||
| 402 | moveOffset.rx() += delta; | - | ||||||||||||||||||||||||
| 403 | invertedMoveOffset.rx() += delta; | - | ||||||||||||||||||||||||
| 404 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 405 | moveOffset.rx() -= delta; | - | ||||||||||||||||||||||||
| 406 | invertedMoveOffset.rx() -= delta; | - | ||||||||||||||||||||||||
| 407 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 408 | } | - | ||||||||||||||||||||||||
| 409 | if (isResize() && !resizeHorizontalDirectionFixed) {
| 0 | ||||||||||||||||||||||||
| 410 | resizeHorizontalDirectionFixed = true; | - | ||||||||||||||||||||||||
| 411 | if (mode == BottomLeft)
| 0 | ||||||||||||||||||||||||
| 412 | mode = BottomRight; never executed: mode = BottomRight; | 0 | ||||||||||||||||||||||||
| 413 | else if (mode == TopLeft)
| 0 | ||||||||||||||||||||||||
| 414 | mode = TopRight; never executed: mode = TopRight; | 0 | ||||||||||||||||||||||||
| 415 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 416 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 417 | widget->grabMouse(widget->cursor()); | - | ||||||||||||||||||||||||
| 418 | #else | - | ||||||||||||||||||||||||
| 419 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 420 | #endif | - | ||||||||||||||||||||||||
| 421 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 422 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 423 | case Qt::Key_Up: never executed: case Qt::Key_Up: | 0 | ||||||||||||||||||||||||
| 424 | pos.ry() -= delta; | - | ||||||||||||||||||||||||
| 425 | if (pos.y() <= QApplication::desktop()->geometry().top()) {
| 0 | ||||||||||||||||||||||||
| 426 | if (mode == TopLeft || mode == TopRight) {
| 0 | ||||||||||||||||||||||||
| 427 | moveOffset.ry() += delta; | - | ||||||||||||||||||||||||
| 428 | invertedMoveOffset.ry() += delta; | - | ||||||||||||||||||||||||
| 429 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 430 | moveOffset.ry() -= delta; | - | ||||||||||||||||||||||||
| 431 | invertedMoveOffset.ry() -= delta; | - | ||||||||||||||||||||||||
| 432 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 433 | } | - | ||||||||||||||||||||||||
| 434 | if (isResize() && !resizeVerticalDirectionFixed) {
| 0 | ||||||||||||||||||||||||
| 435 | resizeVerticalDirectionFixed = true; | - | ||||||||||||||||||||||||
| 436 | if (mode == BottomLeft)
| 0 | ||||||||||||||||||||||||
| 437 | mode = TopLeft; never executed: mode = TopLeft; | 0 | ||||||||||||||||||||||||
| 438 | else if (mode == BottomRight)
| 0 | ||||||||||||||||||||||||
| 439 | mode = TopRight; never executed: mode = TopRight; | 0 | ||||||||||||||||||||||||
| 440 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 441 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 442 | widget->grabMouse(widget->cursor()); | - | ||||||||||||||||||||||||
| 443 | #else | - | ||||||||||||||||||||||||
| 444 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 445 | #endif | - | ||||||||||||||||||||||||
| 446 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 447 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 448 | case Qt::Key_Down: never executed: case Qt::Key_Down: | 0 | ||||||||||||||||||||||||
| 449 | pos.ry() += delta; | - | ||||||||||||||||||||||||
| 450 | if (pos.y() >= QApplication::desktop()->geometry().bottom()) {
| 0 | ||||||||||||||||||||||||
| 451 | if (mode == BottomLeft || mode == BottomRight) {
| 0 | ||||||||||||||||||||||||
| 452 | moveOffset.ry() += delta; | - | ||||||||||||||||||||||||
| 453 | invertedMoveOffset.ry() += delta; | - | ||||||||||||||||||||||||
| 454 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
| 455 | moveOffset.ry() -= delta; | - | ||||||||||||||||||||||||
| 456 | invertedMoveOffset.ry() -= delta; | - | ||||||||||||||||||||||||
| 457 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 458 | } | - | ||||||||||||||||||||||||
| 459 | if (isResize() && !resizeVerticalDirectionFixed) {
| 0 | ||||||||||||||||||||||||
| 460 | resizeVerticalDirectionFixed = true; | - | ||||||||||||||||||||||||
| 461 | if (mode == TopLeft)
| 0 | ||||||||||||||||||||||||
| 462 | mode = BottomLeft; never executed: mode = BottomLeft; | 0 | ||||||||||||||||||||||||
| 463 | else if (mode == TopRight)
| 0 | ||||||||||||||||||||||||
| 464 | mode = BottomRight; never executed: mode = BottomRight; | 0 | ||||||||||||||||||||||||
| 465 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 466 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 467 | widget->grabMouse(widget->cursor()); | - | ||||||||||||||||||||||||
| 468 | #else | - | ||||||||||||||||||||||||
| 469 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 470 | #endif | - | ||||||||||||||||||||||||
| 471 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 472 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 473 | case Qt::Key_Space: never executed: case Qt::Key_Space: | 0 | ||||||||||||||||||||||||
| 474 | case Qt::Key_Return: never executed: case Qt::Key_Return: | 0 | ||||||||||||||||||||||||
| 475 | case Qt::Key_Enter: never executed: case Qt::Key_Enter: | 0 | ||||||||||||||||||||||||
| 476 | case Qt::Key_Escape: never executed: case Qt::Key_Escape: | 0 | ||||||||||||||||||||||||
| 477 | moveResizeMode = false; | - | ||||||||||||||||||||||||
| 478 | widget->releaseMouse(); | - | ||||||||||||||||||||||||
| 479 | widget->releaseKeyboard(); | - | ||||||||||||||||||||||||
| 480 | buttonDown = false; | - | ||||||||||||||||||||||||
| 481 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 482 | default: never executed: default: | 0 | ||||||||||||||||||||||||
| 483 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 484 | } | - | ||||||||||||||||||||||||
| 485 | QCursor::setPos(pos); | - | ||||||||||||||||||||||||
| 486 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 487 | - | |||||||||||||||||||||||||
| 488 | - | |||||||||||||||||||||||||
| 489 | void QWidgetResizeHandler::doResize() | - | ||||||||||||||||||||||||
| 490 | { | - | ||||||||||||||||||||||||
| 491 | if (!activeForResize)
| 0 | ||||||||||||||||||||||||
| 492 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 493 | - | |||||||||||||||||||||||||
| 494 | moveResizeMode = true; | - | ||||||||||||||||||||||||
| 495 | moveOffset = widget->mapFromGlobal(QCursor::pos()); | - | ||||||||||||||||||||||||
| 496 | if (moveOffset.x() < widget->width()/2) {
| 0 | ||||||||||||||||||||||||
| 497 | if (moveOffset.y() < widget->height()/2)
| 0 | ||||||||||||||||||||||||
| 498 | mode = TopLeft; never executed: mode = TopLeft; | 0 | ||||||||||||||||||||||||
| 499 | else | - | ||||||||||||||||||||||||
| 500 | mode = BottomLeft; never executed: mode = BottomLeft; | 0 | ||||||||||||||||||||||||
| 501 | } else { | - | ||||||||||||||||||||||||
| 502 | if (moveOffset.y() < widget->height()/2)
| 0 | ||||||||||||||||||||||||
| 503 | mode = TopRight; never executed: mode = TopRight; | 0 | ||||||||||||||||||||||||
| 504 | else | - | ||||||||||||||||||||||||
| 505 | mode = BottomRight; never executed: mode = BottomRight; | 0 | ||||||||||||||||||||||||
| 506 | } | - | ||||||||||||||||||||||||
| 507 | invertedMoveOffset = widget->rect().bottomRight() - moveOffset; | - | ||||||||||||||||||||||||
| 508 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 509 | setMouseCursor(mode); | - | ||||||||||||||||||||||||
| 510 | widget->grabMouse(widget->cursor() ); | - | ||||||||||||||||||||||||
| 511 | #else | - | ||||||||||||||||||||||||
| 512 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 513 | #endif | - | ||||||||||||||||||||||||
| 514 | widget->grabKeyboard(); | - | ||||||||||||||||||||||||
| 515 | resizeHorizontalDirectionFixed = false; | - | ||||||||||||||||||||||||
| 516 | resizeVerticalDirectionFixed = false; | - | ||||||||||||||||||||||||
| 517 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 518 | - | |||||||||||||||||||||||||
| 519 | void QWidgetResizeHandler::doMove() | - | ||||||||||||||||||||||||
| 520 | { | - | ||||||||||||||||||||||||
| 521 | if (!activeForMove)
| 0 | ||||||||||||||||||||||||
| 522 | return; never executed: return; | 0 | ||||||||||||||||||||||||
| 523 | - | |||||||||||||||||||||||||
| 524 | mode = Center; | - | ||||||||||||||||||||||||
| 525 | moveResizeMode = true; | - | ||||||||||||||||||||||||
| 526 | moveOffset = widget->mapFromGlobal(QCursor::pos()); | - | ||||||||||||||||||||||||
| 527 | invertedMoveOffset = widget->rect().bottomRight() - moveOffset; | - | ||||||||||||||||||||||||
| 528 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
| 529 | widget->grabMouse(Qt::SizeAllCursor); | - | ||||||||||||||||||||||||
| 530 | #else | - | ||||||||||||||||||||||||
| 531 | widget->grabMouse(); | - | ||||||||||||||||||||||||
| 532 | #endif | - | ||||||||||||||||||||||||
| 533 | widget->grabKeyboard(); | - | ||||||||||||||||||||||||
| 534 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 535 | - | |||||||||||||||||||||||||
| 536 | QT_END_NAMESPACE | - | ||||||||||||||||||||||||
| 537 | - | |||||||||||||||||||||||||
| 538 | #include "moc_qwidgetresizehandler_p.cpp" | - | ||||||||||||||||||||||||
| 539 | - | |||||||||||||||||||||||||
| 540 | #endif //QT_NO_RESIZEHANDLER | - | ||||||||||||||||||||||||
| Source code | Switch to Preprocessed file |