From 8efc7c190b7cd57c3285ba8fcb9e17ea8f4717c2 Mon Sep 17 00:00:00 2001 From: John Brooks Date: Sun, 9 Feb 2014 02:34:25 -0700 Subject: Fix origin for short reversed item views Reversed (BottomToTop and RightToLeft) item views would report an impossible positive value for origin when contentHeight < height. The correct value will be effectively equivalent to the position of the footer, and always negative. Match other logic using lastPosition() by negating its value for reversed views. This fixes a bug with content disappearing in a Controls ScrollView on a BottomToTop view. Change-Id: Ieedbb64ce8fc7c0fb36e5256e437ddeb3e757761 Reviewed-by: Martin Jones --- src/quick/items/qquickitemview.cpp | 4 ++-- .../quick/qquicklistview/tst_qquicklistview.cpp | 28 +++++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 5d6fc534b4..e5b2ee822c 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1381,7 +1381,7 @@ qreal QQuickItemView::originX() const if (d->layoutOrientation() == Qt::Horizontal && effectiveLayoutDirection() == Qt::RightToLeft && contentWidth() < width()) { - return d->lastPosition() - d->footerSize(); + return -d->lastPosition() - d->footerSize(); } return QQuickFlickable::originX(); } @@ -1392,7 +1392,7 @@ qreal QQuickItemView::originY() const if (d->layoutOrientation() == Qt::Vertical && d->verticalLayoutDirection == QQuickItemView::BottomToTop && contentHeight() < height()) { - return d->lastPosition() - d->footerSize(); + return -d->lastPosition() - d->footerSize(); } return QQuickFlickable::originY(); } diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 4b52ad0071..97259e9fca 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -3919,7 +3919,8 @@ void tst_QQuickListView::extents() QFETCH(QPointF, minPos); QFETCH(QPointF, maxPos); QFETCH(QPointF, origin_empty); - QFETCH(QPointF, origin_nonEmpty); + QFETCH(QPointF, origin_short); + QFETCH(QPointF, origin_long); QQuickView *window = getView(); @@ -3956,12 +3957,20 @@ void tst_QQuickListView::extents() QCOMPARE(listview->originX(), origin_empty.x()); QCOMPARE(listview->originY(), origin_empty.y()); - for (int i=0; i<30; i++) + + for (int i=0; i<3; i++) + model.addItem("Item" + QString::number(i), ""); + listview->forceLayout(); + QTRY_COMPARE(listview->count(), model.count()); + QCOMPARE(listview->originX(), origin_short.x()); + QCOMPARE(listview->originY(), origin_short.y()); + + for (int i=3; i<30; i++) model.addItem("Item" + QString::number(i), ""); listview->forceLayout(); QTRY_COMPARE(listview->count(), model.count()); - QCOMPARE(listview->originX(), origin_nonEmpty.x()); - QCOMPARE(listview->originY(), origin_nonEmpty.y()); + QCOMPARE(listview->originX(), origin_long.x()); + QCOMPARE(listview->originY(), origin_long.y()); releaseView(window); } @@ -3976,7 +3985,8 @@ void tst_QQuickListView::extents_data() QTest::addColumn("minPos"); QTest::addColumn("maxPos"); QTest::addColumn("origin_empty"); - QTest::addColumn("origin_nonEmpty"); + QTest::addColumn("origin_short"); + QTest::addColumn("origin_long"); // header is 240x20 (or 20x320 in Horizontal orientation) // footer is 240x30 (or 30x320 in Horizontal orientation) @@ -3985,25 +3995,25 @@ void tst_QQuickListView::extents_data() << QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << QPointF(0, -20) << QPointF(0, 0) << QPointF(0, 20) << QPointF(240, 20) - << QPointF(0, -20) << QPointF(0, -20); + << QPointF(0, -20) << QPointF(0, -20) << QPointF(0, -20); QTest::newRow("Vertical, BottomToTop") << QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::BottomToTop << QPointF(0, 0) << QPointF(0, -30) << QPointF(0, 320 - 20) << QPointF(240, 320 - 20) // content flow is reversed - << QPointF(0, -30) << QPointF(0, (-30.0 * 30) - 30); + << QPointF(0, -30) << QPointF(0, (-30.0 * 3) - 30) << QPointF(0, (-30.0 * 30) - 30); QTest::newRow("Horizontal, LeftToRight") << QQuickListView::Horizontal << Qt::LeftToRight << QQuickItemView::TopToBottom << QPointF(-20, 0) << QPointF(0, 0) << QPointF(20, 0) << QPointF(20, 320) - << QPointF(-20, 0) << QPointF(-20, 0); + << QPointF(-20, 0) << QPointF(-20, 0) << QPointF(-20, 0); QTest::newRow("Horizontal, RightToLeft") << QQuickListView::Horizontal << Qt::RightToLeft << QQuickItemView::TopToBottom << QPointF(0, 0) << QPointF(-30, 0) << QPointF(240 - 20, 0) << QPointF(240 - 20, 320) // content flow is reversed - << QPointF(-30, 0) << QPointF((-240.0 * 30) - 30, 0); + << QPointF(-30, 0) << QPointF((-240.0 * 3) - 30, 0) << QPointF((-240.0 * 30) - 30, 0); } void tst_QQuickListView::resetModel_headerFooter() -- cgit v1.2.3