1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <QtTest/QtTest>
43 #include <QtTest/QSignalSpy>
44 #include <QtQuick1/private/qdeclarativemousearea_p.h>
45 #include <QtQuick1/private/qdeclarativerectangle_p.h>
46 #include <QtQuick1/private/qdeclarativeflickable_p.h>
47 #include <QtQuick1/qdeclarativeview.h>
48 #include <QtDeclarative/qdeclarativecontext.h>
49 #include <QtDeclarative/qdeclarativeengine.h>
50 #include <QtDeclarative/qdeclarativeproperty.h>
52 class tst_QDeclarative1MouseArea: public QObject
56 void dragProperties();
59 void updateMouseAreaPosOnClick();
60 void updateMouseAreaPosOnResize();
61 void noOnClickedWithPressAndHold();
62 void onMousePressRejected();
65 void pressedOrdering();
66 void preventStealing();
67 void testQtQuick11Attributes();
68 void testQtQuick11Attributes_data();
69 #ifndef QT_NO_CONTEXTMENU
70 void preventContextMenu();
71 #endif // QT_NO_CONTEXTMENU
74 QDeclarativeView *createView();
77 void tst_QDeclarative1MouseArea::dragProperties()
79 QDeclarativeView *canvas = createView();
80 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragproperties.qml"));
83 QVERIFY(canvas->rootObject() != 0);
85 QDeclarative1MouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mouseregion");
86 QDeclarative1Drag *drag = mouseRegion->drag();
87 QVERIFY(mouseRegion != 0);
91 QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
92 QVERIFY(blackRect != 0);
93 QVERIFY(blackRect == drag->target());
94 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
95 QVERIFY(rootItem != 0);
96 QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
97 drag->setTarget(rootItem);
98 QCOMPARE(targetSpy.count(),1);
99 drag->setTarget(rootItem);
100 QCOMPARE(targetSpy.count(),1);
103 QCOMPARE(drag->axis(), QDeclarative1Drag::XandYAxis);
104 QSignalSpy axisSpy(drag, SIGNAL(axisChanged()));
105 drag->setAxis(QDeclarative1Drag::XAxis);
106 QCOMPARE(drag->axis(), QDeclarative1Drag::XAxis);
107 QCOMPARE(axisSpy.count(),1);
108 drag->setAxis(QDeclarative1Drag::XAxis);
109 QCOMPARE(axisSpy.count(),1);
111 // minimum and maximum properties
112 QSignalSpy xminSpy(drag, SIGNAL(minimumXChanged()));
113 QSignalSpy xmaxSpy(drag, SIGNAL(maximumXChanged()));
114 QSignalSpy yminSpy(drag, SIGNAL(minimumYChanged()));
115 QSignalSpy ymaxSpy(drag, SIGNAL(maximumYChanged()));
117 QCOMPARE(drag->xmin(), 0.0);
118 QCOMPARE(drag->xmax(), rootItem->width()-blackRect->width());
119 QCOMPARE(drag->ymin(), 0.0);
120 QCOMPARE(drag->ymax(), rootItem->height()-blackRect->height());
127 QCOMPARE(drag->xmin(), 10.0);
128 QCOMPARE(drag->xmax(), 10.0);
129 QCOMPARE(drag->ymin(), 10.0);
130 QCOMPARE(drag->ymax(), 10.0);
132 QCOMPARE(xminSpy.count(),1);
133 QCOMPARE(xmaxSpy.count(),1);
134 QCOMPARE(yminSpy.count(),1);
135 QCOMPARE(ymaxSpy.count(),1);
142 QCOMPARE(xminSpy.count(),1);
143 QCOMPARE(xmaxSpy.count(),1);
144 QCOMPARE(yminSpy.count(),1);
145 QCOMPARE(ymaxSpy.count(),1);
148 QSignalSpy filterChildrenSpy(drag, SIGNAL(filterChildrenChanged()));
150 drag->setFilterChildren(true);
152 QVERIFY(drag->filterChildren());
153 QCOMPARE(filterChildrenSpy.count(), 1);
155 drag->setFilterChildren(true);
156 QCOMPARE(filterChildrenSpy.count(), 1);
161 void tst_QDeclarative1MouseArea::resetDrag()
163 QDeclarativeView *canvas = createView();
165 canvas->rootContext()->setContextProperty("haveTarget", QVariant(true));
166 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragreset.qml"));
169 QVERIFY(canvas->rootObject() != 0);
171 QDeclarative1MouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mouseregion");
172 QDeclarative1Drag *drag = mouseRegion->drag();
173 QVERIFY(mouseRegion != 0);
177 QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
178 QVERIFY(blackRect != 0);
179 QVERIFY(blackRect == drag->target());
180 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
181 QVERIFY(rootItem != 0);
182 QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
183 QVERIFY(drag->target() != 0);
184 canvas->rootContext()->setContextProperty("haveTarget", QVariant(false));
185 QCOMPARE(targetSpy.count(),1);
186 QVERIFY(drag->target() == 0);
192 void tst_QDeclarative1MouseArea::dragging()
194 QDeclarativeView *canvas = createView();
196 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragging.qml"));
199 QVERIFY(canvas->rootObject() != 0);
201 QDeclarative1MouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mouseregion");
202 QDeclarative1Drag *drag = mouseRegion->drag();
203 QVERIFY(mouseRegion != 0);
207 QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
208 QVERIFY(blackRect != 0);
209 QVERIFY(blackRect == drag->target());
211 QVERIFY(!drag->active());
213 QGraphicsScene *scene = canvas->scene();
214 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
215 pressEvent.setScenePos(QPointF(100, 100));
216 pressEvent.setButton(Qt::LeftButton);
217 pressEvent.setButtons(Qt::LeftButton);
218 QApplication::sendEvent(scene, &pressEvent);
220 QVERIFY(!drag->active());
221 QCOMPARE(blackRect->x(), 50.0);
222 QCOMPARE(blackRect->y(), 50.0);
224 // First move event triggers drag, second is acted upon.
225 // This is due to possibility of higher stacked area taking precedence.
226 QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
227 moveEvent.setScenePos(QPointF(106, 106));
228 moveEvent.setButton(Qt::LeftButton);
229 moveEvent.setButtons(Qt::LeftButton);
230 QApplication::sendEvent(scene, &moveEvent);
232 moveEvent.setScenePos(QPointF(110, 110));
233 moveEvent.setButton(Qt::LeftButton);
234 moveEvent.setButtons(Qt::LeftButton);
235 QApplication::sendEvent(scene, &moveEvent);
237 QVERIFY(drag->active());
238 QCOMPARE(blackRect->x(), 60.0);
239 QCOMPARE(blackRect->y(), 60.0);
241 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
242 releaseEvent.setScenePos(QPointF(110, 110));
243 releaseEvent.setButton(Qt::LeftButton);
244 releaseEvent.setButtons(Qt::LeftButton);
245 QApplication::sendEvent(scene, &releaseEvent);
247 QVERIFY(!drag->active());
248 QCOMPARE(blackRect->x(), 60.0);
249 QCOMPARE(blackRect->y(), 60.0);
254 QDeclarativeView *tst_QDeclarative1MouseArea::createView()
256 QDeclarativeView *canvas = new QDeclarativeView(0);
257 canvas->setFixedSize(240,320);
262 void tst_QDeclarative1MouseArea::updateMouseAreaPosOnClick()
264 QDeclarativeView *canvas = createView();
265 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnClick.qml"));
268 QVERIFY(canvas->rootObject() != 0);
270 QDeclarative1MouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mouseregion");
271 QVERIFY(mouseRegion != 0);
273 QDeclarative1Rectangle *rect = canvas->rootObject()->findChild<QDeclarative1Rectangle*>("ball");
276 QCOMPARE(mouseRegion->mouseX(), rect->x());
277 QCOMPARE(mouseRegion->mouseY(), rect->y());
279 QGraphicsScene *scene = canvas->scene();
280 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
281 event.setScenePos(QPointF(100, 100));
282 event.setButton(Qt::LeftButton);
283 event.setButtons(Qt::LeftButton);
284 QApplication::sendEvent(scene, &event);
286 QCOMPARE(mouseRegion->mouseX(), 100.0);
287 QCOMPARE(mouseRegion->mouseY(), 100.0);
289 QCOMPARE(mouseRegion->mouseX(), rect->x());
290 QCOMPARE(mouseRegion->mouseY(), rect->y());
295 void tst_QDeclarative1MouseArea::updateMouseAreaPosOnResize()
297 QDeclarativeView *canvas = createView();
298 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnResize.qml"));
301 QVERIFY(canvas->rootObject() != 0);
303 QDeclarative1MouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mouseregion");
304 QVERIFY(mouseRegion != 0);
306 QDeclarative1Rectangle *rect = canvas->rootObject()->findChild<QDeclarative1Rectangle*>("brother");
309 QCOMPARE(mouseRegion->mouseX(), 0.0);
310 QCOMPARE(mouseRegion->mouseY(), 0.0);
312 QGraphicsScene *scene = canvas->scene();
313 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
314 event.setScenePos(rect->pos());
315 event.setButton(Qt::LeftButton);
316 event.setButtons(Qt::LeftButton);
317 QApplication::sendEvent(scene, &event);
319 QVERIFY(!mouseRegion->property("emitPositionChanged").toBool());
320 QVERIFY(mouseRegion->property("mouseMatchesPos").toBool());
322 QCOMPARE(mouseRegion->property("x1").toInt(), 0);
323 QCOMPARE(mouseRegion->property("y1").toInt(), 0);
325 // XXX: is it on purpose that mouseX is real and mouse.x is int?
326 QCOMPARE(mouseRegion->property("x2").toInt(), (int) rect->x());
327 QCOMPARE(mouseRegion->property("y2").toInt(), (int) rect->y());
329 QCOMPARE(mouseRegion->mouseX(), rect->x());
330 QCOMPARE(mouseRegion->mouseY(), rect->y());
335 void tst_QDeclarative1MouseArea::noOnClickedWithPressAndHold()
337 QDeclarativeView *canvas = createView();
338 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml"));
341 QVERIFY(canvas->rootObject() != 0);
343 QGraphicsScene *scene = canvas->scene();
344 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
345 pressEvent.setScenePos(QPointF(100, 100));
346 pressEvent.setButton(Qt::LeftButton);
347 pressEvent.setButtons(Qt::LeftButton);
348 QApplication::sendEvent(scene, &pressEvent);
350 QVERIFY(!canvas->rootObject()->property("clicked").toBool());
351 QVERIFY(!canvas->rootObject()->property("held").toBool());
355 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
356 releaseEvent.setScenePos(QPointF(100, 100));
357 releaseEvent.setButton(Qt::LeftButton);
358 releaseEvent.setButtons(Qt::LeftButton);
359 QApplication::sendEvent(scene, &releaseEvent);
361 QVERIFY(!canvas->rootObject()->property("clicked").toBool());
362 QVERIFY(canvas->rootObject()->property("held").toBool());
367 void tst_QDeclarative1MouseArea::onMousePressRejected()
369 QDeclarativeView *canvas = createView();
370 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rejectEvent.qml"));
373 QVERIFY(canvas->rootObject() != 0);
374 QVERIFY(canvas->rootObject()->property("enabled").toBool());
376 QVERIFY(!canvas->rootObject()->property("mr1_pressed").toBool());
377 QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
378 QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
379 QVERIFY(!canvas->rootObject()->property("mr2_pressed").toBool());
380 QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
381 QVERIFY(!canvas->rootObject()->property("mr2_canceled").toBool());
383 QGraphicsScene *scene = canvas->scene();
384 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
385 pressEvent.setScenePos(QPointF(100, 100));
386 pressEvent.setButton(Qt::LeftButton);
387 pressEvent.setButtons(Qt::LeftButton);
388 QApplication::sendEvent(scene, &pressEvent);
390 QVERIFY(canvas->rootObject()->property("mr1_pressed").toBool());
391 QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
392 QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
393 QVERIFY(canvas->rootObject()->property("mr2_pressed").toBool());
394 QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
395 QVERIFY(canvas->rootObject()->property("mr2_canceled").toBool());
399 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
400 releaseEvent.setScenePos(QPointF(100, 100));
401 releaseEvent.setButton(Qt::LeftButton);
402 releaseEvent.setButtons(Qt::LeftButton);
403 QApplication::sendEvent(scene, &releaseEvent);
405 QVERIFY(canvas->rootObject()->property("mr1_released").toBool());
406 QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
407 QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
412 void tst_QDeclarative1MouseArea::doubleClick()
414 QDeclarativeView *canvas = createView();
415 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/doubleclick.qml"));
418 QVERIFY(canvas->rootObject() != 0);
420 QGraphicsScene *scene = canvas->scene();
421 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
422 pressEvent.setScenePos(QPointF(100, 100));
423 pressEvent.setButton(Qt::LeftButton);
424 pressEvent.setButtons(Qt::LeftButton);
425 QApplication::sendEvent(scene, &pressEvent);
427 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
428 releaseEvent.setScenePos(QPointF(100, 100));
429 releaseEvent.setButton(Qt::LeftButton);
430 releaseEvent.setButtons(Qt::LeftButton);
431 QApplication::sendEvent(scene, &releaseEvent);
433 QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
435 QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick);
436 dblClickEvent.setScenePos(QPointF(100, 100));
437 dblClickEvent.setButton(Qt::LeftButton);
438 dblClickEvent.setButtons(Qt::LeftButton);
439 QApplication::sendEvent(scene, &dblClickEvent);
441 QApplication::sendEvent(scene, &releaseEvent);
443 QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
444 QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1);
445 QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
451 void tst_QDeclarative1MouseArea::clickTwice()
453 QDeclarativeView *canvas = createView();
454 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clicktwice.qml"));
457 QVERIFY(canvas->rootObject() != 0);
459 QGraphicsScene *scene = canvas->scene();
460 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
461 pressEvent.setScenePos(QPointF(100, 100));
462 pressEvent.setButton(Qt::LeftButton);
463 pressEvent.setButtons(Qt::LeftButton);
464 QApplication::sendEvent(scene, &pressEvent);
466 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
467 releaseEvent.setScenePos(QPointF(100, 100));
468 releaseEvent.setButton(Qt::LeftButton);
469 releaseEvent.setButtons(Qt::LeftButton);
470 QApplication::sendEvent(scene, &releaseEvent);
472 QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 1);
473 QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
474 QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
476 QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick);
477 dblClickEvent.setScenePos(QPointF(100, 100));
478 dblClickEvent.setButton(Qt::LeftButton);
479 dblClickEvent.setButtons(Qt::LeftButton);
480 QApplication::sendEvent(scene, &dblClickEvent);
482 QApplication::sendEvent(scene, &pressEvent);
483 QApplication::sendEvent(scene, &releaseEvent);
485 QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 2);
486 QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
487 QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 2);
492 void tst_QDeclarative1MouseArea::pressedOrdering()
494 QDeclarativeView *canvas = createView();
495 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedOrdering.qml"));
498 QVERIFY(canvas->rootObject() != 0);
500 QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("base"));
502 QGraphicsScene *scene = canvas->scene();
503 QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
504 pressEvent.setScenePos(QPointF(100, 100));
505 pressEvent.setButton(Qt::LeftButton);
506 pressEvent.setButtons(Qt::LeftButton);
507 QApplication::sendEvent(scene, &pressEvent);
509 QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
511 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
512 releaseEvent.setScenePos(QPointF(100, 100));
513 releaseEvent.setButton(Qt::LeftButton);
514 releaseEvent.setButtons(Qt::LeftButton);
515 QApplication::sendEvent(scene, &releaseEvent);
517 QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("toggled"));
519 QApplication::sendEvent(scene, &pressEvent);
521 QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
526 void tst_QDeclarative1MouseArea::preventStealing()
528 QDeclarativeView *canvas = createView();
530 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventstealing.qml"));
533 QVERIFY(canvas->rootObject() != 0);
535 QDeclarative1Flickable *flickable = qobject_cast<QDeclarative1Flickable*>(canvas->rootObject());
536 QVERIFY(flickable != 0);
538 QDeclarative1MouseArea *mouseArea = canvas->rootObject()->findChild<QDeclarative1MouseArea*>("mousearea");
539 QVERIFY(mouseArea != 0);
541 QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QDeclarative1MouseEvent*)));
543 QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
545 // Without preventStealing, mouse movement over MouseArea would
546 // cause the Flickable to steal mouse and trigger content movement.
547 QGraphicsScene *scene = canvas->scene();
548 QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
549 moveEvent.setScenePos(QPointF(70, 70));
550 moveEvent.setButton(Qt::LeftButton);
551 moveEvent.setButtons(Qt::LeftButton);
552 QApplication::sendEvent(scene, &moveEvent);
554 moveEvent.setScenePos(QPointF(60, 60));
555 moveEvent.setButton(Qt::LeftButton);
556 moveEvent.setButtons(Qt::LeftButton);
557 QApplication::sendEvent(scene, &moveEvent);
559 moveEvent.setScenePos(QPointF(50, 50));
560 moveEvent.setButton(Qt::LeftButton);
561 moveEvent.setButtons(Qt::LeftButton);
562 QApplication::sendEvent(scene, &moveEvent);
564 // We should have received all three move events
565 QCOMPARE(mousePositionSpy.count(), 3);
566 QVERIFY(mouseArea->pressed());
568 // Flickable content should not have moved.
569 QCOMPARE(flickable->contentX(), 0.);
570 QCOMPARE(flickable->contentY(), 0.);
572 QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
574 // Now allow stealing and confirm Flickable does its thing.
575 canvas->rootObject()->setProperty("stealing", false);
577 QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
579 // Without preventStealing, mouse movement over MouseArea would
580 // cause the Flickable to steal mouse and trigger content movement.
581 moveEvent.setScenePos(QPointF(70, 70));
582 QApplication::sendEvent(scene, &moveEvent);
584 moveEvent.setScenePos(QPointF(60, 60));
585 QApplication::sendEvent(scene, &moveEvent);
587 moveEvent.setScenePos(QPointF(50, 50));
588 QApplication::sendEvent(scene, &moveEvent);
590 // We should only have received the first move event
591 QCOMPARE(mousePositionSpy.count(), 4);
592 // Our press should be taken away
593 QVERIFY(!mouseArea->pressed());
595 // Flickable content should have moved.
596 QCOMPARE(flickable->contentX(), 10.);
597 QCOMPARE(flickable->contentY(), 10.);
599 QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
604 void tst_QDeclarative1MouseArea::testQtQuick11Attributes()
606 QFETCH(QString, code);
607 QFETCH(QString, warning);
608 QFETCH(QString, error);
610 QDeclarativeEngine engine;
613 QDeclarativeComponent valid(&engine);
614 valid.setData("import QtQuick 1.1; MouseArea { " + code.toUtf8() + " }", QUrl(""));
615 obj = valid.create();
617 QVERIFY(valid.errorString().isEmpty());
620 QDeclarativeComponent invalid(&engine);
621 invalid.setData("import QtQuick 1.0; MouseArea { " + code.toUtf8() + " }", QUrl(""));
622 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
623 obj = invalid.create();
624 QCOMPARE(invalid.errorString(), error);
628 void tst_QDeclarative1MouseArea::testQtQuick11Attributes_data()
630 QTest::addColumn<QString>("code");
631 QTest::addColumn<QString>("warning");
632 QTest::addColumn<QString>("error");
634 QTest::newRow("preventStealing") << "preventStealing: true"
635 << "QDeclarativeComponent: Component is not ready"
636 << ":1 \"MouseArea.preventStealing\" is not available in QtQuick 1.0.\n";
639 #ifndef QT_NO_CONTEXTMENU
640 class ContextMenuEventReceiver : public QDeclarativeItem
643 Q_PROPERTY(int eventCount READ eventCount NOTIFY eventCountChanged);
645 ContextMenuEventReceiver(QDeclarativeItem *parent = 0) : QDeclarativeItem(parent), m_eventCount(0) { }
646 int eventCount() const { return m_eventCount; }
648 void eventCountChanged(int);
650 void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
651 if (event->reason() == QGraphicsSceneContextMenuEvent::Mouse) {
653 emit eventCountChanged(m_eventCount);
660 void tst_QDeclarative1MouseArea::preventContextMenu()
662 // A MouseArea accepting Left, Middle and Right buttons should prevent context menu
663 // events with "Mouse" reason to hit the Item below.
665 qmlRegisterType<ContextMenuEventReceiver>("Test", 1, 0, "ContextMenuEventReceiver");
667 QDeclarativeView *view = createView();
668 view->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventContextMenu.qml"));
670 QVERIFY(view->rootObject() != 0);
672 QDeclarativeProperty mouseAreaEnabled(view->rootObject(), "mouseAreaEnabled");
673 QVERIFY(mouseAreaEnabled.read().toBool());
675 QDeclarativeProperty eventsReceived(view->rootObject(), "eventsReceived");
676 QCOMPARE(eventsReceived.read().toInt(), 0);
678 QPoint targetPoint = view->mapFromScene(QPoint(80, 80));
680 QContextMenuEvent fakeEvent1(QContextMenuEvent::Mouse, targetPoint);
681 QApplication::sendEvent(view->viewport(), &fakeEvent1);
682 QCOMPARE(eventsReceived.read().toInt(), 0);
684 mouseAreaEnabled.write(false);
685 QVERIFY(!mouseAreaEnabled.read().toBool());
686 QContextMenuEvent fakeEvent2(QContextMenuEvent::Mouse, targetPoint);
687 QApplication::sendEvent(view->viewport(), &fakeEvent2);
688 QCOMPARE(eventsReceived.read().toInt(), 1);
690 mouseAreaEnabled.write(true);
691 QVERIFY(mouseAreaEnabled.read().toBool());
692 QContextMenuEvent fakeEvent3(QContextMenuEvent::Mouse, targetPoint);
693 QApplication::sendEvent(view->viewport(), &fakeEvent3);
694 QCOMPARE(eventsReceived.read().toInt(), 1);
696 #endif // QT_NO_CONTEXTMENU
698 QTEST_MAIN(tst_QDeclarative1MouseArea)
700 #include "tst_qdeclarativemousearea.moc"