aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2011-07-14 13:55:20 +1000
committerQt by Nokia <qt-info@nokia.com>2011-07-21 06:23:11 +0200
commitc0fc795feb06a8e2f813690e47b2cb981c67546c (patch)
tree6d4b20b85d140bb55599ac55a2c0c37fa4aa0853 /src
parent6b8e98aec3f382fedea704691da40376cbe88e5e (diff)
Always position headers at a negative position
Previously headers were either positioned at 0 if there were no items in the view, or at (0 - headerSize) if items were present. With this fix they are always positioned at (0 - headerSize) to be consistent. Due to the change, setPosition(-headerSize()) is now called from componentCompleted() to ensure the header is visible. This change also fixes GridView's header and footer positioning in TopToBottom + RightToLeft mode. Also added extra tests for header and footer positioning and fixed incorrect test value in tst_QSGGridView::positionViewAtIndex() (was 460 instead of 430 because previously rowPosAt() always added the header size, so if positionViewAtIndex() jumped past all visible items and caused them to be released, the new items started at +headerSize() instead of 0). Change-Id: I1015bed457d4ae964a7fb13702e2dfc470a168a9 Reviewed-on: http://codereview.qt.nokia.com/1618 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.cpp50
-rw-r--r--src/declarative/items/qsgitemview.cpp12
-rw-r--r--src/declarative/items/qsgitemview_p_p.h1
-rw-r--r--src/declarative/items/qsglistview.cpp12
4 files changed, 33 insertions, 42 deletions
diff --git a/src/declarative/items/qsggridview.cpp b/src/declarative/items/qsggridview.cpp
index 24fc70851c..ef660c0533 100644
--- a/src/declarative/items/qsggridview.cpp
+++ b/src/declarative/items/qsggridview.cpp
@@ -292,10 +292,8 @@ qreal QSGGridViewPrivate::colPosAt(int modelIndex) const
int count = columns - 1 - (modelIndex - visibleItems.last()->index - 1) % columns;
return static_cast<FxGridItemSG*>(visibleItems.last())->colPos() - count * colSize();
}
- } else {
- return (modelIndex % columns) * colSize();
}
- return 0;
+ return (modelIndex % columns) * colSize();
}
qreal QSGGridViewPrivate::rowPosAt(int modelIndex) const
@@ -316,13 +314,8 @@ qreal QSGGridViewPrivate::rowPosAt(int modelIndex) const
int rows = col / (columns * colSize());
return lastItem->rowPos() + rows * rowSize();
}
- } else {
- qreal pos = (modelIndex / columns) * rowSize();
- if (header)
- pos += headerSize();
- return pos;
}
- return 0;
+ return (modelIndex / columns) * rowSize();
}
@@ -659,13 +652,12 @@ void QSGGridViewPrivate::updateFooter()
FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(footer);
qreal colOffset = 0;
- qreal rowOffset;
- if (isRightToLeftTopToBottom()) {
- rowOffset = gridItem->item->width()-cellWidth;
- } else {
- rowOffset = 0;
- if (q->effectiveLayoutDirection() == Qt::RightToLeft)
- colOffset = gridItem->item->width()-cellWidth;
+ qreal rowOffset = 0;
+ if (q->effectiveLayoutDirection() == Qt::RightToLeft) {
+ if (flow == QSGGridView::TopToBottom)
+ rowOffset = gridItem->item->width() - cellWidth;
+ else
+ colOffset = gridItem->item->width() - cellWidth;
}
if (visibleItems.count()) {
qreal endPos = lastPosition() + 1;
@@ -677,11 +669,7 @@ void QSGGridViewPrivate::updateFooter()
gridItem->setPosition(colOffset, endPos + rowOffset);
}
} else {
- qreal endPos = 0;
- if (header) {
- endPos += headerSize();
- }
- gridItem->setPosition(colOffset, endPos);
+ gridItem->setPosition(colOffset, rowOffset);
}
}
@@ -699,12 +687,11 @@ void QSGGridViewPrivate::updateHeader()
FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(header);
qreal colOffset = 0;
- qreal rowOffset;
- if (isRightToLeftTopToBottom()) {
- rowOffset = -cellWidth;
- } else {
- rowOffset = -headerSize();
- if (q->effectiveLayoutDirection() == Qt::RightToLeft)
+ qreal rowOffset = -headerSize();
+ if (q->effectiveLayoutDirection() == Qt::RightToLeft) {
+ if (flow == QSGGridView::TopToBottom)
+ rowOffset += gridItem->item->width()-cellWidth;
+ else
colOffset = gridItem->item->width()-cellWidth;
}
if (visibleItems.count()) {
@@ -718,7 +705,10 @@ void QSGGridViewPrivate::updateHeader()
gridItem->setPosition(colOffset, startPos + rowOffset);
}
} else {
- gridItem->setPosition(colOffset, 0);
+ if (isRightToLeftTopToBottom())
+ gridItem->setPosition(colOffset, rowOffset);
+ else
+ gridItem->setPosition(colOffset, -headerSize());
}
}
@@ -1339,8 +1329,6 @@ void QSGGridView::itemsInserted(int modelIndex, int count)
rowPos += d->rowSize();
}
}
- } else if (d->itemCount == 0 && d->header) {
- rowPos = d->headerSize();
}
// Update the indexes of the following visible items.
@@ -1479,7 +1467,7 @@ void QSGGridView::itemsRemoved(int modelIndex, int count)
if (removedVisible && d->visibleItems.isEmpty()) {
d->timeline.clear();
if (d->itemCount == 0) {
- d->setPosition(0);
+ d->setPosition(d->contentStartPosition());
d->updateHeader();
d->updateFooter();
}
diff --git a/src/declarative/items/qsgitemview.cpp b/src/declarative/items/qsgitemview.cpp
index e1788ca270..df8de86ba8 100644
--- a/src/declarative/items/qsgitemview.cpp
+++ b/src/declarative/items/qsgitemview.cpp
@@ -107,7 +107,7 @@ void QSGItemView::setModel(const QVariant &model)
QSGVisualModel *oldModel = d->model;
d->clear();
- d->setPosition(0);
+ d->setPosition(d->contentStartPosition());
d->model = 0;
d->modelVariant = model;
@@ -955,6 +955,7 @@ void QSGItemView::componentComplete()
d->updateHeader();
d->updateFooter();
d->updateViewport();
+ d->setPosition(d->contentStartPosition());
if (d->isValid()) {
d->refill();
d->moveReason = QSGItemViewPrivate::SetIndex;
@@ -1022,6 +1023,11 @@ qreal QSGItemViewPrivate::endPosition() const
return isContentFlowReversed() ? -originPosition()-1 : lastPosition();
}
+qreal QSGItemViewPrivate::contentStartPosition() const
+{
+ return -headerSize();
+}
+
int QSGItemViewPrivate::findLastVisibleIndex(int defaultValue) const
{
if (visibleItems.count()) {
@@ -1209,7 +1215,7 @@ void QSGItemViewPrivate::regenerate()
updateFooter();
clear();
updateViewport();
- setPosition(0);
+ setPosition(contentStartPosition());
refill();
updateCurrent(currentIndex);
}
@@ -1241,7 +1247,7 @@ void QSGItemViewPrivate::layout()
layoutScheduled = false;
if (!isValid() && !visibleItems.count()) {
clear();
- setPosition(0);
+ setPosition(contentStartPosition());
return;
}
diff --git a/src/declarative/items/qsgitemview_p_p.h b/src/declarative/items/qsgitemview_p_p.h
index 78f0e149f0..bc2e45ff88 100644
--- a/src/declarative/items/qsgitemview_p_p.h
+++ b/src/declarative/items/qsgitemview_p_p.h
@@ -87,6 +87,7 @@ public:
qreal size() const;
qreal startPosition() const;
qreal endPosition() const;
+ qreal contentStartPosition() const;
int findLastVisibleIndex(int defaultValue = -1) const;
FxViewItem *visibleItem(int modelIndex) const;
FxViewItem *firstVisibleItem() const;
diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp
index e9a592299f..4502dc8216 100644
--- a/src/declarative/items/qsglistview.cpp
+++ b/src/declarative/items/qsglistview.cpp
@@ -465,7 +465,7 @@ void QSGListViewPrivate::clear()
delete sectionCache[i];
sectionCache[i] = 0;
}
- visiblePos = header ? headerSize() : 0;
+ visiblePos = 0;
QSGItemViewPrivate::clear();
}
@@ -963,9 +963,7 @@ void QSGListViewPrivate::updateHeader()
listItem->setPosition(startPos - headerSize());
}
} else {
- if (itemCount == 0)
- visiblePos = headerSize();
- listItem->setPosition(0);
+ listItem->setPosition(-headerSize());
}
}
}
@@ -1607,8 +1605,6 @@ void QSGListView::itemsInserted(int modelIndex, int count)
if (d->visibleItems.count()) {
pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
: d->visibleItems.last()->endPosition()+d->spacing+1;
- } else if (d->itemCount == 0 && d->header) {
- pos = d->headerSize();
}
int initialPos = pos;
@@ -1781,8 +1777,8 @@ void QSGListView::itemsRemoved(int modelIndex, int count)
d->timeline.clear();
if (removedVisible && d->itemCount == 0) {
d->visibleIndex = 0;
- d->visiblePos = d->header ? d->headerSize() : 0;
- d->setPosition(0);
+ d->visiblePos = 0;
+ d->setPosition(d->contentStartPosition());
d->updateHeader();
d->updateFooter();
} else {