Fix setting drag properties in mousePress.

Cache the dragX and dragY properties after the onPressed
signal has been emitted to allow for deferred creation of the drag
object or changes to the axis property in the handler.

Change-Id: If154e661359c82e957fcf0cbc11ccc1f75bee919
Reviewed-by: Martin Jones <martin.jones@nokia.com>
This commit is contained in:
Andrew den Exter 2012-05-11 11:01:33 +10:00 committed by Qt by Nokia
parent d3ec26ea2e
commit 15db94ac65
3 changed files with 72 additions and 5 deletions

View File

@ -188,7 +188,7 @@ QQuickDragAttached *QQuickDrag::qmlAttachedProperties(QObject *obj)
QQuickMouseAreaPrivate::QQuickMouseAreaPrivate()
: enabled(true), hovered(false), pressed(false), longPress(false),
moved(false), stealMouse(false), doubleClick(false), preventStealing(false),
moved(false), dragX(true), dragY(true), stealMouse(false), doubleClick(false), preventStealing(false),
propagateComposedEvents(false), drag(0)
{
}
@ -696,10 +696,6 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event)
else {
d->longPress = false;
d->saveEvent(event);
if (d->drag) {
d->dragX = drag()->axis() & QQuickDrag::XAxis;
d->dragY = drag()->axis() & QQuickDrag::YAxis;
}
if (d->drag)
d->drag->setActive(false);
setHovered(true);
@ -708,6 +704,10 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event)
setKeepMouseGrab(d->stealMouse);
event->setAccepted(setPressed(true));
if (d->drag) {
d->dragX = drag()->axis() & QQuickDrag::XAxis;
d->dragY = drag()->axis() & QQuickDrag::YAxis;
}
}
}

View File

@ -0,0 +1,18 @@
import QtQuick 2.0
MouseArea {
width: 200; height: 200
Item {
id: dragTarget
objectName: "target"
x: 50; y: 50
width: 100; height: 100
}
onPressed: {
drag.target = dragTarget
drag.axis = Drag.XAxis
}
onReleased: drag.target = null
}

View File

@ -59,6 +59,7 @@ private slots:
void dragProperties();
void resetDrag();
void dragging();
void setDragOnPressed();
void updateMouseAreaPosOnClick();
void updateMouseAreaPosOnResize();
void noOnClickedWithPressAndHold();
@ -255,6 +256,54 @@ void tst_QQuickMouseArea::dragging()
delete canvas;
}
void tst_QQuickMouseArea::setDragOnPressed()
{
QQuickView *canvas = createView();
canvas->setSource(testFileUrl("setDragOnPressed.qml"));
canvas->show();
canvas->requestActivateWindow();
QTest::qWait(20);
QVERIFY(canvas->rootObject() != 0);
QQuickMouseArea *mouseArea = qobject_cast<QQuickMouseArea *>(canvas->rootObject());
QVERIFY(mouseArea);
// target
QQuickItem *target = mouseArea->findChild<QQuickItem*>("target");
QVERIFY(target);
QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100));
QQuickDrag *drag = mouseArea->drag();
QVERIFY(drag);
QVERIFY(!drag->active());
QCOMPARE(target->x(), 50.0);
QCOMPARE(target->y(), 50.0);
// First move event triggers drag, second is acted upon.
// This is due to possibility of higher stacked area taking precedence.
QTest::mouseMove(canvas, QPoint(111,102));
QTest::qWait(50);
QTest::mouseMove(canvas, QPoint(122,122));
QTest::qWait(50);
QVERIFY(drag->active());
QCOMPARE(target->x(), 72.0);
QCOMPARE(target->y(), 50.0);
QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(122,122));
QTest::qWait(50);
QVERIFY(!drag->active());
QCOMPARE(target->x(), 72.0);
QCOMPARE(target->y(), 50.0);
delete canvas;
}
QQuickView *tst_QQuickMouseArea::createView()
{
QQuickView *canvas = new QQuickView(0);