Add headerItem and footerItem properties to views.
authorMartin Jones <martin.jones@nokia.com>
Tue, 26 Jul 2011 05:33:58 +0000 (15:33 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 26 Jul 2011 07:37:52 +0000 (09:37 +0200)
Fixes: QTBUG-19684

Change-Id: Iea7d4a4f902cc45cb0cca8e1221fdb993f0bebd2
Reviewed-on: http://codereview.qt.nokia.com/2151
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Bea Lam <bea.lam@nokia.com>
src/declarative/items/qsggridview.cpp
src/declarative/items/qsgitemview.cpp
src/declarative/items/qsgitemview_p.h
src/declarative/items/qsglistview.cpp
tests/auto/declarative/qsggridview/tst_qsggridview.cpp
tests/auto/declarative/qsglistview/tst_qsglistview.cpp

index 8d91a41..307aeae 100644 (file)
@@ -641,13 +641,14 @@ qreal QSGGridViewPrivate::footerSize() const
 void QSGGridViewPrivate::updateFooter()
 {
     Q_Q(QSGGridView);
-
+    bool created = false;
     if (!footer) {
         QSGItem *item = createComponentItem(footerComponent, true);
         if (!item)
             return;
         item->setZ(1);
         footer = new FxGridItemSG(item, q, true);
+        created = true;
     }
 
     FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(footer);
@@ -671,18 +672,22 @@ void QSGGridViewPrivate::updateFooter()
     } else {
         gridItem->setPosition(colOffset, rowOffset);
     }
+
+    if (created)
+        emit q->footerItemChanged();
 }
 
 void QSGGridViewPrivate::updateHeader()
 {
     Q_Q(QSGGridView);
-
+    bool created = false;
     if (!header) {
         QSGItem *item = createComponentItem(headerComponent, true);
         if (!item)
             return;
         item->setZ(1);
         header = new FxGridItemSG(item, q, true);
+        created = true;
     }
 
     FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(header);
@@ -710,6 +715,9 @@ void QSGGridViewPrivate::updateHeader()
         else
             gridItem->setPosition(colOffset, -headerSize());
     }
+
+    if (created)
+        emit q->headerItemChanged();
 }
 
 void QSGGridViewPrivate::initializeCurrentItem()
index df8de86..a9550e8 100644 (file)
@@ -309,6 +309,12 @@ QDeclarativeComponent *QSGItemView::header() const
     return d->headerComponent;
 }
 
+QSGItem *QSGItemView::headerItem() const
+{
+    Q_D(const QSGItemView);
+    return d->header ? d->header->item : 0;
+}
+
 void QSGItemView::setHeader(QDeclarativeComponent *headerComponent)
 {
     Q_D(QSGItemView);
@@ -325,6 +331,8 @@ void QSGItemView::setHeader(QDeclarativeComponent *headerComponent)
             d->updateFooter();
             d->updateViewport();
             d->fixupPosition();
+        } else {
+            emit headerItemChanged();
         }
         emit headerChanged();
     }
@@ -336,6 +344,12 @@ QDeclarativeComponent *QSGItemView::footer() const
     return d->footerComponent;
 }
 
+QSGItem *QSGItemView::footerItem() const
+{
+    Q_D(const QSGItemView);
+    return d->footer ? d->footer->item : 0;
+}
+
 void QSGItemView::setFooter(QDeclarativeComponent *footerComponent)
 {
     Q_D(QSGItemView);
@@ -348,6 +362,8 @@ void QSGItemView::setFooter(QDeclarativeComponent *footerComponent)
             d->updateFooter();
             d->updateViewport();
             d->fixupPosition();
+        } else {
+            emit footerItemChanged();
         }
         emit footerChanged();
     }
index fb95e4f..4c5b91f 100644 (file)
@@ -71,7 +71,9 @@ class Q_AUTOTEST_EXPORT QSGItemView : public QSGFlickable
     Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
 
     Q_PROPERTY(QDeclarativeComponent *header READ header WRITE setHeader NOTIFY headerChanged)
