diff options
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); |