aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickitemview.cpp45
-rw-r--r--src/quick/items/qquickitemview_p_p.h2
-rw-r--r--tests/auto/qtquick2/qquicklistview/data/Page.qml10
-rw-r--r--tests/auto/qtquick2/qquicklistview/data/margins2.qml29
-rw-r--r--tests/auto/qtquick2/qquicklistview/tst_qquicklistview.cpp57
5 files changed, 123 insertions, 20 deletions
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<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");