summaryrefslogtreecommitdiffstats
path: root/tests/auto/declarative
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den.exter@jollamobile.com>2013-02-16 17:59:50 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-22 10:02:59 +0100
commit72ad290bcb705a5ed89d57dce6665fe78bc3cf9f (patch)
tree1ca74fa5d2879fdc823e5886bce9401789fa8e0d /tests/auto/declarative
parente3cc56d532edc97291b4f5a6c95db8b0ed8b3fe8 (diff)
MouseArea shouldn't grab the mouse until there is an effective drag.
A MouseArea shouldn't prevent a parent MouseArea or Flickable from handling a drag event unless it is going to do something useful with it. (cherry picked from commit 67db779665b1d95a20720c0dee058c47f7df8726) Task-number: QTBUG-29717 Change-Id: I17caa51ebc2e547e73e727fd185e60644591ad2b Reviewed-by: Alan Alpert <aalpert@rim.com>
Diffstat (limited to 'tests/auto/declarative')
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/data/nestedStopAtBounds.qml44
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp75
2 files changed, 119 insertions, 0 deletions
diff --git a/tests/auto/declarative/qdeclarativemousearea/data/nestedStopAtBounds.qml b/tests/auto/declarative/qdeclarativemousearea/data/nestedStopAtBounds.qml
new file mode 100644
index 0000000000..0379964db5
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemousearea/data/nestedStopAtBounds.qml
@@ -0,0 +1,44 @@
+import QtQuick 1.1
+
+Rectangle {
+ width: 400
+ height: 400
+
+ MouseArea {
+ id: outer
+ objectName: "outer"
+ x: 50
+ y: 50
+ width: 300
+ height: 300
+
+ drag.target: outer
+ drag.filterChildren: true
+
+ Rectangle {
+ anchors.fill: parent
+ color: "yellow"
+ }
+
+ MouseArea {
+ id: inner
+ objectName: "inner"
+
+ x: 0
+ y: 0
+ width: 200
+ height: 200
+
+ drag.target: inner
+ drag.minimumX: 0
+ drag.maximumX: 100
+ drag.minimumY: 0
+ drag.maximumY: 100
+
+ Rectangle {
+ anchors.fill: parent
+ color: "blue"
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index fc5353cae6..41dcc81cd9 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -75,6 +75,8 @@ private slots:
void preventContextMenu();
#endif // QT_NO_CONTEXTMENU
void changeAxis();
+ void nestedStopAtBounds();
+ void nestedStopAtBounds_data();
private:
QDeclarativeView *createView();
@@ -782,6 +784,79 @@ void tst_QDeclarativeMouseArea::changeAxis()
delete canvas;
}
+void tst_QDeclarativeMouseArea::nestedStopAtBounds_data()
+{
+ QTest::addColumn<bool>("transpose");
+ QTest::addColumn<bool>("invert");
+
+ QTest::newRow("left") << false << false;
+ QTest::newRow("right") << false << true;
+ QTest::newRow("top") << true << false;
+ QTest::newRow("bottom") << true << true;
+}
+
+void tst_QDeclarativeMouseArea::nestedStopAtBounds()
+{
+ QFETCH(bool, transpose);
+ QFETCH(bool, invert);
+
+ QDeclarativeView view;
+ view.setSource(QUrl::fromLocalFile(SRCDIR "/data/nestedStopAtBounds.qml"));
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ QVERIFY(view.rootObject());
+
+ QDeclarativeMouseArea *outer = view.rootObject()->findChild<QDeclarativeMouseArea*>("outer");
+ QVERIFY(outer);
+
+ QDeclarativeMouseArea *inner = outer->findChild<QDeclarativeMouseArea*>("inner");
+ QVERIFY(inner);
+ inner->drag()->setAxis(transpose ? QDeclarativeDrag::YAxis : QDeclarativeDrag::XAxis);
+ inner->setX(invert ? 100 : 0);
+ inner->setY(invert ? 100 : 0);
+
+ const int threshold = QApplication::startDragDistance();
+
+ QPoint position(200, 200);
+ int &axis = transpose ? position.ry() : position.rx();
+
+ QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+
+ // drag toward the aligned boundary. Outer mouse area dragged.
+ QTest::mousePress(view.viewport(), Qt::LeftButton, 0, position);
+ QTest::qWait(10);
+ axis += invert ? threshold * 2 : -threshold * 2;
+ moveEvent.setScenePos(position);
+ QApplication::sendEvent(view.scene(), &moveEvent);
+ axis += invert ? threshold : -threshold;
+ moveEvent.setScenePos(position);
+ QApplication::sendEvent(view.scene(), &moveEvent);
+ QCOMPARE(outer->drag()->active(), true);
+ QCOMPARE(inner->drag()->active(), false);
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, position);
+
+ QVERIFY(!outer->drag()->active());
+
+ axis = 200;
+ outer->setX(50);
+ outer->setY(50);
+
+ // drag away from the aligned boundary. Inner mouse area dragged.
+ QTest::mousePress(view.viewport(), Qt::LeftButton, 0, position);
+ QTest::qWait(10);
+ axis += invert ? -threshold * 2 : threshold * 2;
+ moveEvent.setScenePos(position);
+ QApplication::sendEvent(view.scene(), &moveEvent);
+ axis += invert ? -threshold : threshold;
+ moveEvent.setScenePos(position);
+ QApplication::sendEvent(view.scene(), &moveEvent);
+ QCOMPARE(outer->drag()->active(), false);
+ QCOMPARE(inner->drag()->active(), true);
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, position);
+}
+
QTEST_MAIN(tst_QDeclarativeMouseArea)
#include "tst_qdeclarativemousearea.moc"