summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea.cpp17
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea_p_p.h2
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/data/changeAxis.qml22
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp79
4 files changed, 109 insertions, 11 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index ca6ba511..b0a48615 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -483,10 +483,6 @@ void QDeclarativeMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event)
else {
d->longPress = false;
d->saveEvent(event);
- if (d->drag) {
- d->dragX = drag()->axis() & QDeclarativeDrag::XAxis;
- d->dragY = drag()->axis() & QDeclarativeDrag::YAxis;
- }
if (d->drag)
d->drag->setActive(false);
setHovered(true);
@@ -540,7 +536,10 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (keepMouseGrab() && d->stealMouse)
d->drag->setActive(true);
- if (d->dragX && d->drag->active()) {
+ bool dragX = drag()->axis() & QDeclarativeDrag::XAxis;
+ bool dragY = drag()->axis() & QDeclarativeDrag::YAxis;
+
+ if (dragX && d->drag->active()) {
qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX;
if (x < drag()->xmin())
x = drag()->xmin();
@@ -548,7 +547,7 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
x = drag()->xmax();
drag()->target()->setX(x);
}
- if (d->dragY && d->drag->active()) {
+ if (dragY && d->drag->active()) {
qreal y = (curLocalPos.y() - startLocalPos.y()) + d->startY;
if (y < drag()->ymin())
y = drag()->ymin();
@@ -558,9 +557,9 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
if (!keepMouseGrab()) {
- if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
- || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
- || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
+ if ((!dragY && dy < dragThreshold && dragX && dx > dragThreshold)
+ || (!dragX && dx < dragThreshold && dragY && dy > dragThreshold)
+ || (dragX && dragY && (dx > dragThreshold || dy > dragThreshold))) {
setKeepMouseGrab(true);
d->stealMouse = true;
}
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
index 013d3397..87adef6f 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
@@ -106,8 +106,6 @@ public:
bool pressed : 1;
bool longPress : 1;
bool moved : 1;
- bool dragX : 1;
- bool dragY : 1;
bool stealMouse : 1;
bool doubleClick : 1;
bool preventStealing : 1;
diff --git a/tests/auto/declarative/qdeclarativemousearea/data/changeAxis.qml b/tests/auto/declarative/qdeclarativemousearea/data/changeAxis.qml
new file mode 100644
index 00000000..45613b9b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemousearea/data/changeAxis.qml
@@ -0,0 +1,22 @@
+import QtQuick 1.0
+Rectangle {
+ id: whiteRect
+ width: 200
+ height: 200
+ color: "white"
+ Rectangle {
+ id: blackRect
+ objectName: "blackrect"
+ color: "black"
+ y: 50
+ x: 50
+ width: 100
+ height: 100
+ MouseArea {
+ objectName: "mouseregion"
+ anchors.fill: parent
+ drag.target: blackRect
+ drag.axis: blackRect.x <= 75 ? Drag.XandYAxis : Drag.YAxis
+ }
+ }
+ }
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index 811fcd46..e81e01cb 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -75,6 +75,7 @@ private slots:
#ifndef QT_NO_CONTEXTMENU
void preventContextMenu();
#endif // QT_NO_CONTEXTMENU
+ void changeAxis();
private:
QDeclarativeView *createView();
@@ -702,6 +703,84 @@ void tst_QDeclarativeMouseArea::preventContextMenu()
}
#endif // QT_NO_CONTEXTMENU
+void tst_QDeclarativeMouseArea::changeAxis()
+{
+ QDeclarativeView *canvas = createView();
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/changeAxis.qml"));
+ canvas->show();
+ canvas->setFocus();
+ QVERIFY(canvas->rootObject() != 0);
+
+ QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
+ QDeclarativeDrag *drag = mouseRegion->drag();
+ QVERIFY(mouseRegion != 0);
+ QVERIFY(drag != 0);
+
+ // target
+ QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
+ QVERIFY(blackRect != 0);
+ QVERIFY(blackRect == drag->target());
+
+ QVERIFY(!drag->active());
+
+ // Start a diagonal drag
+ QGraphicsScene *scene = canvas->scene();
+ QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
+ pressEvent.setScenePos(QPointF(100, 100));
+ pressEvent.setButton(Qt::LeftButton);
+ pressEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &pressEvent);
+
+ QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
+ moveEvent.setScenePos(QPointF(111, 111));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ moveEvent.setScenePos(QPointF(122, 122));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ QVERIFY(drag->active());
+ QCOMPARE(blackRect->x(), 72.0);
+ QCOMPARE(blackRect->y(), 72.0);
+ QCOMPARE(drag->axis(), QDeclarativeDrag::XandYAxis);
+
+ /* When blackRect.x becomes bigger than 75, the drag axis is change to
+ * Drag.YAxis by the QML code. Verify that this happens, and that the drag
+ * movement is effectively constrained to the Y axis. */
+ moveEvent.setScenePos(QPointF(133, 133));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ QCOMPARE(blackRect->x(), 83.0);
+ QCOMPARE(blackRect->y(), 83.0);
+ QCOMPARE(drag->axis(), QDeclarativeDrag::YAxis);
+
+ moveEvent.setScenePos(QPointF(144, 144));
+ moveEvent.setButton(Qt::LeftButton);
+ moveEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &moveEvent);
+
+ QCOMPARE(blackRect->x(), 83.0);
+ QCOMPARE(blackRect->y(), 94.0);
+
+ QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
+ releaseEvent.setScenePos(QPointF(144, 144));
+ releaseEvent.setButton(Qt::LeftButton);
+ releaseEvent.setButtons(Qt::LeftButton);
+ QApplication::sendEvent(scene, &releaseEvent);
+
+ QVERIFY(!drag->active());
+ QCOMPARE(blackRect->x(), 83.0);
+ QCOMPARE(blackRect->y(), 94.0);
+
+ delete canvas;
+}
+
QTEST_MAIN(tst_QDeclarativeMouseArea)
#include "tst_qdeclarativemousearea.moc"