Add a HoverHandler autotest
Change-Id: I223bad4f8117af76ad2a5079ecc0b73c2eba94bc Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This commit is contained in:
parent
2541070336
commit
7c55485b75
|
@ -4,10 +4,10 @@ qtConfig(private_tests) {
|
|||
SUBDIRS += \
|
||||
flickableinterop \
|
||||
multipointtoucharea_interop \
|
||||
qquickdraghandler \
|
||||
qquickhoverhandler \
|
||||
qquickpinchhandler \
|
||||
qquickpointerhandler \
|
||||
qquickpointhandler \
|
||||
qquickdraghandler \
|
||||
qquickpinchhandler \
|
||||
qquicktaphandler \
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,164 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** 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 General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** 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-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.12
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
width: 640
|
||||
height: 480
|
||||
color: "#444"
|
||||
|
||||
Component {
|
||||
id: buttonsAndStuff
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 8
|
||||
spacing: 8
|
||||
|
||||
Rectangle {
|
||||
objectName: "buttonWithMA"
|
||||
width: parent.width
|
||||
height: 30
|
||||
color: buttonMA.pressed ? "lightsteelblue" : "#999"
|
||||
border.color: buttonMA.containsMouse ? "cyan" : "transparent"
|
||||
|
||||
MouseArea {
|
||||
id: buttonMA
|
||||
objectName: "buttonMA"
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: console.log("clicked MA")
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "MouseArea"
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
objectName: "buttonWithHH"
|
||||
width: parent.width
|
||||
height: 30
|
||||
color: flash ? "#999" : "white"
|
||||
border.color: buttonHH.hovered ? "cyan" : "transparent"
|
||||
property bool flash: true
|
||||
|
||||
HoverHandler {
|
||||
id: buttonHH
|
||||
objectName: "buttonHH"
|
||||
acceptedDevices: PointerDevice.AllDevices
|
||||
}
|
||||
|
||||
TapHandler { }
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "HoverHandler"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: paddle
|
||||
objectName: "paddle"
|
||||
width: 100
|
||||
height: 40
|
||||
color: paddleHH.hovered ? "indianred" : "#888"
|
||||
x: (parent.width - width) / 2
|
||||
y: parent.height - 100
|
||||
radius: 10
|
||||
|
||||
HoverHandler {
|
||||
id: paddleHH
|
||||
objectName: "paddleHH"
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
objectName: "topSidebar"
|
||||
radius: 5
|
||||
antialiasing: true
|
||||
x: -radius
|
||||
y: -radius
|
||||
width: 120
|
||||
height: 200
|
||||
border.color: topSidebarHH.hovered ? "cyan" : "black"
|
||||
color: "#777"
|
||||
|
||||
Rectangle {
|
||||
color: "cyan"
|
||||
width: 10
|
||||
height: width
|
||||
radius: width / 2
|
||||
visible: topSidebarHH.hovered
|
||||
x: topSidebarHH.point.position.x - width / 2
|
||||
y: topSidebarHH.point.position.y - height / 2
|
||||
z: 100
|
||||
}
|
||||
|
||||
HoverHandler {
|
||||
id: topSidebarHH
|
||||
objectName: "topSidebarHH"
|
||||
}
|
||||
|
||||
Loader {
|
||||
objectName: "topSidebarLoader"
|
||||
sourceComponent: buttonsAndStuff
|
||||
anchors.fill: parent
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
objectName: "bottomSidebar"
|
||||
radius: 5
|
||||
antialiasing: true
|
||||
x: -radius
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: -radius
|
||||
width: 120
|
||||
height: 200
|
||||
border.color: bottomSidebarMA.containsMouse ? "cyan" : "black"
|
||||
color: "#777"
|
||||
|
||||
MouseArea {
|
||||
id: bottomSidebarMA
|
||||
objectName: "bottomSidebarMA"
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Loader {
|
||||
objectName: "bottomSidebarLoader"
|
||||
sourceComponent: buttonsAndStuff
|
||||
anchors.fill: parent
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
CONFIG += testcase
|
||||
|
||||
TARGET = tst_qquickhoverhandler
|
||||
QT += core-private gui-private qml-private quick-private testlib
|
||||
|
||||
macos:CONFIG -= app_bundle
|
||||
|
||||
SOURCES += tst_qquickhoverhandler.cpp
|
||||
|
||||
include (../../../shared/util.pri)
|
||||
include (../../shared/util.pri)
|
||||
|
||||
TESTDATA = data/*
|
||||
|
||||
OTHER_FILES += data/lesHoverables.qml \
|
|
@ -0,0 +1,234 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** 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 General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** 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-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
#include <QtQuick/qquickview.h>
|
||||
#include <QtQuick/qquickitem.h>
|
||||
#include <QtQuick/private/qquickhoverhandler_p.h>
|
||||
#include <QtQuick/private/qquickmousearea_p.h>
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
|
||||
#include <private/qquickwindow_p.h>
|
||||
|
||||
#include <QtQml/qqmlengine.h>
|
||||
#include <QtQml/qqmlproperty.h>
|
||||
|
||||
#include "../../../shared/util.h"
|
||||
#include "../../shared/viewtestutil.h"
|
||||
|
||||
Q_LOGGING_CATEGORY(lcPointerTests, "qt.quick.pointer.tests")
|
||||
|
||||
static bool isPlatformWayland()
|
||||
{
|
||||
return !QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive);
|
||||
}
|
||||
|
||||
class tst_HoverHandler : public QQmlDataTest
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
tst_HoverHandler()
|
||||
{}
|
||||
|
||||
private slots:
|
||||
void hoverHandlerAndUnderlyingHoverHandler();
|
||||
void mouseAreaAndUnderlyingHoverHandler();
|
||||
void hoverHandlerAndUnderlyingMouseArea();
|
||||
|
||||
private:
|
||||
void createView(QScopedPointer<QQuickView> &window, const char *fileName);
|
||||
};
|
||||
|
||||
void tst_HoverHandler::createView(QScopedPointer<QQuickView> &window, const char *fileName)
|
||||
{
|
||||
window.reset(new QQuickView);
|
||||
window->setSource(testFileUrl(fileName));
|
||||
QTRY_COMPARE(window->status(), QQuickView::Ready);
|
||||
QQuickViewTestUtil::centerOnScreen(window.data());
|
||||
QQuickViewTestUtil::moveMouseAway(window.data());
|
||||
|
||||
window->show();
|
||||
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
||||
QVERIFY(window->rootObject() != nullptr);
|
||||
}
|
||||
|
||||
void tst_HoverHandler::hoverHandlerAndUnderlyingHoverHandler()
|
||||
{
|
||||
QScopedPointer<QQuickView> windowPtr;
|
||||
createView(windowPtr, "lesHoverables.qml");
|
||||
QQuickView * window = windowPtr.data();
|
||||
QQuickItem * topSidebar = window->rootObject()->findChild<QQuickItem *>("topSidebar");
|
||||
QVERIFY(topSidebar);
|
||||
QQuickItem * button = topSidebar->findChild<QQuickItem *>("buttonWithHH");
|
||||
QVERIFY(button);
|
||||
QQuickHoverHandler *topSidebarHH = topSidebar->findChild<QQuickHoverHandler *>("topSidebarHH");
|
||||
QVERIFY(topSidebarHH);
|
||||
QQuickHoverHandler *buttonHH = button->findChild<QQuickHoverHandler *>("buttonHH");
|
||||
QVERIFY(buttonHH);
|
||||
|
||||
QPoint buttonCenter(button->mapToScene(QPointF(button->width() / 2, button->height() / 2)).toPoint());
|
||||
QPoint rightOfButton(button->mapToScene(QPointF(button->width() + 2, button->height() / 2)).toPoint());
|
||||
QPoint outOfSidebar(topSidebar->mapToScene(QPointF(topSidebar->width() + 2, topSidebar->height() / 2)).toPoint());
|
||||
QSignalSpy sidebarHoveredSpy(topSidebarHH, SIGNAL(hoveredChanged()));
|
||||
QSignalSpy buttonHoveredSpy(buttonHH, SIGNAL(hoveredChanged()));
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(topSidebarHH->isHovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 0);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, buttonCenter);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonHH->isHovered(), true);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 1);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(topSidebarHH->isHovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 2);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
}
|
||||
|
||||
void tst_HoverHandler::mouseAreaAndUnderlyingHoverHandler()
|
||||
{
|
||||
QScopedPointer<QQuickView> windowPtr;
|
||||
createView(windowPtr, "lesHoverables.qml");
|
||||
QQuickView * window = windowPtr.data();
|
||||
QQuickItem * topSidebar = window->rootObject()->findChild<QQuickItem *>("topSidebar");
|
||||
QVERIFY(topSidebar);
|
||||
QQuickMouseArea * buttonMA = topSidebar->findChild<QQuickMouseArea *>("buttonMA");
|
||||
QVERIFY(buttonMA);
|
||||
QQuickHoverHandler *topSidebarHH = topSidebar->findChild<QQuickHoverHandler *>("topSidebarHH");
|
||||
QVERIFY(topSidebarHH);
|
||||
|
||||
QPoint buttonCenter(buttonMA->mapToScene(QPointF(buttonMA->width() / 2, buttonMA->height() / 2)).toPoint());
|
||||
QPoint rightOfButton(buttonMA->mapToScene(QPointF(buttonMA->width() + 2, buttonMA->height() / 2)).toPoint());
|
||||
QPoint outOfSidebar(topSidebar->mapToScene(QPointF(topSidebar->width() + 2, topSidebar->height() / 2)).toPoint());
|
||||
QSignalSpy sidebarHoveredSpy(topSidebarHH, SIGNAL(hoveredChanged()));
|
||||
QSignalSpy buttonHoveredSpy(buttonMA, SIGNAL(hoveredChanged()));
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(topSidebarHH->isHovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 0);
|
||||
QCOMPARE(buttonMA->hovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonMA->hovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, buttonCenter);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonMA->hovered(), true);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 1);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(topSidebarHH->isHovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonMA->hovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(topSidebarHH->isHovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 2);
|
||||
QCOMPARE(buttonMA->hovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
}
|
||||
|
||||
void tst_HoverHandler::hoverHandlerAndUnderlyingMouseArea()
|
||||
{
|
||||
QScopedPointer<QQuickView> windowPtr;
|
||||
createView(windowPtr, "lesHoverables.qml");
|
||||
QQuickView * window = windowPtr.data();
|
||||
QQuickItem * bottomSidebar = window->rootObject()->findChild<QQuickItem *>("bottomSidebar");
|
||||
QVERIFY(bottomSidebar);
|
||||
QQuickMouseArea *bottomSidebarMA = bottomSidebar->findChild<QQuickMouseArea *>("bottomSidebarMA");
|
||||
QVERIFY(bottomSidebarMA);
|
||||
QQuickItem * button = bottomSidebar->findChild<QQuickItem *>("buttonWithHH");
|
||||
QVERIFY(button);
|
||||
QQuickHoverHandler *buttonHH = button->findChild<QQuickHoverHandler *>("buttonHH");
|
||||
QVERIFY(buttonHH);
|
||||
|
||||
QPoint buttonCenter(button->mapToScene(QPointF(button->width() / 2, button->height() / 2)).toPoint());
|
||||
QPoint rightOfButton(button->mapToScene(QPointF(button->width() + 2, button->height() / 2)).toPoint());
|
||||
QPoint outOfSidebar(bottomSidebar->mapToScene(QPointF(bottomSidebar->width() + 2, bottomSidebar->height() / 2)).toPoint());
|
||||
QSignalSpy sidebarHoveredSpy(bottomSidebarMA, SIGNAL(hoveredChanged()));
|
||||
QSignalSpy buttonHoveredSpy(buttonHH, SIGNAL(hoveredChanged()));
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(bottomSidebarMA->hovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 0);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(bottomSidebarMA->hovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 1);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 0);
|
||||
|
||||
QTest::mouseMove(window, buttonCenter);
|
||||
QCOMPARE(bottomSidebarMA->hovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 2);
|
||||
QCOMPARE(buttonHH->isHovered(), true);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 1);
|
||||
|
||||
QTest::mouseMove(window, rightOfButton);
|
||||
QCOMPARE(bottomSidebarMA->hovered(), true);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 3);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
|
||||
QTest::mouseMove(window, outOfSidebar);
|
||||
QCOMPARE(bottomSidebarMA->hovered(), false);
|
||||
QCOMPARE(sidebarHoveredSpy.count(), 4);
|
||||
QCOMPARE(buttonHH->isHovered(), false);
|
||||
QCOMPARE(buttonHoveredSpy.count(), 2);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_HoverHandler)
|
||||
|
||||
#include "tst_qquickhoverhandler.moc"
|
Loading…
Reference in New Issue