From 897ab4f34156b928ff5b59965cfb8d708db232d7 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 2 Feb 2012 11:46:55 +1000 Subject: Incorrect initial pos after resizing view with margins. The currentItem tracking didn't position the view to show the margins. This affects resizing the view and also changing currentIndex. Task-number: QTBUG-24028 Change-Id: I47d4c771c0d712c93abadfb6b2deb5194241fb6b Reviewed-by: Bea Lam --- src/quick/items/qquickitemview.cpp | 45 +++++++++-------- src/quick/items/qquickitemview_p_p.h | 2 +- tests/auto/qtquick2/qquicklistview/data/Page.qml | 10 ++++ .../auto/qtquick2/qquicklistview/data/margins2.qml | 29 +++++++++++ .../qtquick2/qquicklistview/tst_qquicklistview.cpp | 57 ++++++++++++++++++++++ 5 files changed, 123 insertions(+), 20 deletions(-) create mode 100644 tests/auto/qtquick2/qquicklistview/data/Page.qml create mode 100644 tests/auto/qtquick2/qquicklistview/data/margins2.qml diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index a90d7cc8a0..513a600046 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -186,7 +186,7 @@ void QQuickItemView::setModel(const QVariant &model) QQuickVisualModel *oldModel = d->model; d->clear(); - d->setPosition(d->contentStartPosition()); + d->setPosition(d->contentStartOffset()); d->model = 0; d->modelVariant = model; @@ -837,22 +837,27 @@ void QQuickItemView::trackedPositionChanged() 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(); @@ -864,6 +869,8 @@ void QQuickItemView::trackedPositionChanged() pos = d->currentItem->position(); } } + if (trackedPos < pos && toItemPos < pos) + pos = qMax(trackedPos, toItemPos); } if (viewPos != pos) { cancelFlick(); @@ -1078,7 +1085,7 @@ void QQuickItemView::componentComplete() d->updateHeader(); d->updateFooter(); d->updateViewport(); - d->setPosition(d->contentStartPosition()); + d->setPosition(d->contentStartOffset()); if (d->isValid()) { d->refill(); d->moveReason = QQuickItemViewPrivate::SetIndex; @@ -1148,7 +1155,7 @@ qreal QQuickItemViewPrivate::endPosition() const return isContentFlowReversed() ? -originPosition() : lastPosition(); } -qreal QQuickItemViewPrivate::contentStartPosition() const +qreal QQuickItemViewPrivate::contentStartOffset() const { qreal pos = -headerSize(); if (layoutOrientation() == Qt::Vertical) @@ -1353,7 +1360,7 @@ void QQuickItemViewPrivate::regenerate() updateFooter(); clear(); updateViewport(); - setPosition(contentStartPosition()); + setPosition(contentStartOffset()); refill(); updateCurrent(currentIndex); } @@ -1378,7 +1385,7 @@ void QQuickItemViewPrivate::layout() if (!isValid() && !visibleItems.count()) { clear(); - setPosition(contentStartPosition()); + setPosition(contentStartOffset()); return; } diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 56a22437ad..340349e9f7 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -126,7 +126,7 @@ public: qreal size() const; qreal startPosition() const; qreal endPosition() const; - qreal contentStartPosition() const; + qreal contentStartOffset() const; int findLastVisibleIndex(int defaultValue = -1) const; FxViewItem *visibleItem(int modelIndex) const; FxViewItem *firstVisibleItem() const; diff --git a/tests/auto/qtquick2/qquicklistview/data/Page.qml b/tests/auto/qtquick2/qquicklistview/data/Page.qml new file mode 100644 index 0000000000..abe4364315 --- /dev/null +++ b/tests/auto/qtquick2/qquicklistview/data/Page.qml @@ -0,0 +1,10 @@ +import QtQuick 2.0 + +Item { + anchors.fill: parent + default property alias contentArea: contentItem.data + Item { + id: contentItem + anchors.fill: parent + } +} diff --git a/tests/auto/qtquick2/qquicklistview/data/margins2.qml b/tests/auto/qtquick2/qquicklistview/data/margins2.qml new file mode 100644 index 0000000000..e11c803c4b --- /dev/null +++ b/tests/auto/qtquick2/qquicklistview/data/margins2.qml @@ -0,0 +1,29 @@ +import QtQuick 2.0 + +Item { + width: 200; height: 200 + Page { + Rectangle { + anchors.fill: parent + color: "lightsteelblue" + } + ListView { + objectName: "listview" + topMargin: 20 + bottomMargin: 20 + leftMargin: 20 + rightMargin: 20 + anchors.fill: parent + + model: 20 + delegate: Rectangle { + color: "skyblue" + width: 60; height: 60 + Text { + id: txt + text: "test" + index + } + } + } + } +} diff --git a/tests/auto/qtquick2/qquicklistview/tst_qquicklistview.cpp b/tests/auto/qtquick2/qquicklistview/tst_qquicklistview.cpp index 4873a230b9..9dd72aeeaf 100644 --- a/tests/auto/qtquick2/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/qtquick2/qquicklistview/tst_qquicklistview.cpp @@ -152,6 +152,8 @@ private slots: void rightToLeft(); void test_mirroring(); void margins(); + void marginsResize(); + void marginsResize_data(); void creationContext(); void snapToItem_data(); void snapToItem(); @@ -4287,6 +4289,61 @@ void tst_QQuickListView::margins() 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(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("orientation"); + QTest::addColumn("layoutDirection"); + QTest::addColumn("start"); + QTest::addColumn("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("orientation"); -- cgit v1.2.3