From a380768b135c16d3621ec0be8e1bbe410cd7ed47 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Tue, 26 Jul 2011 15:33:58 +1000 Subject: [PATCH] Add headerItem and footerItem properties to views. Fixes: QTBUG-19684 Change-Id: Iea7d4a4f902cc45cb0cca8e1221fdb993f0bebd2 Reviewed-on: http://codereview.qt.nokia.com/2151 Reviewed-by: Qt Sanity Bot Reviewed-by: Bea Lam --- src/declarative/items/qsggridview.cpp | 12 ++++++++++-- src/declarative/items/qsgitemview.cpp | 16 ++++++++++++++++ src/declarative/items/qsgitemview_p.h | 6 ++++++ src/declarative/items/qsglistview.cpp | 11 ++++++++++- tests/auto/declarative/qsggridview/tst_qsggridview.cpp | 15 +++++++++++++++ tests/auto/declarative/qsglistview/tst_qsglistview.cpp | 14 ++++++++++++++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/declarative/items/qsggridview.cpp b/src/declarative/items/qsggridview.cpp index 8d91a41..307aeae 100644 --- a/src/declarative/items/qsggridview.cpp +++ b/src/declarative/items/qsggridview.cpp @@ -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(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(header); @@ -710,6 +715,9 @@ void QSGGridViewPrivate::updateHeader() else gridItem->setPosition(colOffset, -headerSize()); } + + if (created) + emit q->headerItemChanged(); } void QSGGridViewPrivate::initializeCurrentItem() diff --git a/src/declarative/items/qsgitemview.cpp b/src/declarative/items/qsgitemview.cpp index df8de86..a9550e8 100644 --- a/src/declarative/items/qsgitemview.cpp +++ b/src/declarative/items/qsgitemview.cpp @@ -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(); } diff --git a/src/declarative/items/qsgitemview_p.h b/src/declarative/items/qsgitemview_p.h index fb95e4f..4c5b91f 100644 --- a/src/declarative/items/qsgitemview_p.h +++ b/src/declarative/items/qsgitemview_p.h @@ -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(); diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp index 4502dc8..fa42602 100644 --- a/src/declarative/items/qsglistview.cpp +++ b/src/declarative/items/qsglistview.cpp @@ -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(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(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) diff --git a/tests/auto/declarative/qsggridview/tst_qsggridview.cpp b/tests/auto/declarative/qsggridview/tst_qsggridview.cpp index 3929c71..d8b084a 100644 --- a/tests/auto/declarative/qsggridview/tst_qsggridview.cpp +++ b/tests/auto/declarative/qsggridview/tst_qsggridview.cpp @@ -1865,6 +1865,8 @@ void tst_QSGGridView::footer() QSGText *footer = findItem(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(contentItem, "footer"); QVERIFY(!footer); footer = findItem(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(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(contentItem, "header"); QVERIFY(!header); header = findItem(contentItem, "header2"); QVERIFY(header); + QVERIFY(header == gridview->headerItem()); + QCOMPARE(header->pos(), changedHeaderPos); QCOMPARE(header->width(), 50.); QCOMPARE(header->height(), 20.); diff --git a/tests/auto/declarative/qsglistview/tst_qsglistview.cpp b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp index 75b68e4..4d6920c 100644 --- a/tests/auto/declarative/qsglistview/tst_qsglistview.cpp +++ b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp @@ -1930,6 +1930,8 @@ void tst_QSGListView::header() QSGText *header = findItem(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(contentItem, "header"); QVERIFY(!header); header = findItem(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(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(contentItem, "footer"); QVERIFY(!footer); footer = findItem(contentItem, "footer2"); QVERIFY(footer); + QVERIFY(footer == listview->footerItem()); + QCOMPARE(footer->pos(), changedFooterPos); QCOMPARE(footer->width(), 50.); QCOMPARE(footer->height(), 20.); -- 2.7.4