Don't override "z" bindings for header and footer
authorBea Lam <bea.lam@nokia.com>
Fri, 25 May 2012 07:33:02 +0000 (17:33 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 28 May 2012 00:39:10 +0000 (02:39 +0200)
Headers and footers are given a default z value. This value
should be set between Component beginCreate() and completeCreate()
to avoid overwriting any binding in the header or footer item
that has already set the 'z' value.

Change-Id: I8e3ee97232d99500a32f2d77d2b663016eb404f7
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickgridview.cpp
src/quick/items/qquickitemview.cpp
src/quick/items/qquickitemview_p_p.h
src/quick/items/qquicklistview.cpp
tests/auto/quick/qquickgridview/data/initialZValues.qml [new file with mode: 0644]
tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
tests/auto/quick/qquicklistview/data/initialZValues.qml [new file with mode: 0644]
tests/auto/quick/qquicklistview/tst_qquicklistview.cpp

index d7fa0ed..61bd202 100644 (file)
@@ -817,10 +817,9 @@ void QQuickGridViewPrivate::updateFooter()
     Q_Q(QQuickGridView);
     bool created = false;
     if (!footer) {
-        QQuickItem *item = createComponentItem(footerComponent);
+        QQuickItem *item = createComponentItem(footerComponent, 1.0);
         if (!item)
             return;
-        item->setZ(1);
         footer = new FxGridItemSG(item, q, true, true);
         created = true;
     }
@@ -862,10 +861,9 @@ void QQuickGridViewPrivate::updateHeader()
     Q_Q(QQuickGridView);
     bool created = false;
     if (!header) {
-        QQuickItem *item = createComponentItem(headerComponent);
+        QQuickItem *item = createComponentItem(headerComponent, 1.0);
         if (!item)
             return;
-        item->setZ(1);
         header = new FxGridItemSG(item, q, true, true);
         created = true;
     }
index bab505e..88a8a30 100644 (file)
@@ -2260,10 +2260,10 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item)
 
 QQuickItem *QQuickItemViewPrivate::createHighlightItem()
 {
-    return createComponentItem(highlightComponent, true);
+    return createComponentItem(highlightComponent, 0.0, true);
 }
 
-QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component, bool createDefault)
+QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault)
 {
     Q_Q(QQuickItemView);
 
@@ -2272,7 +2272,7 @@ QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component,
         QQmlContext *creationContext = component->creationContext();
         QQmlContext *context = new QQmlContext(
                 creationContext ? creationContext : qmlContext(q));
-        QObject *nobj = component->create(context);
+        QObject *nobj = component->beginCreate(context);
         if (nobj) {
             QQml_setParent_noEvent(context, nobj);
             item = qobject_cast<QQuickItem *>(nobj);
@@ -2285,9 +2285,12 @@ QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component,
         item = new QQuickItem;
     }
     if (item) {
+        item->setZ(zValue);
         QQml_setParent_noEvent(item, q->contentItem());
         item->setParentItem(q->contentItem());
     }
+    if (component)
+        component->completeCreate();
     return item;
 }
 
index 5f28ac7..c235945 100644 (file)
@@ -196,7 +196,7 @@ public:
     virtual bool releaseItem(FxViewItem *item);
 
     QQuickItem *createHighlightItem();
-    QQuickItem *createComponentItem(QQmlComponent *component, bool createDefault = false);
+    QQuickItem *createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault = false);
 
     void updateCurrent(int modelIndex);
     void updateTrackedItem();
index 09abd63..864c639 100644 (file)
@@ -1272,10 +1272,9 @@ void QQuickListViewPrivate::updateFooter()
     Q_Q(QQuickListView);
     bool created = false;
     if (!footer) {
-        QQuickItem *item = createComponentItem(footerComponent);
+        QQuickItem *item = createComponentItem(footerComponent, 1.0);
         if (!item)
             return;
-        item->setZ(1);
         footer = new FxListItemSG(item, q, true, true);
         created = true;
     }