+    Q_PROPERTY(QSGItem *headerItem READ headerItem NOTIFY headerItemChanged)
     Q_PROPERTY(QDeclarativeComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
+    Q_PROPERTY(QSGItem *footerItem READ footerItem NOTIFY footerItemChanged)
 
     Q_PROPERTY(QDeclarativeComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
     Q_PROPERTY(QSGItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
@@ -113,9 +115,11 @@ public:
 
     QDeclarativeComponent *footer() const;
     void setFooter(QDeclarativeComponent *);
+    QSGItem *footerItem() const;
 
     QDeclarativeComponent *header() const;
     void setHeader(QDeclarativeComponent *);
+    QSGItem *headerItem() const;
 
     QDeclarativeComponent *highlight() const;
     void setHighlight(QDeclarativeComponent *);
@@ -164,6 +168,8 @@ signals:
 
     void headerChanged();
     void footerChanged();
+    void headerItemChanged();
+    void footerItemChanged();
 
     void highlightChanged();
     void highlightItemChanged();
index 4502dc8..fa42602 100644 (file)
@@ -917,13 +917,14 @@ qreal QSGListViewPrivate::footerSize() const
 void QSGListViewPrivate::updateFooter()
 {
     Q_Q(QSGListView);
-
+    bool created = false;
     if (!footer) {
         QSGItem *item = createComponentItem(footerComponent, true);
         if (!item)
             return;
         item->setZ(1);
         footer = new FxListItemSG(item, q, true);
+        created = true;
     }
 
     FxListItemSG *listItem = static_cast<FxListItemSG*>(footer);
@@ -939,17 +940,22 @@ void QSGListViewPrivate::updateFooter()
     } else {
         listItem->setPosition(visiblePos);
     }
+
+    if (created)
+        emit q->footerItemChanged();
 }
 
 void QSGListViewPrivate::updateHeader()
 {
     Q_Q(QSGListView);
+    bool created = false;
     if (!header) {
         QSGItem *item = createComponentItem(headerComponent, true);
         if (!item)
             return;
         item->setZ(1);
         header = new FxListItemSG(item, q, true);
+        created = true;
     }
 
     FxListItemSG *listItem = static_cast<FxListItemSG*>(header);
@@ -966,6 +972,9 @@ void QSGListViewPrivate::updateHeader()
             listItem->setPosition(-headerSize());
         }
     }
+
+    if (created)
+        emit q->headerItemChanged();
 }
 
 void QSGListViewPrivate::itemGeometryChanged(QSGItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
index 3929c71..d8b084a 100644 (file)
@@ -1865,6 +1865,8 @@ void tst_QSGGridView::footer()
     QSGText *footer = findItem<QSGText>(contentItem, "footer");
     QVERIFY(footer);
 
+    QVERIFY(footer == gridview->footerItem());
+
     QCOMPARE(footer->pos(), initialFooterPos);
     QCOMPARE(footer->width(), 100.);
     QCOMPARE(footer->height(), 30.);
@@ -1905,13 +1907,19 @@ void tst_QSGGridView::footer()
     // add 30 items
     for (int i = 0; i < 30; i++)
         model.addItem("Item" + QString::number(i), "");
+
+    QSignalSpy footerItemSpy(gridview, SIGNAL(footerItemChanged()));
     QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
 
+    QCOMPARE(footerItemSpy.count(), 1);
+
     footer = findItem<QSGText>(contentItem, "footer");
     QVERIFY(!footer);
     footer = findItem<QSGText>(contentItem, "footer2");
     QVERIFY(footer);
 
+    QVERIFY(footer == gridview->footerItem());
+
     QCOMPARE(footer->pos(), changedFooterPos);
     QCOMPARE(footer->width(), 50.);
     QCOMPARE(footer->height(), 20.);
@@ -2005,6 +2013,8 @@ void tst_QSGGridView::header()
     QSGText *header = findItem<QSGText>(contentItem, "header");
     QVERIFY(header);
 
+    QVERIFY(header == gridview->headerItem());
+
     QCOMPARE(header->pos(), initialHeaderPos);
     QCOMPARE(header->width(), 100.);
     QCOMPARE(header->height(), 30.);
@@ -2020,13 +2030,18 @@ void tst_QSGGridView::header()
     for (int i = 0; i < 30; i++)
         model.addItem("Item" + QString::number(i), "");
 
+    QSignalSpy headerItemSpy(gridview, SIGNAL(headerItemChanged()));
     QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
 
+    QCOMPARE(headerItemSpy.count(), 1);
+
     header = findItem<QSGText>(contentItem, "header");
     QVERIFY(!header);
     header = findItem<QSGText>(contentItem, "header2");
     QVERIFY(header);
 
+    QVERIFY(header == gridview->headerItem());
+
     QCOMPARE(header->pos(), changedHeaderPos);
     QCOMPARE(header->width(), 50.);
     QCOMPARE(header->height(), 20.);
index 75b68e4..4d6920c 100644 (file)
@@ -1930,6 +1930,8 @@ void tst_QSGListView::header()
     QSGText *header = findItem<QSGText>(contentItem, "header");
     QVERIFY(header);
 
+    QVERIFY(header == listview->headerItem());
+
     QCOMPARE(header->width(), 100.);
     QCOMPARE(header->height(), 30.);
     QCOMPARE(header->pos(), initialHeaderPos);
@@ -1945,13 +1947,18 @@ void tst_QSGListView::header()
     for (int i = 0; i < 30; i++)
         model.addItem("Item" + QString::number(i), "");
 
+    QSignalSpy headerItemSpy(listview, SIGNAL(headerItemChanged()));
     QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader");
 
+    QCOMPARE(headerItemSpy.count(), 1);
+
     header = findItem<QSGText>(contentItem, "header");
     QVERIFY(!header);
     header = findItem<QSGText>(contentItem, "header2");
     QVERIFY(header);
 
+    QVERIFY(header == listview->headerItem());
+
     QCOMPARE(header->pos(), changedHeaderPos);
     QCOMPARE(header->width(), 50.);
     QCOMPARE(header->height(), 20.);
@@ -2070,6 +2077,8 @@ void tst_QSGListView::footer()
     QSGText *footer = findItem<QSGText>(contentItem, "footer");
     QVERIFY(footer);
 
+    QVERIFY(footer == listview->footerItem());
+
     QCOMPARE(footer->pos(), initialFooterPos);
     QCOMPARE(footer->width(), 100.);
     QCOMPARE(footer->height(), 30.);
@@ -2106,13 +2115,18 @@ void tst_QSGListView::footer()
     for (int i = 0; i < 30; i++)
         model.addItem("Item" + QString::number(i), "");
 
+    QSignalSpy footerItemSpy(listview, SIGNAL(footerItemChanged()));
     QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter");
 
+    QCOMPARE(footerItemSpy.count(), 1);
+
     footer = findItem<QSGText>(contentItem, "footer");
     QVERIFY(!footer);
     footer = findItem<QSGText>(contentItem, "footer2");
     QVERIFY(footer);
 
+    QVERIFY(footer == listview->footerItem());
+
     QCOMPARE(footer->pos(), changedFooterPos);
     QCOMPARE(footer->width(), 50.);
     QCOMPARE(footer->height(), 20.);