From bf74a908cb0591c2adc024a6f93d566c7348c125 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Fri, 22 Sep 2017 11:46:36 -0500 Subject: Support masking of QQuickItems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Shawn Rutledge --- tests/auto/quick/qquickmousearea/data/mask.qml | 63 ++++++++++++++++++++++ .../auto/quick/qquickmousearea/qquickmousearea.pro | 2 + .../quick/qquickmousearea/tst_qquickmousearea.cpp | 63 +++++++++++++++++++++- 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 tests/auto/quick/qquickmousearea/data/mask.qml (limited to 'tests/auto/quick/qquickmousearea') 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("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" -- cgit v1.2.3