Fix min extents to correctly consider header size

Regression from c0fc795f which changed implementation to always position
header at a negative position, and not just when visibleItems is empty.

Task-number: QTBUG-21207

Change-Id: I9a888e7e30b00f70835734b1e0e75e57ed282602
Reviewed-on: http://codereview.qt.nokia.com/4159
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
This commit is contained in:
Bea Lam 2011-09-05 10:59:28 +10:00 committed by Qt by Nokia
parent 0fdd97f613
commit 8282beb53d
5 changed files with 63 additions and 25 deletions

View File

@ -973,7 +973,7 @@ qreal QSGItemView::minYExtent() const
if (d->minExtentDirty) { if (d->minExtentDirty) {
d->minExtent = -d->startPosition(); d->minExtent = -d->startPosition();
if (d->header && d->visibleItems.count()) if (d->header)
d->minExtent += d->headerSize(); d->minExtent += d->headerSize();
if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) { if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
d->minExtent += d->highlightRangeStart; d->minExtent += d->highlightRangeStart;
@ -1044,7 +1044,7 @@ qreal QSGItemView::minXExtent() const
endPositionFirstItem = d->endPositionAt(0); endPositionFirstItem = d->endPositionAt(0);
highlightStart = d->highlightRangeStart; highlightStart = d->highlightRangeStart;
highlightEnd = d->highlightRangeEnd; highlightEnd = d->highlightRangeEnd;
if (d->header && d->visibleItems.count()) if (d->header)
d->minExtent += d->headerSize(); d->minExtent += d->headerSize();
} }
if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) { if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
@ -1093,7 +1093,7 @@ qreal QSGItemView::maxXExtent() const
d->maxExtent = -(d->endPosition() - width()); d->maxExtent = -(d->endPosition() - width());
} }
if (d->isContentFlowReversed()) { if (d->isContentFlowReversed()) {
if (d->header && d->visibleItems.count()) if (d->header)
d->maxExtent -= d->headerSize(); d->maxExtent -= d->headerSize();
} else { } else {
if (d->footer) if (d->footer)

View File

@ -24,8 +24,8 @@ Rectangle {
GridView { GridView {
id: grid id: grid
objectName: "grid" objectName: "grid"
width: 240 width: initialViewWidth
height: 320 height: initialViewHeight
cellWidth: 80 cellWidth: 80
cellHeight: 60 cellHeight: 60
model: testModel model: testModel

View File

@ -2459,17 +2459,15 @@ void tst_QSGGridView::header()
QFETCH(QPointF, firstDelegatePos); QFETCH(QPointF, firstDelegatePos);
QFETCH(QPointF, resizeContentPos); QFETCH(QPointF, resizeContentPos);
QSGView *canvas = createView();
TestModel model; TestModel model;
for (int i = 0; i < 30; i++) for (int i = 0; i < 30; i++)
model.addItem("Item" + QString::number(i), ""); model.addItem("Item" + QString::number(i), "");
QDeclarativeContext *ctxt = canvas->rootContext(); QSGView *canvas = createView();
ctxt->setContextProperty("testModel", &model); canvas->rootContext()->setContextProperty("testModel", &model);
canvas->rootContext()->setContextProperty("initialViewWidth", 240);
canvas->rootContext()->setContextProperty("initialViewHeight", 320);
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml")); canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
qApp->processEvents();
QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid"); QSGGridView *gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
QTRY_VERIFY(gridview != 0); QTRY_VERIFY(gridview != 0);
@ -2525,6 +2523,27 @@ void tst_QSGGridView::header()
QTRY_COMPARE(QPointF(gridview->contentX(), gridview->contentY()), resizeContentPos); QTRY_COMPARE(QPointF(gridview->contentX(), gridview->contentY()), resizeContentPos);
delete canvas; delete canvas;
// QTBUG-21207 header should become visible if view resizes from initial empty size
canvas = createView();
canvas->rootContext()->setContextProperty("testModel", &model);
canvas->rootContext()->setContextProperty("initialViewWidth", 240);
canvas->rootContext()->setContextProperty("initialViewHeight", 320);
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
gridview = findItem<QSGGridView>(canvas->rootObject(), "grid");
QTRY_VERIFY(gridview != 0);
gridview->setFlow(flow);
gridview->setLayoutDirection(layoutDirection);
gridview->setWidth(240);
gridview->setHeight(320);
QTRY_COMPARE(gridview->headerItem()->pos(), initialHeaderPos);
QCOMPARE(QPointF(gridview->contentX(), gridview->contentY()), initialContentPos);
delete canvas;
} }
void tst_QSGGridView::header_data() void tst_QSGGridView::header_data()

View File

@ -24,8 +24,8 @@ Rectangle {
id: list id: list
objectName: "list" objectName: "list"
focus: true focus: true
width: 240 width: initialViewWidth
height: 320 height: initialViewHeight
snapMode: ListView.SnapToItem snapMode: ListView.SnapToItem
model: testModel model: testModel
delegate: myDelegate delegate: myDelegate

View File

@ -2463,17 +2463,15 @@ void tst_QSGListView::header()
QFETCH(QPointF, changedContentPos); QFETCH(QPointF, changedContentPos);
QFETCH(QPointF, resizeContentPos); QFETCH(QPointF, resizeContentPos);
QSGView *canvas = createView();
TestModel model; TestModel model;
for (int i = 0; i < 30; i++) for (int i = 0; i < 30; i++)
model.addItem("Item" + QString::number(i), ""); model.addItem("Item" + QString::number(i), "");
QDeclarativeContext *ctxt = canvas->rootContext(); QSGView *canvas = createView();
ctxt->setContextProperty("testModel", &model); canvas->rootContext()->setContextProperty("testModel", &model);
canvas->rootContext()->setContextProperty("initialViewWidth", 240);
canvas->rootContext()->setContextProperty("initialViewHeight", 320);
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml")); canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
qApp->processEvents();
QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list"); QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list");
QTRY_VERIFY(listview != 0); QTRY_VERIFY(listview != 0);
@ -2521,6 +2519,27 @@ void tst_QSGListView::header()
QTRY_COMPARE(QPointF(listview->contentX(), listview->contentY()), changedContentPos); QTRY_COMPARE(QPointF(listview->contentX(), listview->contentY()), changedContentPos);
QCOMPARE(item->pos(), firstDelegatePos); QCOMPARE(item->pos(), firstDelegatePos);
delete canvas;
// QTBUG-21207 header should become visible if view resizes from initial empty size
canvas = createView();
canvas->rootContext()->setContextProperty("testModel", &model);
canvas->rootContext()->setContextProperty("initialViewWidth", 0.0);
canvas->rootContext()->setContextProperty("initialViewHeight", 0.0);
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
listview = findItem<QSGListView>(canvas->rootObject(), "list");
QTRY_VERIFY(listview != 0);
listview->setOrientation(orientation);
listview->setLayoutDirection(layoutDirection);
listview->setWidth(240);
listview->setHeight(320);
QTRY_COMPARE(listview->headerItem()->pos(), initialHeaderPos);
QCOMPARE(QPointF(listview->contentX(), listview->contentY()), initialContentPos);
header->setHeight(10); header->setHeight(10);
header->setWidth(40); header->setWidth(40);
QTRY_COMPARE(QPointF(listview->contentX(), listview->contentY()), resizeContentPos); QTRY_COMPARE(QPointF(listview->contentX(), listview->contentY()), resizeContentPos);
@ -2800,8 +2819,8 @@ void tst_QSGListView::headerFooter()
QVERIFY(footer); QVERIFY(footer);
QCOMPARE(footer->y(), 0.); QCOMPARE(footer->y(), 0.);
QVERIFY(static_cast<LVAccessor*>(listview)->minY() == 0); QCOMPARE(static_cast<LVAccessor*>(listview)->minY(), header->height());
QVERIFY(static_cast<LVAccessor*>(listview)->maxY() == 0); QCOMPARE(static_cast<LVAccessor*>(listview)->maxY(), header->height());
delete canvas; delete canvas;
} }
@ -2831,8 +2850,8 @@ void tst_QSGListView::headerFooter()
QVERIFY(footer); QVERIFY(footer);
QCOMPARE(footer->x(), 0.); QCOMPARE(footer->x(), 0.);
QVERIFY(static_cast<LVAccessor*>(listview)->minX() == 0); QCOMPARE(static_cast<LVAccessor*>(listview)->minX(), header->width());
QVERIFY(static_cast<LVAccessor*>(listview)->maxX() == 0); QCOMPARE(static_cast<LVAccessor*>(listview)->maxX(), header->width());
delete canvas; delete canvas;
} }
@ -2863,8 +2882,8 @@ void tst_QSGListView::headerFooter()
QVERIFY(footer); QVERIFY(footer);
QCOMPARE(footer->x(), -footer->width()); QCOMPARE(footer->x(), -footer->width());
QCOMPARE(static_cast<LVAccessor*>(listview)->minX(), 240.); QCOMPARE(static_cast<LVAccessor*>(listview)->minX(), 240. - header->width());
QCOMPARE(static_cast<LVAccessor*>(listview)->maxX(), 240.); QCOMPARE(static_cast<LVAccessor*>(listview)->maxX(), 240. - header->width());
delete canvas; delete canvas;
} }