From 1646db78918f740c5e5a7e487914f56d732f4a17 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Mon, 29 Aug 2011 10:11:31 -0300 Subject: [PATCH] Do not deliver hover events when item is not visible This patch change the code to also skip invisible items (it was done for disabled already) when deciding whether or not deliver the hover events to an item. The rationale here is to follow the same rule as the other mouse events. Change-Id: If0fe6d64d1f7cfb8679ce11edda7c02dc3783f9b Reviewed-on: http://codereview.qt.nokia.com/3861 Reviewed-by: Qt Sanity Bot Reviewed-by: Alan Alpert --- src/declarative/items/qsgcanvas.cpp | 2 +- tests/auto/declarative/qsgitem/tst_qsgitem.cpp | 64 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp index 23b2b43..845617c 100644 --- a/src/declarative/items/qsgcanvas.cpp +++ b/src/declarative/items/qsgcanvas.cpp @@ -1238,7 +1238,7 @@ bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, const QPointF &scenePos, QList children = itemPrivate->paintOrderChildItems(); for (int ii = children.count() - 1; ii >= 0; --ii) { QSGItem *child = children.at(ii); - if (!child->isEnabled()) + if (!child->isVisible() || !child->isEnabled()) continue; if (deliverHoverEvent(child, scenePos, lastScenePos, modifiers, accepted)) return true; diff --git a/tests/auto/declarative/qsgitem/tst_qsgitem.cpp b/tests/auto/declarative/qsgitem/tst_qsgitem.cpp index 5c3b9db..05e59a6 100644 --- a/tests/auto/declarative/qsgitem/tst_qsgitem.cpp +++ b/tests/auto/declarative/qsgitem/tst_qsgitem.cpp @@ -127,6 +127,8 @@ private slots: void wheelEvent_data(); void wheelEvent(); + void hoverEvent_data(); + void hoverEvent(); void hoverEventInParent(); private: @@ -925,6 +927,23 @@ protected: } }; +void tst_qsgitem::hoverEvent_data() +{ + QTest::addColumn("visible"); + QTest::addColumn("enabled"); + QTest::addColumn("acceptHoverEvents"); + + QTest::newRow("visible, enabled, accept hover") << true << true << true; + QTest::newRow("visible, disabled, accept hover") << true << false << true; + QTest::newRow("invisible, enabled, accept hover") << false << true << true; + QTest::newRow("invisible, disabled, accept hover") << false << false << true; + + QTest::newRow("visible, enabled, not accept hover") << true << true << false; + QTest::newRow("visible, disabled, not accept hover") << true << false << false; + QTest::newRow("invisible, enabled, not accept hover") << false << true << false; + QTest::newRow("invisible, disabled, not accept hover") << false << false << false; +} + // ### For some unknown reason QTest::mouseMove() isn't working correctly. static void sendMouseMove(QObject *object, const QPoint &position) { @@ -932,6 +951,51 @@ static void sendMouseMove(QObject *object, const QPoint &position) QApplication::sendEvent(object, &moveEvent); } +void tst_qsgitem::hoverEvent() +{ + QFETCH(bool, visible); + QFETCH(bool, enabled); + QFETCH(bool, acceptHoverEvents); + + QSGCanvas *canvas = new QSGCanvas(); + canvas->resize(200, 200); + canvas->show(); + + HoverItem *item = new HoverItem; + item->setSize(QSizeF(100, 100)); + item->setParentItem(canvas->rootItem()); + + item->setEnabled(enabled); + item->setVisible(visible); + item->setAcceptHoverEvents(acceptHoverEvents); + + const QPoint outside(150, 150); + const QPoint inside(50, 50); + const QPoint anotherInside(51, 51); + + sendMouseMove(canvas, outside); + item->resetCounters(); + + // Enter, then move twice inside, then leave. + sendMouseMove(canvas, inside); + sendMouseMove(canvas, anotherInside); + sendMouseMove(canvas, inside); + sendMouseMove(canvas, outside); + + const bool shouldReceiveHoverEvents = visible && enabled && acceptHoverEvents; + if (shouldReceiveHoverEvents) { + QCOMPARE(item->hoverEnterCount, 1); + QCOMPARE(item->hoverMoveCount, 2); + QCOMPARE(item->hoverLeaveCount, 1); + } else { + QCOMPARE(item->hoverEnterCount, 0); + QCOMPARE(item->hoverMoveCount, 0); + QCOMPARE(item->hoverLeaveCount, 0); + } + + delete canvas; +} + void tst_qsgitem::hoverEventInParent() { QSGCanvas *canvas = new QSGCanvas(); -- 2.7.4