Ensure visibility changes are communicated through itemChange.
authorMichael Brasser <michael.brasser@nokia.com>
Wed, 15 Feb 2012 06:27:36 +0000 (16:27 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 16 Feb 2012 07:31:13 +0000 (08:31 +0100)
Also added MouseArea test that depends on this functionality.

Change-Id: I1c303504ffd63d6b9dbdf95ab63e8426dc09c02d
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/quick/items/qquickitem.cpp
src/quick/items/qquickitem.h
tests/auto/qtquick2/qquickmousearea/data/hoverVisible.qml [new file with mode: 0644]
tests/auto/qtquick2/qquickmousearea/tst_qquickmousearea.cpp

index 67da4c8..c5d55cf 100644 (file)
@@ -4009,11 +4009,7 @@ bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible)
     for (int ii = 0; ii < childItems.count(); ++ii)
         childVisibilityChanged |= QQuickItemPrivate::get(childItems.at(ii))->setEffectiveVisibleRecur(newEffectiveVisible);
 
-    for (int ii = 0; ii < changeListeners.count(); ++ii) {
-        const QQuickItemPrivate::ChangeListener &change = changeListeners.at(ii);
-        if (change.types & QQuickItemPrivate::Visibility)
-            change.listener->itemVisibilityChanged(q);
-    }
+    itemChange(QQuickItem::ItemVisibleHasChanged, effectiveVisible);
 
     if (isAccessible)
         QAccessible::updateAccessibility(QAccessibleEvent(effectiveVisible ? QAccessible::ObjectShow : QAccessible::ObjectHide, q, 0));
index 91771c8..16a6074 100644 (file)
@@ -168,7 +168,7 @@ public:
         ItemChildAddedChange,      // value.item
         ItemChildRemovedChange,    // value.item
         ItemSceneChange,           // value.canvas
-        ItemVisibleHasChanged,     // value.realValue
+        ItemVisibleHasChanged,     // value.boolValue
         ItemParentHasChanged,      // value.item
         ItemOpacityHasChanged,     // value.realValue
         ItemActiveFocusHasChanged, // value.boolValue
diff --git a/tests/auto/qtquick2/qquickmousearea/data/hoverVisible.qml b/tests/auto/qtquick2/qquickmousearea/data/hoverVisible.qml
new file mode 100644 (file)
index 0000000..2d65b55
--- /dev/null
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 400; height: 400;
+
+    Rectangle {
+        width: 100; height: 100;
+        MouseArea {
+            id: mousetracker; objectName: "mousetracker"
+            anchors.fill: parent
+            visible: false
+            hoverEnabled: true
+        }
+    }
+}
index 1520dd5..66f6513 100644 (file)
@@ -71,6 +71,7 @@ private slots:
     void clickThrough();
     void hoverPosition();
     void hoverPropagation();
+    void hoverVisible();
 
 private:
     QQuickView *createView();
@@ -771,6 +772,35 @@ void tst_QQuickMouseArea::hoverPropagation()
     delete canvas;
 }
 
+void tst_QQuickMouseArea::hoverVisible()
+{
+    QQuickView *canvas = createView();
+    canvas->setSource(testFileUrl("hoverVisible.qml"));
+
+    QQuickItem *root = canvas->rootObject();
+    QVERIFY(root != 0);
+
+    QQuickMouseArea *mouseTracker = canvas->rootObject()->findChild<QQuickMouseArea*>("mousetracker");
+    QVERIFY(mouseTracker != 0);
+
+    QSignalSpy enteredSpy(mouseTracker, SIGNAL(entered()));
+
+    QTest::mouseMove(canvas,QPoint(10,32));
+
+    QCOMPARE(mouseTracker->hovered(), false);
+    QCOMPARE(enteredSpy.count(), 0);
+
+    mouseTracker->setVisible(true);
+
+    QCOMPARE(mouseTracker->hovered(), true);
+    QCOMPARE(enteredSpy.count(), 1);
+
+    QEXPECT_FAIL("", "QTBUG-24282", Continue);
+    QCOMPARE(QPointF(mouseTracker->mouseX(), mouseTracker->mouseY()), QPointF(10,32));
+
+    delete canvas;
+}
+
 QTEST_MAIN(tst_QQuickMouseArea)
 
 #include "tst_qquickmousearea.moc"