1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28#include <QtTest/QtTest>
29#include <QtQuick/qquickview.h>
30#include <qqmlengine.h>
31#include <QtQuick/private/qquickrectangle_p.h>
32#include <QtQuick/private/qquickpositioners_p.h>
33#include <QtQuick/private/qquicktransition_p.h>
34#include <QtQuickTest/QtQuickTest>
35#include <private/qquickitem_p.h>
36#include <qqmlexpression.h>
37#include "../shared/viewtestutil.h"
38#include "../shared/visualtestutil.h"
39#include "../../shared/util.h"
40
41using namespace QQuickViewTestUtil;
42using namespace QQuickVisualTestUtil;
43
44Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
45
46class tst_qquickpositioners : public QQmlDataTest
47{
48 Q_OBJECT
49public:
50 tst_qquickpositioners();
51
52private slots:
53 void test_horizontal();
54 void test_horizontal_padding();
55 void test_horizontal_rtl();
56 void test_horizontal_spacing();
57 void test_horizontal_spacing_rightToLeft();
58 void test_horizontal_animated();
59 void test_horizontal_animated_padding();
60 void test_horizontal_animated_rightToLeft();
61 void test_horizontal_animated_rightToLeft_padding();
62 void test_horizontal_animated_disabled();
63 void test_horizontal_animated_disabled_padding();
64 void test_vertical();
65 void test_vertical_padding();
66 void test_vertical_spacing();
67 void test_vertical_animated();
68 void test_vertical_animated_padding();
69 void test_grid();
70 void test_grid_padding();
71 void test_grid_topToBottom();
72 void test_grid_rightToLeft();
73 void test_grid_spacing();
74 void test_grid_row_column_spacing();
75 void test_grid_animated();
76 void test_grid_animated_padding();
77 void test_grid_animated_rightToLeft();
78 void test_grid_animated_rightToLeft_padding();
79 void test_grid_zero_columns();
80 void test_grid_H_alignment();
81 void test_grid_H_alignment_padding();
82 void test_grid_V_alignment();
83 void test_grid_V_alignment_padding();
84 void test_propertychanges();
85 void test_repeater();
86 void test_repeater_padding();
87 void test_flow();
88 void test_flow_padding();
89 void test_flow_rightToLeft();
90 void test_flow_topToBottom();
91 void test_flow_topToBottom_padding();
92 void test_flow_resize();
93 void test_flow_resize_padding();
94 void test_flow_resize_rightToLeft();
95 void test_flow_resize_rightToLeft_padding();
96 void test_flow_implicit_resize();
97 void test_flow_implicit_resize_padding();
98 void test_conflictinganchors();
99 void test_mirroring();
100 void test_allInvisible();
101 void test_attachedproperties();
102 void test_attachedproperties_data();
103 void test_attachedproperties_dynamic();
104
105 void populateTransitions_row();
106 void populateTransitions_row_data();
107 void populateTransitions_column();
108 void populateTransitions_column_data();
109 void populateTransitions_grid();
110 void populateTransitions_grid_data();
111 void populateTransitions_flow();
112 void populateTransitions_flow_data();
113 void addTransitions_row();
114 void addTransitions_row_data();
115 void addTransitions_column();
116 void addTransitions_column_data();
117 void addTransitions_grid();
118 void addTransitions_grid_data();
119 void addTransitions_flow();
120 void addTransitions_flow_data();
121 void moveTransitions_row();
122 void moveTransitions_row_data();
123 void moveTransitions_column();
124 void moveTransitions_column_data();
125 void moveTransitions_grid();
126 void moveTransitions_grid_data();
127 void moveTransitions_flow();
128 void moveTransitions_flow_data();
129
130private:
131 QQuickView *createView(const QString &filename, bool wait=true);
132
133 void populateTransitions(const QString &positionerObjectName);
134 void populateTransitions_data();
135 void addTransitions(const QString &positionerObjectName);
136 void addTransitions_data();
137 void moveTransitions(const QString &positionerObjectName);
138 void moveTransitions_data();
139 void matchIndexLists(const QVariantList &indexLists, const QList<int> &expectedIndexes);
140 void matchItemsAndIndexes(const QVariantMap &items, const QaimModel &model, const QList<int> &expectedIndexes);
141 void matchItemLists(const QVariantList &itemLists, const QList<QQuickItem *> &expectedItems);
142 void checkItemPositions(QQuickItem *positioner, QaimModel *model, qreal incrementalSize);
143};
144
145void tst_qquickpositioners::populateTransitions_row()
146{
147 populateTransitions(positionerObjectName: "row");
148}
149
150void tst_qquickpositioners::populateTransitions_row_data()
151{
152 populateTransitions_data();
153}
154
155void tst_qquickpositioners::populateTransitions_column()
156{
157 populateTransitions(positionerObjectName: "column");
158}
159
160void tst_qquickpositioners::populateTransitions_column_data()
161{
162 populateTransitions_data();
163}
164
165void tst_qquickpositioners::populateTransitions_grid()
166{
167 populateTransitions(positionerObjectName: "grid");
168}
169
170void tst_qquickpositioners::populateTransitions_grid_data()
171{
172 populateTransitions_data();
173}
174
175void tst_qquickpositioners::populateTransitions_flow()
176{
177 populateTransitions(positionerObjectName: "flow");
178}
179
180void tst_qquickpositioners::populateTransitions_flow_data()
181{
182 populateTransitions_data();
183}
184
185void tst_qquickpositioners::addTransitions_row()
186{
187 addTransitions(positionerObjectName: "row");
188}
189
190void tst_qquickpositioners::addTransitions_row_data()
191{
192 addTransitions_data();
193}
194
195void tst_qquickpositioners::addTransitions_column()
196{
197 addTransitions(positionerObjectName: "column");
198}
199
200void tst_qquickpositioners::addTransitions_column_data()
201{
202 addTransitions_data();
203}
204
205void tst_qquickpositioners::addTransitions_grid()
206{
207 addTransitions(positionerObjectName: "grid");
208}
209
210void tst_qquickpositioners::addTransitions_grid_data()
211{
212 // don't use addTransitions_data() because grid displaces items differently
213 // (adding items further down the grid can cause displace transitions at
214 // previous indexes, since grid is auto-resized to tightly fit all of its items)
215
216 QTest::addColumn<QString>(name: "qmlFile");
217 QTest::addColumn<int>(name: "initialItemCount");
218 QTest::addColumn<int>(name: "insertionIndex");
219 QTest::addColumn<int>(name: "insertionCount");
220 QTest::addColumn<ListRange>(name: "expectedDisplacedIndexes");
221
222 QTest::newRow(dataTag: "add one @ start") << "transitions.qml" << 10 << 0 << 1 << ListRange(0, 9);
223 QTest::newRow(dataTag: "add one @ middle") << "transitions.qml" << 10 << 5 << 1 << ListRange(3, 3) + ListRange(5, 9);
224 QTest::newRow(dataTag: "add one @ end") << "transitions.qml" << 10 << 10 << 1 << ListRange(3, 3) + ListRange(7, 7);
225 QTest::newRow(dataTag: "padding, add one @ start") << "transitions-padding.qml" << 10 << 0 << 1 << ListRange(0, 9);
226 QTest::newRow(dataTag: "padding, add one @ middle") << "transitions-padding.qml" << 10 << 5 << 1 << ListRange(3, 3) + ListRange(5, 9);
227 QTest::newRow(dataTag: "padding, add one @ end") << "transitions-padding.qml" << 10 << 10 << 1 << ListRange(3, 3) + ListRange(7, 7);
228
229 QTest::newRow(dataTag: "add multiple @ start") << "transitions.qml" << 10 << 0 << 3 << ListRange(0, 9);
230 QTest::newRow(dataTag: "add multiple @ middle") << "transitions.qml" << 10 << 5 << 3 << ListRange(1, 3) + ListRange(5, 9);
231 QTest::newRow(dataTag: "add multiple @ end") << "transitions.qml" << 10 << 10 << 3 << ListRange(1, 3) + ListRange(5, 7) + ListRange(9, 9);
232 QTest::newRow(dataTag: "padding, add multiple @ start") << "transitions-padding.qml" << 10 << 0 << 3 << ListRange(0, 9);
233 QTest::newRow(dataTag: "padding, add multiple @ middle") << "transitions-padding.qml" << 10 << 5 << 3 << ListRange(1, 3) + ListRange(5, 9);
234 QTest::newRow(dataTag: "padding, add multiple @ end") << "transitions-padding.qml" << 10 << 10 << 3 << ListRange(1, 3) + ListRange(5, 7) + ListRange(9, 9);
235}
236
237void tst_qquickpositioners::addTransitions_flow()
238{
239 addTransitions(positionerObjectName: "flow");
240}
241
242void tst_qquickpositioners::addTransitions_flow_data()
243{
244 addTransitions_data();
245}
246
247void tst_qquickpositioners::moveTransitions_row()
248{
249 moveTransitions(positionerObjectName: "row");
250}
251
252void tst_qquickpositioners::moveTransitions_row_data()
253{
254 moveTransitions_data();
255}
256
257void tst_qquickpositioners::moveTransitions_column()
258{
259 moveTransitions(positionerObjectName: "column");
260}
261
262void tst_qquickpositioners::moveTransitions_column_data()
263{
264 moveTransitions_data();
265}
266
267void tst_qquickpositioners::moveTransitions_grid()
268{
269 moveTransitions(positionerObjectName: "grid");
270}
271
272void tst_qquickpositioners::moveTransitions_grid_data()
273{
274 // don't use moveTransitions_data() because grid displaces items differently
275 // (removing items further down the grid can cause displace transitions at
276 // previous indexes, since grid is auto-resized to tightly fit all of its items)
277
278 QTest::addColumn<QString>(name: "qmlFile");
279 QTest::addColumn<int>(name: "initialItemCount");
280 QTest::addColumn<ListChange>(name: "change");
281 QTest::addColumn<ListRange>(name: "expectedDisplacedIndexes");
282
283 QTest::newRow(dataTag: "remove one @ start") << "transitions.qml" << 10 << ListChange::remove(index: 0, count: 1) << ListRange(1, 9);
284 QTest::newRow(dataTag: "remove one @ middle") << "transitions.qml" << 10 << ListChange::remove(index: 4, count: 1) << ListRange(2, 3) + ListRange(5, 9);
285 QTest::newRow(dataTag: "remove one @ end") << "transitions.qml" << 10 << ListChange::remove(index: 9, count: 1) << ListRange(2, 3) + ListRange(6, 7);
286 QTest::newRow(dataTag: "padding, remove one @ start") << "transitions-padding.qml" << 10 << ListChange::remove(index: 0, count: 1) << ListRange(1, 9);
287 QTest::newRow(dataTag: "padding, remove one @ middle") << "transitions-padding.qml" << 10 << ListChange::remove(index: 4, count: 1) << ListRange(2, 3) + ListRange(5, 9);
288 QTest::newRow(dataTag: "padding, remove one @ end") << "transitions-padding.qml" << 10 << ListChange::remove(index: 9, count: 1) << ListRange(2, 3) + ListRange(6, 7);
289
290 QTest::newRow(dataTag: "remove multiple @ start") << "transitions.qml" << 10 << ListChange::remove(index: 0, count: 3) << ListRange(3, 9);
291 QTest::newRow(dataTag: "remove multiple @ middle") << "transitions.qml" << 10 << ListChange::remove(index: 4, count: 3) << ListRange(1, 3) + ListRange(7, 9);
292 QTest::newRow(dataTag: "remove multiple @ end") << "transitions.qml" << 10 << ListChange::remove(index: 7, count: 3) << ListRange(1, 3) + ListRange(5, 6);
293 QTest::newRow(dataTag: "padding, remove multiple @ start") << "transitions-padding.qml" << 10 << ListChange::remove(index: 0, count: 3) << ListRange(3, 9);
294 QTest::newRow(dataTag: "padding, remove multiple @ middle") << "transitions-padding.qml" << 10 << ListChange::remove(index: 4, count: 3) << ListRange(1, 3) + ListRange(7, 9);
295 QTest::newRow(dataTag: "padding, remove multiple @ end") << "transitions-padding.qml" << 10 << ListChange::remove(index: 7, count: 3) << ListRange(1, 3) + ListRange(5, 6);
296}
297
298void tst_qquickpositioners::moveTransitions_flow()
299{
300 moveTransitions(positionerObjectName: "flow");
301}
302
303void tst_qquickpositioners::moveTransitions_flow_data()
304{
305 moveTransitions_data();
306}
307
308tst_qquickpositioners::tst_qquickpositioners()
309{
310}
311
312void tst_qquickpositioners::test_horizontal()
313{
314 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal.qml")));
315
316 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
317
318 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
319 QVERIFY(one != nullptr);
320
321 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
322 QVERIFY(two != nullptr);
323
324 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
325 QVERIFY(three != nullptr);
326
327 QCOMPARE(one->x(), 0.0);
328 QCOMPARE(one->y(), 0.0);
329 QCOMPARE(two->x(), 50.0);
330 QCOMPARE(two->y(), 0.0);
331 QCOMPARE(three->x(), 70.0);
332 QCOMPARE(three->y(), 0.0);
333
334 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
335 QCOMPARE(row->width(), 110.0);
336 QCOMPARE(row->height(), 50.0);
337
338 // test padding
339 row->setProperty(name: "padding", value: 1);
340 row->setProperty(name: "topPadding", value: 2);
341 row->setProperty(name: "leftPadding", value: 3);
342 row->setProperty(name: "rightPadding", value: 4);
343 row->setProperty(name: "bottomPadding", value: 5);
344
345 QTRY_COMPARE(row->width(), 117.0);
346 QCOMPARE(row->height(), 57.0);
347
348 QCOMPARE(one->x(), 3.0);
349 QCOMPARE(one->y(), 2.0);
350 QCOMPARE(two->x(), 53.0);
351 QCOMPARE(two->y(), 2.0);
352 QCOMPARE(three->x(), 73.0);
353 QCOMPARE(three->y(), 2.0);
354}
355
356void tst_qquickpositioners::test_horizontal_padding()
357{
358 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal.qml")));
359
360 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
361
362 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
363 QVERIFY(one != nullptr);
364
365 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
366 QVERIFY(two != nullptr);
367
368 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
369 QVERIFY(three != nullptr);
370
371 QCOMPARE(one->x(), 0.0);
372 QCOMPARE(one->y(), 0.0);
373 QCOMPARE(two->x(), 50.0);
374 QCOMPARE(two->y(), 0.0);
375 QCOMPARE(three->x(), 70.0);
376 QCOMPARE(three->y(), 0.0);
377
378 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
379 QCOMPARE(row->width(), 110.0);
380 QCOMPARE(row->height(), 50.0);
381
382 QQuickRow *obj = qobject_cast<QQuickRow*>(object: row);
383 QVERIFY(obj != nullptr);
384
385 QCOMPARE(row->property("padding").toDouble(), 0.0);
386 QCOMPARE(row->property("topPadding").toDouble(), 0.0);
387 QCOMPARE(row->property("leftPadding").toDouble(), 0.0);
388 QCOMPARE(row->property("rightPadding").toDouble(), 0.0);
389 QCOMPARE(row->property("bottomPadding").toDouble(), 0.0);
390
391 obj->setPadding(1.0);
392
393 QCOMPARE(row->property("padding").toDouble(), 1.0);
394 QCOMPARE(row->property("topPadding").toDouble(), 1.0);
395 QCOMPARE(row->property("leftPadding").toDouble(), 1.0);
396 QCOMPARE(row->property("rightPadding").toDouble(), 1.0);
397 QCOMPARE(row->property("bottomPadding").toDouble(), 1.0);
398
399 QTRY_COMPARE(row->width(), 112.0);
400 QCOMPARE(row->height(), 52.0);
401
402 QCOMPARE(one->x(), 1.0);
403 QCOMPARE(one->y(), 1.0);
404 QCOMPARE(two->x(), 51.0);
405 QCOMPARE(two->y(), 1.0);
406 QCOMPARE(three->x(), 71.0);
407 QCOMPARE(three->y(), 1.0);
408
409 obj->setTopPadding(2.0);
410
411 QCOMPARE(row->property("padding").toDouble(), 1.0);
412 QCOMPARE(row->property("topPadding").toDouble(), 2.0);
413 QCOMPARE(row->property("leftPadding").toDouble(), 1.0);
414 QCOMPARE(row->property("rightPadding").toDouble(), 1.0);
415 QCOMPARE(row->property("bottomPadding").toDouble(), 1.0);
416
417 QTRY_COMPARE(row->height(), 53.0);
418 QCOMPARE(row->width(), 112.0);
419
420 QCOMPARE(one->x(), 1.0);
421 QCOMPARE(one->y(), 2.0);
422 QCOMPARE(two->x(), 51.0);
423 QCOMPARE(two->y(), 2.0);
424 QCOMPARE(three->x(), 71.0);
425 QCOMPARE(three->y(), 2.0);
426
427 obj->setLeftPadding(3.0);
428
429 QCOMPARE(row->property("padding").toDouble(), 1.0);
430 QCOMPARE(row->property("topPadding").toDouble(), 2.0);
431 QCOMPARE(row->property("leftPadding").toDouble(), 3.0);
432 QCOMPARE(row->property("rightPadding").toDouble(), 1.0);
433 QCOMPARE(row->property("bottomPadding").toDouble(), 1.0);
434
435 QTRY_COMPARE(row->width(), 114.0);
436 QCOMPARE(row->height(), 53.0);
437
438 QCOMPARE(one->x(), 3.0);
439 QCOMPARE(one->y(), 2.0);
440 QCOMPARE(two->x(), 53.0);
441 QCOMPARE(two->y(), 2.0);
442 QCOMPARE(three->x(), 73.0);
443 QCOMPARE(three->y(), 2.0);
444
445 obj->setRightPadding(4.0);
446
447 QCOMPARE(row->property("padding").toDouble(), 1.0);
448 QCOMPARE(row->property("topPadding").toDouble(), 2.0);
449 QCOMPARE(row->property("leftPadding").toDouble(), 3.0);
450 QCOMPARE(row->property("rightPadding").toDouble(), 4.0);
451 QCOMPARE(row->property("bottomPadding").toDouble(), 1.0);
452
453 QTRY_COMPARE(row->width(), 117.0);
454 QCOMPARE(row->height(), 53.0);
455
456 QCOMPARE(one->x(), 3.0);
457 QCOMPARE(one->y(), 2.0);
458 QCOMPARE(two->x(), 53.0);
459 QCOMPARE(two->y(), 2.0);
460 QCOMPARE(three->x(), 73.0);
461 QCOMPARE(three->y(), 2.0);
462
463 obj->setBottomPadding(5.0);
464
465 QCOMPARE(row->property("padding").toDouble(), 1.0);
466 QCOMPARE(row->property("topPadding").toDouble(), 2.0);
467 QCOMPARE(row->property("leftPadding").toDouble(), 3.0);
468 QCOMPARE(row->property("rightPadding").toDouble(), 4.0);
469 QCOMPARE(row->property("bottomPadding").toDouble(), 5.0);
470
471 QTRY_COMPARE(row->height(), 57.0);
472 QCOMPARE(row->width(), 117.0);
473
474 QCOMPARE(one->x(), 3.0);
475 QCOMPARE(one->y(), 2.0);
476 QCOMPARE(two->x(), 53.0);
477 QCOMPARE(two->y(), 2.0);
478 QCOMPARE(three->x(), 73.0);
479 QCOMPARE(three->y(), 2.0);
480
481 obj->resetBottomPadding();
482 QCOMPARE(row->property("bottomPadding").toDouble(), 1.0);
483 QTRY_COMPARE(row->height(), 53.0);
484 QCOMPARE(row->width(), 117.0);
485
486 obj->resetRightPadding();
487 QCOMPARE(row->property("rightPadding").toDouble(), 1.0);
488 QTRY_COMPARE(row->width(), 114.0);
489 QCOMPARE(row->height(), 53.0);
490
491 obj->resetLeftPadding();
492 QCOMPARE(row->property("leftPadding").toDouble(), 1.0);
493 QTRY_COMPARE(row->width(), 112.0);
494 QCOMPARE(row->height(), 53.0);
495
496 obj->resetTopPadding();
497 QCOMPARE(row->property("topPadding").toDouble(), 1.0);
498 QTRY_COMPARE(row->height(), 52.0);
499 QCOMPARE(row->width(), 112.0);
500
501 obj->resetPadding();
502 QCOMPARE(row->property("padding").toDouble(), 0.0);
503 QCOMPARE(row->property("topPadding").toDouble(), 0.0);
504 QCOMPARE(row->property("leftPadding").toDouble(), 0.0);
505 QCOMPARE(row->property("rightPadding").toDouble(), 0.0);
506 QCOMPARE(row->property("bottomPadding").toDouble(), 0.0);
507 QTRY_COMPARE(row->height(), 50.0);
508 QCOMPARE(row->width(), 110.0);
509
510 QCOMPARE(one->x(), 0.0);
511 QCOMPARE(one->y(), 0.0);
512 QCOMPARE(two->x(), 50.0);
513 QCOMPARE(two->y(), 0.0);
514 QCOMPARE(three->x(), 70.0);
515 QCOMPARE(three->y(), 0.0);
516}
517
518void tst_qquickpositioners::test_horizontal_rtl()
519{
520 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal.qml")));
521
522 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
523
524 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
525 QVERIFY(one != nullptr);
526
527 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
528 QVERIFY(two != nullptr);
529
530 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
531 QVERIFY(three != nullptr);
532
533 QCOMPARE(one->x(), 60.0);
534 QCOMPARE(one->y(), 0.0);
535 QCOMPARE(two->x(), 40.0);
536 QCOMPARE(two->y(), 0.0);
537 QCOMPARE(three->x(), 0.0);
538 QCOMPARE(three->y(), 0.0);
539
540 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
541 QCOMPARE(row->width(), 110.0);
542 QCOMPARE(row->height(), 50.0);
543
544 // test padding
545 row->setProperty(name: "padding", value: 1);
546 row->setProperty(name: "topPadding", value: 2);
547 row->setProperty(name: "leftPadding", value: 3);
548 row->setProperty(name: "rightPadding", value: 4);
549 row->setProperty(name: "bottomPadding", value: 5);
550
551 QTRY_COMPARE(row->width(), 117.0);
552 QCOMPARE(row->height(), 57.0);
553
554 QCOMPARE(one->x(), 63.0);
555 QCOMPARE(one->y(), 2.0);
556 QCOMPARE(two->x(), 43.0);
557 QCOMPARE(two->y(), 2.0);
558 QCOMPARE(three->x(), 3.0);
559 QCOMPARE(three->y(), 2.0);
560
561 row->setProperty(name: "topPadding", value: 0);
562 row->setProperty(name: "leftPadding", value: 0);
563 row->setProperty(name: "rightPadding", value: 0);
564 row->setProperty(name: "bottomPadding", value: 0);
565 row->setProperty(name: "padding", value: 0);
566
567 QTRY_COMPARE(one->x(), 60.0);
568 QCOMPARE(one->y(), 0.0);
569 QCOMPARE(two->x(), 40.0);
570 QCOMPARE(two->y(), 0.0);
571 QCOMPARE(three->x(), 0.0);
572 QCOMPARE(three->y(), 0.0);
573
574 // Change the width of the row and check that items stay to the right
575 row->setWidth(200);
576 QTRY_COMPARE(one->x(), 150.0);
577 QCOMPARE(one->y(), 0.0);
578 QCOMPARE(two->x(), 130.0);
579 QCOMPARE(two->y(), 0.0);
580 QCOMPARE(three->x(), 90.0);
581 QCOMPARE(three->y(), 0.0);
582
583 row->setProperty(name: "padding", value: 1);
584 row->setProperty(name: "topPadding", value: 2);
585 row->setProperty(name: "leftPadding", value: 3);
586 row->setProperty(name: "rightPadding", value: 4);
587 row->setProperty(name: "bottomPadding", value: 5);
588
589 QTRY_COMPARE(one->x(), 146.0);
590 QCOMPARE(one->y(), 2.0);
591 QCOMPARE(two->x(), 126.0);
592 QCOMPARE(two->y(), 2.0);
593 QCOMPARE(three->x(), 86.0);
594 QCOMPARE(three->y(), 2.0);
595}
596
597void tst_qquickpositioners::test_horizontal_spacing()
598{
599 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-spacing.qml")));
600
601 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
602
603 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
604 QVERIFY(one != nullptr);
605
606 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
607 QVERIFY(two != nullptr);
608
609 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
610 QVERIFY(three != nullptr);
611
612 QCOMPARE(one->x(), 0.0);
613 QCOMPARE(one->y(), 0.0);
614 QCOMPARE(two->x(), 60.0);
615 QCOMPARE(two->y(), 0.0);
616 QCOMPARE(three->x(), 90.0);
617 QCOMPARE(three->y(), 0.0);
618
619 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
620 QCOMPARE(row->width(), 130.0);
621 QCOMPARE(row->height(), 50.0);
622
623 // test padding
624 row->setProperty(name: "padding", value: 1);
625 row->setProperty(name: "topPadding", value: 2);
626 row->setProperty(name: "leftPadding", value: 3);
627 row->setProperty(name: "rightPadding", value: 4);
628 row->setProperty(name: "bottomPadding", value: 5);
629
630 QTRY_COMPARE(row->width(), 137.0);
631 QCOMPARE(row->height(), 57.0);
632
633 QCOMPARE(one->x(), 3.0);
634 QCOMPARE(one->y(), 2.0);
635 QCOMPARE(two->x(), 63.0);
636 QCOMPARE(two->y(), 2.0);
637 QCOMPARE(three->x(), 93.0);
638 QCOMPARE(three->y(), 2.0);
639}
640
641void tst_qquickpositioners::test_horizontal_spacing_rightToLeft()
642{
643 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-spacing.qml")));
644
645 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
646
647 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
648 QVERIFY(one != nullptr);
649
650 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
651 QVERIFY(two != nullptr);
652
653 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
654 QVERIFY(three != nullptr);
655
656 QCOMPARE(one->x(), 80.0);
657 QCOMPARE(one->y(), 0.0);
658 QCOMPARE(two->x(), 50.0);
659 QCOMPARE(two->y(), 0.0);
660 QCOMPARE(three->x(), 0.0);
661 QCOMPARE(three->y(), 0.0);
662
663 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
664 QCOMPARE(row->width(), 130.0);
665 QCOMPARE(row->height(), 50.0);
666
667 // test padding
668 row->setProperty(name: "padding", value: 1);
669 row->setProperty(name: "topPadding", value: 2);
670 row->setProperty(name: "leftPadding", value: 3);
671 row->setProperty(name: "rightPadding", value: 4);
672 row->setProperty(name: "bottomPadding", value: 5);
673
674 QTRY_COMPARE(row->width(), 137.0);
675 QCOMPARE(row->height(), 57.0);
676
677 QCOMPARE(one->x(), 83.0);
678 QCOMPARE(one->y(), 2.0);
679 QCOMPARE(two->x(), 53.0);
680 QCOMPARE(two->y(), 2.0);
681 QCOMPARE(three->x(), 3.0);
682 QCOMPARE(three->y(), 2.0);
683}
684
685void tst_qquickpositioners::test_horizontal_animated()
686{
687 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated.qml"), wait: false));
688
689 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
690
691 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
692 QVERIFY(one != nullptr);
693
694 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
695 QVERIFY(two != nullptr);
696
697 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
698 QVERIFY(three != nullptr);
699
700 //Note that they animate in
701 QCOMPARE(one->x(), -100.0);
702 QCOMPARE(two->x(), -100.0);
703 QCOMPARE(three->x(), -100.0);
704
705 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
706
707 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
708 QVERIFY(row);
709 QCOMPARE(row->width(), 100.0);
710 QCOMPARE(row->height(), 50.0);
711
712 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
713 //Note that this means the duration of the animation is NOT tested
714
715 QTRY_COMPARE(one->x(), 0.0);
716 QTRY_COMPARE(one->y(), 0.0);
717 QTRY_COMPARE(two->isVisible(), false);
718 QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
719 QTRY_COMPARE(two->y(), 0.0);
720 QTRY_COMPARE(three->x(), 50.0);
721 QTRY_COMPARE(three->y(), 0.0);
722
723 //Add 'two'
724 two->setVisible(true);
725 QTRY_COMPARE(two->isVisible(), true);
726 QTRY_COMPARE(row->width(), 150.0);
727 QTRY_COMPARE(row->height(), 50.0);
728
729 QTest::qWait(ms: 0);//Let the animation start
730 QVERIFY(two->x() >= -100.0 && two->x() < 50.0);
731 QVERIFY(three->x() >= 50.0 && three->x() < 100.0);
732
733 QTRY_COMPARE(two->x(), 50.0);
734 QTRY_COMPARE(three->x(), 100.0);
735
736}
737
738void tst_qquickpositioners::test_horizontal_animated_padding()
739{
740 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated.qml"), wait: false));
741
742 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
743
744 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
745 QVERIFY(one != nullptr);
746
747 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
748 QVERIFY(two != nullptr);
749
750 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
751 QVERIFY(three != nullptr);
752
753 //Note that they animate in
754 QCOMPARE(one->x(), -100.0);
755 QCOMPARE(two->x(), -100.0);
756 QCOMPARE(three->x(), -100.0);
757
758 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
759
760 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
761 QVERIFY(row);
762 QCOMPARE(row->width(), 100.0);
763 QCOMPARE(row->height(), 50.0);
764
765 // test padding
766 row->setProperty(name: "padding", value: 1);
767 row->setProperty(name: "topPadding", value: 2);
768 row->setProperty(name: "leftPadding", value: 3);
769 row->setProperty(name: "rightPadding", value: 4);
770 row->setProperty(name: "bottomPadding", value: 5);
771
772 QTRY_COMPARE(row->width(), 107.0);
773 QCOMPARE(row->height(), 57.0);
774
775 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
776 //Note that this means the duration of the animation is NOT tested
777
778 QTRY_COMPARE(one->x(), 3.0);
779 QTRY_COMPARE(one->y(), 2.0);
780 QTRY_COMPARE(two->isVisible(), false);
781 QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
782 QTRY_COMPARE(two->y(), 0.0);
783 QTRY_COMPARE(three->x(), 53.0);
784 QTRY_COMPARE(three->y(), 2.0);
785
786 //Add 'two'
787 two->setVisible(true);
788 QTRY_COMPARE(two->isVisible(), true);
789 QTRY_COMPARE(row->width(), 157.0);
790 QTRY_COMPARE(row->height(), 57.0);
791
792 QTest::qWait(ms: 0);//Let the animation start
793 QVERIFY(two->x() >= -100.0 && two->x() < 53.0);
794 QVERIFY(three->x() >= 53.0 && three->x() < 103.0);
795
796 QTRY_COMPARE(two->y(), 2.0);
797 QTRY_COMPARE(two->x(), 53.0);
798 QTRY_COMPARE(three->x(), 103.0);
799
800}
801
802void tst_qquickpositioners::test_horizontal_animated_rightToLeft()
803{
804 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated.qml"), wait: false));
805
806 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
807
808 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
809 QVERIFY(one != nullptr);
810
811 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
812 QVERIFY(two != nullptr);
813
814 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
815 QVERIFY(three != nullptr);
816
817 //Note that they animate in
818 QCOMPARE(one->x(), -100.0);
819 QCOMPARE(two->x(), -100.0);
820 QCOMPARE(three->x(), -100.0);
821
822 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
823
824 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
825 QVERIFY(row);
826 QCOMPARE(row->width(), 100.0);
827 QCOMPARE(row->height(), 50.0);
828
829 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
830 //Note that this means the duration of the animation is NOT tested
831
832 QTRY_COMPARE(one->x(), 50.0);
833 QTRY_COMPARE(one->y(), 0.0);
834 QTRY_COMPARE(two->isVisible(), false);
835 QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
836 QTRY_COMPARE(two->y(), 0.0);
837 QTRY_COMPARE(three->x(), 0.0);
838 QTRY_COMPARE(three->y(), 0.0);
839
840 //Add 'two'
841 two->setVisible(true);
842 QTRY_COMPARE(two->isVisible(), true);
843
844 // New size should propagate after visible change
845 QTRY_COMPARE(row->width(), 150.0);
846 QTRY_COMPARE(row->height(), 50.0);
847
848 QTest::qWait(ms: 0);//Let the animation start
849 QVERIFY(one->x() >= 50.0 && one->x() < 100);
850 QVERIFY(two->x() >= -100.0 && two->x() < 50.0);
851
852 QTRY_COMPARE(one->x(), 100.0);
853 QTRY_COMPARE(two->x(), 50.0);
854
855}
856
857void tst_qquickpositioners::test_horizontal_animated_rightToLeft_padding()
858{
859 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated.qml"), wait: false));
860
861 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
862
863 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
864 QVERIFY(one != nullptr);
865
866 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
867 QVERIFY(two != nullptr);
868
869 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
870 QVERIFY(three != nullptr);
871
872 //Note that they animate in
873 QCOMPARE(one->x(), -100.0);
874 QCOMPARE(two->x(), -100.0);
875 QCOMPARE(three->x(), -100.0);
876
877 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
878
879 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
880 QVERIFY(row);
881 QCOMPARE(row->width(), 100.0);
882 QCOMPARE(row->height(), 50.0);
883
884 // test padding
885 row->setProperty(name: "padding", value: 1);
886 row->setProperty(name: "topPadding", value: 2);
887 row->setProperty(name: "leftPadding", value: 3);
888 row->setProperty(name: "rightPadding", value: 4);
889 row->setProperty(name: "bottomPadding", value: 5);
890
891 QTRY_COMPARE(row->width(), 107.0);
892 QCOMPARE(row->height(), 57.0);
893
894 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
895 //Note that this means the duration of the animation is NOT tested
896
897 QTRY_COMPARE(one->x(), 53.0);
898 QTRY_COMPARE(one->y(), 2.0);
899 QTRY_COMPARE(two->isVisible(), false);
900 QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet
901 QTRY_COMPARE(two->y(), 0.0);
902 QTRY_COMPARE(three->x(), 3.0);
903 QTRY_COMPARE(three->y(), 2.0);
904
905 //Add 'two'
906 two->setVisible(true);
907 QTRY_COMPARE(two->isVisible(), true);
908
909 // New size should propagate after visible change
910 QTRY_COMPARE(row->width(), 157.0);
911 QTRY_COMPARE(row->height(), 57.0);
912
913 QTest::qWait(ms: 0);//Let the animation start
914 QVERIFY(one->x() >= 53.0 && one->x() < 100);
915 QVERIFY(two->x() >= -100.0 && two->x() < 53.0);
916
917 QTRY_COMPARE(one->x(), 103.0);
918 QTRY_COMPARE(two->y(), 2.0);
919 QTRY_COMPARE(two->x(), 53.0);
920
921}
922
923void tst_qquickpositioners::test_horizontal_animated_disabled()
924{
925 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated-disabled.qml")));
926
927 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
928 QVERIFY(one != nullptr);
929
930 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
931 QVERIFY(two != nullptr);
932
933 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
934 QVERIFY(three != nullptr);
935
936 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
937 QVERIFY(row);
938
939 qApp->processEvents();
940
941 // test padding
942 row->setProperty(name: "padding", value: 1);
943 row->setProperty(name: "topPadding", value: 2);
944 row->setProperty(name: "leftPadding", value: 3);
945 row->setProperty(name: "rightPadding", value: 4);
946 row->setProperty(name: "bottomPadding", value: 5);
947
948 QTRY_COMPARE(row->width(), 107.0);
949 QCOMPARE(row->height(), 57.0);
950
951 QCOMPARE(one->x(), 3.0);
952 QCOMPARE(one->y(), 2.0);
953 QCOMPARE(two->isVisible(), false);
954 QCOMPARE(two->x(), -100.0);//Not 'in' yet
955 QCOMPARE(two->y(), 0.0);
956 QCOMPARE(three->x(), 53.0);
957 QCOMPARE(three->y(), 2.0);
958
959 //Add 'two'
960 two->setVisible(true);
961 QCOMPARE(two->isVisible(), true);
962 QTRY_COMPARE(row->width(), 157.0);
963 QTRY_COMPARE(row->height(), 57.0);
964
965 QTRY_COMPARE(two->y(), 2.0);
966 QTRY_COMPARE(two->x(), 53.0);
967 QTRY_COMPARE(three->x(), 103.0);
968
969}
970
971void tst_qquickpositioners::test_horizontal_animated_disabled_padding()
972{
973 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "horizontal-animated-disabled.qml")));
974
975 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
976 QVERIFY(one != nullptr);
977
978 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
979 QVERIFY(two != nullptr);
980
981 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
982 QVERIFY(three != nullptr);
983
984 QQuickItem *row = window->rootObject()->findChild<QQuickItem*>(aName: "row");
985 QVERIFY(row);
986
987 qApp->processEvents();
988
989 QCOMPARE(one->x(), 0.0);
990 QCOMPARE(one->y(), 0.0);
991 QCOMPARE(two->isVisible(), false);
992 QCOMPARE(two->x(), -100.0);//Not 'in' yet
993 QCOMPARE(two->y(), 0.0);
994 QCOMPARE(three->x(), 50.0);
995 QCOMPARE(three->y(), 0.0);
996
997 //Add 'two'
998 two->setVisible(true);
999 QCOMPARE(two->isVisible(), true);
1000 QTRY_COMPARE(row->width(), 150.0);
1001 QTRY_COMPARE(row->height(), 50.0);
1002
1003 QTRY_COMPARE(two->x(), 50.0);
1004 QTRY_COMPARE(three->x(), 100.0);
1005
1006}
1007
1008void tst_qquickpositioners::populateTransitions(const QString &positionerObjectName)
1009{
1010 QFETCH(QString, qmlFile);
1011 QFETCH(bool, dynamicallyPopulate);
1012 QFETCH(bool, usePopulateTransition);
1013
1014 QPointF targetItems_transitionFrom(-50, -50);
1015 QPointF displacedItems_transitionVia(100, 100);
1016
1017 QaimModel model;
1018 if (!dynamicallyPopulate) {
1019 for (int i = 0; i < 30; i++)
1020 model.addItem(name: "Original item" + QString::number(i), number: "");
1021 }
1022
1023 QaimModel model_targetItems_transitionFrom;
1024 QaimModel model_displacedItems_transitionVia;
1025
1026 QScopedPointer<QQuickView> window(QQuickViewTestUtil::createView());
1027
1028 window->setInitialProperties({
1029 {"usePopulateTransition", usePopulateTransition},
1030 {"enableAddTransition", true},
1031 {"dynamicallyPopulate", dynamicallyPopulate},
1032 {"testModel", QVariant::fromValue(value: &model)},
1033 {"model_targetItems_transitionFrom", QVariant::fromValue(value: &model_targetItems_transitionFrom)},
1034 {"model_displacedItems_transitionVia", QVariant::fromValue(value: &model_displacedItems_transitionVia)},
1035 {"targetItems_transitionFrom", targetItems_transitionFrom},
1036 {"displacedItems_transitionVia", displacedItems_transitionVia},
1037 {"testedPositioner", positionerObjectName}
1038 });
1039 window->setSource(testFileUrl(fileName: qmlFile));
1040
1041 QQuickItem *positioner = window->rootObject()->findChild<QQuickItem*>(aName: positionerObjectName);
1042 QVERIFY(positioner);
1043 window->show();
1044 QVERIFY(QTest::qWaitForWindowExposed(window.data()));
1045 qApp->processEvents();
1046
1047 if (!dynamicallyPopulate && usePopulateTransition) {
1048 QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), model.count());
1049 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), 0);
1050
1051 QList<QPair<QString, QString> > targetData;
1052 QList<int> targetIndexes;
1053 for (int i=0; i<model.count(); i++) {
1054 targetData << qMakePair(x: model.name(index: i), y: model.number(index: i));
1055 targetIndexes << i;
1056 }
1057 QList<QQuickItem *> targetItems = findItems<QQuickItem>(parent: positioner, objectName: "wrapper", indexes: targetIndexes);
1058 model_targetItems_transitionFrom.matchAgainst(other: targetData, error1: "wasn't animated from target 'from' pos", error2: "shouldn't have been animated from target 'from' pos");
1059 matchItemsAndIndexes(items: window->rootObject()->property(name: "targetTrans_items").toMap(), model, expectedIndexes: targetIndexes);
1060 matchIndexLists(indexLists: window->rootObject()->property(name: "targetTrans_targetIndexes").toList(), expectedIndexes: targetIndexes);
1061 matchItemLists(itemLists: window->rootObject()->property(name: "targetTrans_targetItems").toList(), expectedItems: targetItems);
1062
1063 } else if (dynamicallyPopulate) {
1064 QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0);
1065 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), model.count());
1066 } else {
1067 QVERIFY(QQuickTest::qWaitForItemPolished(positioner));
1068 QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0);
1069 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), 0);
1070 }
1071
1072 checkItemPositions(positioner, model: &model, incrementalSize: window->rootObject()->property(name: "incrementalSize").toInt());
1073
1074 // add an item and check this is done with add transition, not populate
1075 window->rootObject()->setProperty(name: "populateTransitionsDone", value: 0);
1076 window->rootObject()->setProperty(name: "addTransitionsDone", value: 0);
1077 model.insertItem(index: 0, name: "new item", number: "");
1078 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), 1);
1079 QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0);
1080}
1081
1082void tst_qquickpositioners::populateTransitions_data()
1083{
1084 QTest::addColumn<QString>(name: "qmlFile");
1085 QTest::addColumn<bool>(name: "dynamicallyPopulate");
1086 QTest::addColumn<bool>(name: "usePopulateTransition");
1087
1088 QTest::newRow(dataTag: "statically populate") << "transitions.qml" << false << true;
1089 QTest::newRow(dataTag: "statically populate, no populate transition") << "transitions.qml" << false << false;
1090 QTest::newRow(dataTag: "padding, statically populate") << "transitions-padding.qml" << false << true;
1091 QTest::newRow(dataTag: "padding, statically populate, no populate transition") << "transitions-padding.qml" << false << false;
1092
1093 QTest::newRow(dataTag: "dynamically populate") << "transitions.qml" << true << true;
1094 QTest::newRow(dataTag: "dynamically populate, no populate transition") << "transitions.qml" << true << false;
1095 QTest::newRow(dataTag: "padding, dynamically populate") << "transitions-padding.qml" << true << true;
1096 QTest::newRow(dataTag: "padding, dynamically populate, no populate transition") << "transitions-padding.qml" << true << false;
1097}
1098
1099void tst_qquickpositioners::addTransitions(const QString &positionerObjectName)
1100{
1101 QFETCH(QString, qmlFile);
1102 QFETCH(int, initialItemCount);
1103 QFETCH(int, insertionIndex);
1104 QFETCH(int, insertionCount);
1105 QFETCH(ListRange, expectedDisplacedIndexes);
1106
1107 QPointF targetItems_transitionFrom(-50, -50);
1108 QPointF displacedItems_transitionVia(100, 100);
1109
1110 QaimModel model;
1111 QaimModel model_targetItems_transitionFrom;
1112 QaimModel model_displacedItems_transitionVia;
1113
1114 QScopedPointer<QQuickView> window(QQuickViewTestUtil::createView());
1115 window->setInitialProperties({
1116 {"usePopulateTransition", QVariant(false)},
1117 {"enableAddTransition", QVariant(true)},
1118 {"dynamicallyPopulate", QVariant(false)},
1119 {"testModel", QVariant::fromValue(value: &model)},
1120 {"model_targetItems_transitionFrom", QVariant::fromValue(value: &model_targetItems_transitionFrom)},
1121 {"model_displacedItems_transitionVia", QVariant::fromValue(value: &model_displacedItems_transitionVia)},
1122 {"targetItems_transitionFrom", targetItems_transitionFrom},
1123 {"displacedItems_transitionVia", displacedItems_transitionVia},
1124 {"testedPositioner", QString()}
1125 });
1126 window->setSource(testFileUrl(fileName: qmlFile));
1127 window->show();
1128 QVERIFY(QTest::qWaitForWindowExposed(window.data()));
1129 qApp->processEvents();
1130
1131 QQuickItem *positioner = window->rootObject()->findChild<QQuickItem*>(aName: positionerObjectName);
1132 QVERIFY(positioner);
1133 positioner->findChild<QQuickItem*>(aName: "repeater")->setProperty(name: "model", value: QVariant::fromValue(value: &model));
1134 QVERIFY(QQuickTest::qWaitForItemPolished(positioner));
1135
1136 for (int i = 0; i < initialItemCount; i++)
1137 model.addItem(name: "Original item" + QString::number(i), number: "");
1138
1139 QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model);
1140 QList<QPair<QString, QString> > targetData;
1141 QList<int> targetIndexes;
1142 for (int i=0; i<model.count(); i++) {
1143 targetData << qMakePair(x: model.name(index: i), y: model.number(index: i));
1144 targetIndexes << i;
1145 }
1146 QList<QQuickItem *> targetItems = findItems<QQuickItem>(parent: positioner, objectName: "wrapper", indexes: targetIndexes);
1147
1148 // check add transition was run for first lot of added items
1149 QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0);
1150 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), initialItemCount);
1151 QTRY_COMPARE(window->rootObject()->property("displaceTransitionsDone").toInt(), 0);
1152 model_targetItems_transitionFrom.matchAgainst(other: targetData, error1: "wasn't animated from target 'from' pos", error2: "shouldn't have been animated from target 'from' pos");
1153 matchItemsAndIndexes(items: window->rootObject()->property(name: "targetTrans_items").toMap(), model, expectedIndexes: targetIndexes);
1154 matchIndexLists(indexLists: window->rootObject()->property(name: "targetTrans_targetIndexes").toList(), expectedIndexes: targetIndexes);
1155 matchItemLists(itemLists: window->rootObject()->property(name: "targetTrans_targetItems").toList(), expectedItems: targetItems);
1156
1157 model_targetItems_transitionFrom.clear();
1158 window->rootObject()->setProperty(name: "addTransitionsDone", value: 0);
1159 window->rootObject()->setProperty(name: "targetTrans_items", value: QVariantMap());
1160 window->rootObject()->setProperty(name: "targetTrans_targetIndexes", value: QVariantList());
1161 window->rootObject()->setProperty(name: "targetTrans_targetItems", value: QVariantList());
1162
1163 // do insertion
1164 targetData.clear();
1165 targetIndexes.clear();
1166 for (int i=insertionIndex; i<insertionIndex+insertionCount; i++) {
1167 targetData << qMakePair(x: QString("New item %1").arg(a: i), y: QString(""));
1168 targetIndexes << i;
1169 }
1170 model.insertItems(index: insertionIndex, items: targetData);
1171 QTRY_COMPARE(model.count(), positioner->property("count").toInt());
1172
1173 targetItems = findItems<QQuickItem>(parent: positioner, objectName: "wrapper", indexes: targetIndexes);
1174
1175 QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), targetData.count());
1176 QTRY_COMPARE(window->rootObject()->property("displaceTransitionsDone").toInt(), expectedDisplacedIndexes.count());
1177
1178 // check the target and displaced items were animated
1179 model_targetItems_transitionFrom.matchAgainst(other: targetData, error1: "wasn't animated from target 'from' pos", error2: "shouldn't have been animated from target 'from' pos");
1180 model_displacedItems_transitionVia.matchAgainst(other: expectedDisplacedValues, error1: "wasn't animated with displaced anim", error2: "shouldn't have been animated with displaced anim");
1181
1182 // check attached properties
1183 matchItemsAndIndexes(items: window->rootObject()->property(name: "targetTrans_items").toMap(), model, expectedIndexes: targetIndexes);
1184 matchIndexLists(indexLists: window->rootObject()->property(name: "targetTrans_targetIndexes").toList(), expectedIndexes: targetIndexes);
1185 matchItemLists(itemLists: window->rootObject()->property(name: "targetTrans_targetItems").toList(), expectedItems: targetItems);
1186 if (expectedDisplacedIndexes.isValid()) {
1187 // adjust expectedDisplacedIndexes to their final values after the move
1188 QList<int> displacedIndexes = adjustIndexesForAddDisplaced(indexes: expectedDisplacedIndexes.indexes, index: insertionIndex, count: insertionCount);
1189 matchItemsAndIndexes(items: window->rootObject()->property(name: "displacedTrans_items").toMap(), model, expectedIndexes: displacedIndexes);
1190 matchIndexLists(indexLists: window->rootObject()->property(name: "displacedTrans_targetIndexes").toList(), expectedIndexes: targetIndexes);
1191 matchItemLists(itemLists: window->rootObject()->property(name: "displacedTrans_targetItems").toList(), expectedItems: targetItems);
1192 }
1193
1194 checkItemPositions(positioner, model: &model, incrementalSize: window->rootObject()->property(name: "incrementalSize").toInt());
1195}
1196
1197void tst_qquickpositioners::addTransitions_data()
1198{
1199 // If this data changes, update addTransitions_grid_data() also
1200
1201 QTest::addColumn<QString>(name: "qmlFile");
1202 QTest::addColumn<int>(name: "initialItemCount");
1203 QTest::addColumn<int>(name: "insertionIndex");
1204 QTest::addColumn<int>(name: "insertionCount");
1205 QTest::addColumn<ListRange>(name: "expectedDisplacedIndexes");
1206
1207 QTest::newRow(dataTag: "add one @ start") << "transitions.qml" << 10 << 0 << 1 << ListRange(0, 9);
1208 QTest::newRow(dataTag: "add one @ middle") << "transitions.qml" << 10 << 5 << 1 << ListRange(5, 9);
1209 QTest::newRow(dataTag: "add one @ end") << "transitions.qml" << 10 << 10 << 1 << ListRange();
1210 QTest::newRow(dataTag: "padding, add one @ start") << "transitions-padding.qml" << 10 << 0 << 1 << ListRange(0, 9);
1211 QTest::newRow(dataTag: "padding, add one @ middle") << "transitions-padding.qml" << 10 << 5 << 1 << ListRange(5, 9);
1212 QTest::newRow(dataTag: "padding, add one @ end") << "transitions-padding.qml" << 10 << 10 << 1 << ListRange();
1213
1214 QTest::newRow(dataTag: "add multiple @ start") << "transitions.qml" << 10 << 0 << 3 << ListRange(0, 9);
1215 QTest::newRow(dataTag: "add multiple @ middle") << "transitions.qml" << 10 << 5 << 3 << ListRange(5, 9);
1216 QTest::newRow(dataTag: "add multiple @ end") << "transitions.qml" << 10 << 10 << 3 << ListRange();
1217 QTest::newRow(dataTag: "padding, add multiple @ start") << "transitions-padding.qml" << 10 << 0 << 3 << ListRange(0, 9);
1218 QTest::newRow(dataTag: "padding, add multiple @ middle") << "transitions-padding.qml" << 10 << 5 << 3 << ListRange(5, 9);
1219 QTest::newRow(dataTag: "padding, add multiple @ end") << "transitions-padding.qml" << 10 << 10 << 3 << ListRange();
1220}
1221
1222void tst_qquickpositioners::moveTransitions(const QString &positionerObjectName)
1223{
1224 QFETCH(QString, qmlFile);
1225 QFETCH(int, initialItemCount);
1226 QFETCH(ListChange, change);
1227 QFETCH(ListRange, expectedDisplacedIndexes);
1228
1229 QPointF targetItems_transitionFrom(-50, -50);
1230 QPointF displacedItems_transitionVia(100, 100);
1231
1232 QaimModel model;
1233 for (int i = 0; i < initialItemCount; i++)
1234 model.addItem(name: "Item" + QString::number(i), number: "");
1235 QaimModel model_targetItems_transitionFrom;
1236 QaimModel model_displacedItems_transitionVia;
1237
1238 QScopedPointer<QQuickView> window(QQuickViewTestUtil::createView());
1239 window->setInitialProperties({
1240 {"usePopulateTransition", QVariant(false)},
1241 {"enableAddTransition", QVariant(false)},
1242 {"dynamicallyPopulate", QVariant(false)},
1243 {"testModel", QVariant::fromValue(value: &model)},
1244 {"model_targetItems_transitionFrom", QVariant::fromValue(value: &model_targetItems_transitionFrom)},
1245 {"model_displacedItems_transitionVia", QVariant::fromValue(value: &model_displacedItems_transitionVia)},
1246 {"targetItems_transitionFrom", targetItems_transitionFrom},
1247 {"displacedItems_transitionVia", displacedItems_transitionVia},
1248 {"testedPositioner", QString()}
1249 });
1250 window->setSource(testFileUrl(fileName: qmlFile));
1251 window->show();
1252 QVERIFY(QTest::qWaitForWindowExposed(window.data()));
1253 qApp->processEvents();
1254
1255 QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model);
1256
1257 QQuickItem *positioner = window->rootObject()->findChild<QQuickItem*>(aName: positionerObjectName);
1258 QVERIFY(positioner);
1259 positioner->findChild<QQuickItem*>(aName: "repeater")->setProperty(name: "model", value: QVariant::fromValue(value: &model));
1260 QVERIFY(QQuickTest::qWaitForItemPolished(positioner));
1261
1262 switch (change.type) {
1263 case ListChange::Removed:
1264 model.removeItems(index: change.index, count: change.count);
1265 QTRY_COMPARE(model.count(), positioner->property("count").toInt());
1266 break;
1267 case ListChange::Moved:
1268 model.moveItems(from: change.index, to: change.to, count: change.count);
1269 QVERIFY(QQuickTest::qWaitForItemPolished(positioner));
1270 break;
1271 case ListChange::Inserted:
1272 case ListChange::SetCurrent:
1273 case ListChange::SetContentY:
1274 QVERIFY(false);
1275 break;
1276 case ListChange::Polish:
1277 break;
1278 }
1279
1280 QTRY_COMPARE(window->rootObject()->property("displaceTransitionsDone").toInt(), expectedDisplacedIndexes.count());
1281 QCOMPARE(window->rootObject()->property("addTransitionsDone").toInt(), 0);
1282
1283 // check the target and displaced items were animated
1284 QCOMPARE(model_targetItems_transitionFrom.count(), 0);
1285 model_displacedItems_transitionVia.matchAgainst(other: expectedDisplacedValues, error1: "wasn't animated with displaced anim", error2: "shouldn't have been animated with displaced anim");
1286
1287 // check attached properties
1288 QCOMPARE(window->rootObject()->property("targetTrans_items").toMap().count(), 0);
1289 QCOMPARE(window->rootObject()->property("targetTrans_targetIndexes").toList().count(), 0);
1290 QCOMPARE(window->rootObject()->property("targetTrans_targetItems").toList().count(), 0);
1291 if (expectedDisplacedIndexes.isValid()) {
1292 // adjust expectedDisplacedIndexes to their final values after the move
1293 QList<int> displacedIndexes;
1294 if (change.type == ListChange::Inserted)
1295 displacedIndexes = adjustIndexesForAddDisplaced(indexes: expectedDisplacedIndexes.indexes, index: change.index, count: change.count);
1296 else if (change.type == ListChange::Moved)
1297 displacedIndexes = adjustIndexesForMove(indexes: expectedDisplacedIndexes.indexes, from: change.index, to: change.to, count: change.count);
1298 else if (change.type == ListChange::Removed)
1299 displacedIndexes = adjustIndexesForRemoveDisplaced(indexes: expectedDisplacedIndexes.indexes, index: change.index, count: change.count);
1300 else
1301 QVERIFY(false);
1302 matchItemsAndIndexes(items: window->rootObject()->property(name: "displacedTrans_items").toMap(), model, expectedIndexes: displacedIndexes);
1303
1304 QVariantList listOfEmptyIntLists;
1305 for (int i=0; i<displacedIndexes.count(); i++)
1306 listOfEmptyIntLists << QVariant::fromValue(value: QList<int>());
1307 QCOMPARE(window->rootObject()->property("displacedTrans_targetIndexes").toList(), listOfEmptyIntLists);
1308 QVariantList listOfEmptyObjectLists;
1309 for (int i=0; i<displacedIndexes.count(); i++)
1310 listOfEmptyObjectLists.insert(i: listOfEmptyObjectLists.count(), t: QVariantList());
1311 QCOMPARE(window->rootObject()->property("displacedTrans_targetItems").toList(), listOfEmptyObjectLists);
1312 }
1313
1314 checkItemPositions(positioner, model: &model, incrementalSize: window->rootObject()->property(name: "incrementalSize").toInt());
1315}
1316
1317void tst_qquickpositioners::moveTransitions_data()
1318{
1319 // If this data changes, update moveTransitions_grid_data() also
1320
1321 QTest::addColumn<QString>(name: "qmlFile");
1322 QTest::addColumn<int>(name: "initialItemCount");
1323 QTest::addColumn<ListChange>(name: "change");
1324 QTest::addColumn<ListRange>(name: "expectedDisplacedIndexes");
1325
1326 QTest::newRow(dataTag: "remove one @ start") << "transitions.qml" << 10 << ListChange::remove(index: 0, count: 1) << ListRange(1, 9);
1327 QTest::newRow(dataTag: "remove one @ middle") << "transitions.qml" << 10 << ListChange::remove(index: 4, count: 1) << ListRange(5, 9);
1328 QTest::newRow(dataTag: "remove one @ end") << "transitions.qml" << 10 << ListChange::remove(index: 9, count: 1) << ListRange();
1329 QTest::newRow(dataTag: "padding, remove one @ start") << "transitions-padding.qml" << 10 << ListChange::remove(index: 0, count: 1) << ListRange(1, 9);
1330 QTest::newRow(dataTag: "padding, remove one @ middle") << "transitions-padding.qml" << 10 << ListChange::remove(index: 4, count: 1) << ListRange(5, 9);
1331 QTest::newRow(dataTag: "padding, remove one @ end") << "transitions-padding.qml" << 10 << ListChange::remove(index: 9, count: 1) << ListRange();
1332
1333 QTest::newRow(dataTag: "remove multiple @ start") << "transitions.qml" << 10 << ListChange::remove(index: 0, count: 3) << ListRange(3, 9);
1334 QTest::newRow(dataTag: "remove multiple @ middle") << "transitions.qml" << 10 << ListChange::remove(index: 4, count: 3) << ListRange(7, 9);
1335 QTest::newRow(dataTag: "remove multiple @ end") << "transitions.qml" << 10 << ListChange::remove(index: 7, count: 3) << ListRange();
1336 QTest::newRow(dataTag: "padding, remove multiple @ start") << "transitions-padding.qml" << 10 << ListChange::remove(index: 0, count: 3) << ListRange(3, 9);
1337 QTest::newRow(dataTag: "padding, remove multiple @ middle") << "transitions-padding.qml" << 10 << ListChange::remove(index: 4, count: 3) << ListRange(7, 9);
1338 QTest::newRow(dataTag: "padding, remove multiple @ end") << "transitions-padding.qml" << 10 << ListChange::remove(index: 7, count: 3) << ListRange();
1339}
1340
1341void tst_qquickpositioners::checkItemPositions(QQuickItem *positioner, QaimModel *model, qreal incrementalSize)
1342{
1343 QVERIFY(model->count() > 0);
1344
1345 QQuickBasePositioner *p = qobject_cast<QQuickBasePositioner*>(object: positioner);
1346
1347 qreal padding = 0;
1348 qreal currentSize = 30;
1349 qreal rowX = p->leftPadding();
1350 qreal rowY = p->topPadding();
1351
1352 for (int i=0; i<model->count(); ++i) {
1353 QQuickItem *item = findItem<QQuickItem>(parent: positioner, objectName: "wrapper", index: i);
1354 QVERIFY2(item, QTest::toString(QString("Item %1 not found").arg(i)));
1355
1356 QCOMPARE(item->width(), currentSize);
1357 QCOMPARE(item->height(), currentSize);
1358
1359 if (qobject_cast<QQuickRow*>(object: positioner)) {
1360 QCOMPARE(item->x(), (i * 30.0) + padding + p->leftPadding());
1361 QCOMPARE(item->y(), p->topPadding());
1362 } else if (qobject_cast<QQuickColumn*>(object: positioner)) {
1363 QCOMPARE(item->x(), p->leftPadding());
1364 QCOMPARE(item->y(), (i * 30.0) + padding + p->topPadding());
1365 } else if (qobject_cast<QQuickGrid*>(object: positioner)) {
1366 int columns = 4;
1367 int rows = qCeil(v: model->count() / qreal(columns));
1368 int lastMatchingRowIndex = (rows * columns) - (columns - i%columns);
1369 if (lastMatchingRowIndex >= model->count())
1370 lastMatchingRowIndex -= columns;
1371 if (i % columns > 0) {
1372 QQuickItem *finalAlignedRowItem = findItem<QQuickItem>(parent: positioner, objectName: "wrapper", index: lastMatchingRowIndex);
1373 QVERIFY(finalAlignedRowItem);
1374 QCOMPARE(item->x(), finalAlignedRowItem->x());
1375 } else {
1376 QCOMPARE(item->x(), p->leftPadding());
1377 }
1378 if (i / columns > 0) {
1379 QQuickItem *prevRowLastItem = findItem<QQuickItem>(parent: positioner, objectName: "wrapper", index: (i/columns * columns) - 1);
1380 QVERIFY(prevRowLastItem);
1381 QCOMPARE(item->y(), prevRowLastItem->y() + prevRowLastItem->height());
1382 } else {
1383 QCOMPARE(item->y(), p->topPadding());
1384 }
1385 } else if (qobject_cast<QQuickFlow*>(object: positioner)) {
1386 if (rowX + item->width() > positioner->width()) {
1387 QQuickItem *prevItem = findItem<QQuickItem>(parent: positioner, objectName: "wrapper", index: i-1);
1388 QVERIFY(prevItem);
1389 rowX = p->leftPadding();
1390 rowY = prevItem->y() + prevItem->height();
1391 }
1392 QCOMPARE(item->x(), rowX);
1393 QCOMPARE(item->y(), rowY);
1394 rowX += item->width();
1395 } else {
1396 QVERIFY2(false, "Unknown positioner type");
1397 }
1398 QQuickText *name = findItem<QQuickText>(parent: positioner, objectName: "name", index: i);
1399 QVERIFY(name != nullptr);
1400 QTRY_COMPARE(name->text(), model->name(i));
1401
1402 padding += i * incrementalSize;
1403 currentSize += incrementalSize;
1404 }
1405}
1406
1407void tst_qquickpositioners::test_vertical()
1408{
1409 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "vertical.qml")));
1410
1411 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1412 QVERIFY(one != nullptr);
1413
1414 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1415 QVERIFY(two != nullptr);
1416
1417 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1418 QVERIFY(three != nullptr);
1419
1420 QCOMPARE(one->x(), 0.0);
1421 QCOMPARE(one->y(), 0.0);
1422 QCOMPARE(two->x(), 0.0);
1423 QCOMPARE(two->y(), 50.0);
1424 QCOMPARE(three->x(), 0.0);
1425 QCOMPARE(three->y(), 60.0);
1426
1427 QQuickItem *column = window->rootObject()->findChild<QQuickItem*>(aName: "column");
1428 QVERIFY(column);
1429 QCOMPARE(column->height(), 80.0);
1430 QCOMPARE(column->width(), 50.0);
1431
1432 // test padding
1433 column->setProperty(name: "padding", value: 1);
1434 column->setProperty(name: "topPadding", value: 2);
1435 column->setProperty(name: "leftPadding", value: 3);
1436 column->setProperty(name: "rightPadding", value: 4);
1437 column->setProperty(name: "bottomPadding", value: 5);
1438
1439 QTRY_COMPARE(column->height(), 87.0);
1440 QCOMPARE(column->width(), 57.0);
1441
1442 QCOMPARE(one->x(), 3.0);
1443 QCOMPARE(one->y(), 2.0);
1444 QCOMPARE(two->x(), 3.0);
1445 QCOMPARE(two->y(), 52.0);
1446 QCOMPARE(three->x(), 3.0);
1447 QCOMPARE(three->y(), 62.0);
1448}
1449
1450void tst_qquickpositioners::test_vertical_padding()
1451{
1452 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "vertical.qml")));
1453
1454 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1455 QVERIFY(one != nullptr);
1456
1457 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1458 QVERIFY(two != nullptr);
1459
1460 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1461 QVERIFY(three != nullptr);
1462
1463 QCOMPARE(one->x(), 0.0);
1464 QCOMPARE(one->y(), 0.0);
1465 QCOMPARE(two->x(), 0.0);
1466 QCOMPARE(two->y(), 50.0);
1467 QCOMPARE(three->x(), 0.0);
1468 QCOMPARE(three->y(), 60.0);
1469
1470 QQuickItem *column = window->rootObject()->findChild<QQuickItem*>(aName: "column");
1471 QVERIFY(column);
1472 QCOMPARE(column->height(), 80.0);
1473 QCOMPARE(column->width(), 50.0);
1474
1475 QQuickColumn *obj = qobject_cast<QQuickColumn*>(object: column);
1476 QVERIFY(obj != nullptr);
1477
1478 QCOMPARE(column->property("padding").toDouble(), 0.0);
1479 QCOMPARE(column->property("topPadding").toDouble(), 0.0);
1480 QCOMPARE(column->property("leftPadding").toDouble(), 0.0);
1481 QCOMPARE(column->property("rightPadding").toDouble(), 0.0);
1482 QCOMPARE(column->property("bottomPadding").toDouble(), 0.0);
1483
1484 obj->setPadding(1.0);
1485
1486 QCOMPARE(column->property("padding").toDouble(), 1.0);
1487 QCOMPARE(column->property("topPadding").toDouble(), 1.0);
1488 QCOMPARE(column->property("leftPadding").toDouble(), 1.0);
1489 QCOMPARE(column->property("rightPadding").toDouble(), 1.0);
1490 QCOMPARE(column->property("bottomPadding").toDouble(), 1.0);
1491
1492 QTRY_COMPARE(column->height(), 82.0);
1493 QCOMPARE(column->width(), 52.0);
1494
1495 QCOMPARE(one->x(), 1.0);
1496 QCOMPARE(one->y(), 1.0);
1497 QCOMPARE(two->x(), 1.0);
1498 QCOMPARE(two->y(), 51.0);
1499 QCOMPARE(three->x(), 1.0);
1500 QCOMPARE(three->y(), 61.0);
1501
1502 obj->setTopPadding(2.0);
1503
1504 QCOMPARE(column->property("padding").toDouble(), 1.0);
1505 QCOMPARE(column->property("topPadding").toDouble(), 2.0);
1506 QCOMPARE(column->property("leftPadding").toDouble(), 1.0);
1507 QCOMPARE(column->property("rightPadding").toDouble(), 1.0);
1508 QCOMPARE(column->property("bottomPadding").toDouble(), 1.0);
1509
1510 QTRY_COMPARE(column->height(), 83.0);
1511 QCOMPARE(column->width(), 52.0);
1512
1513 QCOMPARE(one->x(), 1.0);
1514 QCOMPARE(one->y(), 2.0);
1515 QCOMPARE(two->x(), 1.0);
1516 QCOMPARE(two->y(), 52.0);
1517 QCOMPARE(three->x(), 1.0);
1518 QCOMPARE(three->y(), 62.0);
1519
1520 obj->setLeftPadding(3.0);
1521
1522 QCOMPARE(column->property("padding").toDouble(), 1.0);
1523 QCOMPARE(column->property("topPadding").toDouble(), 2.0);
1524 QCOMPARE(column->property("leftPadding").toDouble(), 3.0);
1525 QCOMPARE(column->property("rightPadding").toDouble(), 1.0);
1526 QCOMPARE(column->property("bottomPadding").toDouble(), 1.0);
1527
1528 QTRY_COMPARE(column->width(), 54.0);
1529 QCOMPARE(column->height(), 83.0);
1530
1531 QCOMPARE(one->x(), 3.0);
1532 QCOMPARE(one->y(), 2.0);
1533 QCOMPARE(two->x(), 3.0);
1534 QCOMPARE(two->y(), 52.0);
1535 QCOMPARE(three->x(), 3.0);
1536 QCOMPARE(three->y(), 62.0);
1537
1538 obj->setRightPadding(4.0);
1539
1540 QCOMPARE(column->property("padding").toDouble(), 1.0);
1541 QCOMPARE(column->property("topPadding").toDouble(), 2.0);
1542 QCOMPARE(column->property("leftPadding").toDouble(), 3.0);
1543 QCOMPARE(column->property("rightPadding").toDouble(), 4.0);
1544 QCOMPARE(column->property("bottomPadding").toDouble(), 1.0);
1545
1546 QTRY_COMPARE(column->width(), 57.0);
1547 QCOMPARE(column->height(), 83.0);
1548
1549 QCOMPARE(one->x(), 3.0);
1550 QCOMPARE(one->y(), 2.0);
1551 QCOMPARE(two->x(), 3.0);
1552 QCOMPARE(two->y(), 52.0);
1553 QCOMPARE(three->x(), 3.0);
1554 QCOMPARE(three->y(), 62.0);
1555
1556 obj->setBottomPadding(5.0);
1557
1558 QCOMPARE(column->property("padding").toDouble(), 1.0);
1559 QCOMPARE(column->property("topPadding").toDouble(), 2.0);
1560 QCOMPARE(column->property("leftPadding").toDouble(), 3.0);
1561 QCOMPARE(column->property("rightPadding").toDouble(), 4.0);
1562 QCOMPARE(column->property("bottomPadding").toDouble(), 5.0);
1563
1564 QTRY_COMPARE(column->height(), 87.0);
1565 QCOMPARE(column->width(), 57.0);
1566
1567 QCOMPARE(one->x(), 3.0);
1568 QCOMPARE(one->y(), 2.0);
1569 QCOMPARE(two->x(), 3.0);
1570 QCOMPARE(two->y(), 52.0);
1571 QCOMPARE(three->x(), 3.0);
1572 QCOMPARE(three->y(), 62.0);
1573
1574 obj->resetBottomPadding();
1575 QCOMPARE(column->property("bottomPadding").toDouble(), 1.0);
1576 QTRY_COMPARE(column->height(), 83.0);
1577 QCOMPARE(column->width(), 57.0);
1578
1579 obj->resetRightPadding();
1580 QCOMPARE(column->property("rightPadding").toDouble(), 1.0);
1581 QTRY_COMPARE(column->width(), 54.0);
1582 QCOMPARE(column->height(), 83.0);
1583
1584 obj->resetLeftPadding();
1585 QCOMPARE(column->property("leftPadding").toDouble(), 1.0);
1586 QTRY_COMPARE(column->width(), 52.0);
1587 QCOMPARE(column->height(), 83.0);
1588
1589 obj->resetTopPadding();
1590 QCOMPARE(column->property("topPadding").toDouble(), 1.0);
1591 QTRY_COMPARE(column->height(), 82.0);
1592 QCOMPARE(column->width(), 52.0);
1593
1594 obj->resetPadding();
1595 QCOMPARE(column->property("padding").toDouble(), 0.0);
1596 QCOMPARE(column->property("topPadding").toDouble(), 0.0);
1597 QCOMPARE(column->property("leftPadding").toDouble(), 0.0);
1598 QCOMPARE(column->property("rightPadding").toDouble(), 0.0);
1599 QCOMPARE(column->property("bottomPadding").toDouble(), 0.0);
1600 QTRY_COMPARE(column->height(), 80.0);
1601 QCOMPARE(column->width(), 50.0);
1602
1603 QCOMPARE(one->x(), 0.0);
1604 QCOMPARE(one->y(), 0.0);
1605 QCOMPARE(two->x(), 0.0);
1606 QCOMPARE(two->y(), 50.0);
1607 QCOMPARE(three->x(), 0.0);
1608 QCOMPARE(three->y(), 60.0);
1609}
1610
1611void tst_qquickpositioners::test_vertical_spacing()
1612{
1613 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "vertical-spacing.qml")));
1614
1615 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1616 QVERIFY(one != nullptr);
1617
1618 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1619 QVERIFY(two != nullptr);
1620
1621 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1622 QVERIFY(three != nullptr);
1623
1624 QCOMPARE(one->x(), 0.0);
1625 QCOMPARE(one->y(), 0.0);
1626 QCOMPARE(two->x(), 0.0);
1627 QCOMPARE(two->y(), 60.0);
1628 QCOMPARE(three->x(), 0.0);
1629 QCOMPARE(three->y(), 80.0);
1630
1631 QQuickItem *column = window->rootObject()->findChild<QQuickItem*>(aName: "column");
1632 QCOMPARE(column->height(), 100.0);
1633 QCOMPARE(column->width(), 50.0);
1634
1635 // test padding
1636 column->setProperty(name: "padding", value: 1);
1637 column->setProperty(name: "topPadding", value: 2);
1638 column->setProperty(name: "leftPadding", value: 3);
1639 column->setProperty(name: "rightPadding", value: 4);
1640 column->setProperty(name: "bottomPadding", value: 5);
1641
1642 QTRY_COMPARE(column->height(), 107.0);
1643 QCOMPARE(column->width(), 57.0);
1644
1645 QCOMPARE(one->x(), 3.0);
1646 QCOMPARE(one->y(), 2.0);
1647 QCOMPARE(two->x(), 3.0);
1648 QCOMPARE(two->y(), 62.0);
1649 QCOMPARE(three->x(), 3.0);
1650 QCOMPARE(three->y(), 82.0);
1651}
1652
1653void tst_qquickpositioners::test_vertical_animated()
1654{
1655 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "vertical-animated.qml"), wait: false));
1656
1657 //Note that they animate in
1658 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1659 QVERIFY(one != nullptr);
1660 QCOMPARE(one->y(), -100.0);
1661
1662 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1663 QVERIFY(two != nullptr);
1664 QCOMPARE(two->y(), -100.0);
1665
1666 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1667 QVERIFY(three != nullptr);
1668 QCOMPARE(three->y(), -100.0);
1669
1670 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
1671
1672 QQuickItem *column = window->rootObject()->findChild<QQuickItem*>(aName: "column");
1673 QVERIFY(column);
1674 QCOMPARE(column->height(), 100.0);
1675 QCOMPARE(column->width(), 50.0);
1676
1677 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
1678 //Note that this means the duration of the animation is NOT tested
1679
1680 QTRY_COMPARE(one->y(), 0.0);
1681 QTRY_COMPARE(one->x(), 0.0);
1682 QTRY_COMPARE(two->isVisible(), false);
1683 QTRY_COMPARE(two->y(), -100.0);//Not 'in' yet
1684 QTRY_COMPARE(two->x(), 0.0);
1685 QTRY_COMPARE(three->y(), 50.0);
1686 QTRY_COMPARE(three->x(), 0.0);
1687
1688 //Add 'two'
1689 two->setVisible(true);
1690 QTRY_COMPARE(two->isVisible(), true);
1691 QTRY_COMPARE(column->height(), 150.0);
1692 QTRY_COMPARE(column->width(), 50.0);
1693 QTest::qWait(ms: 0);//Let the animation start
1694 QVERIFY(two->y() >= -100.0 && two->y() < 50.0);
1695 QVERIFY(three->y() >= 50.0 && three->y() < 100.0);
1696
1697 QTRY_COMPARE(two->y(), 50.0);
1698 QTRY_COMPARE(three->y(), 100.0);
1699
1700}
1701
1702void tst_qquickpositioners::test_vertical_animated_padding()
1703{
1704 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "vertical-animated.qml"), wait: false));
1705
1706 //Note that they animate in
1707 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1708 QVERIFY(one != nullptr);
1709 QCOMPARE(one->y(), -100.0);
1710
1711 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1712 QVERIFY(two != nullptr);
1713 QCOMPARE(two->y(), -100.0);
1714
1715 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1716 QVERIFY(three != nullptr);
1717 QCOMPARE(three->y(), -100.0);
1718
1719 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
1720
1721 QQuickItem *column = window->rootObject()->findChild<QQuickItem*>(aName: "column");
1722 QVERIFY(column);
1723 QCOMPARE(column->height(), 100.0);
1724 QCOMPARE(column->width(), 50.0);
1725
1726 // test padding
1727 column->setProperty(name: "padding", value: 1);
1728 column->setProperty(name: "topPadding", value: 2);
1729 column->setProperty(name: "leftPadding", value: 3);
1730 column->setProperty(name: "rightPadding", value: 4);
1731 column->setProperty(name: "bottomPadding", value: 5);
1732
1733 QTRY_COMPARE(column->height(), 107.0);
1734 QCOMPARE(column->width(), 57.0);
1735
1736 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
1737 //Note that this means the duration of the animation is NOT tested
1738
1739 QTRY_COMPARE(one->y(), 2.0);
1740 QTRY_COMPARE(one->x(), 3.0);
1741 QTRY_COMPARE(two->isVisible(), false);
1742 QTRY_COMPARE(two->y(), -100.0);//Not 'in' yet
1743 QTRY_COMPARE(two->x(), 0.0);
1744 QTRY_COMPARE(three->y(), 52.0);
1745 QTRY_COMPARE(three->x(), 3.0);
1746
1747 //Add 'two'
1748 two->setVisible(true);
1749 QTRY_COMPARE(two->isVisible(), true);
1750 QTRY_COMPARE(column->height(), 157.0);
1751 QTRY_COMPARE(column->width(), 57.0);
1752 QTest::qWait(ms: 0);//Let the animation start
1753 QVERIFY(two->y() >= -100.0 && two->y() < 52.0);
1754 QVERIFY(three->y() >= 52.0 && three->y() < 102.0);
1755
1756 QTRY_COMPARE(two->x(), 3.0);
1757 QTRY_COMPARE(two->y(), 52.0);
1758 QTRY_COMPARE(three->y(), 102.0);
1759
1760}
1761
1762void tst_qquickpositioners::test_grid()
1763{
1764 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
1765
1766 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1767 QVERIFY(one != nullptr);
1768 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1769 QVERIFY(two != nullptr);
1770 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1771 QVERIFY(three != nullptr);
1772 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
1773 QVERIFY(four != nullptr);
1774 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
1775 QVERIFY(five != nullptr);
1776
1777 QCOMPARE(one->x(), 0.0);
1778 QCOMPARE(one->y(), 0.0);
1779 QCOMPARE(two->x(), 50.0);
1780 QCOMPARE(two->y(), 0.0);
1781 QCOMPARE(three->x(), 70.0);
1782 QCOMPARE(three->y(), 0.0);
1783 QCOMPARE(four->x(), 0.0);
1784 QCOMPARE(four->y(), 50.0);
1785 QCOMPARE(five->x(), 50.0);
1786 QCOMPARE(five->y(), 50.0);
1787
1788 QQuickGrid *grid = window->rootObject()->findChild<QQuickGrid*>(aName: "grid");
1789 QCOMPARE(grid->flow(), QQuickGrid::LeftToRight);
1790 QCOMPARE(grid->width(), 100.0);
1791 QCOMPARE(grid->height(), 100.0);
1792
1793 // test padding
1794 grid->setProperty(name: "padding", value: 1);
1795 grid->setProperty(name: "topPadding", value: 2);
1796 grid->setProperty(name: "leftPadding", value: 3);
1797 grid->setProperty(name: "rightPadding", value: 4);
1798 grid->setProperty(name: "bottomPadding", value: 5);
1799
1800 QTRY_COMPARE(grid->width(), 107.0);
1801 QCOMPARE(grid->height(), 107.0);
1802
1803 QCOMPARE(one->x(), 3.0);
1804 QCOMPARE(one->y(), 2.0);
1805 QCOMPARE(two->x(), 53.0);
1806 QCOMPARE(two->y(), 2.0);
1807 QCOMPARE(three->x(), 73.0);
1808 QCOMPARE(three->y(), 2.0);
1809 QCOMPARE(four->x(), 3.0);
1810 QCOMPARE(four->y(), 52.0);
1811 QCOMPARE(five->x(), 53.0);
1812 QCOMPARE(five->y(), 52.0);
1813}
1814
1815void tst_qquickpositioners::test_grid_padding()
1816{
1817 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
1818
1819 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
1820 QVERIFY(one != nullptr);
1821 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
1822 QVERIFY(two != nullptr);
1823 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
1824 QVERIFY(three != nullptr);
1825 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
1826 QVERIFY(four != nullptr);
1827 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
1828 QVERIFY(five != nullptr);
1829
1830 QCOMPARE(one->x(), 0.0);
1831 QCOMPARE(one->y(), 0.0);
1832 QCOMPARE(two->x(), 50.0);
1833 QCOMPARE(two->y(), 0.0);
1834 QCOMPARE(three->x(), 70.0);
1835 QCOMPARE(three->y(), 0.0);
1836 QCOMPARE(four->x(), 0.0);
1837 QCOMPARE(four->y(), 50.0);
1838 QCOMPARE(five->x(), 50.0);
1839 QCOMPARE(five->y(), 50.0);
1840
1841 QQuickGrid *grid = window->rootObject()->findChild<QQuickGrid*>(aName: "grid");
1842 QCOMPARE(grid->flow(), QQuickGrid::LeftToRight);
1843 QCOMPARE(grid->width(), 100.0);
1844 QCOMPARE(grid->height(), 100.0);
1845
1846 QCOMPARE(grid->property("padding").toDouble(), 0.0);
1847 QCOMPARE(grid->property("topPadding").toDouble(), 0.0);
1848 QCOMPARE(grid->property("leftPadding").toDouble(), 0.0);
1849 QCOMPARE(grid->property("rightPadding").toDouble(), 0.0);
1850 QCOMPARE(grid->property("bottomPadding").toDouble(), 0.0);
1851
1852 grid->setPadding(1.0);
1853
1854 QCOMPARE(grid->property("padding").toDouble(), 1.0);
1855 QCOMPARE(grid->property("topPadding").toDouble(), 1.0);
1856 QCOMPARE(grid->property("leftPadding").toDouble(), 1.0);
1857 QCOMPARE(grid->property("rightPadding").toDouble(), 1.0);
1858 QCOMPARE(grid->property("bottomPadding").toDouble(), 1.0);
1859
1860 QTRY_COMPARE(grid->width(), 102.0);
1861 QCOMPARE(grid->height(), 102.0);
1862
1863 QCOMPARE(one->x(), 1.0);
1864 QCOMPARE(one->y(), 1.0);
1865 QCOMPARE(two->x(), 51.0);
1866 QCOMPARE(two->y(), 1.0);
1867 QCOMPARE(three->x(), 71.0);
1868 QCOMPARE(three->y(), 1.0);
1869 QCOMPARE(four->x(), 1.0);
1870 QCOMPARE(four->y(), 51.0);
1871 QCOMPARE(five->x(), 51.0);
1872 QCOMPARE(five->y(), 51.0);
1873
1874 grid->setTopPadding(2.0);
1875
1876 QCOMPARE(grid->property("padding").toDouble(), 1.0);
1877 QCOMPARE(grid->property("topPadding").toDouble(), 2.0);
1878 QCOMPARE(grid->property("leftPadding").toDouble(), 1.0);
1879 QCOMPARE(grid->property("rightPadding").toDouble(), 1.0);
1880 QCOMPARE(grid->property("bottomPadding").toDouble(), 1.0);
1881
1882 QTRY_COMPARE(grid->height(), 103.0);
1883 QCOMPARE(grid->width(), 102.0);
1884
1885 QCOMPARE(one->x(), 1.0);
1886 QCOMPARE(one->y(), 2.0);
1887 QCOMPARE(two->x(), 51.0);
1888 QCOMPARE(two->y(), 2.0);
1889 QCOMPARE(three->x(), 71.0);
1890 QCOMPARE(three->y(), 2.0);
1891 QCOMPARE(four->x(), 1.0);
1892 QCOMPARE(four->y(), 52.0);
1893 QCOMPARE(five->x(), 51.0);
1894 QCOMPARE(five->y(), 52.0);
1895
1896 grid->setLeftPadding(3.0);
1897
1898 QCOMPARE(grid->property("padding").toDouble(), 1.0);
1899 QCOMPARE(grid->property("topPadding").toDouble(), 2.0);
1900 QCOMPARE(grid->property("leftPadding").toDouble(), 3.0);
1901 QCOMPARE(grid->property("rightPadding").toDouble(), 1.0);
1902 QCOMPARE(grid->property("bottomPadding").toDouble(), 1.0);
1903
1904 QTRY_COMPARE(grid->width(), 104.0);
1905 QCOMPARE(grid->height(), 103.0);
1906
1907 QCOMPARE(one->x(), 3.0);
1908 QCOMPARE(one->y(), 2.0);
1909 QCOMPARE(two->x(), 53.0);
1910 QCOMPARE(two->y(), 2.0);
1911 QCOMPARE(three->x(), 73.0);
1912 QCOMPARE(three->y(), 2.0);
1913 QCOMPARE(four->x(), 3.0);
1914 QCOMPARE(four->y(), 52.0);
1915 QCOMPARE(five->x(), 53.0);
1916 QCOMPARE(five->y(), 52.0);
1917
1918 grid->setRightPadding(4.0);
1919
1920 QCOMPARE(grid->property("padding").toDouble(), 1.0);
1921 QCOMPARE(grid->property("topPadding").toDouble(), 2.0);
1922 QCOMPARE(grid->property("leftPadding").toDouble(), 3.0);
1923 QCOMPARE(grid->property("rightPadding").toDouble(), 4.0);
1924 QCOMPARE(grid->property("bottomPadding").toDouble(), 1.0);
1925
1926 QTRY_COMPARE(grid->width(), 107.0);
1927 QCOMPARE(grid->height(), 103.0);
1928
1929 QCOMPARE(one->x(), 3.0);
1930 QCOMPARE(one->y(), 2.0);
1931 QCOMPARE(two->x(), 53.0);
1932 QCOMPARE(two->y(), 2.0);
1933 QCOMPARE(three->x(), 73.0);
1934 QCOMPARE(three->y(), 2.0);
1935 QCOMPARE(four->x(), 3.0);
1936 QCOMPARE(four->y(), 52.0);
1937 QCOMPARE(five->x(), 53.0);
1938 QCOMPARE(five->y(), 52.0);
1939
1940 grid->setBottomPadding(5.0);
1941
1942 QCOMPARE(grid->property("padding").toDouble(), 1.0);
1943 QCOMPARE(grid->property("topPadding").toDouble(), 2.0);
1944 QCOMPARE(grid->property("leftPadding").toDouble(), 3.0);
1945 QCOMPARE(grid->property("rightPadding").toDouble(), 4.0);
1946 QCOMPARE(grid->property("bottomPadding").toDouble(), 5.0);
1947
1948 QTRY_COMPARE(grid->height(), 107.0);
1949 QCOMPARE(grid->width(), 107.0);
1950
1951 QCOMPARE(one->x(), 3.0);
1952 QCOMPARE(one->y(), 2.0);
1953 QCOMPARE(two->x(), 53.0);
1954 QCOMPARE(two->y(), 2.0);
1955 QCOMPARE(three->x(), 73.0);
1956 QCOMPARE(three->y(), 2.0);
1957 QCOMPARE(four->x(), 3.0);
1958 QCOMPARE(four->y(), 52.0);
1959 QCOMPARE(five->x(), 53.0);
1960 QCOMPARE(five->y(), 52.0);
1961
1962 grid->resetBottomPadding();
1963 QCOMPARE(grid->property("bottomPadding").toDouble(), 1.0);
1964 QTRY_COMPARE(grid->height(), 103.0);
1965 QCOMPARE(grid->width(), 107.0);
1966
1967 grid->resetRightPadding();
1968 QCOMPARE(grid->property("rightPadding").toDouble(), 1.0);
1969 QTRY_COMPARE(grid->width(), 104.0);
1970 QCOMPARE(grid->height(), 103.0);
1971
1972 grid->resetLeftPadding();
1973 QCOMPARE(grid->property("leftPadding").toDouble(), 1.0);
1974 QTRY_COMPARE(grid->width(), 102.0);
1975 QCOMPARE(grid->height(), 103.0);
1976
1977 grid->resetTopPadding();
1978 QCOMPARE(grid->property("topPadding").toDouble(), 1.0);
1979 QTRY_COMPARE(grid->height(), 102.0);
1980 QCOMPARE(grid->width(), 102.0);
1981
1982 grid->resetPadding();
1983 QCOMPARE(grid->property("padding").toDouble(), 0.0);
1984 QCOMPARE(grid->property("topPadding").toDouble(), 0.0);
1985 QCOMPARE(grid->property("leftPadding").toDouble(), 0.0);
1986 QCOMPARE(grid->property("rightPadding").toDouble(), 0.0);
1987 QCOMPARE(grid->property("bottomPadding").toDouble(), 0.0);
1988 QTRY_COMPARE(grid->height(), 100.0);
1989 QCOMPARE(grid->width(), 100.0);
1990
1991 QCOMPARE(one->x(), 0.0);
1992 QCOMPARE(one->y(), 0.0);
1993 QCOMPARE(two->x(), 50.0);
1994 QCOMPARE(two->y(), 0.0);
1995 QCOMPARE(three->x(), 70.0);
1996 QCOMPARE(three->y(), 0.0);
1997 QCOMPARE(four->x(), 0.0);
1998 QCOMPARE(four->y(), 50.0);
1999 QCOMPARE(five->x(), 50.0);
2000 QCOMPARE(five->y(), 50.0);
2001}
2002
2003void tst_qquickpositioners::test_grid_topToBottom()
2004{
2005 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-toptobottom.qml")));
2006
2007 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2008 QVERIFY(one != nullptr);
2009 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2010 QVERIFY(two != nullptr);
2011 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2012 QVERIFY(three != nullptr);
2013 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2014 QVERIFY(four != nullptr);
2015 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2016 QVERIFY(five != nullptr);
2017
2018 QCOMPARE(one->x(), 0.0);
2019 QCOMPARE(one->y(), 0.0);
2020 QCOMPARE(two->x(), 0.0);
2021 QCOMPARE(two->y(), 50.0);
2022 QCOMPARE(three->x(), 0.0);
2023 QCOMPARE(three->y(), 100.0);
2024 QCOMPARE(four->x(), 50.0);
2025 QCOMPARE(four->y(), 0.0);
2026 QCOMPARE(five->x(), 50.0);
2027 QCOMPARE(five->y(), 50.0);
2028
2029 QQuickGrid *grid = window->rootObject()->findChild<QQuickGrid*>(aName: "grid");
2030 QCOMPARE(grid->flow(), QQuickGrid::TopToBottom);
2031 QCOMPARE(grid->width(), 100.0);
2032 QCOMPARE(grid->height(), 120.0);
2033
2034 // test padding
2035 grid->setProperty(name: "padding", value: 1);
2036 grid->setProperty(name: "topPadding", value: 2);
2037 grid->setProperty(name: "leftPadding", value: 3);
2038 grid->setProperty(name: "rightPadding", value: 4);
2039 grid->setProperty(name: "bottomPadding", value: 5);
2040
2041 QTRY_COMPARE(grid->width(), 107.0);
2042 QCOMPARE(grid->height(), 127.0);
2043
2044 QCOMPARE(one->x(), 3.0);
2045 QCOMPARE(one->y(), 2.0);
2046 QCOMPARE(two->x(), 3.0);
2047 QCOMPARE(two->y(), 52.0);
2048 QCOMPARE(three->x(), 3.0);
2049 QCOMPARE(three->y(), 102.0);
2050 QCOMPARE(four->x(), 53.0);
2051 QCOMPARE(four->y(), 2.0);
2052 QCOMPARE(five->x(), 53.0);
2053 QCOMPARE(five->y(), 52.0);
2054}
2055
2056void tst_qquickpositioners::test_grid_rightToLeft()
2057{
2058 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
2059
2060 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
2061
2062 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2063 QVERIFY(one != nullptr);
2064 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2065 QVERIFY(two != nullptr);
2066 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2067 QVERIFY(three != nullptr);
2068 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2069 QVERIFY(four != nullptr);
2070 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2071 QVERIFY(five != nullptr);
2072
2073 QCOMPARE(one->x(), 50.0);
2074 QCOMPARE(one->y(), 0.0);
2075 QCOMPARE(two->x(), 30.0);
2076 QCOMPARE(two->y(), 0.0);
2077 QCOMPARE(three->x(), 0.0);
2078 QCOMPARE(three->y(), 0.0);
2079 QCOMPARE(four->x(), 50.0);
2080 QCOMPARE(four->y(), 50.0);
2081 QCOMPARE(five->x(), 40.0);
2082 QCOMPARE(five->y(), 50.0);
2083
2084 QQuickGrid *grid = window->rootObject()->findChild<QQuickGrid*>(aName: "grid");
2085 QCOMPARE(grid->layoutDirection(), Qt::RightToLeft);
2086 QCOMPARE(grid->width(), 100.0);
2087 QCOMPARE(grid->height(), 100.0);
2088
2089 // test padding
2090 grid->setProperty(name: "padding", value: 1);
2091 grid->setProperty(name: "topPadding", value: 2);
2092 grid->setProperty(name: "leftPadding", value: 3);
2093 grid->setProperty(name: "rightPadding", value: 4);
2094 grid->setProperty(name: "bottomPadding", value: 5);
2095
2096 QTRY_COMPARE(grid->width(), 107.0);
2097 QCOMPARE(grid->height(), 107.0);
2098
2099 QCOMPARE(one->x(), 53.0);
2100 QCOMPARE(one->y(), 2.0);
2101 QCOMPARE(two->x(), 33.0);
2102 QCOMPARE(two->y(), 2.0);
2103 QCOMPARE(three->x(), 3.0);
2104 QCOMPARE(three->y(), 2.0);
2105 QCOMPARE(four->x(), 53.0);
2106 QCOMPARE(four->y(), 52.0);
2107 QCOMPARE(five->x(), 43.0);
2108 QCOMPARE(five->y(), 52.0);
2109
2110 grid->setProperty(name: "topPadding", value: 0);
2111 grid->setProperty(name: "leftPadding", value: 0);
2112 grid->setProperty(name: "rightPadding", value: 0);
2113 grid->setProperty(name: "bottomPadding", value: 0);
2114 grid->setProperty(name: "padding", value: 0);
2115
2116 QTRY_COMPARE(one->x(), 50.0);
2117 QCOMPARE(one->y(), 0.0);
2118 QCOMPARE(two->x(), 30.0);
2119 QCOMPARE(two->y(), 0.0);
2120 QCOMPARE(three->x(), 0.0);
2121 QCOMPARE(three->y(), 0.0);
2122 QCOMPARE(four->x(), 50.0);
2123 QCOMPARE(four->y(), 50.0);
2124 QCOMPARE(five->x(), 40.0);
2125 QCOMPARE(five->y(), 50.0);
2126
2127 // Change the width of the grid and check that items stay to the right
2128 grid->setWidth(200);
2129 QTRY_COMPARE(one->x(), 150.0);
2130 QCOMPARE(one->y(), 0.0);
2131 QCOMPARE(two->x(), 130.0);
2132 QCOMPARE(two->y(), 0.0);
2133 QCOMPARE(three->x(), 100.0);
2134 QCOMPARE(three->y(), 0.0);
2135 QCOMPARE(four->x(), 150.0);
2136 QCOMPARE(four->y(), 50.0);
2137 QCOMPARE(five->x(), 140.0);
2138 QCOMPARE(five->y(), 50.0);
2139
2140 grid->setProperty(name: "padding", value: 1);
2141 grid->setProperty(name: "topPadding", value: 2);
2142 grid->setProperty(name: "leftPadding", value: 3);
2143 grid->setProperty(name: "rightPadding", value: 4);
2144 grid->setProperty(name: "bottomPadding", value: 5);
2145
2146 QTRY_COMPARE(one->x(), 146.0);
2147 QCOMPARE(one->y(), 2.0);
2148 QCOMPARE(two->x(), 126.0);
2149 QCOMPARE(two->y(), 2.0);
2150 QCOMPARE(three->x(), 96.0);
2151 QCOMPARE(three->y(), 2.0);
2152 QCOMPARE(four->x(), 146.0);
2153 QCOMPARE(four->y(), 52.0);
2154 QCOMPARE(five->x(), 136.0);
2155 QCOMPARE(five->y(), 52.0);
2156}
2157
2158void tst_qquickpositioners::test_grid_spacing()
2159{
2160 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-spacing.qml")));
2161
2162 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2163 QVERIFY(one != nullptr);
2164 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2165 QVERIFY(two != nullptr);
2166 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2167 QVERIFY(three != nullptr);
2168 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2169 QVERIFY(four != nullptr);
2170 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2171 QVERIFY(five != nullptr);
2172
2173 QCOMPARE(one->x(), 0.0);
2174 QCOMPARE(one->y(), 0.0);
2175 QCOMPARE(two->x(), 54.0);
2176 QCOMPARE(two->y(), 0.0);
2177 QCOMPARE(three->x(), 78.0);
2178 QCOMPARE(three->y(), 0.0);
2179 QCOMPARE(four->x(), 0.0);
2180 QCOMPARE(four->y(), 54.0);
2181 QCOMPARE(five->x(), 54.0);
2182 QCOMPARE(five->y(), 54.0);
2183
2184 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2185 QCOMPARE(grid->width(), 128.0);
2186 QCOMPARE(grid->height(), 104.0);
2187
2188 // test padding
2189 grid->setProperty(name: "padding", value: 1);
2190 grid->setProperty(name: "topPadding", value: 2);
2191 grid->setProperty(name: "leftPadding", value: 3);
2192 grid->setProperty(name: "rightPadding", value: 4);
2193 grid->setProperty(name: "bottomPadding", value: 5);
2194
2195 QTRY_COMPARE(grid->width(), 135.0);
2196 QCOMPARE(grid->height(), 111.0);
2197
2198 QCOMPARE(one->x(), 3.0);
2199 QCOMPARE(one->y(), 2.0);
2200 QCOMPARE(two->x(), 57.0);
2201 QCOMPARE(two->y(), 2.0);
2202 QCOMPARE(three->x(), 81.0);
2203 QCOMPARE(three->y(), 2.0);
2204 QCOMPARE(four->x(), 3.0);
2205 QCOMPARE(four->y(), 56.0);
2206 QCOMPARE(five->x(), 57.0);
2207 QCOMPARE(five->y(), 56.0);
2208}
2209
2210void tst_qquickpositioners::test_grid_row_column_spacing()
2211{
2212 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-row-column-spacing.qml")));
2213
2214 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2215 QVERIFY(one != nullptr);
2216 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2217 QVERIFY(two != nullptr);
2218 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2219 QVERIFY(three != nullptr);
2220 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2221 QVERIFY(four != nullptr);
2222 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2223 QVERIFY(five != nullptr);
2224
2225 QCOMPARE(one->x(), 0.0);
2226 QCOMPARE(one->y(), 0.0);
2227 QCOMPARE(two->x(), 61.0);
2228 QCOMPARE(two->y(), 0.0);
2229 QCOMPARE(three->x(), 92.0);
2230 QCOMPARE(three->y(), 0.0);
2231 QCOMPARE(four->x(), 0.0);
2232 QCOMPARE(four->y(), 57.0);
2233 QCOMPARE(five->x(), 61.0);
2234 QCOMPARE(five->y(), 57.0);
2235
2236 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2237 QCOMPARE(grid->width(), 142.0);
2238 QCOMPARE(grid->height(), 107.0);
2239
2240 // test padding
2241 grid->setProperty(name: "padding", value: 1);
2242 grid->setProperty(name: "topPadding", value: 2);
2243 grid->setProperty(name: "leftPadding", value: 3);
2244 grid->setProperty(name: "rightPadding", value: 4);
2245 grid->setProperty(name: "bottomPadding", value: 5);
2246
2247 QTRY_COMPARE(grid->width(), 149.0);
2248 QCOMPARE(grid->height(), 114.0);
2249
2250 QCOMPARE(one->x(), 3.0);
2251 QCOMPARE(one->y(), 2.0);
2252 QCOMPARE(two->x(), 64.0);
2253 QCOMPARE(two->y(), 2.0);
2254 QCOMPARE(three->x(), 95.0);
2255 QCOMPARE(three->y(), 2.0);
2256 QCOMPARE(four->x(), 3.0);
2257 QCOMPARE(four->y(), 59.0);
2258 QCOMPARE(five->x(), 64.0);
2259 QCOMPARE(five->y(), 59.0);
2260}
2261
2262void tst_qquickpositioners::test_grid_animated()
2263{
2264 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-animated.qml"), wait: false));
2265
2266 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
2267
2268 //Note that all animate in
2269 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2270 QVERIFY(one != nullptr);
2271 QCOMPARE(one->x(), -100.0);
2272 QCOMPARE(one->y(), -100.0);
2273
2274 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2275 QVERIFY(two != nullptr);
2276 QCOMPARE(two->x(), -100.0);
2277 QCOMPARE(two->y(), -100.0);
2278
2279 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2280 QVERIFY(three != nullptr);
2281 QCOMPARE(three->x(), -100.0);
2282 QCOMPARE(three->y(), -100.0);
2283
2284 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2285 QVERIFY(four != nullptr);
2286 QCOMPARE(four->x(), -100.0);
2287 QCOMPARE(four->y(), -100.0);
2288
2289 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2290 QVERIFY(five != nullptr);
2291 QCOMPARE(five->x(), -100.0);
2292 QCOMPARE(five->y(), -100.0);
2293
2294 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
2295
2296 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2297 QVERIFY(grid);
2298 QCOMPARE(grid->width(), 150.0);
2299 QCOMPARE(grid->height(), 100.0);
2300
2301 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
2302 //Note that this means the duration of the animation is NOT tested
2303
2304 QTRY_COMPARE(one->y(), 0.0);
2305 QTRY_COMPARE(one->x(), 0.0);
2306 QTRY_COMPARE(two->isVisible(), false);
2307 QTRY_COMPARE(two->y(), -100.0);
2308 QTRY_COMPARE(two->x(), -100.0);
2309 QTRY_COMPARE(three->y(), 0.0);
2310 QTRY_COMPARE(three->x(), 50.0);
2311 QTRY_COMPARE(four->y(), 0.0);
2312 QTRY_COMPARE(four->x(), 100.0);
2313 QTRY_COMPARE(five->y(), 50.0);
2314 QTRY_COMPARE(five->x(), 0.0);
2315
2316 //Add 'two'
2317 two->setVisible(true);
2318 QCOMPARE(two->isVisible(), true);
2319 QCOMPARE(grid->width(), 150.0);
2320 QCOMPARE(grid->height(), 100.0);
2321 QTest::qWait(ms: 0);//Let the animation start
2322 QCOMPARE(two->x(), -100.0);
2323 QCOMPARE(two->y(), -100.0);
2324 QCOMPARE(one->x(), 0.0);
2325 QCOMPARE(one->y(), 0.0);
2326 QCOMPARE(three->x(), 50.0);
2327 QCOMPARE(three->y(), 0.0);
2328 QCOMPARE(four->x(), 100.0);
2329 QCOMPARE(four->y(), 0.0);
2330 QCOMPARE(five->x(), 0.0);
2331 QCOMPARE(five->y(), 50.0);
2332 //Let the animation complete
2333 QTRY_COMPARE(two->x(), 50.0);
2334 QTRY_COMPARE(two->y(), 0.0);
2335 QTRY_COMPARE(one->x(), 0.0);
2336 QTRY_COMPARE(one->y(), 0.0);
2337 QTRY_COMPARE(three->x(), 100.0);
2338 QTRY_COMPARE(three->y(), 0.0);
2339 QTRY_COMPARE(four->x(), 0.0);
2340 QTRY_COMPARE(four->y(), 50.0);
2341 QTRY_COMPARE(five->x(), 50.0);
2342 QTRY_COMPARE(five->y(), 50.0);
2343
2344}
2345
2346void tst_qquickpositioners::test_grid_animated_padding()
2347{
2348 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-animated.qml"), wait: false));
2349
2350 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
2351
2352 //Note that all animate in
2353 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2354 QVERIFY(one != nullptr);
2355 QCOMPARE(one->x(), -100.0);
2356 QCOMPARE(one->y(), -100.0);
2357
2358 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2359 QVERIFY(two != nullptr);
2360 QCOMPARE(two->x(), -100.0);
2361 QCOMPARE(two->y(), -100.0);
2362
2363 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2364 QVERIFY(three != nullptr);
2365 QCOMPARE(three->x(), -100.0);
2366 QCOMPARE(three->y(), -100.0);
2367
2368 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2369 QVERIFY(four != nullptr);
2370 QCOMPARE(four->x(), -100.0);
2371 QCOMPARE(four->y(), -100.0);
2372
2373 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2374 QVERIFY(five != nullptr);
2375 QCOMPARE(five->x(), -100.0);
2376 QCOMPARE(five->y(), -100.0);
2377
2378 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
2379
2380 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2381 QVERIFY(grid);
2382 QCOMPARE(grid->width(), 150.0);
2383 QCOMPARE(grid->height(), 100.0);
2384
2385 // test padding
2386 grid->setProperty(name: "padding", value: 1);
2387 grid->setProperty(name: "topPadding", value: 2);
2388 grid->setProperty(name: "leftPadding", value: 3);
2389 grid->setProperty(name: "rightPadding", value: 4);
2390 grid->setProperty(name: "bottomPadding", value: 5);
2391
2392 QTRY_COMPARE(grid->width(), 157.0);
2393 QCOMPARE(grid->height(), 107.0);
2394
2395 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
2396 //Note that this means the duration of the animation is NOT tested
2397
2398 QTRY_COMPARE(one->y(), 2.0);
2399 QTRY_COMPARE(one->x(), 3.0);
2400 QTRY_COMPARE(two->isVisible(), false);
2401 QTRY_COMPARE(two->y(), -100.0);
2402 QTRY_COMPARE(two->x(), -100.0);
2403 QTRY_COMPARE(three->y(), 2.0);
2404 QTRY_COMPARE(three->x(), 53.0);
2405 QTRY_COMPARE(four->y(), 2.0);
2406 QTRY_COMPARE(four->x(), 103.0);
2407 QTRY_COMPARE(five->y(), 52.0);
2408 QTRY_COMPARE(five->x(), 3.0);
2409
2410 //Add 'two'
2411 two->setVisible(true);
2412 QCOMPARE(two->isVisible(), true);
2413 QCOMPARE(grid->width(), 157.0);
2414 QCOMPARE(grid->height(), 107.0);
2415 QTest::qWait(ms: 0);//Let the animation start
2416 QCOMPARE(two->x(), -100.0);
2417 QCOMPARE(two->y(), -100.0);
2418 QCOMPARE(one->x(), 3.0);
2419 QCOMPARE(one->y(), 2.0);
2420 QCOMPARE(three->x(), 53.0);
2421 QCOMPARE(three->y(), 2.0);
2422 QCOMPARE(four->x(), 103.0);
2423 QCOMPARE(four->y(), 2.0);
2424 QCOMPARE(five->x(), 3.0);
2425 QCOMPARE(five->y(), 52.0);
2426 //Let the animation complete
2427 QTRY_COMPARE(two->x(), 53.0);
2428 QTRY_COMPARE(two->y(), 2.0);
2429 QTRY_COMPARE(one->x(), 3.0);
2430 QTRY_COMPARE(one->y(), 2.0);
2431 QTRY_COMPARE(three->x(), 103.0);
2432 QTRY_COMPARE(three->y(), 2.0);
2433 QTRY_COMPARE(four->x(), 3.0);
2434 QTRY_COMPARE(four->y(), 52.0);
2435 QTRY_COMPARE(five->x(), 53.0);
2436 QTRY_COMPARE(five->y(), 52.0);
2437
2438}
2439
2440void tst_qquickpositioners::test_grid_animated_rightToLeft()
2441{
2442 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-animated.qml"), wait: false));
2443
2444 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
2445
2446 //Note that all animate in
2447 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2448 QVERIFY(one != nullptr);
2449 QCOMPARE(one->x(), -100.0);
2450 QCOMPARE(one->y(), -100.0);
2451
2452 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2453 QVERIFY(two != nullptr);
2454 QCOMPARE(two->x(), -100.0);
2455 QCOMPARE(two->y(), -100.0);
2456
2457 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2458 QVERIFY(three != nullptr);
2459 QCOMPARE(three->x(), -100.0);
2460 QCOMPARE(three->y(), -100.0);
2461
2462 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2463 QVERIFY(four != nullptr);
2464 QCOMPARE(four->x(), -100.0);
2465 QCOMPARE(four->y(), -100.0);
2466
2467 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2468 QVERIFY(five != nullptr);
2469 QCOMPARE(five->x(), -100.0);
2470 QCOMPARE(five->y(), -100.0);
2471
2472 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
2473
2474 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2475 QVERIFY(grid);
2476 QCOMPARE(grid->width(), 150.0);
2477 QCOMPARE(grid->height(), 100.0);
2478
2479 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
2480 //Note that this means the duration of the animation is NOT tested
2481
2482 QTRY_COMPARE(one->y(), 0.0);
2483 QTRY_COMPARE(one->x(), 100.0);
2484 QTRY_COMPARE(two->isVisible(), false);
2485 QTRY_COMPARE(two->y(), -100.0);
2486 QTRY_COMPARE(two->x(), -100.0);
2487 QTRY_COMPARE(three->y(), 0.0);
2488 QTRY_COMPARE(three->x(), 50.0);
2489 QTRY_COMPARE(four->y(), 0.0);
2490 QTRY_COMPARE(four->x(), 0.0);
2491 QTRY_COMPARE(five->y(), 50.0);
2492 QTRY_COMPARE(five->x(), 100.0);
2493
2494 //Add 'two'
2495 two->setVisible(true);
2496 QCOMPARE(two->isVisible(), true);
2497 QCOMPARE(grid->width(), 150.0);
2498 QCOMPARE(grid->height(), 100.0);
2499 QTest::qWait(ms: 0);//Let the animation start
2500 QCOMPARE(two->x(), -100.0);
2501 QCOMPARE(two->y(), -100.0);
2502 QCOMPARE(one->x(), 100.0);
2503 QCOMPARE(one->y(), 0.0);
2504 QCOMPARE(three->x(), 50.0);
2505 QCOMPARE(three->y(), 0.0);
2506 QCOMPARE(four->x(), 0.0);
2507 QCOMPARE(four->y(), 0.0);
2508 QCOMPARE(five->x(), 100.0);
2509 QCOMPARE(five->y(), 50.0);
2510 //Let the animation complete
2511 QTRY_COMPARE(two->x(), 50.0);
2512 QTRY_COMPARE(two->y(), 0.0);
2513 QTRY_COMPARE(one->x(), 100.0);
2514 QTRY_COMPARE(one->y(), 0.0);
2515 QTRY_COMPARE(three->x(), 0.0);
2516 QTRY_COMPARE(three->y(), 0.0);
2517 QTRY_COMPARE(four->x(), 100.0);
2518 QTRY_COMPARE(four->y(), 50.0);
2519 QTRY_COMPARE(five->x(), 50.0);
2520 QTRY_COMPARE(five->y(), 50.0);
2521
2522}
2523
2524void tst_qquickpositioners::test_grid_animated_rightToLeft_padding()
2525{
2526 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "grid-animated.qml"), wait: false));
2527
2528 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
2529
2530 //Note that all animate in
2531 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2532 QVERIFY(one != nullptr);
2533 QCOMPARE(one->x(), -100.0);
2534 QCOMPARE(one->y(), -100.0);
2535
2536 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2537 QVERIFY(two != nullptr);
2538 QCOMPARE(two->x(), -100.0);
2539 QCOMPARE(two->y(), -100.0);
2540
2541 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2542 QVERIFY(three != nullptr);
2543 QCOMPARE(three->x(), -100.0);
2544 QCOMPARE(three->y(), -100.0);
2545
2546 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2547 QVERIFY(four != nullptr);
2548 QCOMPARE(four->x(), -100.0);
2549 QCOMPARE(four->y(), -100.0);
2550
2551 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2552 QVERIFY(five != nullptr);
2553 QCOMPARE(five->x(), -100.0);
2554 QCOMPARE(five->y(), -100.0);
2555
2556 QVERIFY(QTest::qWaitForWindowExposed(window.data())); //It may not relayout until the next frame, so it needs to be drawn
2557
2558 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2559 QVERIFY(grid);
2560 QCOMPARE(grid->width(), 150.0);
2561 QCOMPARE(grid->height(), 100.0);
2562
2563 // test padding
2564 grid->setProperty(name: "padding", value: 1);
2565 grid->setProperty(name: "topPadding", value: 2);
2566 grid->setProperty(name: "leftPadding", value: 3);
2567 grid->setProperty(name: "rightPadding", value: 4);
2568 grid->setProperty(name: "bottomPadding", value: 5);
2569
2570 QTRY_COMPARE(grid->width(), 157.0);
2571 QCOMPARE(grid->height(), 107.0);
2572
2573 //QTRY_COMPARE used instead of waiting for the expected time of animation completion
2574 //Note that this means the duration of the animation is NOT tested
2575
2576 QTRY_COMPARE(one->y(), 2.0);
2577 QTRY_COMPARE(one->x(), 103.0);
2578 QTRY_COMPARE(two->isVisible(), false);
2579 QTRY_COMPARE(two->y(), -100.0);
2580 QTRY_COMPARE(two->x(), -100.0);
2581 QTRY_COMPARE(three->y(), 2.0);
2582 QTRY_COMPARE(three->x(), 53.0);
2583 QTRY_COMPARE(four->y(), 2.0);
2584 QTRY_COMPARE(four->x(), 3.0);
2585 QTRY_COMPARE(five->y(), 52.0);
2586 QTRY_COMPARE(five->x(), 103.0);
2587
2588 //Add 'two'
2589 two->setVisible(true);
2590 QCOMPARE(two->isVisible(), true);
2591 QCOMPARE(grid->width(), 157.0);
2592 QCOMPARE(grid->height(), 107.0);
2593 QTest::qWait(ms: 0);//Let the animation start
2594 QCOMPARE(two->x(), -100.0);
2595 QCOMPARE(two->y(), -100.0);
2596 QCOMPARE(one->x(), 103.0);
2597 QCOMPARE(one->y(), 2.0);
2598 QCOMPARE(three->x(), 53.0);
2599 QCOMPARE(three->y(), 2.0);
2600 QCOMPARE(four->x(), 3.0);
2601 QCOMPARE(four->y(), 2.0);
2602 QCOMPARE(five->x(), 103.0);
2603 QCOMPARE(five->y(), 52.0);
2604 //Let the animation complete
2605 QTRY_COMPARE(two->x(), 53.0);
2606 QTRY_COMPARE(two->y(), 2.0);
2607 QTRY_COMPARE(one->x(), 103.0);
2608 QTRY_COMPARE(one->y(), 2.0);
2609 QTRY_COMPARE(three->x(), 3.0);
2610 QTRY_COMPARE(three->y(), 2.0);
2611 QTRY_COMPARE(four->x(), 103.0);
2612 QTRY_COMPARE(four->y(), 52.0);
2613 QTRY_COMPARE(five->x(), 53.0);
2614 QTRY_COMPARE(five->y(), 52.0);
2615
2616}
2617
2618void tst_qquickpositioners::test_grid_zero_columns()
2619{
2620 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridzerocolumns.qml")));
2621
2622 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2623 QVERIFY(one != nullptr);
2624 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2625 QVERIFY(two != nullptr);
2626 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2627 QVERIFY(three != nullptr);
2628 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2629 QVERIFY(four != nullptr);
2630 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2631 QVERIFY(five != nullptr);
2632
2633 QCOMPARE(one->x(), 0.0);
2634 QCOMPARE(one->y(), 0.0);
2635 QCOMPARE(two->x(), 50.0);
2636 QCOMPARE(two->y(), 0.0);
2637 QCOMPARE(three->x(), 70.0);
2638 QCOMPARE(three->y(), 0.0);
2639 QCOMPARE(four->x(), 120.0);
2640 QCOMPARE(four->y(), 0.0);
2641 QCOMPARE(five->x(), 0.0);
2642 QCOMPARE(five->y(), 50.0);
2643
2644 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2645 QCOMPARE(grid->width(), 170.0);
2646 QCOMPARE(grid->height(), 60.0);
2647
2648 // test padding
2649 grid->setProperty(name: "padding", value: 1);
2650 grid->setProperty(name: "topPadding", value: 2);
2651 grid->setProperty(name: "leftPadding", value: 3);
2652 grid->setProperty(name: "rightPadding", value: 4);
2653 grid->setProperty(name: "bottomPadding", value: 5);
2654
2655 QTRY_COMPARE(grid->width(), 177.0);
2656 QCOMPARE(grid->height(), 67.0);
2657
2658 QCOMPARE(one->x(), 3.0);
2659 QCOMPARE(one->y(), 2.0);
2660 QCOMPARE(two->x(), 53.0);
2661 QCOMPARE(two->y(), 2.0);
2662 QCOMPARE(three->x(), 73.0);
2663 QCOMPARE(three->y(), 2.0);
2664 QCOMPARE(four->x(), 123.0);
2665 QCOMPARE(four->y(), 2.0);
2666 QCOMPARE(five->x(), 3.0);
2667 QCOMPARE(five->y(), 52.0);
2668}
2669
2670void tst_qquickpositioners::test_grid_H_alignment()
2671{
2672 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
2673
2674 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignHCenter);
2675
2676 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2677 QVERIFY(one != nullptr);
2678 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2679 QVERIFY(two != nullptr);
2680 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2681 QVERIFY(three != nullptr);
2682 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2683 QVERIFY(four != nullptr);
2684 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2685 QVERIFY(five != nullptr);
2686
2687 QCOMPARE(one->x(), 0.0);
2688 QCOMPARE(one->y(), 0.0);
2689 QCOMPARE(two->x(), 50.0);
2690 QCOMPARE(two->y(), 0.0);
2691 QCOMPARE(three->x(), 70.0);
2692 QCOMPARE(three->y(), 0.0);
2693 QCOMPARE(four->x(), 0.0);
2694 QCOMPARE(four->y(), 50.0);
2695 QCOMPARE(five->x(), 55.0);
2696 QCOMPARE(five->y(), 50.0);
2697
2698 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2699 QCOMPARE(grid->width(), 100.0);
2700 QCOMPARE(grid->height(), 100.0);
2701
2702 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignRight);
2703
2704 QCOMPARE(one->x(), 0.0);
2705 QCOMPARE(one->y(), 0.0);
2706 QCOMPARE(two->x(), 50.0);
2707 QCOMPARE(two->y(), 0.0);
2708 QCOMPARE(three->x(), 70.0);
2709 QCOMPARE(three->y(), 0.0);
2710 QCOMPARE(four->x(), 0.0);
2711 QCOMPARE(four->y(), 50.0);
2712 QCOMPARE(five->x(), 60.0);
2713 QCOMPARE(five->y(), 50.0);
2714 QCOMPARE(grid->width(), 100.0);
2715 QCOMPARE(grid->height(), 100.0);
2716
2717 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
2718
2719 QCOMPARE(one->x(), 50.0);
2720 QCOMPARE(one->y(), 0.0);
2721 QCOMPARE(two->x(), 30.0);
2722 QCOMPARE(two->y(), 0.0);
2723 QCOMPARE(three->x(), 0.0);
2724 QCOMPARE(three->y(), 0.0);
2725 QCOMPARE(four->x(), 50.0);
2726 QCOMPARE(four->y(), 50.0);
2727 QCOMPARE(five->x(), 30.0);
2728 QCOMPARE(five->y(), 50.0);
2729 QCOMPARE(grid->width(), 100.0);
2730 QCOMPARE(grid->height(), 100.0);
2731
2732 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignHCenter);
2733
2734 QCOMPARE(one->x(), 50.0);
2735 QCOMPARE(one->y(), 0.0);
2736 QCOMPARE(two->x(), 30.0);
2737 QCOMPARE(two->y(), 0.0);
2738 QCOMPARE(three->x(), 0.0);
2739 QCOMPARE(three->y(), 0.0);
2740 QCOMPARE(four->x(), 50.0);
2741 QCOMPARE(four->y(), 50.0);
2742 QCOMPARE(five->x(), 35.0);
2743 QCOMPARE(five->y(), 50.0);
2744 QCOMPARE(grid->width(), 100.0);
2745 QCOMPARE(grid->height(), 100.0);
2746
2747}
2748
2749void tst_qquickpositioners::test_grid_H_alignment_padding()
2750{
2751 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
2752
2753 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignHCenter);
2754
2755 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2756 QVERIFY(one != nullptr);
2757 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2758 QVERIFY(two != nullptr);
2759 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2760 QVERIFY(three != nullptr);
2761 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2762 QVERIFY(four != nullptr);
2763 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2764 QVERIFY(five != nullptr);
2765
2766 QCOMPARE(one->x(), 0.0);
2767 QCOMPARE(one->y(), 0.0);
2768 QCOMPARE(two->x(), 50.0);
2769 QCOMPARE(two->y(), 0.0);
2770 QCOMPARE(three->x(), 70.0);
2771 QCOMPARE(three->y(), 0.0);
2772 QCOMPARE(four->x(), 0.0);
2773 QCOMPARE(four->y(), 50.0);
2774 QCOMPARE(five->x(), 55.0);
2775 QCOMPARE(five->y(), 50.0);
2776
2777 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2778 QCOMPARE(grid->width(), 100.0);
2779 QCOMPARE(grid->height(), 100.0);
2780
2781 // test padding
2782 grid->setProperty(name: "padding", value: 1);
2783 grid->setProperty(name: "topPadding", value: 2);
2784 grid->setProperty(name: "leftPadding", value: 3);
2785 grid->setProperty(name: "rightPadding", value: 4);
2786 grid->setProperty(name: "bottomPadding", value: 5);
2787
2788 QTRY_COMPARE(grid->width(), 107.0);
2789 QCOMPARE(grid->height(), 107.0);
2790
2791 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignRight);
2792
2793 QCOMPARE(one->x(), 3.0);
2794 QCOMPARE(one->y(), 2.0);
2795 QCOMPARE(two->x(), 53.0);
2796 QCOMPARE(two->y(), 2.0);
2797 QCOMPARE(three->x(), 73.0);
2798 QCOMPARE(three->y(), 2.0);
2799 QCOMPARE(four->x(), 3.0);
2800 QCOMPARE(four->y(), 52.0);
2801 QCOMPARE(five->x(), 63.0);
2802 QCOMPARE(five->y(), 52.0);
2803 QCOMPARE(grid->width(), 107.0);
2804 QCOMPARE(grid->height(), 107.0);
2805
2806 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
2807
2808 QCOMPARE(one->x(), 53.0);
2809 QCOMPARE(one->y(), 2.0);
2810 QCOMPARE(two->x(), 33.0);
2811 QCOMPARE(two->y(), 2.0);
2812 QCOMPARE(three->x(), 3.0);
2813 QCOMPARE(three->y(), 2.0);
2814 QCOMPARE(four->x(), 53.0);
2815 QCOMPARE(four->y(), 52.0);
2816 QCOMPARE(five->x(), 33.0);
2817 QCOMPARE(five->y(), 52.0);
2818 QCOMPARE(grid->width(), 107.0);
2819 QCOMPARE(grid->height(), 107.0);
2820
2821 window->rootObject()->setProperty(name: "testHAlignment", value: QQuickGrid::AlignHCenter);
2822
2823 QCOMPARE(one->x(), 53.0);
2824 QCOMPARE(one->y(), 2.0);
2825 QCOMPARE(two->x(), 33.0);
2826 QCOMPARE(two->y(), 2.0);
2827 QCOMPARE(three->x(), 3.0);
2828 QCOMPARE(three->y(), 2.0);
2829 QCOMPARE(four->x(), 53.0);
2830 QCOMPARE(four->y(), 52.0);
2831 QCOMPARE(five->x(), 38.0);
2832 QCOMPARE(five->y(), 52.0);
2833 QCOMPARE(grid->width(), 107.0);
2834 QCOMPARE(grid->height(), 107.0);
2835
2836}
2837
2838void tst_qquickpositioners::test_grid_V_alignment()
2839{
2840 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
2841
2842 window->rootObject()->setProperty(name: "testVAlignment", value: QQuickGrid::AlignVCenter);
2843
2844 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2845 QVERIFY(one != nullptr);
2846 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2847 QVERIFY(two != nullptr);
2848 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2849 QVERIFY(three != nullptr);
2850 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2851 QVERIFY(four != nullptr);
2852 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2853 QVERIFY(five != nullptr);
2854
2855 QCOMPARE(one->x(), 0.0);
2856 QCOMPARE(one->y(), 0.0);
2857 QCOMPARE(two->x(), 50.0);
2858 QCOMPARE(two->y(), 0.0);
2859 QCOMPARE(three->x(), 70.0);
2860 QCOMPARE(three->y(), 15.0);
2861 QCOMPARE(four->x(), 0.0);
2862 QCOMPARE(four->y(), 50.0);
2863 QCOMPARE(five->x(), 50.0);
2864 QCOMPARE(five->y(), 70.0);
2865
2866 window->rootObject()->setProperty(name: "testVAlignment", value: QQuickGrid::AlignBottom);
2867
2868 QCOMPARE(one->x(), 0.0);
2869 QCOMPARE(one->y(), 0.0);
2870 QCOMPARE(two->x(), 50.0);
2871 QCOMPARE(two->y(), 0.0);
2872 QCOMPARE(three->x(), 70.0);
2873 QCOMPARE(three->y(), 30.0);
2874 QCOMPARE(four->x(), 0.0);
2875 QCOMPARE(four->y(), 50.0);
2876 QCOMPARE(five->x(), 50.0);
2877 QCOMPARE(five->y(), 90.0);
2878
2879}
2880
2881void tst_qquickpositioners::test_grid_V_alignment_padding()
2882{
2883 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "gridtest.qml")));
2884
2885 window->rootObject()->setProperty(name: "testVAlignment", value: QQuickGrid::AlignVCenter);
2886
2887 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
2888 QVERIFY(one != nullptr);
2889 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
2890 QVERIFY(two != nullptr);
2891 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
2892 QVERIFY(three != nullptr);
2893 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
2894 QVERIFY(four != nullptr);
2895 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
2896 QVERIFY(five != nullptr);
2897
2898 QQuickItem *grid = window->rootObject()->findChild<QQuickItem*>(aName: "grid");
2899 QCOMPARE(grid->width(), 100.0);
2900 QCOMPARE(grid->height(), 100.0);
2901
2902 // test padding
2903 grid->setProperty(name: "padding", value: 1);
2904 grid->setProperty(name: "topPadding", value: 2);
2905 grid->setProperty(name: "leftPadding", value: 3);
2906 grid->setProperty(name: "rightPadding", value: 4);
2907 grid->setProperty(name: "bottomPadding", value: 5);
2908
2909 QTRY_COMPARE(grid->width(), 107.0);
2910 QCOMPARE(grid->height(), 107.0);
2911
2912 QCOMPARE(one->x(), 3.0);
2913 QCOMPARE(one->y(), 2.0);
2914 QCOMPARE(two->x(), 53.0);
2915 QCOMPARE(two->y(), 2.0);
2916 QCOMPARE(three->x(), 73.0);
2917 QCOMPARE(three->y(), 17.0);
2918 QCOMPARE(four->x(), 3.0);
2919 QCOMPARE(four->y(), 52.0);
2920 QCOMPARE(five->x(), 53.0);
2921 QCOMPARE(five->y(), 72.0);
2922
2923 window->rootObject()->setProperty(name: "testVAlignment", value: QQuickGrid::AlignBottom);
2924
2925 QCOMPARE(one->x(), 3.0);
2926 QCOMPARE(one->y(), 2.0);
2927 QCOMPARE(two->x(), 53.0);
2928 QCOMPARE(two->y(), 2.0);
2929 QCOMPARE(three->x(), 73.0);
2930 QCOMPARE(three->y(), 32.0);
2931 QCOMPARE(four->x(), 3.0);
2932 QCOMPARE(four->y(), 52.0);
2933 QCOMPARE(five->x(), 53.0);
2934 QCOMPARE(five->y(), 92.0);
2935
2936}
2937
2938void tst_qquickpositioners::test_propertychanges()
2939{
2940 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "propertychangestest.qml")));
2941
2942 QQuickGrid *grid = qobject_cast<QQuickGrid*>(object: window->rootObject());
2943 QVERIFY(grid != nullptr);
2944 QQuickTransition *rowTransition = window->rootObject()->findChild<QQuickTransition*>(aName: "rowTransition");
2945 QQuickTransition *columnTransition = window->rootObject()->findChild<QQuickTransition*>(aName: "columnTransition");
2946
2947 QSignalSpy addSpy(grid, SIGNAL(addChanged()));
2948 QSignalSpy moveSpy(grid, SIGNAL(moveChanged()));
2949 QSignalSpy columnsSpy(grid, SIGNAL(columnsChanged()));
2950 QSignalSpy rowsSpy(grid, SIGNAL(rowsChanged()));
2951
2952 QVERIFY(grid);
2953 QVERIFY(rowTransition);
2954 QVERIFY(columnTransition);
2955 QCOMPARE(grid->add(), columnTransition);
2956 QCOMPARE(grid->move(), columnTransition);
2957 QCOMPARE(grid->columns(), 4);
2958 QCOMPARE(grid->rows(), -1);
2959
2960 grid->setAdd(rowTransition);
2961 grid->setMove(rowTransition);
2962 QCOMPARE(grid->add(), rowTransition);
2963 QCOMPARE(grid->move(), rowTransition);
2964 QCOMPARE(addSpy.count(),1);
2965 QCOMPARE(moveSpy.count(),1);
2966
2967 grid->setAdd(rowTransition);
2968 grid->setMove(rowTransition);
2969 QCOMPARE(addSpy.count(),1);
2970 QCOMPARE(moveSpy.count(),1);
2971
2972 grid->setAdd(nullptr);
2973 grid->setMove(nullptr);
2974 QCOMPARE(addSpy.count(),2);
2975 QCOMPARE(moveSpy.count(),2);
2976
2977 grid->setColumns(-1);
2978 grid->setRows(3);
2979 QCOMPARE(grid->columns(), -1);
2980 QCOMPARE(grid->rows(), 3);
2981 QCOMPARE(columnsSpy.count(),1);
2982 QCOMPARE(rowsSpy.count(),1);
2983
2984 grid->setColumns(-1);
2985 grid->setRows(3);
2986 QCOMPARE(columnsSpy.count(),1);
2987 QCOMPARE(rowsSpy.count(),1);
2988
2989 grid->setColumns(2);
2990 grid->setRows(2);
2991 QCOMPARE(columnsSpy.count(),2);
2992 QCOMPARE(rowsSpy.count(),2);
2993
2994}
2995
2996void tst_qquickpositioners::test_repeater()
2997{
2998 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "repeatertest.qml")));
2999
3000 QQuickRectangle *one = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "one");
3001 QVERIFY(one != nullptr);
3002
3003 QQuickRectangle *two = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "two");
3004 QVERIFY(two != nullptr);
3005
3006 QQuickRectangle *three = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "three");
3007 QVERIFY(three != nullptr);
3008
3009 QCOMPARE(one->x(), 0.0);
3010 QCOMPARE(one->y(), 0.0);
3011 QCOMPARE(two->x(), 50.0);
3012 QCOMPARE(two->y(), 0.0);
3013 QCOMPARE(three->x(), 100.0);
3014 QCOMPARE(three->y(), 0.0);
3015
3016}
3017
3018void tst_qquickpositioners::test_repeater_padding()
3019{
3020 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "repeatertest-padding.qml")));
3021
3022 QQuickRectangle *one = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "one");
3023 QVERIFY(one != nullptr);
3024
3025 QQuickRectangle *two = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "two");
3026 QVERIFY(two != nullptr);
3027
3028 QQuickRectangle *three = findItem<QQuickRectangle>(parent: window->contentItem(), objectName: "three");
3029 QVERIFY(three != nullptr);
3030
3031 QCOMPARE(one->x(), 3.0);
3032 QCOMPARE(one->y(), 2.0);
3033 QCOMPARE(two->x(), 53.0);
3034 QCOMPARE(two->y(), 2.0);
3035 QCOMPARE(three->x(), 103.0);
3036 QCOMPARE(three->y(), 2.0);
3037
3038}
3039
3040void tst_qquickpositioners::test_flow()
3041{
3042 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest.qml")));
3043
3044 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
3045
3046 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3047 QVERIFY(one != nullptr);
3048 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3049 QVERIFY(two != nullptr);
3050 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3051 QVERIFY(three != nullptr);
3052 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3053 QVERIFY(four != nullptr);
3054 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3055 QVERIFY(five != nullptr);
3056
3057 QCOMPARE(one->x(), 0.0);
3058 QCOMPARE(one->y(), 0.0);
3059 QCOMPARE(two->x(), 50.0);
3060 QCOMPARE(two->y(), 0.0);
3061 QCOMPARE(three->x(), 0.0);
3062 QCOMPARE(three->y(), 50.0);
3063 QCOMPARE(four->x(), 0.0);
3064 QCOMPARE(four->y(), 70.0);
3065 QCOMPARE(five->x(), 50.0);
3066 QCOMPARE(five->y(), 70.0);
3067
3068 QQuickItem *flow = window->rootObject()->findChild<QQuickItem*>(aName: "flow");
3069 QVERIFY(flow);
3070 QCOMPARE(flow->width(), 90.0);
3071 QCOMPARE(flow->height(), 120.0);
3072
3073 // test padding
3074 flow->setProperty(name: "padding", value: 1);
3075 flow->setProperty(name: "topPadding", value: 2);
3076 flow->setProperty(name: "leftPadding", value: 3);
3077 flow->setProperty(name: "rightPadding", value: 4);
3078 flow->setProperty(name: "bottomPadding", value: 5);
3079
3080 QTRY_COMPARE(flow->height(), 127.0);
3081 QCOMPARE(flow->width(), 90.0);
3082
3083 QCOMPARE(one->x(), 3.0);
3084 QCOMPARE(one->y(), 2.0);
3085 QCOMPARE(two->x(), 53.0);
3086 QCOMPARE(two->y(), 2.0);
3087 QCOMPARE(three->x(), 3.0);
3088 QCOMPARE(three->y(), 52.0);
3089 QCOMPARE(four->x(), 3.0);
3090 QCOMPARE(four->y(), 72.0);
3091 QCOMPARE(five->x(), 53.0);
3092 QCOMPARE(five->y(), 72.0);
3093}
3094
3095void tst_qquickpositioners::test_flow_padding()
3096{
3097 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest.qml")));
3098
3099 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
3100
3101 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3102 QVERIFY(one != nullptr);
3103 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3104 QVERIFY(two != nullptr);
3105 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3106 QVERIFY(three != nullptr);
3107 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3108 QVERIFY(four != nullptr);
3109 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3110 QVERIFY(five != nullptr);
3111
3112 QCOMPARE(one->x(), 0.0);
3113 QCOMPARE(one->y(), 0.0);
3114 QCOMPARE(two->x(), 50.0);
3115 QCOMPARE(two->y(), 0.0);
3116 QCOMPARE(three->x(), 0.0);
3117 QCOMPARE(three->y(), 50.0);
3118 QCOMPARE(four->x(), 0.0);
3119 QCOMPARE(four->y(), 70.0);
3120 QCOMPARE(five->x(), 50.0);
3121 QCOMPARE(five->y(), 70.0);
3122
3123 QQuickItem *flow = window->rootObject()->findChild<QQuickItem*>(aName: "flow");
3124 QVERIFY(flow);
3125 QCOMPARE(flow->width(), 90.0);
3126 QCOMPARE(flow->height(), 120.0);
3127
3128 QQuickFlow *obj = qobject_cast<QQuickFlow*>(object: flow);
3129 QVERIFY(obj != nullptr);
3130
3131 QCOMPARE(flow->property("padding").toDouble(), 0.0);
3132 QCOMPARE(flow->property("topPadding").toDouble(), 0.0);
3133 QCOMPARE(flow->property("leftPadding").toDouble(), 0.0);
3134 QCOMPARE(flow->property("rightPadding").toDouble(), 0.0);
3135 QCOMPARE(flow->property("bottomPadding").toDouble(), 0.0);
3136
3137 obj->setPadding(1.0);
3138
3139 QCOMPARE(flow->property("padding").toDouble(), 1.0);
3140 QCOMPARE(flow->property("topPadding").toDouble(), 1.0);
3141 QCOMPARE(flow->property("leftPadding").toDouble(), 1.0);
3142 QCOMPARE(flow->property("rightPadding").toDouble(), 1.0);
3143 QCOMPARE(flow->property("bottomPadding").toDouble(), 1.0);
3144
3145 QTRY_COMPARE(flow->height(), 122.0);
3146 QCOMPARE(flow->width(), 90.0);
3147
3148 QCOMPARE(one->x(), 1.0);
3149 QCOMPARE(one->y(), 1.0);
3150 QCOMPARE(two->x(), 51.0);
3151 QCOMPARE(two->y(), 1.0);
3152 QCOMPARE(three->x(), 1.0);
3153 QCOMPARE(three->y(), 51.0);
3154 QCOMPARE(four->x(), 1.0);
3155 QCOMPARE(four->y(), 71.0);
3156 QCOMPARE(five->x(), 51.0);
3157 QCOMPARE(five->y(), 71.0);
3158
3159 obj->setTopPadding(2.0);
3160
3161 QCOMPARE(flow->property("padding").toDouble(), 1.0);
3162 QCOMPARE(flow->property("topPadding").toDouble(), 2.0);
3163 QCOMPARE(flow->property("leftPadding").toDouble(), 1.0);
3164 QCOMPARE(flow->property("rightPadding").toDouble(), 1.0);
3165 QCOMPARE(flow->property("bottomPadding").toDouble(), 1.0);
3166
3167 QTRY_COMPARE(flow->height(), 123.0);
3168 QCOMPARE(flow->width(), 90.0);
3169
3170 QCOMPARE(one->x(), 1.0);
3171 QCOMPARE(one->y(), 2.0);
3172 QCOMPARE(two->x(), 51.0);
3173 QCOMPARE(two->y(), 2.0);
3174 QCOMPARE(three->x(), 1.0);
3175 QCOMPARE(three->y(), 52.0);
3176 QCOMPARE(four->x(), 1.0);
3177 QCOMPARE(four->y(), 72.0);
3178 QCOMPARE(five->x(), 51.0);
3179 QCOMPARE(five->y(), 72.0);
3180
3181 obj->setLeftPadding(3.0);
3182
3183 QCOMPARE(flow->property("padding").toDouble(), 1.0);
3184 QCOMPARE(flow->property("topPadding").toDouble(), 2.0);
3185 QCOMPARE(flow->property("leftPadding").toDouble(), 3.0);
3186 QCOMPARE(flow->property("rightPadding").toDouble(), 1.0);
3187 QCOMPARE(flow->property("bottomPadding").toDouble(), 1.0);
3188
3189 QCOMPARE(flow->height(), 123.0);
3190 QCOMPARE(flow->width(), 90.0);
3191
3192 QTRY_COMPARE(one->x(), 3.0);
3193 QCOMPARE(one->y(), 2.0);
3194 QCOMPARE(two->x(), 53.0);
3195 QCOMPARE(two->y(), 2.0);
3196 QCOMPARE(three->x(), 3.0);
3197 QCOMPARE(three->y(), 52.0);
3198 QCOMPARE(four->x(), 3.0);
3199 QCOMPARE(four->y(), 72.0);
3200 QCOMPARE(five->x(), 53.0);
3201 QCOMPARE(five->y(), 72.0);
3202
3203 obj->setRightPadding(4.0);
3204
3205 QCOMPARE(flow->property("padding").toDouble(), 1.0);
3206 QCOMPARE(flow->property("topPadding").toDouble(), 2.0);
3207 QCOMPARE(flow->property("leftPadding").toDouble(), 3.0);
3208 QCOMPARE(flow->property("rightPadding").toDouble(), 4.0);
3209 QCOMPARE(flow->property("bottomPadding").toDouble(), 1.0);
3210
3211 QCOMPARE(flow->height(), 123.0);
3212 QCOMPARE(flow->width(), 90.0);
3213
3214 QTRY_COMPARE(one->x(), 3.0);
3215 QCOMPARE(one->y(), 2.0);
3216 QCOMPARE(two->x(), 53.0);
3217 QCOMPARE(two->y(), 2.0);
3218 QCOMPARE(three->x(), 3.0);
3219 QCOMPARE(three->y(), 52.0);
3220 QCOMPARE(four->x(), 3.0);
3221 QCOMPARE(four->y(), 72.0);
3222 QCOMPARE(five->x(), 53.0);
3223 QCOMPARE(five->y(), 72.0);
3224
3225 obj->setBottomPadding(5.0);
3226
3227 QCOMPARE(flow->property("padding").toDouble(), 1.0);
3228 QCOMPARE(flow->property("topPadding").toDouble(), 2.0);
3229 QCOMPARE(flow->property("leftPadding").toDouble(), 3.0);
3230 QCOMPARE(flow->property("rightPadding").toDouble(), 4.0);
3231 QCOMPARE(flow->property("bottomPadding").toDouble(), 5.0);
3232
3233 QTRY_COMPARE(flow->height(), 127.0);
3234 QCOMPARE(flow->width(), 90.0);
3235
3236 QCOMPARE(one->x(), 3.0);
3237 QCOMPARE(one->y(), 2.0);
3238 QCOMPARE(two->x(), 53.0);
3239 QCOMPARE(two->y(), 2.0);
3240 QCOMPARE(three->x(), 3.0);
3241 QCOMPARE(three->y(), 52.0);
3242 QCOMPARE(four->x(), 3.0);
3243 QCOMPARE(four->y(), 72.0);
3244 QCOMPARE(five->x(), 53.0);
3245 QCOMPARE(five->y(), 72.0);
3246
3247 obj->resetBottomPadding();
3248 QCOMPARE(flow->property("bottomPadding").toDouble(), 1.0);
3249 QTRY_COMPARE(flow->height(), 123.0);
3250 QCOMPARE(flow->width(), 90.0);
3251
3252 obj->resetRightPadding();
3253 QCOMPARE(flow->property("rightPadding").toDouble(), 1.0);
3254 QTRY_COMPARE(flow->height(), 123.0);
3255 QCOMPARE(flow->width(), 90.0);
3256
3257 obj->resetLeftPadding();
3258 QCOMPARE(flow->property("leftPadding").toDouble(), 1.0);
3259 QTRY_COMPARE(flow->height(), 123.0);
3260 QCOMPARE(flow->width(), 90.0);
3261
3262 obj->resetTopPadding();
3263 QCOMPARE(flow->property("topPadding").toDouble(), 1.0);
3264 QTRY_COMPARE(flow->height(), 122.0);
3265 QCOMPARE(flow->width(), 90.0);
3266
3267 obj->resetPadding();
3268 QCOMPARE(flow->property("padding").toDouble(), 0.0);
3269 QCOMPARE(flow->property("topPadding").toDouble(), 0.0);
3270 QCOMPARE(flow->property("leftPadding").toDouble(), 0.0);
3271 QCOMPARE(flow->property("rightPadding").toDouble(), 0.0);
3272 QCOMPARE(flow->property("bottomPadding").toDouble(), 0.0);
3273 QTRY_COMPARE(flow->height(), 120.0);
3274 QCOMPARE(flow->width(), 90.0);
3275
3276 QCOMPARE(one->x(), 0.0);
3277 QCOMPARE(one->y(), 0.0);
3278 QCOMPARE(two->x(), 50.0);
3279 QCOMPARE(two->y(), 0.0);
3280 QCOMPARE(three->x(), 0.0);
3281 QCOMPARE(three->y(), 50.0);
3282 QCOMPARE(four->x(), 0.0);
3283 QCOMPARE(four->y(), 70.0);
3284 QCOMPARE(five->x(), 50.0);
3285 QCOMPARE(five->y(), 70.0);
3286}
3287
3288void tst_qquickpositioners::test_flow_rightToLeft()
3289{
3290 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest.qml")));
3291
3292 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
3293
3294 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3295 QVERIFY(one != nullptr);
3296 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3297 QVERIFY(two != nullptr);
3298 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3299 QVERIFY(three != nullptr);
3300 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3301 QVERIFY(four != nullptr);
3302 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3303 QVERIFY(five != nullptr);
3304
3305 QCOMPARE(one->x(), 40.0);
3306 QCOMPARE(one->y(), 0.0);
3307 QCOMPARE(two->x(), 20.0);
3308 QCOMPARE(two->y(), 0.0);
3309 QCOMPARE(three->x(), 40.0);
3310 QCOMPARE(three->y(), 50.0);
3311 QCOMPARE(four->x(), 40.0);
3312 QCOMPARE(four->y(), 70.0);
3313 QCOMPARE(five->x(), 30.0);
3314 QCOMPARE(five->y(), 70.0);
3315
3316 QQuickItem *flow = window->rootObject()->findChild<QQuickItem*>(aName: "flow");
3317 QVERIFY(flow);
3318 QCOMPARE(flow->width(), 90.0);
3319 QCOMPARE(flow->height(), 120.0);
3320
3321 // test padding
3322 flow->setProperty(name: "padding", value: 1);
3323 flow->setProperty(name: "topPadding", value: 2);
3324 flow->setProperty(name: "leftPadding", value: 3);
3325 flow->setProperty(name: "rightPadding", value: 4);
3326 flow->setProperty(name: "bottomPadding", value: 5);
3327
3328 QTRY_COMPARE(flow->height(), 127.0);
3329 QCOMPARE(flow->width(), 90.0);
3330
3331 QCOMPARE(one->x(), 36.0);
3332 QCOMPARE(one->y(), 2.0);
3333 QCOMPARE(two->x(), 16.0);
3334 QCOMPARE(two->y(), 2.0);
3335 QCOMPARE(three->x(), 36.0);
3336 QCOMPARE(three->y(), 52.0);
3337 QCOMPARE(four->x(), 36.0);
3338 QCOMPARE(four->y(), 72.0);
3339 QCOMPARE(five->x(), 26.0);
3340 QCOMPARE(five->y(), 72.0);
3341}
3342
3343void tst_qquickpositioners::test_flow_topToBottom()
3344{
3345 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest-toptobottom.qml")));
3346
3347 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
3348
3349 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3350 QVERIFY(one != nullptr);
3351 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3352 QVERIFY(two != nullptr);
3353 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3354 QVERIFY(three != nullptr);
3355 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3356 QVERIFY(four != nullptr);
3357 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3358 QVERIFY(five != nullptr);
3359
3360 QCOMPARE(one->x(), 0.0);
3361 QCOMPARE(one->y(), 0.0);
3362 QCOMPARE(two->x(), 50.0);
3363 QCOMPARE(two->y(), 0.0);
3364 QCOMPARE(three->x(), 50.0);
3365 QCOMPARE(three->y(), 50.0);
3366 QCOMPARE(four->x(), 100.0);
3367 QCOMPARE(four->y(), 0.0);
3368 QCOMPARE(five->x(), 100.0);
3369 QCOMPARE(five->y(), 50.0);
3370
3371 QQuickItem *flow = window->rootObject()->findChild<QQuickItem*>(aName: "flow");
3372 QVERIFY(flow);
3373 QCOMPARE(flow->height(), 90.0);
3374 QCOMPARE(flow->width(), 150.0);
3375
3376 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
3377
3378 QVERIFY(flow);
3379 QCOMPARE(flow->height(), 90.0);
3380 QCOMPARE(flow->width(), 150.0);
3381
3382 QCOMPARE(one->x(), 100.0);
3383 QCOMPARE(one->y(), 0.0);
3384 QCOMPARE(two->x(), 80.0);
3385 QCOMPARE(two->y(), 0.0);
3386 QCOMPARE(three->x(), 50.0);
3387 QCOMPARE(three->y(), 50.0);
3388 QCOMPARE(four->x(), 0.0);
3389 QCOMPARE(four->y(), 0.0);
3390 QCOMPARE(five->x(), 40.0);
3391 QCOMPARE(five->y(), 50.0);
3392
3393}
3394
3395void tst_qquickpositioners::test_flow_topToBottom_padding()
3396{
3397 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest-toptobottom.qml")));
3398
3399 window->rootObject()->setProperty(name: "testRightToLeft", value: false);
3400
3401 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3402 QVERIFY(one != nullptr);
3403 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3404 QVERIFY(two != nullptr);
3405 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3406 QVERIFY(three != nullptr);
3407 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3408 QVERIFY(four != nullptr);
3409 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3410 QVERIFY(five != nullptr);
3411
3412 QCOMPARE(one->x(), 0.0);
3413 QCOMPARE(one->y(), 0.0);
3414 QCOMPARE(two->x(), 50.0);
3415 QCOMPARE(two->y(), 0.0);
3416 QCOMPARE(three->x(), 50.0);
3417 QCOMPARE(three->y(), 50.0);
3418 QCOMPARE(four->x(), 100.0);
3419 QCOMPARE(four->y(), 0.0);
3420 QCOMPARE(five->x(), 100.0);
3421 QCOMPARE(five->y(), 50.0);
3422
3423 QQuickItem *flow = window->rootObject()->findChild<QQuickItem*>(aName: "flow");
3424 QVERIFY(flow);
3425 QCOMPARE(flow->height(), 90.0);
3426 QCOMPARE(flow->width(), 150.0);
3427
3428 // test padding
3429 flow->setProperty(name: "padding", value: 1);
3430 flow->setProperty(name: "topPadding", value: 2);
3431 flow->setProperty(name: "leftPadding", value: 3);
3432 flow->setProperty(name: "rightPadding", value: 4);
3433 flow->setProperty(name: "bottomPadding", value: 5);
3434
3435 QTRY_COMPARE(flow->width(), 157.0);
3436 QCOMPARE(flow->height(), 90.0);
3437
3438 QCOMPARE(one->x(), 3.0);
3439 QCOMPARE(one->y(), 2.0);
3440 QCOMPARE(two->x(), 53.0);
3441 QCOMPARE(two->y(), 2.0);
3442 QCOMPARE(three->x(), 53.0);
3443 QCOMPARE(three->y(), 52.0);
3444 QCOMPARE(four->x(), 103.0);
3445 QCOMPARE(four->y(), 2.0);
3446 QCOMPARE(five->x(), 103.0);
3447 QCOMPARE(five->y(), 52.0);
3448
3449 window->rootObject()->setProperty(name: "testRightToLeft", value: true);
3450
3451 QVERIFY(flow);
3452 QTRY_COMPARE(flow->width(), 157.0);
3453 QCOMPARE(flow->height(), 90.0);
3454
3455 QCOMPARE(one->x(), 103.0);
3456 QCOMPARE(one->y(), 2.0);
3457 QCOMPARE(two->x(), 83.0);
3458 QCOMPARE(two->y(), 2.0);
3459 QCOMPARE(three->x(), 53.0);
3460 QCOMPARE(three->y(), 52.0);
3461 QCOMPARE(four->x(), 3.0);
3462 QCOMPARE(four->y(), 2.0);
3463 QCOMPARE(five->x(), 43.0);
3464 QCOMPARE(five->y(), 52.0);
3465
3466}
3467
3468void tst_qquickpositioners::test_flow_resize()
3469{
3470 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest.qml")));
3471
3472 QQuickItem *root = qobject_cast<QQuickItem*>(object: window->rootObject());
3473 QVERIFY(root);
3474 root->setWidth(125);
3475 root->setProperty(name: "testRightToLeft", value: false);
3476
3477 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3478 QVERIFY(one != nullptr);
3479 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3480 QVERIFY(two != nullptr);
3481 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3482 QVERIFY(three != nullptr);
3483 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3484 QVERIFY(four != nullptr);
3485 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3486 QVERIFY(five != nullptr);
3487
3488 QTRY_COMPARE(one->x(), 0.0);
3489 QTRY_COMPARE(one->y(), 0.0);
3490 QTRY_COMPARE(two->x(), 50.0);
3491 QTRY_COMPARE(two->y(), 0.0);
3492 QTRY_COMPARE(three->x(), 70.0);
3493 QTRY_COMPARE(three->y(), 0.0);
3494 QTRY_COMPARE(four->x(), 0.0);
3495 QTRY_COMPARE(four->y(), 50.0);
3496 QTRY_COMPARE(five->x(), 50.0);
3497 QTRY_COMPARE(five->y(), 50.0);
3498
3499}
3500
3501void tst_qquickpositioners::test_flow_resize_padding()
3502{
3503 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest-padding.qml")));
3504
3505 QQuickItem *root = qobject_cast<QQuickItem*>(object: window->rootObject());
3506 QVERIFY(root);
3507 root->setWidth(125);
3508 root->setProperty(name: "testRightToLeft", value: false);
3509
3510 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3511 QVERIFY(one != nullptr);
3512 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3513 QVERIFY(two != nullptr);
3514 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3515 QVERIFY(three != nullptr);
3516 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3517 QVERIFY(four != nullptr);
3518 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3519 QVERIFY(five != nullptr);
3520
3521 QTRY_COMPARE(one->x(), 3.0);
3522 QTRY_COMPARE(one->y(), 2.0);
3523 QTRY_COMPARE(two->x(), 53.0);
3524 QTRY_COMPARE(two->y(), 2.0);
3525 QTRY_COMPARE(three->x(), 3.0);
3526 QTRY_COMPARE(three->y(), 52.0);
3527 QTRY_COMPARE(four->x(), 53.0);
3528 QTRY_COMPARE(four->y(), 52.0);
3529 QTRY_COMPARE(five->x(), 103.0);
3530 QTRY_COMPARE(five->y(), 52.0);
3531
3532}
3533
3534void tst_qquickpositioners::test_flow_resize_rightToLeft()
3535{
3536 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest.qml")));
3537
3538 QQuickItem *root = qobject_cast<QQuickItem*>(object: window->rootObject());
3539 QVERIFY(root);
3540 root->setWidth(125);
3541 root->setProperty(name: "testRightToLeft", value: true);
3542
3543 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3544 QTRY_VERIFY(one != nullptr);
3545 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3546 QVERIFY(two != nullptr);
3547 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3548 QVERIFY(three != nullptr);
3549 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3550 QVERIFY(four != nullptr);
3551 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3552 QVERIFY(five != nullptr);
3553
3554 QCOMPARE(one->x(), 75.0);
3555 QCOMPARE(one->y(), 0.0);
3556 QCOMPARE(two->x(), 55.0);
3557 QCOMPARE(two->y(), 0.0);
3558 QCOMPARE(three->x(), 5.0);
3559 QCOMPARE(three->y(), 0.0);
3560 QCOMPARE(four->x(), 75.0);
3561 QCOMPARE(four->y(), 50.0);
3562 QCOMPARE(five->x(), 65.0);
3563 QCOMPARE(five->y(), 50.0);
3564
3565}
3566
3567void tst_qquickpositioners::test_flow_resize_rightToLeft_padding()
3568{
3569 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flowtest-padding.qml")));
3570
3571 QQuickItem *root = qobject_cast<QQuickItem*>(object: window->rootObject());
3572 QVERIFY(root);
3573 root->setWidth(125);
3574 root->setProperty(name: "testRightToLeft", value: true);
3575
3576 QQuickRectangle *one = window->rootObject()->findChild<QQuickRectangle*>(aName: "one");
3577 QTRY_VERIFY(one != nullptr);
3578 QQuickRectangle *two = window->rootObject()->findChild<QQuickRectangle*>(aName: "two");
3579 QVERIFY(two != nullptr);
3580 QQuickRectangle *three = window->rootObject()->findChild<QQuickRectangle*>(aName: "three");
3581 QVERIFY(three != nullptr);
3582 QQuickRectangle *four = window->rootObject()->findChild<QQuickRectangle*>(aName: "four");
3583 QVERIFY(four != nullptr);
3584 QQuickRectangle *five = window->rootObject()->findChild<QQuickRectangle*>(aName: "five");
3585 QVERIFY(five != nullptr);
3586
3587 QCOMPARE(one->x(), 71.0);
3588 QCOMPARE(one->y(), 2.0);
3589 QCOMPARE(two->x(), 51.0);
3590 QCOMPARE(two->y(), 2.0);
3591 QCOMPARE(three->x(), 71.0);
3592 QCOMPARE(three->y(), 52.0);
3593 QCOMPARE(four->x(), 21.0);
3594 QCOMPARE(four->y(), 52.0);
3595 QCOMPARE(five->x(), 11.0);
3596 QCOMPARE(five->y(), 52.0);
3597
3598}
3599
3600void tst_qquickpositioners::test_flow_implicit_resize()
3601{
3602 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flow-testimplicitsize.qml")));
3603 QVERIFY(window->rootObject() != nullptr);
3604
3605 QQuickFlow *flow = window->rootObject()->findChild<QQuickFlow*>(aName: "flow");
3606 QVERIFY(flow != nullptr);
3607
3608 QCOMPARE(flow->width(), 100.0);
3609 QCOMPARE(flow->height(), 120.0);
3610
3611 window->rootObject()->setProperty(name: "flowLayout", value: 0);
3612 QCOMPARE(flow->flow(), QQuickFlow::LeftToRight);
3613 QCOMPARE(flow->width(), 220.0);
3614 QCOMPARE(flow->height(), 50.0);
3615
3616 window->rootObject()->setProperty(name: "flowLayout", value: 1);
3617 QCOMPARE(flow->flow(), QQuickFlow::TopToBottom);
3618 QCOMPARE(flow->width(), 100.0);
3619 QCOMPARE(flow->height(), 120.0);
3620
3621 window->rootObject()->setProperty(name: "flowLayout", value: 2);
3622 QCOMPARE(flow->layoutDirection(), Qt::RightToLeft);
3623 QCOMPARE(flow->width(), 220.0);
3624 QCOMPARE(flow->height(), 50.0);
3625
3626}
3627
3628void tst_qquickpositioners::test_flow_implicit_resize_padding()
3629{
3630 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "flow-testimplicitsize.qml")));
3631 QVERIFY(window->rootObject() != nullptr);
3632
3633 QQuickFlow *flow = window->rootObject()->findChild<QQuickFlow*>(aName: "flow");
3634 QVERIFY(flow != nullptr);
3635
3636 QCOMPARE(flow->width(), 100.0);
3637 QCOMPARE(flow->height(), 120.0);
3638
3639 // test padding
3640 flow->setProperty(name: "padding", value: 1);
3641 flow->setProperty(name: "topPadding", value: 2);
3642 flow->setProperty(name: "leftPadding", value: 3);
3643 flow->setProperty(name: "rightPadding", value: 4);
3644 flow->setProperty(name: "bottomPadding", value: 5);
3645
3646 QTRY_COMPARE(flow->width(), 107.0);
3647 QCOMPARE(flow->height(), 127.0);
3648
3649 window->rootObject()->setProperty(name: "flowLayout", value: 0);
3650 QCOMPARE(flow->flow(), QQuickFlow::LeftToRight);
3651 QCOMPARE(flow->width(), 227.0);
3652 QCOMPARE(flow->height(), 57.0);
3653
3654 window->rootObject()->setProperty(name: "flowLayout", value: 1);
3655 QCOMPARE(flow->flow(), QQuickFlow::TopToBottom);
3656 QCOMPARE(flow->width(), 107.0);
3657 QCOMPARE(flow->height(), 127.0);
3658
3659 window->rootObject()->setProperty(name: "flowLayout", value: 2);
3660 QCOMPARE(flow->layoutDirection(), Qt::RightToLeft);
3661 QCOMPARE(flow->width(), 227.0);
3662 QCOMPARE(flow->height(), 57.0);
3663
3664}
3665
3666void tst_qquickpositioners::test_conflictinganchors()
3667{
3668 QQmlTestMessageHandler messageHandler;
3669 QQmlEngine engine;
3670 QQmlComponent component(&engine);
3671
3672 component.setData("import QtQuick 2.0\nColumn { Item { width: 100; height: 100; } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3673 QQuickItem *item = qobject_cast<QQuickItem*>(object: component.create());
3674 QVERIFY(item);
3675 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3676 delete item;
3677
3678 component.setData("import QtQuick 2.0\nRow { Item { width: 100; height: 100; } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3679 item = qobject_cast<QQuickItem*>(object: component.create());
3680 QVERIFY(item);
3681 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3682 delete item;
3683
3684 component.setData("import QtQuick 2.0\nGrid { Item { width: 100; height: 100; } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3685 item = qobject_cast<QQuickItem*>(object: component.create());
3686 QVERIFY(item);
3687 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3688 delete item;
3689
3690 component.setData("import QtQuick 2.0\nFlow { Item { width: 100; height: 100; } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3691 item = qobject_cast<QQuickItem*>(object: component.create());
3692 QVERIFY(item);
3693 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3694 delete item;
3695
3696 component.setData("import QtQuick 2.0\nColumn { Item { width: 100; height: 100; anchors.top: parent.top } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3697 item = qobject_cast<QQuickItem*>(object: component.create());
3698 QVERIFY(item);
3699 QCOMPARE(messageHandler.messages().size(), 1);
3700 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column. Column will not function."));
3701 messageHandler.clear();
3702 delete item;
3703
3704 component.setData("import QtQuick 2.0\nColumn { Item { width: 100; height: 100; anchors.centerIn: parent } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3705 item = qobject_cast<QQuickItem*>(object: component.create());
3706 QVERIFY(item);
3707 QCOMPARE(messageHandler.messages().size(), 1);
3708 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column. Column will not function."));
3709 messageHandler.clear();
3710 delete item;
3711
3712 component.setData("import QtQuick 2.0\nColumn { Item { width: 100; height: 100; anchors.left: parent.left } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3713 item = qobject_cast<QQuickItem*>(object: component.create());
3714 QVERIFY(item);
3715 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3716 delete item;
3717
3718 component.setData("import QtQuick 2.0\nRow { Item { width: 100; height: 100; anchors.left: parent.left } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3719 item = qobject_cast<QQuickItem*>(object: component.create());
3720 QVERIFY(item);
3721 QCOMPARE(messageHandler.messages().size(), 1);
3722 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row. Row will not function."));
3723 messageHandler.clear();
3724 delete item;
3725
3726 component.setData("import QtQuick 2.0\nRow { width: 100; height: 100; Item { anchors.fill: parent } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3727 item = qobject_cast<QQuickItem*>(object: component.create());
3728 QVERIFY(item);
3729 QCOMPARE(messageHandler.messages().size(), 1);
3730 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row. Row will not function."));
3731 messageHandler.clear();
3732 delete item;
3733
3734 component.setData("import QtQuick 2.0\nRow { Item { width: 100; height: 100; anchors.top: parent.top } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3735 item = qobject_cast<QQuickItem*>(object: component.create());
3736 QVERIFY(item);
3737 QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
3738 delete item;
3739
3740 component.setData("import QtQuick 2.0\nGrid { Item { width: 100; height: 100; anchors.horizontalCenter: parent.horizontalCenter } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3741 item = qobject_cast<QQuickItem*>(object: component.create());
3742 QVERIFY(item);
3743 QCOMPARE(messageHandler.messages().size(), 1);
3744 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Grid: Cannot specify anchors for items inside Grid. Grid will not function."));
3745 messageHandler.clear();
3746 delete item;
3747
3748 component.setData("import QtQuick 2.0\nGrid { Item { width: 100; height: 100; anchors.centerIn: parent } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3749 item = qobject_cast<QQuickItem*>(object: component.create());
3750 QVERIFY(item);
3751 QCOMPARE(messageHandler.messages().size(), 1);
3752 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Grid: Cannot specify anchors for items inside Grid. Grid will not function."));
3753 messageHandler.clear();
3754 delete item;
3755
3756 component.setData("import QtQuick 2.0\nFlow { Item { width: 100; height: 100; anchors.verticalCenter: parent.verticalCenter } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3757 item = qobject_cast<QQuickItem*>(object: component.create());
3758 QVERIFY(item);
3759 QCOMPARE(messageHandler.messages().size(), 1);
3760 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Flow: Cannot specify anchors for items inside Flow. Flow will not function."));
3761 messageHandler.clear();
3762 delete item;
3763
3764 component.setData("import QtQuick 2.0\nFlow { width: 100; height: 100; Item { anchors.fill: parent } }", baseUrl: QUrl::fromLocalFile(localfile: ""));
3765 item = qobject_cast<QQuickItem*>(object: component.create());
3766 QVERIFY(item);
3767 QCOMPARE(messageHandler.messages().size(), 1);
3768 QCOMPARE(messageHandler.messages().back(), QString("<Unknown File>:2:1: QML Flow: Cannot specify anchors for items inside Flow. Flow will not function."));
3769 delete item;
3770}
3771
3772void tst_qquickpositioners::test_mirroring()
3773{
3774 QList<QString> qmlFiles;
3775 qmlFiles << "horizontal.qml" << "horizontal-padding.qml"
3776 << "gridtest.qml" << "gridtest-padding.qml"
3777 << "flowtest.qml" << "flowtest-padding.qml";
3778 QList<QString> objectNames;
3779 objectNames << "one" << "two" << "three" << "four" << "five";
3780
3781 foreach (const QString qmlFile, qmlFiles) {
3782 QScopedPointer<QQuickView> windowA(createView(filename: testFile(fileName: qmlFile)));
3783 QQuickItem *rootA = qobject_cast<QQuickItem*>(object: windowA->rootObject());
3784
3785 QScopedPointer<QQuickView> windowB(createView(filename: testFile(fileName: qmlFile)));
3786 QQuickItem *rootB = qobject_cast<QQuickItem*>(object: windowB->rootObject());
3787 // On OS X the windows might get positioned exactly on top of each other
3788 // that means no repaint for the bottom window will ever occur
3789 windowB->setPosition(windowB->position() + QPoint(10, 10));
3790
3791 rootA->setProperty(name: "testRightToLeft", value: true); // layoutDirection: Qt.RightToLeft
3792
3793 // LTR != RTL
3794 foreach (const QString objectName, objectNames) {
3795 // horizontal.qml and horizontal-padding.qml only have three items
3796 if (qmlFile.startsWith(s: QString("horizontal")) && objectName == QString("four"))
3797 break;
3798 QQuickItem *itemA = rootA->findChild<QQuickItem*>(aName: objectName);
3799 QQuickItem *itemB = rootB->findChild<QQuickItem*>(aName: objectName);
3800 QTRY_VERIFY(itemA->x() != itemB->x());
3801 }
3802
3803 QQmlProperty enabledProp(rootB, "LayoutMirroring.enabled", qmlContext(rootB));
3804 enabledProp.write(true);
3805 QQmlProperty inheritProp(rootB, "LayoutMirroring.childrenInherit", qmlContext(rootB));
3806 inheritProp.write(true);
3807
3808 // RTL == mirror
3809 foreach (const QString objectName, objectNames) {
3810 // horizontal.qml and horizontal-padding.qml only have three items
3811 if (qmlFile.startsWith(s: QString("horizontal")) && objectName == QString("four"))
3812 break;
3813 QQuickItem *itemA = rootA->findChild<QQuickItem*>(aName: objectName);
3814 QQuickItem *itemB = rootB->findChild<QQuickItem*>(aName: objectName);
3815 QTRY_COMPARE(itemA->x(), itemB->x());
3816
3817 // after resize (QTBUG-35095)
3818 QQuickItem *positionerA = itemA->parentItem();
3819 QQuickItem *positionerB = itemB->parentItem();
3820 positionerA->setWidth(positionerA->width() * 2);
3821 positionerB->setWidth(positionerB->width() * 2);
3822 QVERIFY(QQuickTest::qWaitForItemPolished(positionerA) && QQuickTest::qWaitForItemPolished(positionerB));
3823 QTRY_COMPARE(itemA->x(), itemB->x());
3824 }
3825
3826 rootA->setProperty(name: "testRightToLeft", value: false); // layoutDirection: Qt.LeftToRight
3827 rootB->setProperty(name: "testRightToLeft", value: true); // layoutDirection: Qt.RightToLeft
3828
3829 // LTR == RTL + mirror
3830 foreach (const QString objectName, objectNames) {
3831 // horizontal.qml and horizontal-padding.qml only have three items
3832 if (qmlFile.startsWith(s: QString("horizontal")) && objectName == QString("four"))
3833 break;
3834 QQuickItem *itemA = rootA->findChild<QQuickItem*>(aName: objectName);
3835 QQuickItem *itemB = rootB->findChild<QQuickItem*>(aName: objectName);
3836 QTRY_COMPARE(itemA->x(), itemB->x());
3837 }
3838 }
3839}
3840
3841void tst_qquickpositioners::test_allInvisible()
3842{
3843 //QTBUG-19361
3844 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "allInvisible.qml")));
3845
3846 QQuickItem *root = qobject_cast<QQuickItem*>(object: window->rootObject());
3847 QVERIFY(root);
3848
3849 QQuickRow *row = window->rootObject()->findChild<QQuickRow*>(aName: "row");
3850 QVERIFY(row != nullptr);
3851 QCOMPARE(row->width(), qreal(0));
3852 QCOMPARE(row->height(), qreal(0));
3853
3854 // test padding
3855 row->setProperty(name: "padding", value: 1);
3856 row->setProperty(name: "topPadding", value: 2);
3857 row->setProperty(name: "leftPadding", value: 3);
3858 row->setProperty(name: "rightPadding", value: 4);
3859 row->setProperty(name: "bottomPadding", value: 5);
3860
3861 QTRY_COMPARE(row->height(), 7.0);
3862 QCOMPARE(row->width(), 7.0);
3863
3864 QQuickColumn *column = window->rootObject()->findChild<QQuickColumn*>(aName: "column");
3865 QVERIFY(column != nullptr);
3866 QCOMPARE(column->width(), qreal(0));
3867 QCOMPARE(column->height(), qreal(0));
3868
3869 // test padding
3870 column->setProperty(name: "padding", value: 1);
3871 column->setProperty(name: "topPadding", value: 2);
3872 column->setProperty(name: "leftPadding", value: 3);
3873 column->setProperty(name: "rightPadding", value: 4);
3874 column->setProperty(name: "bottomPadding", value: 5);
3875
3876 QTRY_COMPARE(column->height(), 7.0);
3877 QCOMPARE(column->width(), 7.0);
3878
3879 QQuickGrid *grid = window->rootObject()->findChild<QQuickGrid*>(aName: "grid");
3880 QVERIFY(grid != nullptr);
3881 QCOMPARE(grid->width(), qreal(0));
3882 QCOMPARE(grid->height(), qreal(0));
3883
3884 // test padding
3885 grid->setProperty(name: "padding", value: 1);
3886 grid->setProperty(name: "topPadding", value: 2);
3887 grid->setProperty(name: "leftPadding", value: 3);
3888 grid->setProperty(name: "rightPadding", value: 4);
3889 grid->setProperty(name: "bottomPadding", value: 5);
3890
3891 QTRY_COMPARE(grid->height(), 7.0);
3892 QCOMPARE(grid->width(), 7.0);
3893
3894 QQuickFlow *flow = window->rootObject()->findChild<QQuickFlow*>(aName: "flow");
3895 QVERIFY(flow != nullptr);
3896 QCOMPARE(flow->width(), qreal(0));
3897 QCOMPARE(flow->height(), qreal(0));
3898
3899 // test padding
3900 flow->setProperty(name: "padding", value: 1);
3901 flow->setProperty(name: "topPadding", value: 2);
3902 flow->setProperty(name: "leftPadding", value: 3);
3903 flow->setProperty(name: "rightPadding", value: 4);
3904 flow->setProperty(name: "bottomPadding", value: 5);
3905
3906 QTRY_COMPARE(flow->height(), 7.0);
3907 QCOMPARE(flow->width(), 7.0);
3908}
3909
3910void tst_qquickpositioners::test_attachedproperties()
3911{
3912 QFETCH(QString, filename);
3913
3914 QScopedPointer<QQuickView> window(createView(filename));
3915 QVERIFY(window->rootObject() != nullptr);
3916
3917 QQuickRectangle *greenRect = window->rootObject()->findChild<QQuickRectangle *>(aName: "greenRect");
3918 QVERIFY(greenRect != nullptr);
3919
3920 int posIndex = greenRect->property(name: "posIndex").toInt();
3921 QCOMPARE(posIndex, 0);
3922 bool isFirst = greenRect->property(name: "isFirstItem").toBool();
3923 QVERIFY(isFirst);
3924 bool isLast = greenRect->property(name: "isLastItem").toBool();
3925 QVERIFY(!isLast);
3926
3927 QQuickRectangle *yellowRect = window->rootObject()->findChild<QQuickRectangle *>(aName: "yellowRect");
3928 QVERIFY(yellowRect != nullptr);
3929
3930 posIndex = yellowRect->property(name: "posIndex").toInt();
3931 QCOMPARE(posIndex, -1);
3932 isFirst = yellowRect->property(name: "isFirstItem").toBool();
3933 QVERIFY(!isFirst);
3934 isLast = yellowRect->property(name: "isLastItem").toBool();
3935 QVERIFY(!isLast);
3936
3937 yellowRect->metaObject()->invokeMethod(obj: yellowRect, member: "onDemandPositioner");
3938
3939 posIndex = yellowRect->property(name: "posIndex").toInt();
3940 QCOMPARE(posIndex, 1);
3941 isFirst = yellowRect->property(name: "isFirstItem").toBool();
3942 QVERIFY(!isFirst);
3943 isLast = yellowRect->property(name: "isLastItem").toBool();
3944 QVERIFY(isLast);
3945
3946}
3947
3948void tst_qquickpositioners::test_attachedproperties_data()
3949{
3950 QTest::addColumn<QString>(name: "filename");
3951
3952 QTest::newRow(dataTag: "column") << testFile(fileName: "attachedproperties-column.qml");
3953 QTest::newRow(dataTag: "row") << testFile(fileName: "attachedproperties-row.qml");
3954 QTest::newRow(dataTag: "grid") << testFile(fileName: "attachedproperties-grid.qml");
3955 QTest::newRow(dataTag: "flow") << testFile(fileName: "attachedproperties-flow.qml");
3956}
3957
3958void tst_qquickpositioners::test_attachedproperties_dynamic()
3959{
3960 QScopedPointer<QQuickView> window(createView(filename: testFile(fileName: "attachedproperties-dynamic.qml")));
3961 QVERIFY(window->rootObject() != nullptr);
3962
3963 QQuickRow *row = window->rootObject()->findChild<QQuickRow *>(aName: "pos");
3964 QVERIFY(row != nullptr);
3965
3966 QQuickRectangle *rect0 = window->rootObject()->findChild<QQuickRectangle *>(aName: "rect0");
3967 QVERIFY(rect0 != nullptr);
3968
3969 int posIndex = rect0->property(name: "index").toInt();
3970 QCOMPARE(posIndex, 0);
3971 bool isFirst = rect0->property(name: "firstItem").toBool();
3972 QVERIFY(isFirst);
3973 bool isLast = rect0->property(name: "lastItem").toBool();
3974 QVERIFY(!isLast);
3975
3976 QQuickRectangle *rect1 = window->rootObject()->findChild<QQuickRectangle *>(aName: "rect1");
3977 QVERIFY(rect1 != nullptr);
3978
3979 posIndex = rect1->property(name: "index").toInt();
3980 QCOMPARE(posIndex, 1);
3981 isFirst = rect1->property(name: "firstItem").toBool();
3982 QVERIFY(!isFirst);
3983 isLast = rect1->property(name: "lastItem").toBool();
3984 QVERIFY(isLast);
3985
3986 row->metaObject()->invokeMethod(obj: row, member: "createSubRect");
3987
3988 QTRY_COMPARE(rect1->property("index").toInt(), 1);
3989 QTRY_VERIFY(!rect1->property("firstItem").toBool());
3990 QTRY_VERIFY(!rect1->property("lastItem").toBool());
3991
3992 QQuickRectangle *rect2 = window->rootObject()->findChild<QQuickRectangle *>(aName: "rect2");
3993 QVERIFY(rect2 != nullptr);
3994
3995 posIndex = rect2->property(name: "index").toInt();
3996 QCOMPARE(posIndex, 2);
3997 isFirst = rect2->property(name: "firstItem").toBool();
3998 QVERIFY(!isFirst);
3999 isLast = rect2->property(name: "lastItem").toBool();
4000 QVERIFY(isLast);
4001
4002 row->metaObject()->invokeMethod(obj: row, member: "destroySubRect");
4003
4004 QCoreApplication::sendPostedEvents(receiver: nullptr, event_type: QEvent::DeferredDelete);
4005 QCoreApplication::processEvents();
4006
4007 QTRY_COMPARE(rect1->property("index").toInt(), 1);
4008 QTRY_VERIFY(!rect1->property("firstItem").toBool());
4009 QTRY_VERIFY(rect1->property("lastItem").toBool());
4010
4011}
4012
4013QQuickView *tst_qquickpositioners::createView(const QString &filename, bool wait)
4014{
4015 QQuickView *window = new QQuickView(nullptr);
4016 qCDebug(lcTests) << "created window";
4017
4018 window->setSource(QUrl::fromLocalFile(localfile: filename));
4019 qCDebug(lcTests) << "loaded content from" << filename;
4020 window->show();
4021 qCDebug(lcTests) << "window shown";
4022 bool exposed = true;
4023 if (wait)
4024 exposed = QTest::qWaitForWindowExposed(window); //It may not relayout until the next frame, so it needs to be drawn
4025 if (exposed)
4026 qCDebug(lcTests) << "window exposed";
4027 else
4028 qCWarning(lcTests) << "window NOT exposed";
4029
4030 return window;
4031}
4032
4033void tst_qquickpositioners::matchIndexLists(const QVariantList &indexLists, const QList<int> &expectedIndexes)
4034{
4035 const QSet<int> expectedIndexSet(expectedIndexes.cbegin(), expectedIndexes.cend());
4036 for (int i=0; i<indexLists.count(); i++) {
4037 const auto &currentList = indexLists[i].value<QList<int> >();
4038 const QSet<int> current(currentList.cbegin(), currentList.cend());
4039 if (current != expectedIndexSet)
4040 qDebug() << "Cannot match actual targets" << current << "with expected" << expectedIndexes;
4041 QCOMPARE(current, expectedIndexSet);
4042 }
4043}
4044
4045void tst_qquickpositioners::matchItemsAndIndexes(const QVariantMap &items, const QaimModel &model, const QList<int> &expectedIndexes)
4046{
4047 for (QVariantMap::const_iterator it = items.begin(); it != items.end(); ++it) {
4048 QCOMPARE(it.value().type(), QVariant::Int);
4049 QString name = it.key();
4050 int itemIndex = it.value().toInt();
4051 QVERIFY2(expectedIndexes.contains(itemIndex), QTest::toString(QString("Index %1 not found in expectedIndexes").arg(itemIndex)));
4052 if (model.name(index: itemIndex) != name)
4053 qDebug() << itemIndex;
4054 QCOMPARE(model.name(itemIndex), name);
4055 }
4056 QCOMPARE(items.count(), expectedIndexes.count());
4057}
4058
4059void tst_qquickpositioners::matchItemLists(const QVariantList &itemLists, const QList<QQuickItem *> &expectedItems)
4060{
4061 for (int i=0; i<itemLists.count(); i++) {
4062 QCOMPARE(itemLists[i].type(), QVariant::List);
4063 QVariantList current = itemLists[i].toList();
4064 for (int j=0; j<current.count(); j++) {
4065 QQuickItem *o = qobject_cast<QQuickItem*>(object: current[j].value<QObject*>());
4066 QVERIFY2(o, QTest::toString(QString("Invalid actual item at %1").arg(j)));
4067 QVERIFY2(expectedItems.contains(o), QTest::toString(QString("Cannot match item %1").arg(j)));
4068 }
4069 QCOMPARE(current.count(), expectedItems.count());
4070 }
4071}
4072
4073QTEST_MAIN(tst_qquickpositioners)
4074
4075#include "tst_qquickpositioners.moc"
4076

source code of qtdeclarative/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp