QQuickVisualModel *oldModel = d->model;
d->clear();
- d->setPosition(d->contentStartPosition());
+ d->setPosition(d->contentStartOffset());
d->model = 0;
d->modelVariant = model;
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 (d->showHeaderForIndex(d->currentIndex)) {
+ qreal startOffset = -d->contentStartOffset();
+ trackedPos -= startOffset;
+ trackedEndPos -= startOffset;
+ toItemPos -= startOffset;
+ toItemEndPos -= startOffset;
+ } else if (d->showFooterForIndex(d->currentIndex)) {
+ qreal endOffset = d->footerSize();
+ if (d->layoutOrientation() == Qt::Vertical)
+ endOffset += d->vData.endMargin;
+ else if (d->isContentFlowReversed())
+ endOffset += d->hData.endMargin;
+ else
+ endOffset += d->hData.startMargin;
+ trackedPos += endOffset;
+ trackedEndPos += endOffset;
+ toItemPos += endOffset;
+ toItemEndPos += endOffset;
}
- if (trackedPos < viewPos && toItemPos < viewPos) {
- pos = qMax(trackedPos, toItemPos);
- } else if (trackedEndPos >= viewPos + d->size()
+ if (trackedEndPos >= viewPos + d->size()
&& toItemEndPos >= viewPos + d->size()) {
if (trackedEndPos <= toItemEndPos) {
pos = trackedEndPos - d->size();
pos = d->currentItem->position();
}
}
+ if (trackedPos < pos && toItemPos < pos)
+ pos = qMax(trackedPos, toItemPos);
}
if (viewPos != pos) {
cancelFlick();
d->updateHeader();
d->updateFooter();
d->updateViewport();
- d->setPosition(d->contentStartPosition());
+ d->setPosition(d->contentStartOffset());
if (d->isValid()) {
d->refill();
d->moveReason = QQuickItemViewPrivate::SetIndex;
return isContentFlowReversed() ? -originPosition() : lastPosition();
}
-qreal QQuickItemViewPrivate::contentStartPosition() const
+qreal QQuickItemViewPrivate::contentStartOffset() const
{
qreal pos = -headerSize();
if (layoutOrientation() == Qt::Vertical)
updateFooter();
clear();
updateViewport();
- setPosition(contentStartPosition());
+ setPosition(contentStartOffset());
refill();
updateCurrent(currentIndex);
}
if (!isValid() && !visibleItems.count()) {
clear();
- setPosition(contentStartPosition());
+ setPosition(contentStartOffset());
return;
}
void rightToLeft();
void test_mirroring();
void margins();
+ void marginsResize();
+ void marginsResize_data();
void creationContext();
void snapToItem_data();
void snapToItem();
delete canvas;
}
+// QTBUG-24028
+void tst_QQuickListView::marginsResize()
+{
+ QFETCH(QQuickListView::Orientation, orientation);
+ QFETCH(Qt::LayoutDirection, layoutDirection);
+ QFETCH(qreal, start);
+ QFETCH(qreal, end);
+
+ QQuickView *canvas = createView();
+
+ canvas->setSource(testFileUrl("margins2.qml"));
+ canvas->show();
+ qApp->processEvents();
+
+ QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "listview");
+ QTRY_VERIFY(listview != 0);
+
+ listview->setOrientation(orientation);
+ listview->setLayoutDirection(layoutDirection);
+
+ // view is resized after componentCompleted - top margin should still be visible
+ if (orientation == QQuickListView::Vertical)
+ QCOMPARE(listview->contentY(), start);
+ else
+ QCOMPARE(listview->contentX(), start);
+
+ // move to last index and ensure bottom margin is visible.
+ listview->setCurrentIndex(19);
+ if (orientation == QQuickListView::Vertical)
+ QTRY_COMPARE(listview->contentY(), end);
+ else
+ QTRY_COMPARE(listview->contentX(), end);
+
+ // back to top - top margin should be visible.
+ listview->setCurrentIndex(0);
+ if (orientation == QQuickListView::Vertical)
+ QTRY_COMPARE(listview->contentY(), start);
+ else
+ QTRY_COMPARE(listview->contentX(), start);
+
+ delete canvas;
+}
+
+void tst_QQuickListView::marginsResize_data()
+{
+ QTest::addColumn<QQuickListView::Orientation>("orientation");
+ QTest::addColumn<Qt::LayoutDirection>("layoutDirection");
+ QTest::addColumn<qreal>("start");
+ QTest::addColumn<qreal>("end");
+
+ QTest::newRow("vertical") << QQuickListView::Vertical << Qt::LeftToRight << -20.0 << 1020.0;
+ QTest::newRow("horizontal") << QQuickListView::Horizontal << Qt::LeftToRight << -20.0 << 1020.0;
+ QTest::newRow("horizontal, rtl") << QQuickListView::Horizontal << Qt::RightToLeft << -180.0 << -1220.0;
+}
+
void tst_QQuickListView::snapToItem_data()
{
QTest::addColumn<QQuickListView::Orientation>("orientation");