From 73a5e30f44aa2cbb9a181bd9d47ffa9d942f0cfb Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Thu, 10 May 2012 15:15:50 +1000 Subject: [PATCH] Fix xOrigin and yOrigin to always be top-left pos Currently xOrigin is reversed for right-to-left and yOrigin is reversed for bottom-to-top. This is wrong since xOrigin and yOrigin come from Flickable so they should keep that meaning, i.e. the top left corner of where the content begins, in ListView and GridView. Change-Id: I88c77fadd1cf784f4b4d62677168b84675e921b0 Reviewed-by: Martin Jones --- src/quick/items/qquickitemview.cpp | 20 +++++--- .../quick/qquickgridview/data/headerfooter.qml | 8 ++- .../quick/qquickgridview/tst_qquickgridview.cpp | 59 +++++++++++++++------- .../quick/qquicklistview/data/headerfooter.qml | 6 ++- .../quick/qquicklistview/tst_qquicklistview.cpp | 33 ++++++++---- 5 files changed, 87 insertions(+), 39 deletions(-) diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 1b48a32..bab505e 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1344,19 +1344,23 @@ void QQuickItemView::setContentY(qreal pos) qreal QQuickItemView::xOrigin() const { Q_D(const QQuickItemView); - if (d->isContentFlowReversed()) - return -maxXExtent() + d->size() - d->hData.endMargin; - else - return -minXExtent() + d->hData.startMargin; + if (d->layoutOrientation() == Qt::Horizontal + && effectiveLayoutDirection() == Qt::RightToLeft + && contentWidth() < width()) { + return d->lastPosition() - d->footerSize(); + } + return QQuickFlickable::xOrigin(); } qreal QQuickItemView::yOrigin() const { Q_D(const QQuickItemView); - if (d->isContentFlowReversed()) - return -maxYExtent() + d->size() - d->vData.endMargin; - else - return -minYExtent() + d->vData.startMargin; + if (d->layoutOrientation() == Qt::Vertical + && d->verticalLayoutDirection == QQuickItemView::BottomToTop + && contentHeight() < height()) { + return d->lastPosition() - d->footerSize(); + } + return QQuickFlickable::yOrigin(); } void QQuickItemView::updatePolish() diff --git a/tests/auto/quick/qquickgridview/data/headerfooter.qml b/tests/auto/quick/qquickgridview/data/headerfooter.qml index f0f73a0..a1f31ea 100644 --- a/tests/auto/quick/qquickgridview/data/headerfooter.qml +++ b/tests/auto/quick/qquickgridview/data/headerfooter.qml @@ -22,7 +22,11 @@ GridView { } cellWidth: 80; - cellHeight: 80; + cellHeight: 60; - delegate: Text { width: 80; height: 80; text: index + "(" + x + ")" } + delegate: Rectangle { + width: 80; height: 60 + border.width: 1 + Text { text: index + "(" + parent.x + "," + parent.y + ")" } + } } diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp index d39fbe5..8dc7fda 100644 --- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp @@ -120,8 +120,8 @@ private slots: void footer_data(); void header(); void header_data(); - void headerFooter(); - void headerFooter_data(); + void extents(); + void extents_data(); void resetModel_headerFooter(); void resizeViewAndRepaint(); void resizeGrid(); @@ -3485,7 +3485,7 @@ public: qreal maxX() const { return maxXExtent(); } }; -void tst_QQuickGridView::headerFooter() +void tst_QQuickGridView::extents() { QFETCH(QQuickGridView::Flow, flow); QFETCH(Qt::LayoutDirection, layoutDirection); @@ -3494,6 +3494,8 @@ void tst_QQuickGridView::headerFooter() QFETCH(QPointF, footerPos); QFETCH(QPointF, minPos); QFETCH(QPointF, maxPos); + QFETCH(QPointF, origin_empty); + QFETCH(QPointF, origin_nonEmpty); QQuickView *canvas = getView(); @@ -3527,10 +3529,18 @@ void tst_QQuickGridView::headerFooter() QCOMPARE(static_cast(gridview)->maxX(), maxPos.x()); QCOMPARE(static_cast(gridview)->maxY(), maxPos.y()); + QCOMPARE(gridview->xOrigin(), origin_empty.x()); + QCOMPARE(gridview->yOrigin(), origin_empty.y()); + for (int i=0; i<30; i++) + model.addItem("Item" + QString::number(i), ""); + QTRY_COMPARE(gridview->count(), model.count()); + QCOMPARE(gridview->xOrigin(), origin_nonEmpty.x()); + QCOMPARE(gridview->yOrigin(), origin_nonEmpty.y()); + releaseView(canvas); } -void tst_QQuickGridView::headerFooter_data() +void tst_QQuickGridView::extents_data() { QTest::addColumn("flow"); QTest::addColumn("layoutDirection"); @@ -3539,50 +3549,61 @@ void tst_QQuickGridView::headerFooter_data() QTest::addColumn("footerPos"); QTest::addColumn("minPos"); QTest::addColumn("maxPos"); + QTest::addColumn("origin_empty"); + QTest::addColumn("origin_nonEmpty"); // header is 240x20 (or 20x320 in TopToBottom) // footer is 240x30 (or 30x320 in TopToBottom) + // grid has 10 rows in LeftToRight mode and 6 columns in TopToBottom QTest::newRow("LeftToRight, LtR, TtB") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << QQuickItemView::TopToBottom << QPointF(0, -20) << QPointF(0, 0) - << QPointF(0, 20) << QPointF(240, 20); + << QPointF(0, 20) << QPointF(240, 20) + << QPointF(0, -20) << QPointF(0, -20); QTest::newRow("LeftToRight, RtL, TtB") << QQuickGridView::FlowLeftToRight << Qt::RightToLeft << QQuickItemView::TopToBottom << QPointF(0, -20) << QPointF(0, 0) - << QPointF(0, 20) << QPointF(240, 20); + << QPointF(0, 20) << QPointF(240, 20) + << QPointF(0, -20) << QPointF(0, -20); QTest::newRow("LeftToRight, LtR, BtT") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << QQuickItemView::BottomToTop << QPointF(0, 0) << QPointF(0, -30) - << QPointF(0, 320 - 20) << QPointF(240, 320 - 20); // content flow is reversed + << QPointF(0, 320 - 20) << QPointF(240, 320 - 20) // content flow is reversed + << QPointF(0, -30) << QPointF(0, (-60.0 * 10) - 30); QTest::newRow("LeftToRight, RtL, BtT") << QQuickGridView::FlowLeftToRight << Qt::RightToLeft << QQuickItemView::BottomToTop << QPointF(0, 0) << QPointF(0, -30) - << QPointF(0, 320 - 20) << QPointF(240, 320 - 20); // content flow is reversed + << QPointF(0, 320 - 20) << QPointF(240, 320 - 20) // content flow is reversed + << QPointF(0, -30) << QPointF(0, (-60.0 * 10) - 30); QTest::newRow("TopToBottom, LtR, TtB") << QQuickGridView::FlowTopToBottom << Qt::LeftToRight << QQuickItemView::TopToBottom << QPointF(-20, 0) << QPointF(0, 0) - << QPointF(20, 0) << QPointF(20, 320); + << QPointF(20, 0) << QPointF(20, 320) + << QPointF(-20, 0) << QPointF(-20, 0); QTest::newRow("TopToBottom, RtL, TtB") << QQuickGridView::FlowTopToBottom << Qt::RightToLeft << QQuickItemView::TopToBottom << QPointF(0, 0) << QPointF(-30, 0) - << QPointF(240 - 20, 0) << QPointF(240 - 20, 320); // content flow is reversed + << QPointF(240 - 20, 0) << QPointF(240 - 20, 320) // content flow is reversed + << QPointF(-30, 0) << QPointF((-80.0 * 6) - 30, 0); QTest::newRow("TopToBottom, LtR, BtT") << QQuickGridView::FlowTopToBottom << Qt::LeftToRight << QQuickItemView::BottomToTop << QPointF(-20, -320) << QPointF(0, -320) - << QPointF(20, 0) << QPointF(20, 320); + << QPointF(20, 0) << QPointF(20, 320) + << QPointF(-20, 0) << QPointF(-20, 0); QTest::newRow("TopToBottom, RtL, BtT") << QQuickGridView::FlowTopToBottom << Qt::RightToLeft << QQuickItemView::BottomToTop << QPointF(0, -320) << QPointF(-30, -320) - << QPointF(240 - 20, 0) << QPointF(240 - 20, 320); // content flow is reversed + << QPointF(240 - 20, 0) << QPointF(240 - 20, 320) // content flow is reversed + << QPointF(-30, 0) << QPointF((-80.0 * 6) - 30, 0); } void tst_QQuickGridView::resetModel_headerFooter() @@ -3612,7 +3633,7 @@ void tst_QQuickGridView::resetModel_headerFooter() QQuickItem *footer = findItem(contentItem, "footer"); QVERIFY(footer); - QCOMPARE(footer->y(), 80.*2); + QCOMPARE(footer->y(), 60.*2); model.reset(); @@ -3622,7 +3643,7 @@ void tst_QQuickGridView::resetModel_headerFooter() footer = findItem(contentItem, "footer"); QVERIFY(footer); - QCOMPARE(footer->y(), 80.*2); + QCOMPARE(footer->y(), 60.*2); delete canvas; } @@ -4166,7 +4187,7 @@ void tst_QQuickGridView::margins() QTRY_VERIFY(contentItem != 0); QTRY_COMPARE(gridview->contentX(), -240+50.); - QTRY_COMPARE(gridview->xOrigin(), 0.); + QTRY_COMPARE(gridview->xOrigin(), -100. * 10); // check end bound gridview->positionViewAtEnd(); @@ -4183,18 +4204,18 @@ void tst_QQuickGridView::margins() QTRY_COMPARE(model.count(), gridview->count()); gridview->setContentX(-240+50); gridview->returnToBounds(); - QCOMPARE(gridview->xOrigin(), -100.); + QCOMPARE(gridview->xOrigin(), -1000.); QTRY_COMPARE(gridview->contentX(), -240-50.); // reduce right margin pos = gridview->contentX(); gridview->setRightMargin(40); - QCOMPARE(gridview->xOrigin(), -100.); + QCOMPARE(gridview->xOrigin(), -1000.); QTRY_COMPARE(gridview->contentX(), -240-100 + 40.); // check end bound gridview->positionViewAtEnd(); - QCOMPARE(gridview->xOrigin(), 0.); // positionViewAtEnd() resets origin + QCOMPARE(gridview->xOrigin(), -900.); // positionViewAtEnd() resets origin pos = gridview->contentX(); gridview->setContentX(pos - 80); gridview->returnToBounds(); @@ -4203,7 +4224,7 @@ void tst_QQuickGridView::margins() // reduce left margin pos = gridview->contentX(); gridview->setLeftMargin(20); - QCOMPARE(gridview->xOrigin(), 0.); + QCOMPARE(gridview->xOrigin(), -900.); QTRY_COMPARE(gridview->contentX(), pos+10); delete canvas; diff --git a/tests/auto/quick/qquicklistview/data/headerfooter.qml b/tests/auto/quick/qquicklistview/data/headerfooter.qml index 07a331a..592e2ce 100644 --- a/tests/auto/quick/qquicklistview/data/headerfooter.qml +++ b/tests/auto/quick/qquicklistview/data/headerfooter.qml @@ -21,5 +21,9 @@ ListView { color: "blue" } - delegate: Text { width: 30; height: 30; text: index + "(" + x + ")" } + delegate: Rectangle { + width: view.width + height: 30 + Text { text: index + "(" + x + ")" } + } } diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index b38bb0d..4652051 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -154,8 +154,8 @@ private slots: void header_delayItemCreation(); void footer(); void footer_data(); - void headerFooter(); - void headerFooter_data(); + void extents(); + void extents_data(); void resetModel_headerFooter(); void resizeView(); void resizeViewAndRepaint(); @@ -3609,7 +3609,7 @@ public: }; -void tst_QQuickListView::headerFooter() +void tst_QQuickListView::extents() { QFETCH(QQuickListView::Orientation, orientation); QFETCH(Qt::LayoutDirection, layoutDirection); @@ -3618,6 +3618,8 @@ void tst_QQuickListView::headerFooter() QFETCH(QPointF, footerPos); QFETCH(QPointF, minPos); QFETCH(QPointF, maxPos); + QFETCH(QPointF, origin_empty); + QFETCH(QPointF, origin_nonEmpty); QQuickView *canvas = getView(); @@ -3651,10 +3653,18 @@ void tst_QQuickListView::headerFooter() QCOMPARE(static_cast(listview)->maxX(), maxPos.x()); QCOMPARE(static_cast(listview)->maxY(), maxPos.y()); + QCOMPARE(listview->xOrigin(), origin_empty.x()); + QCOMPARE(listview->yOrigin(), origin_empty.y()); + for (int i=0; i<30; i++) + model.addItem("Item" + QString::number(i), ""); + QTRY_COMPARE(listview->count(), model.count()); + QCOMPARE(listview->xOrigin(), origin_nonEmpty.x()); + QCOMPARE(listview->yOrigin(), origin_nonEmpty.y()); + releaseView(canvas); } -void tst_QQuickListView::headerFooter_data() +void tst_QQuickListView::extents_data() { QTest::addColumn("orientation"); QTest::addColumn("layoutDirection"); @@ -3663,6 +3673,8 @@ void tst_QQuickListView::headerFooter_data() QTest::addColumn("footerPos"); QTest::addColumn("minPos"); QTest::addColumn("maxPos"); + QTest::addColumn("origin_empty"); + QTest::addColumn("origin_nonEmpty"); // header is 240x20 (or 20x320 in Horizontal orientation) // footer is 240x30 (or 30x320 in Horizontal orientation) @@ -3670,23 +3682,26 @@ void tst_QQuickListView::headerFooter_data() QTest::newRow("Vertical, TopToBottom") << QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << QPointF(0, -20) << QPointF(0, 0) - << QPointF(0, 20) << QPointF(240, 20); + << QPointF(0, 20) << QPointF(240, 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, 320 - 20) << QPointF(240, 320 - 20) // content flow is reversed + << QPointF(0, -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, 320) + << 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(240 - 20, 0) << QPointF(240 - 20, 320) // content flow is reversed + << QPointF(-30, 0) << QPointF((-240.0 * 30) - 30, 0); } void tst_QQuickListView::resetModel_headerFooter() -- 2.7.4