@@ -1303,10 +1302,9 @@ void QQuickListViewPrivate::updateHeader()
     Q_Q(QQuickListView);
     bool created = false;
     if (!header) {
-        QQuickItem *item = createComponentItem(headerComponent);
+        QQuickItem *item = createComponentItem(headerComponent, 1.0);
         if (!item)
             return;
-        item->setZ(1);
         header = new FxListItemSG(item, q, true, true);
         created = true;
     }
diff --git a/tests/auto/quick/qquickgridview/data/initialZValues.qml b/tests/auto/quick/qquickgridview/data/initialZValues.qml
new file mode 100644 (file)
index 0000000..9768b2c
--- /dev/null
@@ -0,0 +1,35 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+
+    GridView {
+        id: grid
+
+        property real initialZ: 342
+
+        anchors.fill: parent
+        objectName: "grid"
+        model: ListModel {}
+
+        delegate: Text {
+            objectName: "wrapper"
+            font.pointSize: 20
+            text: index
+        }
+
+        header: Rectangle {
+            width: 240
+            height: 30
+            z: grid.initialZ
+        }
+
+        footer: Rectangle {
+            width: 240
+            height: 30
+            z: grid.initialZ
+        }
+    }
+}
+
index 8dc7fda..828a102 100644 (file)
@@ -118,6 +118,7 @@ private slots:
     void manualHighlight();
     void footer();
     void footer_data();
+    void initialZValues();
     void header();
     void header_data();
     void extents();
@@ -3265,6 +3266,26 @@ void tst_QQuickGridView::footer_data()
         << QPointF(-(6 * 80) - 40, -320);
 }
 
+void tst_QQuickGridView::initialZValues()
+{
+    QQuickView *canvas = createView();
+    canvas->setSource(testFileUrl("initialZValues.qml"));
+    qApp->processEvents();
+
+    QQuickGridView *gridview = findItem<QQuickGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+    QQuickItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QVERIFY(gridview->headerItem());
+    QTRY_COMPARE(gridview->headerItem()->z(), gridview->property("initialZ").toReal());
+
+    QVERIFY(gridview->footerItem());
+    QTRY_COMPARE(gridview->footerItem()->z(), gridview->property("initialZ").toReal());
+
+    delete canvas;
+}
+
 void tst_QQuickGridView::header()
 {
     QFETCH(QQuickGridView::Flow, flow);
diff --git a/tests/auto/quick/qquicklistview/data/initialZValues.qml b/tests/auto/quick/qquicklistview/data/initialZValues.qml
new file mode 100644 (file)
index 0000000..3a8e78d
--- /dev/null
@@ -0,0 +1,35 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 240
+    height: 320
+
+    ListView {
+        id: list
+
+        property real initialZ: 342
+
+        anchors.fill: parent
+        objectName: "list"
+        model: ListModel {}
+
+        delegate: Text {
+            objectName: "wrapper"
+            font.pointSize: 20
+            text: index
+        }
+
+        header: Rectangle {
+            width: 240
+            height: 30
+            z: list.initialZ
+        }
+
+        footer: Rectangle {
+            width: 240
+            height: 30
+            z: list.initialZ
+        }
+    }
+}
+
index 4652051..f24f91c 100644 (file)
@@ -149,6 +149,7 @@ private slots:
     void componentChanges();
     void modelChanges();
     void manualHighlight();
+    void initialZValues();
     void header();
     void header_data();
     void header_delayItemCreation();
@@ -3218,6 +3219,26 @@ void tst_QQuickListView::QTBUG_11105()
     delete testObject;
 }
 
+void tst_QQuickListView::initialZValues()
+{
+    QQuickView *canvas = createView();
+    canvas->setSource(testFileUrl("initialZValues.qml"));
+    qApp->processEvents();
+
+    QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+    QQuickItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QVERIFY(listview->headerItem());
+    QTRY_COMPARE(listview->headerItem()->z(), listview->property("initialZ").toReal());
+
+    QVERIFY(listview->footerItem());
+    QTRY_COMPARE(listview->footerItem()->z(), listview->property("initialZ").toReal());
+
+    delete canvas;
+}
+
 void tst_QQuickListView::header()
 {
     QFETCH(QQuickListView::Orientation, orientation);