Fixed QML Item updates after reparenting.
authorKim Motoyoshi Kalland <kim.kalland@nokia.com>
Wed, 8 Feb 2012 11:31:17 +0000 (12:31 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 13 Feb 2012 12:13:50 +0000 (13:13 +0100)
Setting an Item's parent to null caused its scene graph nodes to
be deleted, but resetting the parent to a valid object did not
recreate and update all the nodes.

Task-number: QTBUG-21032
Change-Id: I00f93a481a326ba9b9fb98bf4212479622552783
Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
src/quick/items/qquickcanvas.cpp

index cb60a23..53ff4fd 100644 (file)
@@ -1629,9 +1629,9 @@ void QQuickCanvasPrivate::updateDirtyNode(QQuickItem *item)
         itemPriv->itemNode()->setMatrix(matrix);
     }
 
-    bool clipEffectivelyChanged = dirty & QQuickItemPrivate::Clip &&
+    bool clipEffectivelyChanged = (dirty & (QQuickItemPrivate::Clip | QQuickItemPrivate::Canvas)) &&
                                   ((item->clip() == false) != (itemPriv->clipNode == 0));
-    bool effectRefEffectivelyChanged = dirty & QQuickItemPrivate::EffectReference &&
+    bool effectRefEffectivelyChanged = (dirty & (QQuickItemPrivate::EffectReference | QQuickItemPrivate::Canvas)) &&
                                   ((itemPriv->effectRefCount == 0) != (itemPriv->rootNode == 0));
 
     if (clipEffectivelyChanged) {
@@ -1731,7 +1731,9 @@ void QQuickCanvasPrivate::updateDirtyNode(QQuickItem *item)
         itemPriv->clipNode->update();
     }
 
-    if (dirty & (QQuickItemPrivate::OpacityValue | QQuickItemPrivate::Visible | QQuickItemPrivate::HideReference)) {
+    if (dirty & (QQuickItemPrivate::OpacityValue | QQuickItemPrivate::Visible
+                 | QQuickItemPrivate::HideReference | QQuickItemPrivate::Canvas))
+    {
         qreal opacity = itemPriv->explicitVisible && itemPriv->hideRefCount == 0
                       ? itemPriv->opacity : qreal(0);
 
@@ -1777,7 +1779,7 @@ void QQuickCanvasPrivate::updateDirtyNode(QQuickItem *item)
         }
     }
 
-    if ((dirty & QQuickItemPrivate::PerformanceHints) && itemPriv->groupNode) {
+    if ((dirty & (QQuickItemPrivate::PerformanceHints | QQuickItemPrivate::Canvas)) && itemPriv->groupNode) {
         itemPriv->groupNode->setFlag(QSGNode::ChildrenDoNotOverlap, itemPriv->childrenDoNotOverlap);
         itemPriv->groupNode->setFlag(QSGNode::StaticSubtreeGeometry, itemPriv->staticSubtreeGeometry);
     }