diff options
author | Charles Yin <charles.yin@nokia.com> | 2011-07-29 10:38:35 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-08-02 10:46:54 +0200 |
commit | 09f4bd20d7514f229338667effdf8519f1722b3f (patch) | |
tree | cb907a723793b0102ad3965ba2855c364c32a21b | |
parent | 6f146a5d2ea893b13e4cfcd90243e66f7c9a0083 (diff) |
Cancel mousearea pressed state when window is deactivated
Change-Id: I1cc21c338576a2ac3b1e8e282e8e4de3bc63759a
Task-number:QTBUG-19904
Reviewed-on: http://codereview.qt.nokia.com/2357
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
-rw-r--r-- | src/declarative/items/qsgcanvas.cpp | 3 | ||||
-rw-r--r-- | src/declarative/items/qsgitem.cpp | 7 | ||||
-rw-r--r-- | src/declarative/items/qsgitem.h | 1 | ||||
-rw-r--r-- | src/declarative/items/qsgmousearea.cpp | 13 | ||||
-rw-r--r-- | src/declarative/items/qsgmousearea_p.h | 2 | ||||
-rw-r--r-- | tests/auto/declarative/qsgmousearea/data/pressedCanceled.qml | 18 | ||||
-rw-r--r-- | tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp | 45 |
7 files changed, 88 insertions, 1 deletions
diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp index 2efdd50c73..03b6a72b96 100644 --- a/src/declarative/items/qsgcanvas.cpp +++ b/src/declarative/items/qsgcanvas.cpp @@ -1017,6 +1017,9 @@ bool QSGCanvas::event(QEvent *e) case QSGEvent::SGDragDrop: d->deliverDragEvent(static_cast<QSGDragEvent *>(e)); break; + case QEvent::WindowDeactivate: + rootItem()->windowDeactivateEvent(); + break; default: break; } diff --git a/src/declarative/items/qsgitem.cpp b/src/declarative/items/qsgitem.cpp index ef77bfda02..f94aa96666 100644 --- a/src/declarative/items/qsgitem.cpp +++ b/src/declarative/items/qsgitem.cpp @@ -1714,6 +1714,13 @@ bool QSGItem::childMouseEventFilter(QSGItem *, QEvent *) return false; } +void QSGItem::windowDeactivateEvent() +{ + foreach (QSGItem* item, childItems()) { + item->windowDeactivateEvent(); + } +} + Qt::InputMethodHints QSGItem::inputMethodHints() const { Q_D(const QSGItem); diff --git a/src/declarative/items/qsgitem.h b/src/declarative/items/qsgitem.h index 2cd2082acd..249a2065dd 100644 --- a/src/declarative/items/qsgitem.h +++ b/src/declarative/items/qsgitem.h @@ -370,6 +370,7 @@ protected: virtual void dragExitEvent(QSGDragEvent *event); virtual void dragDropEvent(QSGDragEvent *event); virtual bool childMouseEventFilter(QSGItem *, QEvent *); + virtual void windowDeactivateEvent(); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index 88a617fd71..5bf0867cdb 100644 --- a/src/declarative/items/qsgmousearea.cpp +++ b/src/declarative/items/qsgmousearea.cpp @@ -682,7 +682,7 @@ void QSGMouseArea::hoverLeaveEvent(QHoverEvent *event) setHovered(false); } -void QSGMouseArea::mouseUngrabEvent() +void QSGMouseArea::ungrabMouse() { Q_D(QSGMouseArea); if (d->pressed) { @@ -700,6 +700,11 @@ void QSGMouseArea::mouseUngrabEvent() } } +void QSGMouseArea::mouseUngrabEvent() +{ + ungrabMouse(); +} + bool QSGMouseArea::sendMouseEvent(QGraphicsSceneMouseEvent *event) { Q_D(QSGMouseArea); @@ -794,6 +799,12 @@ void QSGMouseArea::timerEvent(QTimerEvent *event) } } +void QSGMouseArea::windowDeactivateEvent() +{ + ungrabMouse(); + QSGItem::windowDeactivateEvent(); +} + void QSGMouseArea::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { diff --git a/src/declarative/items/qsgmousearea_p.h b/src/declarative/items/qsgmousearea_p.h index aac829f6a9..ff3863c3bb 100644 --- a/src/declarative/items/qsgmousearea_p.h +++ b/src/declarative/items/qsgmousearea_p.h @@ -223,6 +223,7 @@ protected: virtual void hoverLeaveEvent(QHoverEvent *event); virtual bool childMouseEventFilter(QSGItem *i, QEvent *e); virtual void timerEvent(QTimerEvent *event); + virtual void windowDeactivateEvent(); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); @@ -231,6 +232,7 @@ protected: private: void handlePress(); void handleRelease(); + void ungrabMouse(); private: Q_DISABLE_COPY(QSGMouseArea) diff --git a/tests/auto/declarative/qsgmousearea/data/pressedCanceled.qml b/tests/auto/declarative/qsgmousearea/data/pressedCanceled.qml new file mode 100644 index 0000000000..231436d0f2 --- /dev/null +++ b/tests/auto/declarative/qsgmousearea/data/pressedCanceled.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Rectangle { + id: root + color: "#ffffff" + width: 320; height: 240 + property bool pressed:mouse.pressed + property bool canceled: false + property bool released: false + + MouseArea { + id: mouse + anchors.fill: parent + onPressed: { root.canceled = false } + onCanceled: {root.canceled = true} + onReleased: {root.released = true; root.canceled = false} + } +}
\ No newline at end of file diff --git a/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp index e9788cd147..6e731d1682 100644 --- a/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp +++ b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp @@ -67,6 +67,7 @@ private slots: void updateMouseAreaPosOnResize(); void noOnClickedWithPressAndHold(); void onMousePressRejected(); + void pressedCanceledOnWindowDeactivate(); void doubleClick(); void clickTwice(); void pressedOrdering(); @@ -418,7 +419,51 @@ void tst_QSGMouseArea::onMousePressRejected() delete canvas; } +void tst_QSGMouseArea::pressedCanceledOnWindowDeactivate() +{ + QSGView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedCanceled.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + QVERIFY(!canvas->rootObject()->property("pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("released").toBool()); + + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &pressEvent); + + QVERIFY(canvas->rootObject()->property("pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("released").toBool()); + + QTest::qWait(200); + + QEvent windowDeactivateEvent(QEvent::WindowDeactivate); + QApplication::sendEvent(canvas, &windowDeactivateEvent); + QVERIFY(!canvas->rootObject()->property("pressed").toBool()); + QVERIFY(canvas->rootObject()->property("canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("released").toBool()); + QTest::qWait(200); + + //press again + QApplication::sendEvent(canvas, &pressEvent); + QVERIFY(canvas->rootObject()->property("pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("released").toBool()); + + QTest::qWait(200); + + //release + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &releaseEvent); + QVERIFY(!canvas->rootObject()->property("pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("canceled").toBool()); + QVERIFY(canvas->rootObject()->property("released").toBool()); + + delete canvas; +} void tst_QSGMouseArea::doubleClick() { QSGView *canvas = createView(); |