on xenial help sign in
Fix showHeader animation when the header is half shown at top
commit888e546cceec832927bb7d43a5ce1a760b1790ca authorAlbert Astals <albert.astals@canonical.com> dateTue 9 Jul 2013, 16:11 (13 years ago) parentc153658
3 files changed+121
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+53 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+55
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13
@@ -347,6 +347,19 @@ void ListViewWithPageHeader::showHeader()
347347
348348 auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
349349 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+ }
350363 m_headerShowAnimation->setTo(to);
351364 m_headerShowAnimation->start();
352365 }
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+53
@@ -1248,6 +1248,59 @@ private Q_SLOTS:
12481248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12491249 }
12501250
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+
12511304 void testShowHeaderAtBottom()
12521305 {
12531306 scrollToBottom();
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+55
@@ -1407,6 +1407,61 @@ private Q_SLOTS:
14071407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14081408 }
14091409
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+
14101465 void testShowHeaderCloseToTheTop()
14111466 {
14121467 changeContentY(375);