Do not deliver hover events when item is not visible
authorCaio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Mon, 29 Aug 2011 13:11:31 +0000 (10:11 -0300)
committerQt by Nokia <qt-info@nokia.com>
Wed, 31 Aug 2011 01:25:28 +0000 (03:25 +0200)
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 <qt_sanity_bot@ovi.com>
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>

src/declarative/items/qsgcanvas.cpp
tests/auto/declarative/qsgitem/tst_qsgitem.cpp

index 23b2b43..845617c 100644 (file)
@@ -1238,7 +1238,7 @@ bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, const QPointF &scenePos,
     QList<QSGItem *> 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;
index 5c3b9db..05e59a6 100644 (file)
@@ -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<bool>("visible");
+    QTest::addColumn<bool>("enabled");
+    QTest::addColumn<bool>("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();