aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2017-09-22 11:46:36 -0500
committerShawn Rutledge <shawn.rutledge@qt.io>2018-01-25 16:22:51 +0000
commitbf74a908cb0591c2adc024a6f93d566c7348c125 (patch)
tree71e749e71e8dcd4b159303526e7343dcd968e920 /tests
parentf6222f825831202c084835412a3c217a9420cad7 (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')
-rw-r--r--tests/auto/quick/qquickmousearea/data/mask.qml63
-rw-r--r--tests/auto/quick/qquickmousearea/qquickmousearea.pro2
-rw-r--r--tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp63
3 files changed, 127 insertions, 1 deletions
diff --git a/tests/auto/quick/qquickmousearea/data/mask.qml b/tests/auto/quick/qquickmousearea/data/mask.qml
new file mode 100644
index 0000000000..23e93f0310
--- /dev/null
+++ b/tests/auto/quick/qquickmousearea/data/mask.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Ford Motor Company
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.11
+import Test 1.0
+
+Item {
+ id: root
+ property int clicked: 0
+ property int pressed: 0
+ property int released: 0
+
+ width: 200; height: 200
+
+ MouseArea {
+ id: mouseArea
+ width: 200; height: 200
+ onPressed: { root.pressed++ }
+ onClicked: { root.clicked++ }
+ onReleased: { root.released++ }
+
+ containsMask: CircleMask {
+ radius: mouseArea.width/2
+ }
+ }
+}
+
diff --git a/tests/auto/quick/qquickmousearea/qquickmousearea.pro b/tests/auto/quick/qquickmousearea/qquickmousearea.pro
index 3a4dfa946f..ee9d6dce2b 100644
--- a/tests/auto/quick/qquickmousearea/qquickmousearea.pro
+++ b/tests/auto/quick/qquickmousearea/qquickmousearea.pro
@@ -6,6 +6,8 @@ HEADERS += ../../shared/testhttpserver.h
SOURCES += tst_qquickmousearea.cpp \
../../shared/testhttpserver.cpp
+OTHER_FILES += $$files(data/*.qml)
+
include (../../shared/util.pri)
include (../shared/util.pri)
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"