diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-09-22 11:46:36 -0500 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2018-01-25 16:22:51 +0000 |
commit | bf74a908cb0591c2adc024a6f93d566c7348c125 (patch) | |
tree | 71e749e71e8dcd4b159303526e7343dcd968e920 /tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | |
parent | f6222f825831202c084835412a3c217a9420cad7 (diff) |
Support masking of QQuickItems
Adding a new property, containsMask, to QQuickItem, that can be set
to any QObject defining a
Q_INVOKABLE bool contains(const QPointF &point).
When this property is set, the mask object contains method is used in
place of the item own contains method.
[ChangeLog][QtQuick][QQuickItem] Added containsMask property.
Task-number: QTBUG-20524
Change-Id: I5b0696e2cddc6ae3e217ce149c5f44980fdb69aa
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp')
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index b9a9dabf00..4fe01787fa 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -68,13 +68,45 @@ static bool initView(QQuickView &v, const QUrl &url, bool moveMouseOut, QByteArr return true; } +class CircleMask : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) + +public: + virtual ~CircleMask() {} + qreal radius() const { return m_radius; } + void setRadius(qreal radius) + { + if (m_radius == radius) + return; + m_radius = radius; + emit radiusChanged(); + } + + Q_INVOKABLE bool contains(const QPointF &point) const + { + QPointF center(m_radius, m_radius); + QLineF line(center, point); + return line.length() <= m_radius; + } + +signals: + void radiusChanged(); + +private: + qreal m_radius; +}; + class tst_QQuickMouseArea: public QQmlDataTest { Q_OBJECT public: tst_QQuickMouseArea() : device(nullptr) - {} + { + qmlRegisterType<CircleMask>("Test", 1, 0, "CircleMask"); + } private slots: void initTestCase() override; @@ -132,6 +164,7 @@ private slots: void pressAndHold(); void pressOneAndTapAnother_data(); void pressOneAndTapAnother(); + void mask(); private: int startDragDistance() const { @@ -2247,6 +2280,34 @@ void tst_QQuickMouseArea::pressOneAndTapAnother() } } +void tst_QQuickMouseArea::mask() +{ + QQuickView window; + QByteArray errorMessage; + QVERIFY2(initView(window, testFileUrl("mask.qml"), true, &errorMessage), errorMessage.constData()); + window.show(); + window.requestActivate(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + QQuickItem *root = window.rootObject(); + QVERIFY(root != 0); + + // click inside the mask, and verify it registers + QTest::mousePress(&window, Qt::LeftButton, 0, QPoint(100,100)); + QTest::mouseRelease(&window, Qt::LeftButton, 0, QPoint(100,100)); + + QCOMPARE(window.rootObject()->property("pressed").toInt(), 1); + QCOMPARE(window.rootObject()->property("released").toInt(), 1); + QCOMPARE(window.rootObject()->property("clicked").toInt(), 1); + + // click outside the mask (but inside the MouseArea), and verify it doesn't register + QTest::mousePress(&window, Qt::LeftButton, 0, QPoint(10,10)); + QTest::mouseRelease(&window, Qt::LeftButton, 0, QPoint(10,10)); + + QCOMPARE(window.rootObject()->property("pressed").toInt(), 1); + QCOMPARE(window.rootObject()->property("released").toInt(), 1); + QCOMPARE(window.rootObject()->property("clicked").toInt(), 1); +} + QTEST_MAIN(tst_QQuickMouseArea) #include "tst_qquickmousearea.moc" |