aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2011-08-05 15:48:16 +1000
committerQt by Nokia <qt-info@nokia.com>2011-08-05 09:23:48 +0200
commit5a8de45440ad924e5e787e12e2396ffeed6cce80 (patch)
tree55fa4e649d2a392238d5d415e0b1ca6a923186cf /src
parentab4cac7453c5da79f356bdac4b15d876dde97938 (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.cpp12
-rw-r--r--src/declarative/items/qsgitemview.cpp30
-rw-r--r--src/declarative/items/qsgitemview_p_p.h2
-rw-r--r--src/declarative/items/qsglistview.cpp12
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);