Commit 3f62886a authored by Martin Jones's avatar Martin Jones Committed by Qt by Nokia
Browse files

Handle MouseArea.enabled = false after mouse is pressed.


Currently this leaves the MouseArea in a broken state,
i.e. still in pressed state, and the next press after
it is re-enabled is ignored.

In this case we now allow subsequent mouse move or
release events to continue. Following the release,
no further press will be accepted.

Change-Id: I65a890da90e2166ad568505fffdbd3db6c97165b
Reviewed-by: default avatarAndrew den Exter <andrew.den-exter@nokia.com>
parent 43ffdc3f
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.0 old/5.1 old/5.2 wip/cmake wip/dbus wip/gc wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1 v5.1.0-beta1 v5.1.0-alpha1 v5.0.2 v5.0.1 v5.0.0 v5.0.0-rc2 v5.0.0-rc1 v5.0.0-beta2 v5.0.0-beta1 qt-v5.0.0-alpha1
No related merge requests found
Showing with 111 additions and 6 deletions
......@@ -697,7 +697,7 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event)
void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event)
{
Q_D(QQuickMouseArea);
if (!d->absorb) {
if (!d->absorb && !d->pressed) {
QQuickItem::mouseMoveEvent(event);
return;
}
......@@ -783,7 +783,7 @@ void QQuickMouseArea::mouseReleaseEvent(QMouseEvent *event)
{
Q_D(QQuickMouseArea);
d->stealMouse = false;
if (!d->absorb) {
if (!d->absorb && !d->pressed) {
QQuickItem::mouseReleaseEvent(event);
} else {
d->saveEvent(event);
......@@ -820,7 +820,7 @@ void QQuickMouseArea::mouseDoubleClickEvent(QMouseEvent *event)
void QQuickMouseArea::hoverEnterEvent(QHoverEvent *event)
{
Q_D(QQuickMouseArea);
if (!d->absorb) {
if (!d->absorb && !d->pressed) {
QQuickItem::hoverEnterEvent(event);
} else {
d->lastPos = event->posF();
......@@ -837,7 +837,7 @@ void QQuickMouseArea::hoverEnterEvent(QHoverEvent *event)
void QQuickMouseArea::hoverMoveEvent(QHoverEvent *event)
{
Q_D(QQuickMouseArea);
if (!d->absorb) {
if (!d->absorb && !d->pressed) {
QQuickItem::hoverMoveEvent(event);
} else {
d->lastPos = event->posF();
......@@ -854,7 +854,7 @@ void QQuickMouseArea::hoverMoveEvent(QHoverEvent *event)
void QQuickMouseArea::hoverLeaveEvent(QHoverEvent *event)
{
Q_D(QQuickMouseArea);
if (!d->absorb)
if (!d->absorb && !d->pressed)
QQuickItem::hoverLeaveEvent(event);
else
setHovered(false);
......@@ -935,7 +935,7 @@ bool QQuickMouseArea::sendMouseEvent(QMouseEvent *event)
bool QQuickMouseArea::childMouseEventFilter(QQuickItem *i, QEvent *e)
{
Q_D(QQuickMouseArea);
if (!d->absorb || !isVisible() || !d->drag || !d->drag->filterChildren())
if (!d->pressed && (!d->absorb || !isVisible() || !d->drag || !d->drag->filterChildren()))
return QQuickItem::childMouseEventFilter(i, e);
switch (e->type()) {
case QEvent::MouseButtonPress:
......
......@@ -72,6 +72,7 @@ private slots:
void hoverPosition();
void hoverPropagation();
void hoverVisible();
void disableAfterPress();
private:
QQuickView *createView();
......@@ -801,6 +802,110 @@ void tst_QQuickMouseArea::hoverVisible()
delete canvas;
}
void tst_QQuickMouseArea::disableAfterPress()
{
QQuickView *canvas = createView();
canvas->setSource(testFileUrl("dragging.qml"));
canvas->show();
canvas->requestActivateWindow();
QTest::qWait(20);
QVERIFY(canvas->rootObject() != 0);
QQuickMouseArea *mouseArea = canvas->rootObject()->findChild<QQuickMouseArea*>("mouseregion");
QQuickDrag *drag = mouseArea->drag();
QVERIFY(mouseArea != 0);
QVERIFY(drag != 0);
QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QQuickMouseEvent*)));
QSignalSpy mousePressSpy(mouseArea, SIGNAL(pressed(QQuickMouseEvent*)));
QSignalSpy mouseReleaseSpy(mouseArea, SIGNAL(released(QQuickMouseEvent*)));
// target
QQuickItem *blackRect = canvas->rootObject()->findChild<QQuickItem*>("blackrect");
QVERIFY(blackRect != 0);
QVERIFY(blackRect == drag->target());
QVERIFY(!drag->active());
QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100));
QTRY_COMPARE(mousePressSpy.count(), 1);
QVERIFY(!drag->active());
QCOMPARE(blackRect->x(), 50.0);
QCOMPARE(blackRect->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,111));
QTest::qWait(50);
QTest::mouseMove(canvas, QPoint(122,122));
QTRY_COMPARE(mousePositionSpy.count(), 2);
QVERIFY(drag->active());
QCOMPARE(blackRect->x(), 72.0);
QCOMPARE(blackRect->y(), 72.0);
mouseArea->setEnabled(false);
// move should still be acted upon
QTest::mouseMove(canvas, QPoint(133,133));
QTest::qWait(50);
QTest::mouseMove(canvas, QPoint(144,144));
QTRY_COMPARE(mousePositionSpy.count(), 4);
QVERIFY(drag->active());
QCOMPARE(blackRect->x(), 94.0);
QCOMPARE(blackRect->y(), 94.0);
QVERIFY(mouseArea->pressed());
QVERIFY(mouseArea->hovered());
QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(144,144));
QTRY_COMPARE(mouseReleaseSpy.count(), 1);
QVERIFY(!drag->active());
QCOMPARE(blackRect->x(), 94.0);
QCOMPARE(blackRect->y(), 94.0);
QVERIFY(!mouseArea->pressed());
QVERIFY(!mouseArea->hovered()); // since hover is not enabled
// Next press will be ignored
blackRect->setX(50);
blackRect->setY(50);
mousePressSpy.clear();
mousePositionSpy.clear();
mouseReleaseSpy.clear();
QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100));
QTest::qWait(50);
QCOMPARE(mousePressSpy.count(), 0);
QTest::mouseMove(canvas, QPoint(111,111));
QTest::qWait(50);
QTest::mouseMove(canvas, QPoint(122,122));
QTest::qWait(50);
QCOMPARE(mousePositionSpy.count(), 0);
QVERIFY(!drag->active());
QCOMPARE(blackRect->x(), 50.0);
QCOMPARE(blackRect->y(), 50.0);
QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(122,122));
QTest::qWait(50);
QCOMPARE(mouseReleaseSpy.count(), 0);
delete canvas;
}
QTEST_MAIN(tst_QQuickMouseArea)
#include "tst_qquickmousearea.moc"
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment