on xenial help sign in
Fix showHeader animation when the header is half shown at top
888e546Albert Astals
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13
@@ -347,6 +347,19 @@ void ListViewWithPageHeader::showHeader()
347
347
348 auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
348 auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
349 if (to != contentY()) {
349 if (to != contentY()) {
350+ const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
351+ if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
352+ // We are not clipping since we are just at the top of the viewport
353+ // but because of the showHeader animation we will need to, so
354+ // enable the clipping without logically moving the items
355+ m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
356+ if (!m_visibleItems.isEmpty()) {
357+ updateClipItem();
358+ ListItem *firstItem = m_visibleItems.first();
359+ firstItem->setY(firstItem->y() - m_headerItemShownHeight);
360+ layout();
361+ }
362+ }
350 m_headerShowAnimation->setTo(to);
363 m_headerShowAnimation->setTo(to);
351 m_headerShowAnimation->start();
364 m_headerShowAnimation->start();
352 }
365 }
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+53
@@ -1248,6 +1248,59 @@ private Q_SLOTS:
1248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1249 }
1249 }
1250
1250
1251+// TODO This test is extremely unstable in 5.0.x, reenable once we have 5.1.x
1252+// void testShowHeaderHalfShown()
1253+// {
1254+// changeContentY(20);
1255+//
1256+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1257+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1258+// verifyItem(0, 30., 150., false);
1259+// verifyItem(1, 180, 200., false);
1260+// verifyItem(2, 380, 350., false);
1261+// verifyItem(3, 730, 350., true);
1262+// QCOMPARE(lvwph->m_minYExtent, 0.);
1263+// QCOMPARE(lvwph->m_clipItem->y(), 20.);
1264+// QCOMPARE(lvwph->m_clipItem->clip(), false);
1265+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
1266+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1267+// QCOMPARE(lvwph->contentY(), 20.);
1268+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1269+//
1270+// lvwph->showHeader();
1271+//
1272+// QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1273+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1274+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1275+// verifyItem(0, -20., 150., false);
1276+// verifyItem(1, 130, 200., false);
1277+// verifyItem(2, 330, 350., false);
1278+// verifyItem(3, 680, 350., true);
1279+// QCOMPARE(lvwph->m_minYExtent, 20.);
1280+// QCOMPARE(lvwph->m_clipItem->y(), 50.);
1281+// QCOMPARE(lvwph->m_clipItem->clip(), true);
1282+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
1283+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1284+// QCOMPARE(lvwph->contentY(), 0.);
1285+// QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1286+//
1287+// scrollToTop();
1288+//
1289+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1290+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1291+// verifyItem(0, 50., 150., false);
1292+// verifyItem(1, 200., 200., false);
1293+// verifyItem(2, 400., 350., false);
1294+// verifyItem(3, 750, 350., true);
1295+// QCOMPARE(lvwph->m_minYExtent, 20.);
1296+// QCOMPARE(lvwph->m_clipItem->y(), -20.);
1297+// QCOMPARE(lvwph->m_clipItem->clip(), false);
1298+// QCOMPARE(lvwph->m_headerItem->y(), -20.);
1299+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1300+// QCOMPARE(lvwph->contentY(), -20.);
1301+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1302+// }
1303+
1251 void testShowHeaderAtBottom()
1304 void testShowHeaderAtBottom()
1252 {
1305 {
1253 scrollToBottom();
1306 scrollToBottom();
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+55
@@ -1407,6 +1407,61 @@ private Q_SLOTS:
1407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1408 }
1408 }
1409
1409
1410+ // TODO This test is extremely unstable in 5.0.x, reenable once we have 5.1.x
1411+// void testShowHeaderHalfShown()
1412+// {
1413+// changeContentY(20);
1414+//
1415+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1416+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1417+// verifyItem(0, 30., 190., false, "Agressive", false);
1418+// verifyItem(1, 220, 240., false, "Regular", false);
1419+// verifyItem(2, 460, 390., false, "Mild", false);
1420+// QCOMPARE(lvwph->m_minYExtent, 0.);
1421+// QCOMPARE(lvwph->m_clipItem->y(), 20.);
1422+// QCOMPARE(lvwph->m_clipItem->clip(), false);
1423+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
1424+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1425+// QCOMPARE(lvwph->contentY(), 20.);
1426+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1427+// QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1428+//
1429+// lvwph->showHeader();
1430+//
1431+// QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1432+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1433+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1434+// verifyItem(0, -20., 190., false, "Agressive", true);
1435+// verifyItem(1, 170, 240., false, "Regular", false);
1436+// verifyItem(2, 410, 390., false, "Mild", false);
1437+// QCOMPARE(lvwph->m_minYExtent, 20.);
1438+// QCOMPARE(lvwph->m_clipItem->y(), 50.);
1439+// QCOMPARE(lvwph->m_clipItem->clip(), true);
1440+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
1441+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1442+// QCOMPARE(lvwph->contentY(), 0.);
1443+// QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1444+// QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1445+// QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1446+// QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1447+//
1448+// scrollToTop();
1449+//
1450+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1451+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1452+// verifyItem(0, 50., 190., false, "Agressive", false);
1453+// verifyItem(1, 240., 240., false, "Regular", false);
1454+// verifyItem(2, 480., 390., false, "Mild", false);
1455+// QCOMPARE(lvwph->m_minYExtent, 20.);
1456+// QCOMPARE(lvwph->m_clipItem->y(), -20.);
1457+// QCOMPARE(lvwph->m_clipItem->clip(), false);
1458+// QCOMPARE(lvwph->m_headerItem->y(), -20.);
1459+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
1460+// QCOMPARE(lvwph->contentY(), -20.);
1461+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1462+// QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1463+// }
1464+
1410 void testShowHeaderCloseToTheTop()
1465 void testShowHeaderCloseToTheTop()
1411 {
1466 {
1412 changeContentY(375);
1467 changeContentY(375);