2 * Copyright (C) 2013 Canonical, Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20#include <QGuiApplication>
22#include <QtQml/qqml.h>
23#include <QStringListModel>
26#pragma GCC diagnostic push
27#pragma GCC diagnostic ignored "-pedantic"
28#include <private/qquickitem_p.h>
29#pragma GCC diagnostic pop
31#include "horizontaljournal.h"
33class WidthModel : public QAbstractListModel {
35 QHash<int, QByteArray> roleNames() const
37 QHash<int, QByteArray> roles;
38 roles.insert(Qt::DisplayRole, "modelWidth");
42 int rowCount(const QModelIndex & /*parent*/) const
44 return m_list.count();
47 QVariant data(const QModelIndex &index, int /*role*/) const
49 return m_list[index.row()];
52 QStringList stringList() const
57 void setStringList(const QStringList &list)
64 void addString(const QString& string)
66 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
73 beginRemoveRows(QModelIndex(), m_list.count() - 1, m_list.count() - 1);
82class HorizontalJournalTest : public QObject
87 void verifyItem(const QQuickItem *item, int modelIndex, qreal x, qreal y, bool visible)
89 QTRY_COMPARE(item->x(), x);
90 QTRY_COMPARE(item->y(), y);
91 QTRY_COMPARE(item->width(), model->stringList()[modelIndex].toDouble());
92 QTRY_COMPARE(QQuickItemPrivate::get(item)->culled, !visible);
95 void checkInitialPositions()
97 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
98 QTRY_COMPARE(hj->m_visibleItems.count(), 14);
99 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
100 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
101 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
102 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
103 verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
104 verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
105 verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
106 verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
107 verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
108 verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true);
109 verifyItem(hj->m_visibleItems[10], 10, 200, 320, true);
110 verifyItem(hj->m_visibleItems[11], 11, 230, 320, true);
111 verifyItem(hj->m_visibleItems[12], 12, 305, 320, true);
112 verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
113 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
114 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
115 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
116 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
117 QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
118 QCOMPARE(hj->implicitHeight(), 900.);
124 view = new QQuickView();
125 view->setResizeMode(QQuickView::SizeRootObjectToView);
126 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
128 model = new WidthModel();
129 QStringList widthList;
130 widthList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
131 model->setStringList(widthList);
133 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml"));
136 view->resize(470, 400);
137 QTest::qWaitForWindowExposed(view);
139 hj = dynamic_cast<HorizontalJournal*>(view->rootObject()->findChild<QObject*>("hj"));
142 checkInitialPositions();
151 void testWidthResize()
153 view->resize(629, 400);
154 QTRY_COMPARE(hj->width(), 629.);
156 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
157 QTRY_COMPARE(hj->m_visibleItems.count(), 17);
158 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
159 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
160 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
161 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
162 verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
163 verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
164 verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
165 verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
166 verifyItem(hj->m_visibleItems[ 8], 8, 330, 160, true);
167 verifyItem(hj->m_visibleItems[ 9], 9, 500, 160, true);
168 verifyItem(hj->m_visibleItems[10], 10, 530, 160, true);
169 verifyItem(hj->m_visibleItems[11], 11, 560, 160, true);
170 verifyItem(hj->m_visibleItems[12], 12, 0, 320, true);
171 verifyItem(hj->m_visibleItems[13], 13, 90, 320, true);
172 verifyItem(hj->m_visibleItems[14], 14, 300, 320, true);
173 verifyItem(hj->m_visibleItems[15], 15, 0, 480, false);
174 verifyItem(hj->m_visibleItems[16], 16, 140, 480, false);
175 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
176 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
177 QTRY_COMPARE(hj->m_lastInRowIndexPosition[11], 560.);
178 QTRY_COMPARE(hj->m_lastInRowIndexPosition[14], 300.);
179 QTRY_COMPARE(hj->m_lastInRowIndexPosition[16], 140.);
180 QCOMPARE(hj->implicitHeight(), 630. + 3. * 630. / 17.);
182 view->resize(470, 400);
184 // This is exactly the same block as the first again
185 checkInitialPositions();
188 void testColumnSpacing()
190 hj->setColumnSpacing(11);
192 QTRY_COMPARE(hj->m_needsRelayout, false);
193 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
194 QTRY_COMPARE(hj->m_visibleItems.count(), 14);
195 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
196 verifyItem(hj->m_visibleItems[ 1], 1, 111, 0, true);
197 verifyItem(hj->m_visibleItems[ 2], 2, 172, 0, true);
198 verifyItem(hj->m_visibleItems[ 3], 3, 308, 0, true);
199 verifyItem(hj->m_visibleItems[ 4], 4, 329, 0, true);
200 verifyItem(hj->m_visibleItems[ 5], 5, 380, 0, true);
201 verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
202 verifyItem(hj->m_visibleItems[ 7], 7, 211, 160, true);
203 verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
204 verifyItem(hj->m_visibleItems[ 9], 9, 171, 320, true);
205 verifyItem(hj->m_visibleItems[10], 10, 202, 320, true);
206 verifyItem(hj->m_visibleItems[11], 11, 233, 320, true);
207 verifyItem(hj->m_visibleItems[12], 12, 309, 320, true);
208 verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
209 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
210 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 380.);
211 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 211.);
212 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 309.);
213 QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
214 QCOMPARE(hj->implicitHeight(), 900.);
216 hj->setColumnSpacing(10);
217 QTRY_COMPARE(hj->m_needsRelayout, false);
219 // This is exactly the same block as the first again
220 checkInitialPositions();
223 void testRowSpacing()
225 hj->setRowSpacing(11);
227 QTRY_COMPARE(hj->m_needsRelayout, false);
228 QTRY_COMPARE(hj->m_needsRelayout, false);
229 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
230 QTRY_COMPARE(hj->m_visibleItems.count(), 14);
231 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
232 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
233 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
234 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
235 verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
236 verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
237 verifyItem(hj->m_visibleItems[ 6], 6, 0, 161, true);
238 verifyItem(hj->m_visibleItems[ 7], 7, 210, 161, true);
239 verifyItem(hj->m_visibleItems[ 8], 8, 0, 322, true);
240 verifyItem(hj->m_visibleItems[ 9], 9, 170, 322, true);
241 verifyItem(hj->m_visibleItems[10], 10, 200, 322, true);
242 verifyItem(hj->m_visibleItems[11], 11, 230, 322, true);
243 verifyItem(hj->m_visibleItems[12], 12, 305, 322, true);
244 verifyItem(hj->m_visibleItems[13], 13, 0, 483, false);
245 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
246 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
247 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
248 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
249 QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
250 QCOMPARE(hj->implicitHeight(), 633. + 6. * 633. / 14.);
252 hj->setRowSpacing(10);
253 QTRY_COMPARE(hj->m_needsRelayout, false);
255 // This is exactly the same block as the first again
256 checkInitialPositions();
259 void testDelegateCreationRanges()
261 hj->setDelegateCreationBegin(300);
262 hj->setDelegateCreationEnd(view->height());
264 QTRY_COMPARE(hj->m_firstVisibleIndex, 6);
265 QTRY_COMPARE(hj->m_visibleItems.count(), 7);
266 verifyItem(hj->m_visibleItems[0], 6, 0, 160, true);
267 verifyItem(hj->m_visibleItems[1], 7, 210, 160, true);
268 verifyItem(hj->m_visibleItems[2], 8, 0, 320, true);
269 verifyItem(hj->m_visibleItems[3], 9, 170, 320, true);
270 verifyItem(hj->m_visibleItems[4], 10, 200, 320, true);
271 verifyItem(hj->m_visibleItems[5], 11, 230, 320, true);
272 verifyItem(hj->m_visibleItems[6], 12, 305, 320, true);
273 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
274 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
275 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
277 hj->resetDelegateCreationBegin();
278 hj->resetDelegateCreationEnd();
280 // This is exactly the same block as the first again
281 checkInitialPositions();
285 void testRowHeightChange()
287 hj->setRowHeight(200);
288 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
289 QTRY_COMPARE(hj->m_visibleItems.count(), 13);
290 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
291 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
292 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
293 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
294 verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
295 verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
296 verifyItem(hj->m_visibleItems[ 6], 6, 0, 210, true);
297 verifyItem(hj->m_visibleItems[ 7], 7, 210, 210, true);
298 verifyItem(hj->m_visibleItems[ 8], 8, 0, 420, false);
299 verifyItem(hj->m_visibleItems[ 9], 9, 170, 420, false);
300 verifyItem(hj->m_visibleItems[10], 10, 200, 420, false);
301 verifyItem(hj->m_visibleItems[11], 11, 230, 420, false);
302 verifyItem(hj->m_visibleItems[12], 12, 305, 420, false);
303 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 3);
304 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
305 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
306 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
307 QCOMPARE(hj->implicitHeight(), 620. + 7. * 620. / 13.);
309 hj->setRowHeight(150);
311 // This is exactly the same block as the first again
312 checkInitialPositions();
315 void testChangeModel()
317 WidthModel *model2 = new WidthModel();
319 list2 << "100" << "50" << "125" << "25" << "50" << "50";
320 model2->setStringList(list2);
321 hj->setModel(model2);
325 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
326 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
327 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
328 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
329 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
330 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
331 verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true);
332 verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true);
333 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
334 QCOMPARE(hj->implicitHeight(), 150.);
337 void testModelReset()
339 QStringList widthList;
340 widthList << "100" << "50" << "125" << "25" << "50" << "50";
341 model->setStringList(widthList);
343 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
344 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
345 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
346 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
347 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
348 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
349 verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true);
350 verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true);
351 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
352 QCOMPARE(hj->implicitHeight(), 150.);
355 void testModelRemoveLastNonVisible()
359 // This is the same than checkInitialPositions but
360 // with a different implicitHeight since there's an item less
362 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
363 QTRY_COMPARE(hj->m_visibleItems.count(), 14);
364 verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
365 verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
366 verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
367 verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
368 verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
369 verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
370 verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
371 verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
372 verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
373 verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true);
374 verifyItem(hj->m_visibleItems[10], 10, 200, 320, true);
375 verifyItem(hj->m_visibleItems[11], 11, 230, 320, true);
376 verifyItem(hj->m_visibleItems[12], 12, 305, 320, true);
377 verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
378 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
379 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
380 QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
381 QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
382 QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
383 QTRY_COMPARE(hj->implicitHeight(), 855.);
386 void testModelAppendRemoveLast()
388 WidthModel *model2 = new WidthModel();
389 QStringList widthList;
390 widthList << "100" << "50" << "125" << "25" << "50" << "50";
391 model2->setStringList(widthList);
392 hj->setModel(model2);
396 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
397 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
398 verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
399 verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
400 verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
401 verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
402 verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
403 verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
404 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
405 QCOMPARE(hj->implicitHeight(), 150.);
407 model2->addString("75");
409 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
410 QTRY_COMPARE(hj->m_visibleItems.count(), 7);
411 verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
412 verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
413 verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
414 verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
415 verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
416 verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
417 verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
418 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
419 QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
420 QCOMPARE(hj->implicitHeight(), 310.);
422 model2->addString("50");
423 model2->addString("50");
425 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
426 QTRY_COMPARE(hj->m_visibleItems.count(), 9);
427 verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
428 verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
429 verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
430 verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
431 verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
432 verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
433 verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
434 verifyItem(hj->m_visibleItems[7], 7, 85, 160, true);
435 verifyItem(hj->m_visibleItems[8], 8, 145, 160, true);
436 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
437 QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
438 QCOMPARE(hj->implicitHeight(), 310.);
440 model2->removeLast();
442 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
443 QTRY_COMPARE(hj->m_visibleItems.count(), 8);
444 verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
445 verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
446 verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
447 verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
448 verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
449 verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
450 verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
451 verifyItem(hj->m_visibleItems[7], 7, 85, 160, true);
452 QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
453 QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
454 QCOMPARE(hj->implicitHeight(), 310.);
457 void testNegativeHeight()
459 QQuickItemPrivate::get(hj)->anchors()->resetFill();
462 QStringList widthList;
463 widthList << "100" << "50" << "125" << "25" << "50" << "50";
464 model->setStringList(widthList);
466 QTRY_COMPARE(hj->m_visibleItems.count(), 0);
467 QTRY_COMPARE(hj->implicitHeight(), 0.);
470 void testNegativeDelegateCreationRange()
472 hj->setDelegateCreationBegin(0);
473 hj->setDelegateCreationEnd(-100);
475 QStringList widthList;
476 widthList << "100" << "50" << "50" << "30";
477 model->setStringList(widthList);
479 QTRY_COMPARE(hj->m_visibleItems.count(), 0);
480 QTRY_COMPARE(hj->implicitHeight(), 0.);
485 HorizontalJournal *hj;
489QTEST_MAIN(HorizontalJournalTest)
491#include "horizontaljournaltest.moc"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list