diff options
author | Bea Lam <bea.lam@nokia.com> | 2011-07-14 13:55:20 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-07-21 06:23:11 +0200 |
commit | c0fc795feb06a8e2f813690e47b2cb981c67546c (patch) | |
tree | 6d4b20b85d140bb55599ac55a2c0c37fa4aa0853 /src | |
parent | 6b8e98aec3f382fedea704691da40376cbe88e5e (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.cpp | 50 | ||||
-rw-r--r-- | src/declarative/items/qsgitemview.cpp | 12 | ||||
-rw-r--r-- | src/declarative/items/qsgitemview_p_p.h | 1 | ||||
-rw-r--r-- | src/declarative/items/qsglistview.cpp | 12 |
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 { |