diff options
author | Bea Lam <bea.lam@nokia.com> | 2011-08-05 15:48:16 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-08-05 09:23:48 +0200 |
commit | 5a8de45440ad924e5e787e12e2396ffeed6cce80 (patch) | |
tree | 55fa4e649d2a392238d5d415e0b1ca6a923186cf /src | |
parent | ab4cac7453c5da79f356bdac4b15d876dde97938 (diff) |
Show header/footer if current index is set to first/last item or row
Task-number: QTBUG-17853
Change-Id: I1d679cee31d6ee2a4bb2f2bf90f73eb12898189b
Reviewed-on: http://codereview.qt.nokia.com/2664
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/items/qsggridview.cpp | 12 | ||||
-rw-r--r-- | src/declarative/items/qsgitemview.cpp | 30 | ||||
-rw-r--r-- | src/declarative/items/qsgitemview_p_p.h | 2 | ||||
-rw-r--r-- | src/declarative/items/qsglistview.cpp | 12 |
4 files changed, 49 insertions, 7 deletions
diff --git a/src/declarative/items/qsggridview.cpp b/src/declarative/items/qsggridview.cpp index ac86ebbb7f..c9e02a0601 100644 --- a/src/declarative/items/qsggridview.cpp +++ b/src/declarative/items/qsggridview.cpp @@ -176,6 +176,8 @@ public: virtual qreal headerSize() const; virtual qreal footerSize() const; + virtual bool showHeaderForIndex(int index) const; + virtual bool showFooterForIndex(int index) const; virtual void updateHeader(); virtual void updateFooter(); @@ -638,6 +640,16 @@ qreal QSGGridViewPrivate::footerSize() const return flow == QSGGridView::LeftToRight? footer->item->height() : footer->item->width(); } +bool QSGGridViewPrivate::showHeaderForIndex(int index) const +{ + return index / columns == 0; +} + +bool QSGGridViewPrivate::showFooterForIndex(int index) const +{ + return index / columns == (model->count()-1) / columns; +} + void QSGGridViewPrivate::updateFooter() { Q_Q(QSGGridView); diff --git a/src/declarative/items/qsgitemview.cpp b/src/declarative/items/qsgitemview.cpp index 402bbbf414..bf5d190ebf 100644 --- a/src/declarative/items/qsgitemview.cpp +++ b/src/declarative/items/qsgitemview.cpp @@ -756,16 +756,32 @@ void QSGItemView::trackedPositionChanged() pos = d->startPosition(); } } else { - if (trackedPos < viewPos && d->currentItem->position() < viewPos) { - pos = qMax(trackedPos, d->currentItem->position()); - } else if (d->trackedItem->endPosition() >= viewPos + d->size() - && d->currentItem->endPosition() >= viewPos + d->size()) { - if (d->trackedItem->endPosition() <= d->currentItem->endPosition()) { - pos = d->trackedItem->endPosition() - d->size(); + qreal trackedEndPos = d->trackedItem->endPosition(); + qreal toItemPos = d->currentItem->position(); + qreal toItemEndPos = d->currentItem->endPosition(); + + if (d->header && d->showHeaderForIndex(d->currentIndex)) { + trackedPos -= d->headerSize(); + trackedEndPos -= d->headerSize(); + toItemPos -= d->headerSize(); + toItemEndPos -= d->headerSize(); + } else if (d->footer && d->showFooterForIndex(d->currentIndex)) { + trackedPos += d->footerSize(); + trackedEndPos += d->footerSize(); + toItemPos += d->footerSize(); + toItemEndPos += d->footerSize(); + } + + if (trackedPos < viewPos && toItemPos < viewPos) { + pos = qMax(trackedPos, toItemPos); + } else if (trackedEndPos >= viewPos + d->size() + && toItemEndPos >= viewPos + d->size()) { + if (trackedEndPos <= toItemEndPos) { + pos = trackedEndPos - d->size(); if (trackedSize > d->size()) pos = trackedPos; } else { - pos = d->currentItem->endPosition() - d->size(); + pos = toItemEndPos - d->size(); if (d->currentItem->size() > d->size()) pos = d->currentItem->position(); } diff --git a/src/declarative/items/qsgitemview_p_p.h b/src/declarative/items/qsgitemview_p_p.h index b1ee2e6148..f20f4cca3e 100644 --- a/src/declarative/items/qsgitemview_p_p.h +++ b/src/declarative/items/qsgitemview_p_p.h @@ -177,6 +177,8 @@ protected: virtual qreal headerSize() const = 0; virtual qreal footerSize() const = 0; + virtual bool showHeaderForIndex(int index) const = 0; + virtual bool showFooterForIndex(int index) const = 0; virtual void updateHeader() = 0; virtual void updateFooter() = 0; diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp index c8e8817f95..c3466be4a8 100644 --- a/src/declarative/items/qsglistview.cpp +++ b/src/declarative/items/qsglistview.cpp @@ -223,6 +223,8 @@ public: virtual qreal headerSize() const; virtual qreal footerSize() const; + virtual bool showHeaderForIndex(int index) const; + virtual bool showFooterForIndex(int index) const; virtual void updateHeader(); virtual void updateFooter(); @@ -925,6 +927,16 @@ qreal QSGListViewPrivate::footerSize() const return footer ? footer->size() : 0.0; } +bool QSGListViewPrivate::showHeaderForIndex(int index) const +{ + return index == 0; +} + +bool QSGListViewPrivate::showFooterForIndex(int index) const +{ + return index == model->count()-1; +} + void QSGListViewPrivate::updateFooter() { Q_Q(QSGListView); |