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 | |
29 | |
30 | #include <QtTest/QtTest> |
31 | #include <qgraphicsgridlayout.h> |
32 | #include <qgraphicswidget.h> |
33 | #include <qgraphicsscene.h> |
34 | #include <qgraphicsview.h> |
35 | |
36 | class tst_QGraphicsGridLayout : public QObject |
37 | { |
38 | Q_OBJECT |
39 | |
40 | private slots: |
41 | void qgraphicsgridlayout_data(); |
42 | void qgraphicsgridlayout(); |
43 | void addItem_data(); |
44 | void addItem(); |
45 | void alignment_data(); |
46 | void alignment(); |
47 | void alignment2(); |
48 | void alignment2_data(); |
49 | void columnAlignment_data(); |
50 | void columnAlignment(); |
51 | void columnCount_data(); |
52 | void columnCount(); |
53 | void columnMaximumWidth_data(); |
54 | void columnMaximumWidth(); |
55 | void columnMinimumWidth_data(); |
56 | void columnMinimumWidth(); |
57 | void columnPreferredWidth_data(); |
58 | void columnPreferredWidth(); |
59 | void setColumnFixedWidth(); |
60 | void columnSpacing(); |
61 | void columnStretchFactor(); |
62 | void count(); |
63 | void contentsMargins(); |
64 | void horizontalSpacing_data(); |
65 | void horizontalSpacing(); |
66 | void itemAt(); |
67 | void removeAt(); |
68 | void removeItem(); |
69 | void rowAlignment_data(); |
70 | void rowAlignment(); |
71 | void rowCount_data(); |
72 | void rowCount(); |
73 | void rowMaximumHeight_data(); |
74 | void rowMaximumHeight(); |
75 | void rowMinimumHeight_data(); |
76 | void rowMinimumHeight(); |
77 | void rowPreferredHeight_data(); |
78 | void rowPreferredHeight(); |
79 | void rowSpacing(); |
80 | void rowStretchFactor_data(); |
81 | void rowStretchFactor(); |
82 | void setColumnSpacing_data(); |
83 | void setColumnSpacing(); |
84 | void setGeometry_data(); |
85 | void setGeometry(); |
86 | void setRowFixedHeight(); |
87 | void setRowSpacing_data(); |
88 | void setRowSpacing(); |
89 | void setSpacing_data(); |
90 | void setSpacing(); |
91 | void sizeHint_data(); |
92 | void sizeHint(); |
93 | void verticalSpacing_data(); |
94 | void verticalSpacing(); |
95 | void layoutDirection_data(); |
96 | void layoutDirection(); |
97 | void removeLayout(); |
98 | void defaultStretchFactors_data(); |
99 | void defaultStretchFactors(); |
100 | void geometries_data(); |
101 | void geometries(); |
102 | void avoidRecursionInInsertItem(); |
103 | void styleInfoLeak(); |
104 | void task236367_maxSizeHint(); |
105 | void spanningItem2x2_data(); |
106 | void spanningItem2x2(); |
107 | void spanningItem2x3_data(); |
108 | void spanningItem2x3(); |
109 | void spanningItem(); |
110 | void spanAcrossEmptyRow(); |
111 | void heightForWidth(); |
112 | void widthForHeight(); |
113 | void heightForWidthWithSpanning(); |
114 | void stretchAndHeightForWidth(); |
115 | void testDefaultAlignment(); |
116 | void hiddenItems(); |
117 | }; |
118 | |
119 | class RectWidget : public QGraphicsWidget |
120 | { |
121 | public: |
122 | RectWidget(QGraphicsItem *parent = 0) : QGraphicsWidget(parent), m_fnConstraint(0) {} |
123 | |
124 | void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
125 | { |
126 | Q_UNUSED(option); |
127 | Q_UNUSED(widget); |
128 | painter->drawRoundedRect(rect: rect(), xRadius: 25, yRadius: 25, mode: Qt::RelativeSize); |
129 | painter->drawLine(p1: rect().topLeft(), p2: rect().bottomRight()); |
130 | painter->drawLine(p1: rect().bottomLeft(), p2: rect().topRight()); |
131 | } |
132 | |
133 | QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const |
134 | { |
135 | if (constraint.width() < 0 && constraint.height() < 0 && m_sizeHints[which].isValid()) { |
136 | return m_sizeHints[which]; |
137 | } |
138 | if (m_fnConstraint) { |
139 | return m_fnConstraint(which, constraint); |
140 | } |
141 | return QGraphicsWidget::sizeHint(which, constraint); |
142 | } |
143 | |
144 | void setSizeHint(Qt::SizeHint which, const QSizeF &size) { |
145 | m_sizeHints[which] = size; |
146 | updateGeometry(); |
147 | } |
148 | |
149 | void setConstraintFunction(QSizeF (*fnConstraint)(Qt::SizeHint, const QSizeF &)) { |
150 | m_fnConstraint = fnConstraint; |
151 | } |
152 | |
153 | // Initializer {} is a workaround for gcc bug 68949 |
154 | QSizeF m_sizeHints[Qt::NSizeHints] {}; |
155 | QSizeF (*m_fnConstraint)(Qt::SizeHint, const QSizeF &); |
156 | |
157 | }; |
158 | |
159 | struct ItemDesc |
160 | { |
161 | ItemDesc(int row, int col) |
162 | : m_pos(qMakePair(x: row, y: col)) |
163 | { |
164 | } |
165 | |
166 | ItemDesc &rowSpan(int span) { |
167 | m_rowSpan = span; |
168 | return (*this); |
169 | } |
170 | |
171 | ItemDesc &colSpan(int span) { |
172 | m_colSpan = span; |
173 | return (*this); |
174 | } |
175 | |
176 | ItemDesc &sizePolicy(const QSizePolicy &sp) { |
177 | m_sizePolicy = sp; |
178 | return (*this); |
179 | } |
180 | |
181 | ItemDesc &sizePolicy(QSizePolicy::Policy horAndVer) { |
182 | m_sizePolicy = QSizePolicy(horAndVer, horAndVer); |
183 | return (*this); |
184 | } |
185 | |
186 | ItemDesc &sizePolicyH(QSizePolicy::Policy hor) { |
187 | m_sizePolicy.setHorizontalPolicy(hor); |
188 | return (*this); |
189 | } |
190 | |
191 | ItemDesc &sizePolicyV(QSizePolicy::Policy ver) { |
192 | m_sizePolicy.setVerticalPolicy(ver); |
193 | return (*this); |
194 | } |
195 | |
196 | ItemDesc &sizePolicy(QSizePolicy::Policy hor, QSizePolicy::Policy ver) { |
197 | m_sizePolicy = QSizePolicy(hor, ver); |
198 | return (*this); |
199 | } |
200 | |
201 | ItemDesc &sizeHint(Qt::SizeHint which, const QSizeF &sh) { |
202 | m_sizeHints[which] = sh; |
203 | return (*this); |
204 | } |
205 | |
206 | ItemDesc &preferredSizeHint(const QSizeF &sh) { |
207 | m_sizeHints[Qt::PreferredSize] = sh; |
208 | return (*this); |
209 | } |
210 | |
211 | ItemDesc &minSize(const QSizeF &sz) { |
212 | m_sizes[Qt::MinimumSize] = sz; |
213 | return (*this); |
214 | } |
215 | ItemDesc &preferredSize(const QSizeF &sz) { |
216 | m_sizes[Qt::PreferredSize] = sz; |
217 | return (*this); |
218 | } |
219 | ItemDesc &maxSize(const QSizeF &sz) { |
220 | m_sizes[Qt::MaximumSize] = sz; |
221 | return (*this); |
222 | } |
223 | |
224 | ItemDesc &alignment(Qt::Alignment alignment) { |
225 | m_align = alignment; |
226 | return (*this); |
227 | } |
228 | |
229 | ItemDesc &dynamicConstraint(QSizeF (*fnConstraint)(Qt::SizeHint, const QSizeF &), |
230 | Qt::Orientation orientation) { |
231 | m_fnConstraint = fnConstraint; |
232 | m_constraintOrientation = orientation; |
233 | return (*this); |
234 | } |
235 | |
236 | void apply(QGraphicsGridLayout *layout, QGraphicsWidget *item) { |
237 | QSizePolicy sp = m_sizePolicy; |
238 | if (m_fnConstraint) { |
239 | sp.setHeightForWidth(m_constraintOrientation == Qt::Vertical); |
240 | sp.setWidthForHeight(m_constraintOrientation == Qt::Horizontal); |
241 | } |
242 | |
243 | item->setSizePolicy(sp); |
244 | for (int i = 0; i < Qt::NSizeHints; ++i) { |
245 | if (!m_sizes[i].isValid()) |
246 | continue; |
247 | switch ((Qt::SizeHint)i) { |
248 | case Qt::MinimumSize: |
249 | item->setMinimumSize(m_sizes[i]); |
250 | break; |
251 | case Qt::PreferredSize: |
252 | item->setPreferredSize(m_sizes[i]); |
253 | break; |
254 | case Qt::MaximumSize: |
255 | item->setMaximumSize(m_sizes[i]); |
256 | break; |
257 | default: |
258 | qWarning(msg: "not implemented" ); |
259 | break; |
260 | } |
261 | } |
262 | |
263 | layout->addItem(item, row: m_pos.first, column: m_pos.second, rowSpan: m_rowSpan, columnSpan: m_colSpan); |
264 | layout->setAlignment(item, alignment: m_align); |
265 | } |
266 | |
267 | void apply(QGraphicsGridLayout *layout, RectWidget *item) { |
268 | for (int i = 0; i < Qt::NSizeHints; ++i) |
269 | item->setSizeHint(which: (Qt::SizeHint)i, size: m_sizeHints[i]); |
270 | item->setConstraintFunction(m_fnConstraint); |
271 | apply(layout, item: static_cast<QGraphicsWidget*>(item)); |
272 | } |
273 | |
274 | //private: |
275 | QPair<int,int> m_pos; // row,col |
276 | int m_rowSpan = 1; |
277 | int m_colSpan = 1; |
278 | QSizePolicy m_sizePolicy{QSizePolicy::Preferred, QSizePolicy::Preferred}; |
279 | |
280 | // Initializer {} is a workaround for gcc bug 68949 |
281 | QSizeF m_sizeHints[Qt::NSizeHints] {}; |
282 | QSizeF m_sizes[Qt::NSizeHints] {}; |
283 | Qt::Alignment m_align; |
284 | |
285 | Qt::Orientation m_constraintOrientation = Qt::Horizontal; |
286 | QSizeF (*m_fnConstraint)(Qt::SizeHint, const QSizeF &) = nullptr; |
287 | }; |
288 | |
289 | typedef QList<ItemDesc> ItemList; |
290 | Q_DECLARE_METATYPE(ItemList); |
291 | |
292 | typedef QList<QSizeF> SizeList; |
293 | |
294 | void tst_QGraphicsGridLayout::qgraphicsgridlayout_data() |
295 | { |
296 | } |
297 | |
298 | void tst_QGraphicsGridLayout::qgraphicsgridlayout() |
299 | { |
300 | QGraphicsGridLayout layout; |
301 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::addItem: invalid row span/column span: 0" ); |
302 | layout.addItem(item: 0, row: 0, column: 0, rowSpan: 0, columnSpan: 0); |
303 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::addItem: cannot add null item" ); |
304 | layout.addItem(aitem: 0, arow: 0, acolumn: 0); |
305 | layout.alignment(item: 0); |
306 | layout.columnAlignment(column: 0); |
307 | layout.columnCount(); |
308 | layout.columnMaximumWidth(column: 0); |
309 | layout.columnMinimumWidth(column: 0); |
310 | layout.columnPreferredWidth(column: 0); |
311 | layout.columnSpacing(column: 0); |
312 | layout.columnStretchFactor(column: 0); |
313 | layout.count(); |
314 | layout.horizontalSpacing(); |
315 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::itemAt: invalid row, column 0, 0" ); |
316 | layout.itemAt(row: 0, column: 0); |
317 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::itemAt: invalid index 0" ); |
318 | layout.itemAt(index: 0); |
319 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::removeAt: invalid index 0" ); |
320 | layout.removeAt(index: 0); |
321 | layout.rowAlignment(row: 0); |
322 | layout.rowCount(); |
323 | layout.rowMaximumHeight(row: 0); |
324 | layout.rowMinimumHeight(row: 0); |
325 | layout.rowPreferredHeight(row: 0); |
326 | layout.rowSpacing(row: 0); |
327 | layout.rowStretchFactor(row: 0); |
328 | layout.setAlignment(item: 0, alignment: Qt::AlignRight); |
329 | layout.setColumnAlignment(column: 0, alignment: Qt::AlignRight); |
330 | layout.setColumnFixedWidth(column: 0, width: 0); |
331 | layout.setColumnMaximumWidth(column: 0, width: 0); |
332 | layout.setColumnMinimumWidth(column: 0, width: 0); |
333 | layout.setColumnPreferredWidth(column: 0, width: 0); |
334 | layout.setColumnSpacing(column: 0, spacing: 0); |
335 | layout.setColumnStretchFactor(column: 0, stretch: 0); |
336 | layout.setGeometry(QRectF()); |
337 | layout.setHorizontalSpacing(0); |
338 | layout.setRowAlignment(row: 0, alignment: { }); |
339 | layout.setRowFixedHeight(row: 0, height: 0); |
340 | layout.setRowMaximumHeight(row: 0, height: 0); |
341 | layout.setRowMinimumHeight(row: 0, height: 0); |
342 | layout.setRowPreferredHeight(row: 0, height: 0); |
343 | layout.setRowSpacing(row: 0, spacing: 0); |
344 | layout.setRowStretchFactor(row: 0, stretch: 0); |
345 | layout.setSpacing(0); |
346 | layout.setVerticalSpacing(0); |
347 | layout.sizeHint(which: Qt::MinimumSize); |
348 | layout.verticalSpacing(); |
349 | } |
350 | |
351 | static void populateLayout(QGraphicsGridLayout *gridLayout, int width, int height, bool hasHeightForWidth = false) |
352 | { |
353 | for (int y = 0; y < height; ++y) { |
354 | for (int x = 0; x < width; ++x) { |
355 | QGraphicsWidget *item = new RectWidget(); |
356 | item->setMinimumSize(aw: 10, ah: 10); |
357 | item->setPreferredSize(aw: 25, ah: 25); |
358 | item->setMaximumSize(aw: 50, ah: 50); |
359 | gridLayout->addItem(aitem: item, arow: y, acolumn: x); |
360 | QSizePolicy policy = item->sizePolicy(); |
361 | policy.setHeightForWidth(hasHeightForWidth); |
362 | item->setSizePolicy(policy); |
363 | } |
364 | } |
365 | } |
366 | |
367 | |
368 | /** populates \a gridLayout with a 3x2 layout: |
369 | * +----+----+----+ |
370 | * |+---|---+|xxxx| |
371 | * ||span=2 ||hole| |
372 | * |+---|---+|xxxx| |
373 | * +----+----+----+ |
374 | * |xxxx|+---|---+| |
375 | * |hole||span=2 || |
376 | * |xxxx|+---|---+| |
377 | * +----+----+----+ |
378 | */ |
379 | static void populateLayoutWithSpansAndHoles(QGraphicsGridLayout *gridLayout, bool hasHeightForWidth = false) |
380 | { |
381 | QGraphicsWidget *item = new RectWidget(); |
382 | item->setMinimumSize(aw: 10, ah: 10); |
383 | item->setPreferredSize(aw: 25, ah: 25); |
384 | item->setMaximumSize(aw: 50, ah: 50); |
385 | QSizePolicy sizepolicy = item->sizePolicy(); |
386 | sizepolicy.setHeightForWidth(hasHeightForWidth); |
387 | item->setSizePolicy(sizepolicy); |
388 | gridLayout->addItem(item, row: 0, column: 0, rowSpan: 1, columnSpan: 2); |
389 | |
390 | item = new RectWidget(); |
391 | item->setMinimumSize(aw: 10, ah: 10); |
392 | item->setPreferredSize(aw: 25, ah: 25); |
393 | item->setMaximumSize(aw: 50, ah: 50); |
394 | item->setSizePolicy(sizepolicy); |
395 | gridLayout->addItem(item, row: 1, column: 1, rowSpan: 1, columnSpan: 2); |
396 | } |
397 | |
398 | Q_DECLARE_METATYPE(Qt::Alignment) |
399 | void tst_QGraphicsGridLayout::addItem_data() |
400 | { |
401 | QTest::addColumn<int>(name: "row" ); |
402 | QTest::addColumn<int>(name: "column" ); |
403 | QTest::addColumn<int>(name: "rowSpan" ); |
404 | QTest::addColumn<int>(name: "columnSpan" ); |
405 | QTest::addColumn<Qt::Alignment>(name: "alignment" ); |
406 | |
407 | for (int a = -1; a < 3; ++a) { |
408 | for (int b = -1; b < 2; ++b) { |
409 | for (int c = -1; c < 2; ++c) { |
410 | for (int d = -1; d < 2; ++d) { |
411 | int row = a; |
412 | int column = b; |
413 | int rowSpan = c; |
414 | int columnSpan = d; |
415 | const QByteArray name = '(' + QByteArray::number(a) + ',' + QByteArray::number(b) |
416 | + ',' + QByteArray::number(c) + ',' + QByteArray::number(d); |
417 | Qt::Alignment alignment = Qt::AlignLeft; |
418 | QTest::newRow(dataTag: name.constData()) << row << column << rowSpan << columnSpan << alignment; |
419 | }}}} |
420 | } |
421 | |
422 | // public void addItem(QGraphicsLayoutItem* item, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0) |
423 | void tst_QGraphicsGridLayout::addItem() |
424 | { |
425 | QFETCH(int, row); |
426 | QFETCH(int, column); |
427 | QFETCH(int, rowSpan); |
428 | QFETCH(int, columnSpan); |
429 | QFETCH(Qt::Alignment, alignment); |
430 | |
431 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
432 | |
433 | QGraphicsWidget *wid = new QGraphicsWidget; |
434 | if (row < 0 || column < 0) { |
435 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::addItem: invalid row/column: -1" ); |
436 | } else if (rowSpan < 1 || columnSpan < 1) { |
437 | char buf[1024]; |
438 | ::qsnprintf(str: buf, n: sizeof(buf), fmt: "QGraphicsGridLayout::addItem: invalid row span/column span: %d" , |
439 | rowSpan < 1 ? rowSpan : columnSpan); |
440 | QTest::ignoreMessage(type: QtWarningMsg, message: buf); |
441 | } |
442 | layout->addItem(item: wid, row, column, rowSpan, columnSpan, alignment); |
443 | |
444 | delete layout; |
445 | } |
446 | |
447 | void tst_QGraphicsGridLayout::alignment_data() |
448 | { |
449 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
450 | |
451 | QTest::newRow(dataTag: "" ) << false; |
452 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
453 | } |
454 | |
455 | // public Qt::Alignment alignment(QGraphicsLayoutItem* item) const |
456 | void tst_QGraphicsGridLayout::alignment() |
457 | { |
458 | #ifdef Q_OS_MAC |
459 | QSKIP("Resizing a QGraphicsWidget to effectiveSizeHint(Qt::MaximumSize) is currently not supported on mac" ); |
460 | #endif |
461 | QFETCH(bool, hasHeightForWidth); |
462 | QGraphicsScene scene; |
463 | QGraphicsView view(&scene); |
464 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
465 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
466 | scene.addItem(item: widget); |
467 | widget->setLayout(layout); |
468 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
469 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
470 | layout->setSpacing(0); |
471 | |
472 | view.show(); |
473 | widget->show(); |
474 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
475 | QApplication::processEvents(); |
476 | // no alignment (the default) |
477 | QCOMPARE(layout->itemAt(0, 0)->geometry().left(), 0.0); |
478 | QCOMPARE(layout->itemAt(0, 0)->geometry().right(), layout->itemAt(0, 1)->geometry().left()); |
479 | QCOMPARE(layout->itemAt(0, 1)->geometry().left(), 25.0); |
480 | QCOMPARE(layout->itemAt(0, 1)->geometry().right(), layout->itemAt(0, 2)->geometry().left()); |
481 | QCOMPARE(layout->itemAt(0, 2)->geometry().left(), 50.0); |
482 | QCOMPARE(layout->itemAt(0, 2)->geometry().right(), 75.0); |
483 | |
484 | QCOMPARE(layout->itemAt(1, 0)->geometry().left(), 0.0); |
485 | QCOMPARE(layout->itemAt(1, 0)->geometry().right(), layout->itemAt(1, 1)->geometry().left()); |
486 | QCOMPARE(layout->itemAt(1, 1)->geometry().left(), 25.0); |
487 | QCOMPARE(layout->itemAt(1, 1)->geometry().right(), layout->itemAt(1, 2)->geometry().left()); |
488 | QCOMPARE(layout->itemAt(1, 2)->geometry().left(), 50.0); |
489 | QCOMPARE(layout->itemAt(1, 2)->geometry().right(), 75.0); |
490 | |
491 | QCOMPARE(layout->itemAt(0, 0)->geometry().top(), 0.0); |
492 | QCOMPARE(layout->itemAt(0, 0)->geometry().bottom(), layout->itemAt(1, 0)->geometry().top()); |
493 | QCOMPARE(layout->itemAt(1, 0)->geometry().top(), 25.0); |
494 | QCOMPARE(layout->itemAt(1, 0)->geometry().bottom(), 50.0); |
495 | |
496 | // align first column left, second hcenter, third right |
497 | layout->setColumnMinimumWidth(column: 0, width: 100); |
498 | layout->setAlignment(item: layout->itemAt(row: 0,column: 0), alignment: Qt::AlignLeft); |
499 | layout->setAlignment(item: layout->itemAt(row: 1,column: 0), alignment: Qt::AlignLeft); |
500 | layout->setColumnMinimumWidth(column: 1, width: 100); |
501 | layout->setAlignment(item: layout->itemAt(row: 0,column: 1), alignment: Qt::AlignHCenter); |
502 | layout->setAlignment(item: layout->itemAt(row: 1,column: 1), alignment: Qt::AlignHCenter); |
503 | layout->setColumnMinimumWidth(column: 2, width: 100); |
504 | layout->setAlignment(item: layout->itemAt(row: 0,column: 2), alignment: Qt::AlignRight); |
505 | layout->setAlignment(item: layout->itemAt(row: 1,column: 2), alignment: Qt::AlignRight); |
506 | |
507 | widget->resize(size: widget->effectiveSizeHint(which: Qt::MaximumSize)); |
508 | QApplication::processEvents(); |
509 | |
510 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 50, 50)); |
511 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 50, 50)); |
512 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(125, 0, 50, 50)); |
513 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(125, 50, 50, 50)); |
514 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(250, 0, 50, 50)); |
515 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(250, 50, 50, 50)); |
516 | |
517 | delete widget; |
518 | } |
519 | |
520 | void tst_QGraphicsGridLayout::columnAlignment_data() |
521 | { |
522 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
523 | |
524 | QTest::newRow(dataTag: "" ) << false; |
525 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
526 | } |
527 | |
528 | // public void setColumnAlignment(int column, Qt::Alignment alignment) |
529 | // public Qt::Alignment columnAlignment(int column) const |
530 | void tst_QGraphicsGridLayout::columnAlignment() |
531 | { |
532 | #ifdef Q_OS_MAC |
533 | QSKIP("Resizing a QGraphicsWidget to effectiveSizeHint(Qt::MaximumSize) is currently not supported on mac" ); |
534 | #endif |
535 | QFETCH(bool, hasHeightForWidth); |
536 | QGraphicsScene scene; |
537 | QGraphicsView view(&scene); |
538 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
539 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
540 | scene.addItem(item: widget); |
541 | widget->setLayout(layout); |
542 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
543 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
544 | layout->setSpacing(1); |
545 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
546 | |
547 | layout->setColumnMinimumWidth(column: 0, width: 100); |
548 | layout->setColumnMinimumWidth(column: 1, width: 100); |
549 | layout->setColumnMinimumWidth(column: 2, width: 100); |
550 | |
551 | view.resize(w: 450,h: 150); |
552 | widget->resize(size: widget->effectiveSizeHint(which: Qt::MaximumSize)); |
553 | view.show(); |
554 | widget->show(); |
555 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
556 | // Check default |
557 | QCOMPARE(layout->columnAlignment(0), 0); |
558 | QCOMPARE(layout->columnAlignment(1), 0); |
559 | QCOMPARE(layout->columnAlignment(2), 0); |
560 | |
561 | layout->setColumnAlignment(column: 0, alignment: Qt::AlignLeft); |
562 | layout->setColumnAlignment(column: 1, alignment: Qt::AlignHCenter); |
563 | layout->setColumnAlignment(column: 2, alignment: Qt::AlignRight); |
564 | |
565 | // see if item alignment takes preference over columnAlignment |
566 | layout->setAlignment(item: layout->itemAt(row: 1,column: 0), alignment: Qt::AlignHCenter); |
567 | layout->setAlignment(item: layout->itemAt(row: 1,column: 1), alignment: Qt::AlignRight); |
568 | layout->setAlignment(item: layout->itemAt(row: 1,column: 2), alignment: Qt::AlignLeft); |
569 | |
570 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); // process LayoutRequest |
571 | /* |
572 | +----------+------------+---------+ |
573 | | Left | HCenter | Right | |
574 | +----------+------------+---------+ |
575 | | HCenter | Right | Left | |
576 | +---------------------------------+ |
577 | */ |
578 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 50, 50)); |
579 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(25, 51, 50, 50)); // item is king |
580 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(126, 0, 50, 50)); |
581 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(151, 51, 50, 50)); // item is king |
582 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(252, 0, 50, 50)); |
583 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(202, 51, 50, 50)); // item is king |
584 | |
585 | delete widget; |
586 | } |
587 | |
588 | void tst_QGraphicsGridLayout::columnCount_data() |
589 | { |
590 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
591 | |
592 | QTest::newRow(dataTag: "" ) << false; |
593 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
594 | } |
595 | // public int columnCount() const |
596 | void tst_QGraphicsGridLayout::columnCount() |
597 | { |
598 | QFETCH(bool, hasHeightForWidth); |
599 | QGraphicsScene scene; |
600 | QGraphicsView view(&scene); |
601 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
602 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
603 | scene.addItem(item: widget); |
604 | widget->setLayout(layout); |
605 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
606 | layout->setSpacing(0); |
607 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
608 | |
609 | view.show(); |
610 | widget->show(); |
611 | QApplication::processEvents(); |
612 | |
613 | QCOMPARE(layout->columnCount(), 0); |
614 | layout->addItem(aitem: new RectWidget(widget), arow: 0, acolumn: 0); |
615 | QCOMPARE(layout->columnCount(), 1); |
616 | layout->addItem(aitem: new RectWidget(widget), arow: 1, acolumn: 1); |
617 | QCOMPARE(layout->columnCount(), 2); |
618 | layout->addItem(aitem: new RectWidget(widget), arow: 0, acolumn: 2); |
619 | QCOMPARE(layout->columnCount(), 3); |
620 | layout->addItem(aitem: new RectWidget(widget), arow: 1, acolumn: 0); |
621 | QCOMPARE(layout->columnCount(), 3); |
622 | layout->addItem(aitem: new RectWidget(widget), arow: 0, acolumn: 1); |
623 | QCOMPARE(layout->columnCount(), 3); |
624 | layout->addItem(aitem: new RectWidget(widget), arow: 1, acolumn: 2); |
625 | QCOMPARE(layout->columnCount(), 3); |
626 | |
627 | // ### Talk with Jasmin. Not sure if removeAt() should adjust columnCount(). |
628 | widget->setLayout(0); |
629 | layout = new QGraphicsGridLayout(); |
630 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
631 | QCOMPARE(layout->columnCount(), 3); |
632 | layout->removeAt(index: 5); |
633 | layout->removeAt(index: 3); |
634 | QCOMPARE(layout->columnCount(), 3); |
635 | layout->removeAt(index: 1); |
636 | QCOMPARE(layout->columnCount(), 3); |
637 | layout->removeAt(index: 0); |
638 | QCOMPARE(layout->columnCount(), 3); |
639 | layout->removeAt(index: 0); |
640 | QCOMPARE(layout->columnCount(), 2); |
641 | |
642 | delete widget; |
643 | } |
644 | |
645 | void tst_QGraphicsGridLayout::columnMaximumWidth_data() |
646 | { |
647 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
648 | |
649 | QTest::newRow(dataTag: "" ) << false; |
650 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
651 | } |
652 | // public qreal columnMaximumWidth(int column) const |
653 | void tst_QGraphicsGridLayout::columnMaximumWidth() |
654 | { |
655 | QFETCH(bool, hasHeightForWidth); |
656 | QGraphicsScene scene; |
657 | QGraphicsView view(&scene); |
658 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
659 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
660 | scene.addItem(item: widget); |
661 | widget->setLayout(layout); |
662 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
663 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
664 | layout->setSpacing(0); |
665 | |
666 | QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10)); |
667 | QCOMPARE(layout->preferredSize(), QSizeF(25+25+25, 25+25)); |
668 | QCOMPARE(layout->maximumSize(), QSizeF(50+50+50, 50+50)); |
669 | |
670 | // should at least be a very large number |
671 | QVERIFY(layout->columnMaximumWidth(0) >= 10000); |
672 | QCOMPARE(layout->columnMaximumWidth(0), layout->columnMaximumWidth(1)); |
673 | QCOMPARE(layout->columnMaximumWidth(1), layout->columnMaximumWidth(2)); |
674 | layout->setColumnMaximumWidth(column: 0, width: 20); |
675 | layout->setColumnMaximumWidth(column: 2, width: 60); |
676 | |
677 | QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10)); |
678 | QCOMPARE(layout->preferredSize(), QSizeF(20+25+25, 25+25)); |
679 | QCOMPARE(layout->maximumSize(), QSizeF(20+50+60, 50+50)); |
680 | QCOMPARE(layout->maximumSize(), widget->maximumSize()); |
681 | |
682 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
683 | layout->activate(); |
684 | |
685 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 25)); |
686 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 25, 20, 25)); |
687 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 25, 25)); |
688 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 25, 25, 25)); |
689 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(45, 0, 25, 25)); |
690 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(45, 25, 25, 25)); |
691 | |
692 | layout->setColumnAlignment(column: 2, alignment: Qt::AlignCenter); |
693 | widget->resize(size: widget->effectiveSizeHint(which: Qt::MaximumSize)); |
694 | layout->activate(); |
695 | QCOMPARE(layout->geometry(), QRectF(0,0,20+50+60, 50+50)); |
696 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50)); |
697 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50)); |
698 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50)); |
699 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50)); |
700 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(75, 0, 50, 50)); |
701 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(75, 50, 50, 50)); |
702 | |
703 | for (int i = 0; i < layout->count(); i++) |
704 | layout->setAlignment(item: layout->itemAt(index: i), alignment: Qt::AlignRight | Qt::AlignBottom); |
705 | layout->activate(); |
706 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50)); |
707 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50)); |
708 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50)); |
709 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50)); |
710 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(80, 0, 50, 50)); |
711 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(80, 50, 50, 50)); |
712 | for (int i = 0; i < layout->count(); i++) |
713 | layout->setAlignment(item: layout->itemAt(index: i), alignment: Qt::AlignCenter); |
714 | |
715 | layout->setMaximumSize(layout->maximumSize() + QSizeF(60,60)); |
716 | widget->resize(size: widget->effectiveSizeHint(which: Qt::MaximumSize)); |
717 | layout->activate(); |
718 | |
719 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 15, 20, 50)); |
720 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 95, 20, 50)); |
721 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20+30, 15, 50, 50)); |
722 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20+30, 95, 50, 50)); |
723 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(20+60+50+5, 15, 50, 50)); |
724 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(20+60+50+5, 95, 50, 50)); |
725 | |
726 | layout->setMaximumSize(layout->preferredSize() + QSizeF(20,20)); |
727 | widget->resize(size: widget->effectiveSizeHint(which: Qt::MaximumSize)); |
728 | layout->activate(); |
729 | |
730 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 35)); |
731 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 35, 20, 35)); |
732 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 35, 35)); |
733 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 35, 35, 35)); |
734 | QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(55, 0, 35, 35)); |
735 | QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(55, 35, 35, 35)); |
736 | |
737 | delete widget; |
738 | } |
739 | |
740 | void tst_QGraphicsGridLayout::columnMinimumWidth_data() |
741 | { |
742 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
743 | |
744 | QTest::newRow(dataTag: "" ) << false; |
745 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
746 | } |
747 | // public qreal columnMinimumWidth(int column) const |
748 | void tst_QGraphicsGridLayout::columnMinimumWidth() |
749 | { |
750 | QFETCH(bool, hasHeightForWidth); |
751 | QGraphicsScene scene; |
752 | QGraphicsView view(&scene); |
753 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
754 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
755 | scene.addItem(item: widget); |
756 | widget->setLayout(layout); |
757 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
758 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
759 | layout->setSpacing(0); |
760 | |
761 | // should at least be a very large number |
762 | QCOMPARE(layout->columnMinimumWidth(0), 0.0); |
763 | QCOMPARE(layout->columnMinimumWidth(0), layout->columnMinimumWidth(1)); |
764 | QCOMPARE(layout->columnMinimumWidth(1), layout->columnMinimumWidth(2)); |
765 | layout->setColumnMinimumWidth(column: 0, width: 20); |
766 | layout->setColumnMinimumWidth(column: 2, width: 40); |
767 | |
768 | view.show(); |
769 | widget->show(); |
770 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
771 | QApplication::processEvents(); |
772 | |
773 | QCOMPARE(layout->itemAt(0,0)->geometry().width(), 25.0); |
774 | QCOMPARE(layout->itemAt(1,0)->geometry().width(), 25.0); |
775 | QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0); |
776 | QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0); |
777 | QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0); |
778 | QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0); |
779 | |
780 | delete widget; |
781 | } |
782 | |
783 | void tst_QGraphicsGridLayout::columnPreferredWidth_data() |
784 | { |
785 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
786 | |
787 | QTest::newRow(dataTag: "" ) << false; |
788 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
789 | } |
790 | // public qreal columnPreferredWidth(int column) const |
791 | void tst_QGraphicsGridLayout::columnPreferredWidth() |
792 | { |
793 | QFETCH(bool, hasHeightForWidth); |
794 | QGraphicsScene scene; |
795 | QGraphicsView view(&scene); |
796 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
797 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
798 | scene.addItem(item: widget); |
799 | widget->setLayout(layout); |
800 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
801 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
802 | layout->setSpacing(0); |
803 | |
804 | // default preferred width ?? |
805 | QCOMPARE(layout->columnPreferredWidth(0), 0.0); |
806 | QCOMPARE(layout->columnPreferredWidth(0), layout->columnPreferredWidth(1)); |
807 | QCOMPARE(layout->columnPreferredWidth(1), layout->columnPreferredWidth(2)); |
808 | layout->setColumnPreferredWidth(column: 0, width: 20); |
809 | layout->setColumnPreferredWidth(column: 2, width: 40); |
810 | |
811 | view.show(); |
812 | widget->show(); |
813 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
814 | QApplication::processEvents(); |
815 | |
816 | QCOMPARE(layout->itemAt(0,0)->geometry().width(), 25.0); |
817 | QCOMPARE(layout->itemAt(1,0)->geometry().width(), 25.0); |
818 | QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0); |
819 | QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0); |
820 | QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0); |
821 | QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0); |
822 | |
823 | delete widget; |
824 | } |
825 | |
826 | // public void setColumnFixedWidth(int row, qreal height) |
827 | void tst_QGraphicsGridLayout::setColumnFixedWidth() |
828 | { |
829 | QGraphicsScene scene; |
830 | QGraphicsView view(&scene); |
831 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
832 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
833 | scene.addItem(item: widget); |
834 | widget->setLayout(layout); |
835 | populateLayout(gridLayout: layout, width: 3, height: 2); |
836 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
837 | layout->setSpacing(0); |
838 | |
839 | layout->setColumnFixedWidth(column: 0, width: 20); |
840 | layout->setColumnFixedWidth(column: 2, width: 40); |
841 | |
842 | view.show(); |
843 | widget->show(); |
844 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
845 | QApplication::processEvents(); |
846 | |
847 | QCOMPARE(layout->itemAt(0,0)->geometry().width(), 20.0); |
848 | QCOMPARE(layout->itemAt(1,0)->geometry().width(), 20.0); |
849 | QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0); |
850 | QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0); |
851 | QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0); |
852 | QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0); |
853 | |
854 | delete widget; |
855 | } |
856 | |
857 | // public qreal columnSpacing(int column) const |
858 | void tst_QGraphicsGridLayout::columnSpacing() |
859 | { |
860 | { |
861 | QGraphicsScene scene; |
862 | QGraphicsView view(&scene); |
863 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
864 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
865 | scene.addItem(item: widget); |
866 | widget->setLayout(layout); |
867 | populateLayout(gridLayout: layout, width: 3, height: 2); |
868 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
869 | layout->setSpacing(0); |
870 | QCOMPARE(layout->columnSpacing(0), 0.0); |
871 | |
872 | layout->setColumnSpacing(column: 0, spacing: 20); |
873 | view.show(); |
874 | widget->show(); |
875 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
876 | QApplication::processEvents(); |
877 | |
878 | QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0); |
879 | QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0); |
880 | QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0); |
881 | QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0); |
882 | QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0); |
883 | QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0); |
884 | |
885 | delete widget; |
886 | } |
887 | |
888 | { |
889 | // don't include items and spacings that was previously part of the layout |
890 | // (horizontal) |
891 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
892 | populateLayout(gridLayout: layout, width: 3, height: 1); |
893 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
894 | layout->setSpacing(0); |
895 | layout->setColumnSpacing(column: 0, spacing: 10); |
896 | layout->setColumnSpacing(column: 1, spacing: 10); |
897 | layout->setColumnSpacing(column: 2, spacing: 10); |
898 | layout->setColumnSpacing(column: 3, spacing: 10); |
899 | QCOMPARE(layout->preferredSize(), QSizeF(95, 25)); |
900 | layout->removeAt(index: 2); |
901 | QCOMPARE(layout->preferredSize(), QSizeF(60, 25)); |
902 | layout->removeAt(index: 1); |
903 | QCOMPARE(layout->preferredSize(), QSizeF(25, 25)); |
904 | delete layout; |
905 | } |
906 | { |
907 | // don't include items and spacings that was previously part of the layout |
908 | // (vertical) |
909 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
910 | populateLayout(gridLayout: layout, width: 2, height: 2); |
911 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
912 | layout->setSpacing(0); |
913 | layout->setColumnSpacing(column: 0, spacing: 10); |
914 | layout->setColumnSpacing(column: 1, spacing: 10); |
915 | layout->setRowSpacing(row: 0, spacing: 10); |
916 | layout->setRowSpacing(row: 1, spacing: 10); |
917 | QCOMPARE(layout->preferredSize(), QSizeF(60, 60)); |
918 | layout->removeAt(index: 3); |
919 | QCOMPARE(layout->preferredSize(), QSizeF(60, 60)); |
920 | layout->removeAt(index: 2); |
921 | QCOMPARE(layout->preferredSize(), QSizeF(60, 25)); |
922 | layout->removeAt(index: 1); |
923 | QCOMPARE(layout->preferredSize(), QSizeF(25, 25)); |
924 | delete layout; |
925 | } |
926 | |
927 | } |
928 | |
929 | // public int columnStretchFactor(int column) const |
930 | void tst_QGraphicsGridLayout::columnStretchFactor() |
931 | { |
932 | QGraphicsScene scene; |
933 | QGraphicsView view(&scene); |
934 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
935 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
936 | scene.addItem(item: widget); |
937 | widget->setLayout(layout); |
938 | populateLayout(gridLayout: layout, width: 3, height: 2); |
939 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
940 | layout->setSpacing(0); |
941 | |
942 | layout->setColumnStretchFactor(column: 0, stretch: 1); |
943 | layout->setColumnStretchFactor(column: 1, stretch: 2); |
944 | layout->setColumnStretchFactor(column: 2, stretch: 3); |
945 | view.show(); |
946 | widget->show(); |
947 | widget->resize(w: 130, h: 50); |
948 | QApplication::processEvents(); |
949 | |
950 | QVERIFY(layout->itemAt(0,0)->geometry().width() < layout->itemAt(0,1)->geometry().width()); |
951 | QVERIFY(layout->itemAt(0,1)->geometry().width() < layout->itemAt(0,2)->geometry().width()); |
952 | QVERIFY(layout->itemAt(1,0)->geometry().width() < layout->itemAt(1,1)->geometry().width()); |
953 | QVERIFY(layout->itemAt(1,1)->geometry().width() < layout->itemAt(1,2)->geometry().width()); |
954 | |
955 | delete widget; |
956 | } |
957 | |
958 | |
959 | // public int count() const |
960 | void tst_QGraphicsGridLayout::count() |
961 | { |
962 | QGraphicsScene scene; |
963 | QGraphicsView view(&scene); |
964 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
965 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
966 | scene.addItem(item: widget); |
967 | widget->setLayout(layout); |
968 | populateLayout(gridLayout: layout, width: 3, height: 2); |
969 | QCOMPARE(layout->count(), 6); |
970 | layout->removeAt(index: 5); |
971 | layout->removeAt(index: 3); |
972 | QCOMPARE(layout->count(), 4); |
973 | layout->removeAt(index: 1); |
974 | QCOMPARE(layout->count(), 3); |
975 | layout->removeAt(index: 0); |
976 | QCOMPARE(layout->count(), 2); |
977 | layout->removeAt(index: 0); |
978 | QCOMPARE(layout->count(), 1); |
979 | layout->removeAt(index: 0); |
980 | QCOMPARE(layout->count(), 0); |
981 | |
982 | delete widget; |
983 | } |
984 | |
985 | void tst_QGraphicsGridLayout::horizontalSpacing_data() |
986 | { |
987 | QTest::addColumn<qreal>(name: "horizontalSpacing" ); |
988 | QTest::newRow(dataTag: "zero" ) << qreal(0.0); |
989 | QTest::newRow(dataTag: "10" ) << qreal(10.0); |
990 | } |
991 | |
992 | // public qreal horizontalSpacing() const |
993 | void tst_QGraphicsGridLayout::horizontalSpacing() |
994 | { |
995 | QFETCH(qreal, horizontalSpacing); |
996 | QGraphicsScene scene; |
997 | QGraphicsView view(&scene); |
998 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
999 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1000 | scene.addItem(item: widget); |
1001 | widget->setLayout(layout); |
1002 | populateLayout(gridLayout: layout, width: 3, height: 2); |
1003 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1004 | qreal w = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).width(); |
1005 | qreal oldSpacing = layout->horizontalSpacing(); |
1006 | |
1007 | // The remainder of this test is only applicable if the current style uses uniform layout spacing |
1008 | if (oldSpacing != -1) { |
1009 | layout->setHorizontalSpacing(horizontalSpacing); |
1010 | QApplication::processEvents(); |
1011 | qreal new_w = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).width(); |
1012 | QCOMPARE(new_w, w - (3-1)*(oldSpacing - horizontalSpacing)); |
1013 | } |
1014 | delete widget; |
1015 | } |
1016 | |
1017 | void tst_QGraphicsGridLayout::contentsMargins() |
1018 | { |
1019 | QGraphicsScene scene; |
1020 | QGraphicsView view(&scene); |
1021 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1022 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1023 | QGraphicsGridLayout *sublayout = new QGraphicsGridLayout(); |
1024 | scene.addItem(item: widget); |
1025 | widget->setLayout(layout); |
1026 | layout->addItem(aitem: sublayout,arow: 0, acolumn: 1); |
1027 | |
1028 | qreal left, top, right, bottom; |
1029 | // sublayouts have 0 margin |
1030 | sublayout->getContentsMargins(left: &left, top: &top, right: &right, bottom: &bottom); |
1031 | QCOMPARE(left, 0.0); |
1032 | QCOMPARE(top, 0.0); |
1033 | QCOMPARE(right, 0.0); |
1034 | QCOMPARE(bottom, 0.0); |
1035 | |
1036 | // top level layouts have style dependent margins. |
1037 | // we'll just check if its different from 0. (applies to all our styles) |
1038 | layout->getContentsMargins(left: &left, top: &top, right: &right, bottom: &bottom); |
1039 | QVERIFY(left >= 0.0); |
1040 | QVERIFY(top >= 0.0); |
1041 | QVERIFY(right >= 0.0); |
1042 | QVERIFY(bottom >= 0.0); |
1043 | |
1044 | delete widget; |
1045 | } |
1046 | |
1047 | // public QGraphicsLayoutItem* itemAt(int index) const |
1048 | void tst_QGraphicsGridLayout::itemAt() |
1049 | { |
1050 | QGraphicsScene scene; |
1051 | QGraphicsView view(&scene); |
1052 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1053 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1054 | scene.addItem(item: widget); |
1055 | widget->setLayout(layout); |
1056 | populateLayoutWithSpansAndHoles(gridLayout: layout); |
1057 | |
1058 | //itemAt(int row, int column) |
1059 | QVERIFY( layout->itemAt(0,0)); |
1060 | QVERIFY( layout->itemAt(0,1)); |
1061 | QCOMPARE(layout->itemAt(0,2), static_cast<QGraphicsLayoutItem*>(0)); |
1062 | QCOMPARE(layout->itemAt(1,0), static_cast<QGraphicsLayoutItem*>(0)); |
1063 | QVERIFY( layout->itemAt(1,1)); |
1064 | QVERIFY( layout->itemAt(1,2)); |
1065 | |
1066 | |
1067 | //itemAt(int index) |
1068 | for (int i = -2; i < layout->count() + 2; ++i) { |
1069 | if (i >= 0 && i < layout->count()) { |
1070 | QVERIFY(layout->itemAt(i)); |
1071 | } else { |
1072 | const QByteArray message = "QGraphicsGridLayout::itemAt: invalid index " + QByteArray::number(i); |
1073 | QTest::ignoreMessage(type: QtWarningMsg, message: message.constData()); |
1074 | QCOMPARE(layout->itemAt(i), nullptr); |
1075 | } |
1076 | } |
1077 | delete widget; |
1078 | } |
1079 | |
1080 | // public void removeAt(int index) |
1081 | void tst_QGraphicsGridLayout::removeAt() |
1082 | { |
1083 | QGraphicsScene scene; |
1084 | QGraphicsView view(&scene); |
1085 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1086 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1087 | scene.addItem(item: widget); |
1088 | widget->setLayout(layout); |
1089 | populateLayout(gridLayout: layout, width: 3, height: 2); |
1090 | QCOMPARE(layout->count(), 6); |
1091 | layout->removeAt(index: 5); |
1092 | layout->removeAt(index: 3); |
1093 | QCOMPARE(layout->count(), 4); |
1094 | layout->removeAt(index: 1); |
1095 | QCOMPARE(layout->count(), 3); |
1096 | layout->removeAt(index: 0); |
1097 | QCOMPARE(layout->count(), 2); |
1098 | layout->removeAt(index: 0); |
1099 | QCOMPARE(layout->count(), 1); |
1100 | QGraphicsLayoutItem *item0 = layout->itemAt(index: 0); |
1101 | QCOMPARE(item0->parentLayoutItem(), static_cast<QGraphicsLayoutItem *>(layout)); |
1102 | layout->removeAt(index: 0); |
1103 | QCOMPARE(item0->parentLayoutItem(), nullptr); |
1104 | QCOMPARE(layout->count(), 0); |
1105 | QTest::ignoreMessage(type: QtWarningMsg, message: QString::fromLatin1(str: "QGraphicsGridLayout::removeAt: invalid index 0" ).toLatin1().constData()); |
1106 | layout->removeAt(index: 0); |
1107 | QCOMPARE(layout->count(), 0); |
1108 | delete widget; |
1109 | } |
1110 | |
1111 | void tst_QGraphicsGridLayout::removeItem() |
1112 | { |
1113 | QGraphicsScene scene; |
1114 | QGraphicsView view(&scene); |
1115 | |
1116 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1117 | scene.addItem(item: widget); |
1118 | QGraphicsGridLayout *l = new QGraphicsGridLayout(); |
1119 | widget->setLayout(l); |
1120 | |
1121 | populateLayout(gridLayout: l, width: 3, height: 2); |
1122 | QCOMPARE(l->count(), 6); |
1123 | l->removeItem(item: l->itemAt(index: 5)); |
1124 | l->removeItem(item: l->itemAt(index: 4)); |
1125 | QCOMPARE(l->count(), 4); |
1126 | |
1127 | // Avoid crashing. Note that the warning message might change in the future. |
1128 | QTest::ignoreMessage(type: QtWarningMsg, message: QString::fromLatin1(str: "QGraphicsGridLayout::removeAt: invalid index -1" ).toLatin1().constData()); |
1129 | l->removeItem(item: 0); |
1130 | QCOMPARE(l->count(), 4); |
1131 | |
1132 | QTest::ignoreMessage(type: QtWarningMsg, message: QString::fromLatin1(str: "QGraphicsGridLayout::removeAt: invalid index -1" ).toLatin1().constData()); |
1133 | l->removeItem(item: new QGraphicsWidget); |
1134 | QCOMPARE(l->count(), 4); |
1135 | } |
1136 | |
1137 | void tst_QGraphicsGridLayout::rowAlignment_data() |
1138 | { |
1139 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1140 | |
1141 | QTest::newRow(dataTag: "" ) << false; |
1142 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1143 | } |
1144 | |
1145 | // public Qt::Alignment rowAlignment(int row) const |
1146 | void tst_QGraphicsGridLayout::rowAlignment() |
1147 | { |
1148 | QFETCH(bool, hasHeightForWidth); |
1149 | QGraphicsScene scene; |
1150 | QGraphicsView view(&scene); |
1151 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1152 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1153 | scene.addItem(item: widget); |
1154 | widget->setLayout(layout); |
1155 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1156 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1157 | layout->setSpacing(1); |
1158 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1159 | |
1160 | view.resize(w: 330,h: 450); |
1161 | widget->resize(w: 300, h: 400); |
1162 | view.show(); |
1163 | widget->show(); |
1164 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
1165 | // Check default |
1166 | QCOMPARE(layout->rowAlignment(0), 0); |
1167 | QCOMPARE(layout->rowAlignment(1), 0); |
1168 | QCOMPARE(layout->rowAlignment(2), 0); |
1169 | |
1170 | // make the grids larger than the items, so that alignment kicks in |
1171 | layout->setRowMinimumHeight(row: 0, height: 100.0); |
1172 | layout->setRowMinimumHeight(row: 1, height: 100.0); |
1173 | layout->setRowMinimumHeight(row: 2, height: 100.0); |
1174 | // expand columns also, so we can test combination of horiz and vertical alignment |
1175 | layout->setColumnMinimumWidth(column: 0, width: 100.0); |
1176 | layout->setColumnMinimumWidth(column: 1, width: 100.0); |
1177 | |
1178 | layout->setRowAlignment(row: 0, alignment: Qt::AlignBottom); |
1179 | layout->setRowAlignment(row: 1, alignment: Qt::AlignVCenter); |
1180 | layout->setRowAlignment(row: 2, alignment: Qt::AlignTop); |
1181 | |
1182 | // see if item alignment takes preference over rowAlignment |
1183 | layout->setAlignment(item: layout->itemAt(row: 0,column: 0), alignment: Qt::AlignRight); |
1184 | layout->setAlignment(item: layout->itemAt(row: 1,column: 0), alignment: Qt::AlignTop); |
1185 | layout->setAlignment(item: layout->itemAt(row: 2,column: 0), alignment: Qt::AlignHCenter); |
1186 | |
1187 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); // process LayoutRequest |
1188 | |
1189 | QCOMPARE(layout->alignment(layout->itemAt(0,0)), Qt::AlignRight); //Qt::AlignRight | Qt::AlignBottom |
1190 | QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(50, 50, 50, 50)); |
1191 | QCOMPARE(layout->rowAlignment(0), Qt::AlignBottom); |
1192 | QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(101, 50, 50, 50)); |
1193 | QCOMPARE(layout->alignment(layout->itemAt(1,0)), Qt::AlignTop); |
1194 | QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 101, 50, 50)); |
1195 | QCOMPARE(layout->rowAlignment(1), Qt::AlignVCenter); |
1196 | QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(101, 126, 50, 50)); |
1197 | QCOMPARE(layout->alignment(layout->itemAt(2,0)), Qt::AlignHCenter); |
1198 | QCOMPARE(layout->itemAt(2,0)->geometry(), QRectF(25, 202, 50, 50)); |
1199 | QCOMPARE(layout->rowAlignment(2), Qt::AlignTop); |
1200 | QCOMPARE(layout->itemAt(2,1)->geometry(), QRectF(101,202, 50, 50)); |
1201 | |
1202 | delete widget; |
1203 | } |
1204 | |
1205 | void tst_QGraphicsGridLayout::rowCount_data() |
1206 | { |
1207 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1208 | |
1209 | QTest::newRow(dataTag: "" ) << false; |
1210 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1211 | } |
1212 | |
1213 | // public int rowCount() const |
1214 | // public int columnCount() const |
1215 | void tst_QGraphicsGridLayout::rowCount() |
1216 | { |
1217 | QFETCH(bool, hasHeightForWidth); |
1218 | QGraphicsScene scene; |
1219 | QGraphicsView view(&scene); |
1220 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1221 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1222 | scene.addItem(item: widget); |
1223 | widget->setLayout(layout); |
1224 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1225 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1226 | layout->setSpacing(0); |
1227 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1228 | QCOMPARE(layout->rowCount(), 3); |
1229 | QCOMPARE(layout->columnCount(), 2); |
1230 | |
1231 | // with spans and holes... |
1232 | widget->setLayout(0); |
1233 | layout = new QGraphicsGridLayout(); |
1234 | populateLayoutWithSpansAndHoles(gridLayout: layout, hasHeightForWidth); |
1235 | QCOMPARE(layout->rowCount(), 2); |
1236 | QCOMPARE(layout->columnCount(), 3); |
1237 | |
1238 | delete widget; |
1239 | } |
1240 | |
1241 | void tst_QGraphicsGridLayout::rowMaximumHeight_data() |
1242 | { |
1243 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1244 | |
1245 | QTest::newRow(dataTag: "" ) << false; |
1246 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1247 | } |
1248 | |
1249 | // public qreal rowMaximumHeight(int row) const |
1250 | void tst_QGraphicsGridLayout::rowMaximumHeight() |
1251 | { |
1252 | QFETCH(bool, hasHeightForWidth); |
1253 | QGraphicsScene scene; |
1254 | QGraphicsView view(&scene); |
1255 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1256 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
1257 | scene.addItem(item: widget); |
1258 | widget->setLayout(layout); |
1259 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1260 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1261 | layout->setSpacing(0); |
1262 | |
1263 | // should at least be a very large number |
1264 | QVERIFY(layout->rowMaximumHeight(0) >= 10000); |
1265 | QCOMPARE(layout->rowMaximumHeight(0), layout->rowMaximumHeight(1)); |
1266 | QCOMPARE(layout->rowMaximumHeight(1), layout->rowMaximumHeight(2)); |
1267 | layout->setRowMaximumHeight(row: 0, height: 20); |
1268 | layout->setRowMaximumHeight(row: 2, height: 60); |
1269 | |
1270 | view.show(); |
1271 | widget->show(); |
1272 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
1273 | QApplication::processEvents(); |
1274 | |
1275 | QCOMPARE(layout->itemAt(0,0)->geometry().height(), 20.0); |
1276 | QCOMPARE(layout->itemAt(0,1)->geometry().height(), 20.0); |
1277 | QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0); |
1278 | QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0); |
1279 | QCOMPARE(layout->itemAt(2,0)->geometry().height(), 25.0); |
1280 | QCOMPARE(layout->itemAt(2,1)->geometry().height(), 25.0); |
1281 | |
1282 | delete widget; |
1283 | } |
1284 | |
1285 | void tst_QGraphicsGridLayout::rowMinimumHeight_data() |
1286 | { |
1287 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1288 | |
1289 | QTest::newRow(dataTag: "" ) << false; |
1290 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1291 | } |
1292 | // public qreal rowMinimumHeight(int row) const |
1293 | void tst_QGraphicsGridLayout::rowMinimumHeight() |
1294 | { |
1295 | QFETCH(bool, hasHeightForWidth); |
1296 | QGraphicsScene scene; |
1297 | QGraphicsView view(&scene); |
1298 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1299 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1300 | scene.addItem(item: widget); |
1301 | widget->setLayout(layout); |
1302 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1303 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1304 | layout->setSpacing(0); |
1305 | |
1306 | // should at least be a very large number |
1307 | QCOMPARE(layout->rowMinimumHeight(0), 0.0); |
1308 | QCOMPARE(layout->rowMinimumHeight(0), layout->rowMinimumHeight(1)); |
1309 | QCOMPARE(layout->rowMinimumHeight(1), layout->rowMinimumHeight(2)); |
1310 | layout->setRowMinimumHeight(row: 0, height: 20); |
1311 | layout->setRowMinimumHeight(row: 2, height: 40); |
1312 | |
1313 | view.show(); |
1314 | widget->show(); |
1315 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
1316 | QApplication::processEvents(); |
1317 | |
1318 | QCOMPARE(layout->itemAt(0,0)->geometry().height(), 25.0); |
1319 | QCOMPARE(layout->itemAt(0,1)->geometry().height(), 25.0); |
1320 | QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0); |
1321 | QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0); |
1322 | QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0); |
1323 | QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0); |
1324 | |
1325 | delete widget; |
1326 | } |
1327 | |
1328 | void tst_QGraphicsGridLayout::rowPreferredHeight_data() |
1329 | { |
1330 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1331 | |
1332 | QTest::newRow(dataTag: "" ) << false; |
1333 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1334 | } |
1335 | // public qreal rowPreferredHeight(int row) const |
1336 | void tst_QGraphicsGridLayout::rowPreferredHeight() |
1337 | { |
1338 | QFETCH(bool, hasHeightForWidth); |
1339 | QGraphicsScene scene; |
1340 | QGraphicsView view(&scene); |
1341 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1342 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1343 | scene.addItem(item: widget); |
1344 | widget->setLayout(layout); |
1345 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1346 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1347 | layout->setSpacing(0); |
1348 | |
1349 | // default preferred height ?? |
1350 | QCOMPARE(layout->rowPreferredHeight(0), 0.0); |
1351 | QCOMPARE(layout->rowPreferredHeight(0), layout->rowPreferredHeight(1)); |
1352 | QCOMPARE(layout->rowPreferredHeight(1), layout->rowPreferredHeight(2)); |
1353 | layout->setRowPreferredHeight(row: 0, height: 20); |
1354 | layout->setRowPreferredHeight(row: 2, height: 40); |
1355 | |
1356 | view.show(); |
1357 | widget->show(); |
1358 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
1359 | QApplication::processEvents(); |
1360 | |
1361 | // ### Jasmin: Should rowPreferredHeight have precedence over sizeHint(Qt::PreferredSize) ? |
1362 | QCOMPARE(layout->itemAt(0,0)->geometry().height(), 25.0); |
1363 | QCOMPARE(layout->itemAt(0,1)->geometry().height(), 25.0); |
1364 | QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0); |
1365 | QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0); |
1366 | QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0); |
1367 | QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0); |
1368 | |
1369 | delete widget; |
1370 | } |
1371 | |
1372 | // public void setRowFixedHeight(int row, qreal height) |
1373 | void tst_QGraphicsGridLayout::setRowFixedHeight() |
1374 | { |
1375 | QGraphicsScene scene; |
1376 | QGraphicsView view(&scene); |
1377 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1378 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1379 | scene.addItem(item: widget); |
1380 | widget->setLayout(layout); |
1381 | populateLayout(gridLayout: layout, width: 2, height: 3); |
1382 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1383 | layout->setSpacing(0); |
1384 | |
1385 | layout->setRowFixedHeight(row: 0, height: 20.); |
1386 | layout->setRowFixedHeight(row: 2, height: 40.); |
1387 | |
1388 | view.show(); |
1389 | widget->show(); |
1390 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
1391 | QApplication::processEvents(); |
1392 | |
1393 | QCOMPARE(layout->itemAt(0,0)->geometry().height(), 20.0); |
1394 | QCOMPARE(layout->itemAt(0,1)->geometry().height(), 20.0); |
1395 | QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0); |
1396 | QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0); |
1397 | QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0); |
1398 | QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0); |
1399 | |
1400 | delete widget; |
1401 | } |
1402 | |
1403 | // public qreal rowSpacing(int row) const |
1404 | void tst_QGraphicsGridLayout::rowSpacing() |
1405 | { |
1406 | QGraphicsScene scene; |
1407 | QGraphicsView view(&scene); |
1408 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1409 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1410 | scene.addItem(item: widget); |
1411 | widget->setLayout(layout); |
1412 | populateLayout(gridLayout: layout, width: 3, height: 2); |
1413 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1414 | layout->setSpacing(0); |
1415 | QCOMPARE(layout->columnSpacing(0), 0.0); |
1416 | |
1417 | layout->setColumnSpacing(column: 0, spacing: 20); |
1418 | view.show(); |
1419 | widget->show(); |
1420 | widget->resize(size: widget->effectiveSizeHint(which: Qt::PreferredSize)); |
1421 | QApplication::processEvents(); |
1422 | |
1423 | QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0); |
1424 | QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0); |
1425 | QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0); |
1426 | QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0); |
1427 | QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0); |
1428 | QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0); |
1429 | |
1430 | delete widget; |
1431 | |
1432 | } |
1433 | |
1434 | void tst_QGraphicsGridLayout::rowStretchFactor_data() |
1435 | { |
1436 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1437 | |
1438 | QTest::newRow(dataTag: "" ) << false; |
1439 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1440 | } |
1441 | |
1442 | // public int rowStretchFactor(int row) const |
1443 | void tst_QGraphicsGridLayout::rowStretchFactor() |
1444 | { |
1445 | QFETCH(bool, hasHeightForWidth); |
1446 | QGraphicsScene scene; |
1447 | QGraphicsView view(&scene); |
1448 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1449 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1450 | scene.addItem(item: widget); |
1451 | widget->setLayout(layout); |
1452 | populateLayout(gridLayout: layout, width: 2, height: 3, hasHeightForWidth); |
1453 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1454 | layout->setSpacing(0); |
1455 | |
1456 | layout->setRowStretchFactor(row: 0, stretch: 1); |
1457 | layout->setRowStretchFactor(row: 1, stretch: 2); |
1458 | layout->setRowStretchFactor(row: 2, stretch: 3); |
1459 | view.show(); |
1460 | widget->show(); |
1461 | widget->resize(w: 50, h: 130); |
1462 | QApplication::processEvents(); |
1463 | |
1464 | QVERIFY(layout->itemAt(0,0)->geometry().height() < layout->itemAt(1,0)->geometry().height()); |
1465 | QVERIFY(layout->itemAt(1,0)->geometry().height() < layout->itemAt(2,0)->geometry().height()); |
1466 | QVERIFY(layout->itemAt(0,1)->geometry().height() < layout->itemAt(1,1)->geometry().height()); |
1467 | QVERIFY(layout->itemAt(1,1)->geometry().height() < layout->itemAt(2,1)->geometry().height()); |
1468 | |
1469 | delete widget; |
1470 | } |
1471 | |
1472 | void tst_QGraphicsGridLayout::setColumnSpacing_data() |
1473 | { |
1474 | QTest::addColumn<int>(name: "column" ); |
1475 | QTest::addColumn<qreal>(name: "spacing" ); |
1476 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1477 | |
1478 | QTest::newRow(dataTag: "null" ) << 0 << qreal(0.0) << false; |
1479 | QTest::newRow(dataTag: "10" ) << 0 << qreal(10.0) << false; |
1480 | QTest::newRow(dataTag: "null, hasHeightForWidth" ) << 0 << qreal(0.0) << true; |
1481 | QTest::newRow(dataTag: "10, hasHeightForWidth" ) << 0 << qreal(10.0) << true; |
1482 | } |
1483 | |
1484 | // public void setColumnSpacing(int column, qreal spacing) |
1485 | void tst_QGraphicsGridLayout::setColumnSpacing() |
1486 | { |
1487 | QFETCH(int, column); |
1488 | QFETCH(qreal, spacing); |
1489 | QFETCH(bool, hasHeightForWidth); |
1490 | |
1491 | QGraphicsScene scene; |
1492 | QGraphicsView view(&scene); |
1493 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1494 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1495 | scene.addItem(item: widget); |
1496 | widget->setLayout(layout); |
1497 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
1498 | layout->setSpacing(0); |
1499 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1500 | qreal oldSpacing = layout->columnSpacing(column); |
1501 | QCOMPARE(oldSpacing, 0.0); |
1502 | qreal w = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).width(); |
1503 | layout->setColumnSpacing(column, spacing); |
1504 | QApplication::processEvents(); |
1505 | QCOMPARE(layout->sizeHint(Qt::PreferredSize, QSizeF()).width(), w + spacing); |
1506 | } |
1507 | |
1508 | void tst_QGraphicsGridLayout::setGeometry_data() |
1509 | { |
1510 | QTest::addColumn<QRectF>(name: "rect" ); |
1511 | QTest::newRow(dataTag: "null" ) << QRectF(); |
1512 | QTest::newRow(dataTag: "normal" ) << QRectF(0,0, 50, 50); |
1513 | } |
1514 | |
1515 | // public void setGeometry(QRectF const& rect) |
1516 | void tst_QGraphicsGridLayout::setGeometry() |
1517 | { |
1518 | QFETCH(QRectF, rect); |
1519 | |
1520 | QGraphicsWidget *window = new QGraphicsWidget; |
1521 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1522 | window->setLayout(layout); |
1523 | QGraphicsGridLayout *layout2 = new QGraphicsGridLayout(); |
1524 | layout2->setMaximumSize(aw: 100, ah: 100); |
1525 | layout->addItem(aitem: layout2, arow: 0, acolumn: 0); |
1526 | layout2->setGeometry(rect); |
1527 | QCOMPARE(layout2->geometry(), rect); |
1528 | } |
1529 | |
1530 | void tst_QGraphicsGridLayout::setRowSpacing_data() |
1531 | { |
1532 | QTest::addColumn<int>(name: "row" ); |
1533 | QTest::addColumn<qreal>(name: "spacing" ); |
1534 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1535 | |
1536 | QTest::newRow(dataTag: "null" ) << 0 << qreal(0.0) << false; |
1537 | QTest::newRow(dataTag: "10" ) << 0 << qreal(10.0) << false; |
1538 | QTest::newRow(dataTag: "null, hasHeightForWidth" ) << 0 << qreal(0.0) << true; |
1539 | QTest::newRow(dataTag: "10, hasHeightForWidth" ) << 0 << qreal(10.0) << true; |
1540 | } |
1541 | |
1542 | // public void setRowSpacing(int row, qreal spacing) |
1543 | void tst_QGraphicsGridLayout::setRowSpacing() |
1544 | { |
1545 | QFETCH(int, row); |
1546 | QFETCH(qreal, spacing); |
1547 | QFETCH(bool, hasHeightForWidth); |
1548 | |
1549 | QGraphicsScene scene; |
1550 | QGraphicsView view(&scene); |
1551 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1552 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1553 | scene.addItem(item: widget); |
1554 | widget->setLayout(layout); |
1555 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
1556 | layout->setSpacing(0); |
1557 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1558 | qreal oldSpacing = layout->rowSpacing(row); |
1559 | QCOMPARE(oldSpacing, 0.0); |
1560 | qreal h = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).height(); |
1561 | layout->setRowSpacing(row, spacing); |
1562 | QApplication::processEvents(); |
1563 | QCOMPARE(layout->sizeHint(Qt::PreferredSize, QSizeF()).height(), h + spacing); |
1564 | } |
1565 | |
1566 | void tst_QGraphicsGridLayout::setSpacing_data() |
1567 | { |
1568 | QTest::addColumn<qreal>(name: "spacing" ); |
1569 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1570 | QTest::newRow(dataTag: "zero" ) << qreal(0.0) << false; |
1571 | QTest::newRow(dataTag: "17" ) << qreal(17.0) << false; |
1572 | QTest::newRow(dataTag: "zero, hasHeightForWidth" ) << qreal(0.0) << true; |
1573 | QTest::newRow(dataTag: "17, hasHeightForWidth" ) << qreal(17.0) << true; |
1574 | } |
1575 | |
1576 | // public void setSpacing(qreal spacing) |
1577 | void tst_QGraphicsGridLayout::setSpacing() |
1578 | { |
1579 | QFETCH(qreal, spacing); |
1580 | QFETCH(bool, hasHeightForWidth); |
1581 | QGraphicsScene scene; |
1582 | QGraphicsView view(&scene); |
1583 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1584 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1585 | scene.addItem(item: widget); |
1586 | widget->setLayout(layout); |
1587 | populateLayout(gridLayout: layout, width: 3, height: 2, hasHeightForWidth); |
1588 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1589 | QSizeF sh = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()); |
1590 | qreal oldVSpacing = layout->verticalSpacing(); |
1591 | qreal oldHSpacing = layout->horizontalSpacing(); |
1592 | |
1593 | // The remainder of this test is only applicable if the current style uses uniform layout spacing |
1594 | if (oldVSpacing != -1) { |
1595 | layout->setSpacing(spacing); |
1596 | QApplication::processEvents(); |
1597 | QSizeF newSH = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()); |
1598 | QCOMPARE(newSH.height(), sh.height() - (2-1)*(oldVSpacing - spacing)); |
1599 | QCOMPARE(newSH.width(), sh.width() - (3-1)*(oldHSpacing - spacing)); |
1600 | } |
1601 | delete widget; |
1602 | } |
1603 | |
1604 | void tst_QGraphicsGridLayout::sizeHint_data() |
1605 | { |
1606 | QTest::addColumn<ItemList>(name: "itemDescriptions" ); |
1607 | QTest::addColumn<QSizeF>(name: "expectedMinimumSizeHint" ); |
1608 | QTest::addColumn<QSizeF>(name: "expectedPreferredSizeHint" ); |
1609 | QTest::addColumn<QSizeF>(name: "expectedMaximumSizeHint" ); |
1610 | |
1611 | QTest::newRow(dataTag: "rowSpan_larger_than_rows" ) << (ItemList() |
1612 | << ItemDesc(0,0) |
1613 | .minSize(sz: QSizeF(50,300)) |
1614 | .maxSize(sz: QSizeF(50,300)) |
1615 | .rowSpan(span: 2) |
1616 | << ItemDesc(0,1) |
1617 | .minSize(sz: QSizeF(50,0)) |
1618 | .preferredSize(sz: QSizeF(50,50)) |
1619 | .maxSize(sz: QSize(50, 1000)) |
1620 | << ItemDesc(1,1) |
1621 | .minSize(sz: QSizeF(50,0)) |
1622 | .preferredSize(sz: QSizeF(50,50)) |
1623 | .maxSize(sz: QSize(50, 1000)) |
1624 | ) |
1625 | << QSizeF(100, 300) |
1626 | << QSizeF(100, 300) |
1627 | << QSizeF(100, 2000); |
1628 | |
1629 | QTest::newRow(dataTag: "rowSpan_smaller_than_rows" ) << (ItemList() |
1630 | << ItemDesc(0,0) |
1631 | .minSize(sz: QSizeF(50, 0)) |
1632 | .preferredSize(sz: QSizeF(50, 50)) |
1633 | .maxSize(sz: QSizeF(50, 300)) |
1634 | .rowSpan(span: 2) |
1635 | << ItemDesc(0,1) |
1636 | .minSize(sz: QSizeF(50, 50)) |
1637 | .preferredSize(sz: QSizeF(50, 50)) |
1638 | .maxSize(sz: QSize(50, 50)) |
1639 | << ItemDesc(1,1) |
1640 | .minSize(sz: QSizeF(50, 50)) |
1641 | .preferredSize(sz: QSizeF(50, 50)) |
1642 | .maxSize(sz: QSize(50, 50)) |
1643 | ) |
1644 | << QSizeF(100, 100) |
1645 | << QSizeF(100, 100) |
1646 | << QSizeF(100, 100); |
1647 | |
1648 | QTest::newRow(dataTag: "colSpan_with_ignored_column" ) << (ItemList() |
1649 | << ItemDesc(0,0) |
1650 | .minSize(sz: QSizeF(40,20)) |
1651 | .maxSize(sz: QSizeF(60,20)) |
1652 | .colSpan(span: 2) |
1653 | << ItemDesc(0,2) |
1654 | .minSize(sz: QSizeF(20, 20)) |
1655 | .maxSize(sz: QSizeF(30, 20)) |
1656 | << ItemDesc(1,0) |
1657 | .minSize(sz: QSizeF(60, 20)) |
1658 | .maxSize(sz: QSizeF(90, 20)) |
1659 | .colSpan(span: 3) |
1660 | ) |
1661 | << QSizeF(60, 40) |
1662 | << QSizeF(80, 40) |
1663 | << QSizeF(90, 40); |
1664 | |
1665 | } |
1666 | |
1667 | // public QSizeF sizeHint(Qt::SizeHint which, QSizeF const& constraint = QSizeF()) const |
1668 | void tst_QGraphicsGridLayout::sizeHint() |
1669 | { |
1670 | QFETCH(ItemList, itemDescriptions); |
1671 | QFETCH(QSizeF, expectedMinimumSizeHint); |
1672 | QFETCH(QSizeF, expectedPreferredSizeHint); |
1673 | QFETCH(QSizeF, expectedMaximumSizeHint); |
1674 | |
1675 | QGraphicsScene scene; |
1676 | QGraphicsView view(&scene); |
1677 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1678 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
1679 | scene.addItem(item: widget); |
1680 | widget->setLayout(layout); |
1681 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1682 | layout->setSpacing(0.0); |
1683 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1684 | |
1685 | int i; |
1686 | for (i = 0; i < itemDescriptions.count(); ++i) { |
1687 | ItemDesc desc = itemDescriptions.at(i); |
1688 | RectWidget *item = new RectWidget(widget); |
1689 | desc.apply(layout, item); |
1690 | } |
1691 | |
1692 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
1693 | |
1694 | widget->show(); |
1695 | view.show(); |
1696 | view.resize(w: 400,h: 300); |
1697 | QCOMPARE(layout->sizeHint(Qt::MinimumSize), expectedMinimumSizeHint); |
1698 | QCOMPARE(layout->sizeHint(Qt::PreferredSize), expectedPreferredSizeHint); |
1699 | QCOMPARE(layout->sizeHint(Qt::MaximumSize), expectedMaximumSizeHint); |
1700 | |
1701 | } |
1702 | |
1703 | void tst_QGraphicsGridLayout::verticalSpacing_data() |
1704 | { |
1705 | QTest::addColumn<qreal>(name: "verticalSpacing" ); |
1706 | QTest::newRow(dataTag: "zero" ) << qreal(0.0); |
1707 | QTest::newRow(dataTag: "17" ) << qreal(10.0); |
1708 | } |
1709 | |
1710 | // public qreal verticalSpacing() const |
1711 | void tst_QGraphicsGridLayout::verticalSpacing() |
1712 | { |
1713 | QFETCH(qreal, verticalSpacing); |
1714 | QGraphicsScene scene; |
1715 | QGraphicsView view(&scene); |
1716 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
1717 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(); |
1718 | scene.addItem(item: widget); |
1719 | widget->setLayout(layout); |
1720 | populateLayout(gridLayout: layout, width: 3, height: 2); |
1721 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
1722 | qreal h = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).height(); |
1723 | qreal oldSpacing = layout->verticalSpacing(); |
1724 | |
1725 | // The remainder of this test is only applicable if the current style uses uniform layout spacing |
1726 | if (oldSpacing != -1) { |
1727 | layout->setVerticalSpacing(verticalSpacing); |
1728 | QApplication::processEvents(); |
1729 | qreal new_h = layout->sizeHint(which: Qt::PreferredSize, constraint: QSizeF()).height(); |
1730 | QCOMPARE(new_h, h - (2-1)*(oldSpacing - verticalSpacing)); |
1731 | } |
1732 | delete widget; |
1733 | } |
1734 | |
1735 | void tst_QGraphicsGridLayout::layoutDirection_data() |
1736 | { |
1737 | QTest::addColumn<bool>(name: "hasHeightForWidth" ); |
1738 | |
1739 | QTest::newRow(dataTag: "" ) << false; |
1740 | QTest::newRow(dataTag: "hasHeightForWidth" ) << true; |
1741 | } |
1742 | |
1743 | void tst_QGraphicsGridLayout::layoutDirection() |
1744 | { |
1745 | QFETCH(bool, hasHeightForWidth); |
1746 | |
1747 | QGraphicsScene scene; |
1748 | QGraphicsView view(&scene); |
1749 | |
1750 | QGraphicsWidget *window = new QGraphicsWidget(0, Qt::Window); |
1751 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
1752 | layout->setContentsMargins(left: 1, top: 2, right: 3, bottom: 4); |
1753 | layout->setSpacing(6); |
1754 | RectWidget *w1 = new RectWidget; |
1755 | w1->setMinimumSize(aw: 30, ah: 20); |
1756 | layout->addItem(aitem: w1, arow: 0, acolumn: 0); |
1757 | RectWidget *w2 = new RectWidget; |
1758 | w2->setMinimumSize(aw: 20, ah: 20); |
1759 | w2->setMaximumSize(aw: 20, ah: 20); |
1760 | layout->addItem(aitem: w2, arow: 0, acolumn: 1); |
1761 | RectWidget *w3 = new RectWidget; |
1762 | w3->setMinimumSize(aw: 20, ah: 20); |
1763 | w3->setMaximumSize(aw: 20, ah: 20); |
1764 | layout->addItem(aitem: w3, arow: 1, acolumn: 0); |
1765 | RectWidget *w4 = new RectWidget; |
1766 | w4->setMinimumSize(aw: 30, ah: 20); |
1767 | layout->addItem(aitem: w4, arow: 1, acolumn: 1); |
1768 | |
1769 | QSizePolicy policy = w1->sizePolicy(); |
1770 | policy.setHeightForWidth(hasHeightForWidth); |
1771 | w1->setSizePolicy(policy); |
1772 | w2->setSizePolicy(policy); |
1773 | w4->setSizePolicy(policy); |
1774 | |
1775 | layout->setAlignment(item: w2, alignment: Qt::AlignRight); |
1776 | layout->setAlignment(item: w3, alignment: Qt::AlignLeft); |
1777 | |
1778 | scene.addItem(item: window); |
1779 | window->setLayout(layout); |
1780 | view.show(); |
1781 | window->resize(w: 70, h: 52); |
1782 | QApplication::processEvents(); |
1783 | QCOMPARE(w1->geometry().left(), 1.0); |
1784 | QCOMPARE(w1->geometry().right(), 31.0); |
1785 | QCOMPARE(w2->geometry().left(), 47.0); |
1786 | QCOMPARE(w2->geometry().right(), 67.0); |
1787 | QCOMPARE(w3->geometry().left(), 1.0); |
1788 | QCOMPARE(w3->geometry().right(), 21.0); |
1789 | QCOMPARE(w4->geometry().left(), 37.0); |
1790 | QCOMPARE(w4->geometry().right(), 67.0); |
1791 | |
1792 | window->setLayoutDirection(Qt::RightToLeft); |
1793 | QApplication::processEvents(); |
1794 | QCOMPARE(w1->geometry().left(), 39.0); |
1795 | QCOMPARE(w1->geometry().right(), 69.0); |
1796 | QCOMPARE(w2->geometry().left(), 3.0); |
1797 | QCOMPARE(w2->geometry().right(), 23.0); |
1798 | QCOMPARE(w3->geometry().left(), 49.0); |
1799 | QCOMPARE(w3->geometry().right(), 69.0); |
1800 | QCOMPARE(w4->geometry().left(), 3.0); |
1801 | QCOMPARE(w4->geometry().right(), 33.0); |
1802 | |
1803 | delete window; |
1804 | } |
1805 | |
1806 | void tst_QGraphicsGridLayout::removeLayout() |
1807 | { |
1808 | QGraphicsScene scene; |
1809 | RectWidget *textEdit = new RectWidget; |
1810 | RectWidget *pushButton = new RectWidget; |
1811 | scene.addItem(item: textEdit); |
1812 | scene.addItem(item: pushButton); |
1813 | |
1814 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
1815 | layout->addItem(aitem: textEdit, arow: 0, acolumn: 0); |
1816 | layout->addItem(aitem: pushButton, arow: 1, acolumn: 0); |
1817 | |
1818 | QGraphicsWidget *form = new QGraphicsWidget; |
1819 | form->setLayout(layout); |
1820 | scene.addItem(item: form); |
1821 | |
1822 | QGraphicsView view(&scene); |
1823 | view.show(); |
1824 | QVERIFY(QTest::qWaitForWindowExposed(&view)); |
1825 | |
1826 | QRectF r1 = textEdit->geometry(); |
1827 | QRectF r2 = pushButton->geometry(); |
1828 | form->setLayout(0); |
1829 | //documentation of QGraphicsWidget::setLayout: |
1830 | //If layout is 0, the widget is left without a layout. Existing subwidgets' geometries will remain unaffected. |
1831 | QCOMPARE(textEdit->geometry(), r1); |
1832 | QCOMPARE(pushButton->geometry(), r2); |
1833 | } |
1834 | |
1835 | void tst_QGraphicsGridLayout::defaultStretchFactors_data() |
1836 | { |
1837 | QTest::addColumn<ItemList>(name: "itemDescriptions" ); |
1838 | QTest::addColumn<QSizeF>(name: "newSize" ); |
1839 | QTest::addColumn<SizeList>(name: "expectedSizes" ); |
1840 | |
1841 | QTest::newRow(dataTag: "usepreferredsize" ) << (ItemList() |
1842 | << ItemDesc(0,0) |
1843 | .preferredSizeHint(sh: QSizeF(10,10)) |
1844 | << ItemDesc(0,1) |
1845 | .preferredSizeHint(sh: QSizeF(10,10)) |
1846 | << ItemDesc(0,2) |
1847 | .preferredSizeHint(sh: QSizeF(10,10)) |
1848 | << ItemDesc(1,0) |
1849 | .preferredSizeHint(sh: QSizeF(10,10)) |
1850 | << ItemDesc(1,1) |
1851 | .preferredSizeHint(sh: QSizeF(10,10)) |
1852 | << ItemDesc(1,2) |
1853 | .preferredSizeHint(sh: QSizeF(10,10)) |
1854 | ) |
1855 | << QSizeF() |
1856 | << (SizeList() |
1857 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
1858 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
1859 | ); |
1860 | |
1861 | QTest::newRow(dataTag: "preferredsizeIsZero" ) << (ItemList() |
1862 | << ItemDesc(0,0) |
1863 | .preferredSizeHint(sh: QSizeF(0,10)) |
1864 | << ItemDesc(0,1) |
1865 | .preferredSizeHint(sh: QSizeF(10,10)) |
1866 | .maxSize(sz: QSizeF(20, 10)) |
1867 | ) |
1868 | << QSizeF(30, 10) |
1869 | << (SizeList() |
1870 | << QSizeF(10,10) << QSizeF(20,10) |
1871 | ); |
1872 | |
1873 | QTest::newRow(dataTag: "ignoreitem01" ) << (ItemList() |
1874 | << ItemDesc(0,0) |
1875 | .preferredSizeHint(sh: QSizeF(10,10)) |
1876 | << ItemDesc(0,1) |
1877 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1878 | .preferredSizeHint(sh: QSizeF(10,10)) |
1879 | << ItemDesc(0,2) |
1880 | .preferredSizeHint(sh: QSizeF(10,10)) |
1881 | << ItemDesc(1,0) |
1882 | .preferredSizeHint(sh: QSizeF(10,10)) |
1883 | << ItemDesc(1,1) |
1884 | .preferredSizeHint(sh: QSizeF(10,10)) |
1885 | << ItemDesc(1,2) |
1886 | .preferredSizeHint(sh: QSizeF(10,10)) |
1887 | ) |
1888 | << QSizeF() |
1889 | << (SizeList() |
1890 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
1891 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
1892 | ); |
1893 | |
1894 | QTest::newRow(dataTag: "ignoreitem01_resize120x40" ) << (ItemList() |
1895 | << ItemDesc(0,0) |
1896 | .preferredSizeHint(sh: QSizeF(10,10)) |
1897 | << ItemDesc(0,1) |
1898 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1899 | .preferredSizeHint(sh: QSizeF(20,10)) |
1900 | << ItemDesc(0,2) |
1901 | .preferredSizeHint(sh: QSizeF(30,10)) |
1902 | << ItemDesc(1,0) |
1903 | .preferredSizeHint(sh: QSizeF(10,10)) |
1904 | << ItemDesc(1,1) |
1905 | .preferredSizeHint(sh: QSizeF(20,10)) |
1906 | << ItemDesc(1,2) |
1907 | .preferredSizeHint(sh: QSizeF(30,10)) |
1908 | ) |
1909 | << QSizeF(120, 40) |
1910 | << (SizeList() |
1911 | << QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20) |
1912 | << QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20) |
1913 | ); |
1914 | |
1915 | QTest::newRow(dataTag: "ignoreitem11_resize120x40" ) << (ItemList() |
1916 | << ItemDesc(0,0) |
1917 | .preferredSizeHint(sh: QSizeF(10,10)) |
1918 | << ItemDesc(0,1) |
1919 | .preferredSizeHint(sh: QSizeF(20,10)) |
1920 | << ItemDesc(0,2) |
1921 | .preferredSizeHint(sh: QSizeF(30,10)) |
1922 | << ItemDesc(1,0) |
1923 | .preferredSizeHint(sh: QSizeF(10,20)) |
1924 | << ItemDesc(1,1) |
1925 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1926 | .preferredSizeHint(sh: QSizeF(20,20)) |
1927 | << ItemDesc(1,2) |
1928 | .preferredSizeHint(sh: QSizeF(30,20)) |
1929 | ) |
1930 | << QSizeF(120, 60) |
1931 | << (SizeList() |
1932 | << QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20) |
1933 | << QSizeF(20,40) << QSizeF(40,40) << QSizeF(60,40) |
1934 | ); |
1935 | |
1936 | QTest::newRow(dataTag: "ignoreitem01_span01_resize70x60" ) << (ItemList() |
1937 | << ItemDesc(0,0) |
1938 | .preferredSizeHint(sh: QSizeF(10,10)) |
1939 | << ItemDesc(0,1) |
1940 | .preferredSizeHint(sh: QSizeF(20,10)) |
1941 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1942 | .rowSpan(span: 2) |
1943 | << ItemDesc(0,2) |
1944 | .preferredSizeHint(sh: QSizeF(30,10)) |
1945 | << ItemDesc(1,0) |
1946 | .preferredSizeHint(sh: QSizeF(10,20)) |
1947 | << ItemDesc(1,2) |
1948 | .preferredSizeHint(sh: QSizeF(30,20)) |
1949 | ) |
1950 | << QSizeF(70, 60) |
1951 | << (SizeList() |
1952 | << QSizeF(20,20) << QSizeF(10,60) << QSizeF(40,20) |
1953 | << QSizeF(20,40) << QSizeF(40,40) |
1954 | ); |
1955 | |
1956 | QTest::newRow(dataTag: "ignoreitem10_resize40x120" ) << (ItemList() |
1957 | << ItemDesc(0,0) |
1958 | .preferredSizeHint(sh: QSizeF(10,10)) |
1959 | << ItemDesc(0,1) |
1960 | .preferredSizeHint(sh: QSizeF(10,10)) |
1961 | << ItemDesc(1,0) |
1962 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1963 | .preferredSizeHint(sh: QSizeF(10,20)) |
1964 | << ItemDesc(1,1) |
1965 | .preferredSizeHint(sh: QSizeF(10,20)) |
1966 | << ItemDesc(2,0) |
1967 | .preferredSizeHint(sh: QSizeF(10,30)) |
1968 | << ItemDesc(2,1) |
1969 | .preferredSizeHint(sh: QSizeF(10,30)) |
1970 | ) |
1971 | << QSizeF(40, 120) |
1972 | << (SizeList() |
1973 | << QSizeF(20,20) << QSizeF(20,20) |
1974 | << QSizeF(20,40) << QSizeF(20,40) |
1975 | << QSizeF(20,60) << QSizeF(20,60) |
1976 | ); |
1977 | |
1978 | QTest::newRow(dataTag: "ignoreitem01_span02" ) << (ItemList() |
1979 | << ItemDesc(0,0) |
1980 | .preferredSizeHint(sh: QSizeF(10,10)) |
1981 | << ItemDesc(0,1) |
1982 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
1983 | .preferredSizeHint(sh: QSizeF(10,20)) |
1984 | .rowSpan(span: 2) |
1985 | << ItemDesc(0,2) |
1986 | .preferredSizeHint(sh: QSizeF(10,10)) |
1987 | << ItemDesc(1,0) |
1988 | .preferredSizeHint(sh: QSizeF(10,10)) |
1989 | << ItemDesc(1,2) |
1990 | .preferredSizeHint(sh: QSizeF(10,10)) |
1991 | ) |
1992 | << QSizeF() |
1993 | << (SizeList() |
1994 | << QSizeF(10,10) << QSizeF(0,20) << QSizeF(10,10) |
1995 | << QSizeF(10,10) << QSizeF(10,10) |
1996 | ); |
1997 | |
1998 | QTest::newRow(dataTag: "ignoreitem02_span02" ) << (ItemList() |
1999 | << ItemDesc(0,0) |
2000 | .preferredSizeHint(sh: QSizeF(10,10)) |
2001 | << ItemDesc(0,1) |
2002 | .preferredSizeHint(sh: QSizeF(10,10)) |
2003 | << ItemDesc(0,2) |
2004 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2005 | .preferredSizeHint(sh: QSizeF(10,20)) |
2006 | .rowSpan(span: 2) |
2007 | << ItemDesc(1,0) |
2008 | .preferredSizeHint(sh: QSizeF(10,10)) |
2009 | << ItemDesc(1,1) |
2010 | .preferredSizeHint(sh: QSizeF(10,10)) |
2011 | ) |
2012 | << QSizeF() |
2013 | << (SizeList() |
2014 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(0,20) |
2015 | << QSizeF(10,10) << QSizeF(10,10) |
2016 | ); |
2017 | |
2018 | QTest::newRow(dataTag: "ignoreitem02_span00_span02" ) << (ItemList() |
2019 | << ItemDesc(0,0) |
2020 | .preferredSizeHint(sh: QSizeF(10,10)) |
2021 | .rowSpan(span: 2) |
2022 | << ItemDesc(0,1) |
2023 | .preferredSizeHint(sh: QSizeF(10,10)) |
2024 | << ItemDesc(0,2) |
2025 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2026 | .preferredSizeHint(sh: QSizeF(10,20)) |
2027 | .rowSpan(span: 2) |
2028 | << ItemDesc(1,1) |
2029 | .preferredSizeHint(sh: QSizeF(10,10)) |
2030 | ) |
2031 | << QSizeF() |
2032 | << (SizeList() |
2033 | << QSizeF(10,20) << QSizeF(10,10) << QSizeF(0,20) |
2034 | << QSizeF(10,10) |
2035 | ); |
2036 | |
2037 | QTest::newRow(dataTag: "ignoreitem00_colspan00" ) << (ItemList() |
2038 | << ItemDesc(0,0) |
2039 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2040 | .preferredSizeHint(sh: QSizeF(10,20)) |
2041 | .colSpan(span: 2) |
2042 | << ItemDesc(0,2) |
2043 | .preferredSizeHint(sh: QSizeF(10,10)) |
2044 | << ItemDesc(1,0) |
2045 | .preferredSizeHint(sh: QSizeF(10,10)) |
2046 | << ItemDesc(1,1) |
2047 | .preferredSizeHint(sh: QSizeF(10,10)) |
2048 | << ItemDesc(1,2) |
2049 | .preferredSizeHint(sh: QSizeF(10,10)) |
2050 | ) |
2051 | << QSizeF() |
2052 | << (SizeList() |
2053 | << QSizeF(20,10) << QSizeF(10,10) << QSizeF(10,10) |
2054 | << QSizeF(10,10) << QSizeF(10,10) |
2055 | ); |
2056 | |
2057 | QTest::newRow(dataTag: "ignoreitem01_colspan01" ) << (ItemList() |
2058 | << ItemDesc(0,0) |
2059 | .preferredSizeHint(sh: QSizeF(10,10)) |
2060 | << ItemDesc(0,1) |
2061 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2062 | .preferredSizeHint(sh: QSizeF(10,20)) |
2063 | .colSpan(span: 2) |
2064 | << ItemDesc(1,0) |
2065 | .preferredSizeHint(sh: QSizeF(10,10)) |
2066 | << ItemDesc(1,1) |
2067 | .preferredSizeHint(sh: QSizeF(10,10)) |
2068 | << ItemDesc(1,2) |
2069 | .preferredSizeHint(sh: QSizeF(10,10)) |
2070 | ) |
2071 | << QSizeF() |
2072 | << (SizeList() |
2073 | << QSizeF(10,10) << QSizeF(20,10) << QSizeF(10,10) |
2074 | << QSizeF(10,10) << QSizeF(10,10) |
2075 | ); |
2076 | |
2077 | QTest::newRow(dataTag: "ignorecolumn1_resize70x60" ) << (ItemList() |
2078 | << ItemDesc(0,0) |
2079 | .preferredSizeHint(sh: QSizeF(10,10)) |
2080 | << ItemDesc(0,1) |
2081 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2082 | .preferredSizeHint(sh: QSizeF(20,10)) |
2083 | << ItemDesc(0,2) |
2084 | .preferredSizeHint(sh: QSizeF(30,10)) |
2085 | << ItemDesc(1,0) |
2086 | .preferredSizeHint(sh: QSizeF(10,20)) |
2087 | << ItemDesc(1,1) |
2088 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2089 | .preferredSizeHint(sh: QSizeF(20,20)) |
2090 | << ItemDesc(1,2) |
2091 | .preferredSizeHint(sh: QSizeF(30,20)) |
2092 | ) |
2093 | << QSizeF(70, 60) |
2094 | << (SizeList() |
2095 | << QSizeF(20,20) << QSizeF(10,20) << QSizeF(40,20) |
2096 | << QSizeF(20,40) << QSizeF(10,40) << QSizeF(40,40) |
2097 | ); |
2098 | |
2099 | QTest::newRow(dataTag: "ignorerow0" ) << (ItemList() |
2100 | << ItemDesc(0,0) |
2101 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2102 | .preferredSizeHint(sh: QSizeF(10,10)) |
2103 | << ItemDesc(0,1) |
2104 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2105 | .preferredSizeHint(sh: QSizeF(10,10)) |
2106 | << ItemDesc(0,2) |
2107 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2108 | .preferredSizeHint(sh: QSizeF(10,10)) |
2109 | << ItemDesc(1,0) |
2110 | .preferredSizeHint(sh: QSizeF(10,10)) |
2111 | << ItemDesc(1,1) |
2112 | .preferredSizeHint(sh: QSizeF(10,10)) |
2113 | << ItemDesc(1,2) |
2114 | .preferredSizeHint(sh: QSizeF(10,10)) |
2115 | ) |
2116 | << QSizeF() |
2117 | << (SizeList() |
2118 | << QSizeF(10,0) << QSizeF(10,0) << QSizeF(10,0) |
2119 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
2120 | ); |
2121 | |
2122 | QTest::newRow(dataTag: "ignorerow1" ) << (ItemList() |
2123 | << ItemDesc(0,0) |
2124 | .preferredSizeHint(sh: QSizeF(10,10)) |
2125 | << ItemDesc(0,1) |
2126 | .preferredSizeHint(sh: QSizeF(10,10)) |
2127 | << ItemDesc(0,2) |
2128 | .preferredSizeHint(sh: QSizeF(10,10)) |
2129 | << ItemDesc(1,0) |
2130 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2131 | .preferredSizeHint(sh: QSizeF(10,10)) |
2132 | << ItemDesc(1,1) |
2133 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2134 | .preferredSizeHint(sh: QSizeF(10,10)) |
2135 | << ItemDesc(1,2) |
2136 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2137 | .preferredSizeHint(sh: QSizeF(10,10)) |
2138 | ) |
2139 | << QSizeF() |
2140 | << (SizeList() |
2141 | << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10) |
2142 | << QSizeF(10,0) << QSizeF(10,0) << QSizeF(10,0) |
2143 | ); |
2144 | |
2145 | QTest::newRow(dataTag: "ignorerow0_resize60x50" ) << (ItemList() |
2146 | << ItemDesc(0,0) |
2147 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2148 | .preferredSizeHint(sh: QSizeF(10,10)) |
2149 | << ItemDesc(0,1) |
2150 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2151 | .preferredSizeHint(sh: QSizeF(20,10)) |
2152 | << ItemDesc(0,2) |
2153 | .sizePolicy(horAndVer: QSizePolicy::Ignored) |
2154 | .preferredSizeHint(sh: QSizeF(30,10)) |
2155 | << ItemDesc(1,0) |
2156 | .preferredSizeHint(sh: QSizeF(10,30)) |
2157 | << ItemDesc(1,1) |
2158 | .preferredSizeHint(sh: QSizeF(20,30)) |
2159 | << ItemDesc(1,2) |
2160 | .preferredSizeHint(sh: QSizeF(30,30)) |
2161 | ) |
2162 | << QSizeF(60, 50) |
2163 | << (SizeList() |
2164 | << QSizeF(10,10) << QSizeF(20,10) << QSizeF(30,10) |
2165 | << QSizeF(10,40) << QSizeF(20,40) << QSizeF(30,40) |
2166 | ); |
2167 | |
2168 | } |
2169 | |
2170 | void tst_QGraphicsGridLayout::defaultStretchFactors() |
2171 | { |
2172 | QFETCH(ItemList, itemDescriptions); |
2173 | QFETCH(QSizeF, newSize); |
2174 | QFETCH(SizeList, expectedSizes); |
2175 | |
2176 | QGraphicsScene scene; |
2177 | QGraphicsView view(&scene); |
2178 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
2179 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
2180 | scene.addItem(item: widget); |
2181 | widget->setLayout(layout); |
2182 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2183 | layout->setSpacing(0.0); |
2184 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2185 | |
2186 | int i; |
2187 | for (i = 0; i < itemDescriptions.count(); ++i) { |
2188 | ItemDesc desc = itemDescriptions.at(i); |
2189 | RectWidget *item = new RectWidget(widget); |
2190 | desc.apply(layout, item); |
2191 | } |
2192 | |
2193 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
2194 | |
2195 | widget->show(); |
2196 | view.show(); |
2197 | view.resize(w: 400,h: 300); |
2198 | if (newSize.isValid()) |
2199 | widget->resize(size: newSize); |
2200 | |
2201 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
2202 | for (i = 0; i < expectedSizes.count(); ++i) { |
2203 | QSizeF itemSize = layout->itemAt(index: i)->geometry().size(); |
2204 | QCOMPARE(itemSize, expectedSizes.at(i)); |
2205 | } |
2206 | |
2207 | delete widget; |
2208 | } |
2209 | |
2210 | typedef QList<QRectF> RectList; |
2211 | |
2212 | void tst_QGraphicsGridLayout::alignment2_data() |
2213 | { |
2214 | QTest::addColumn<ItemList>(name: "itemDescriptions" ); |
2215 | QTest::addColumn<QSizeF>(name: "newSize" ); |
2216 | QTest::addColumn<RectList>(name: "expectedGeometries" ); |
2217 | |
2218 | QTest::newRow(dataTag: "hor_sizepolicy_fixed" ) << (ItemList() |
2219 | << ItemDesc(0,0) |
2220 | .preferredSizeHint(sh: QSizeF(10,20)) |
2221 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2222 | << ItemDesc(0,1) |
2223 | .preferredSizeHint(sh: QSizeF(10,10)) |
2224 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2225 | ) |
2226 | << QSizeF() |
2227 | << (RectList() |
2228 | << QRectF(0, 0, 10,20) << QRectF(10, 0, 10,10) |
2229 | ); |
2230 | |
2231 | QTest::newRow(dataTag: "hor_sizepolicy_fixed_alignvcenter" ) << (ItemList() |
2232 | << ItemDesc(0,0) |
2233 | .preferredSizeHint(sh: QSizeF(10,20)) |
2234 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2235 | << ItemDesc(0,1) |
2236 | .preferredSizeHint(sh: QSizeF(10,10)) |
2237 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2238 | .alignment(alignment: Qt::AlignVCenter) |
2239 | ) |
2240 | << QSizeF() |
2241 | << (RectList() |
2242 | << QRectF(0, 0, 10,20) << QRectF(10, 5, 10,10) |
2243 | ); |
2244 | |
2245 | QTest::newRow(dataTag: "hor_sizepolicy_fixed_aligntop" ) << (ItemList() |
2246 | << ItemDesc(0,0) |
2247 | .preferredSizeHint(sh: QSizeF(10,20)) |
2248 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2249 | << ItemDesc(0,1) |
2250 | .preferredSizeHint(sh: QSizeF(10,10)) |
2251 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2252 | .alignment(alignment: Qt::AlignTop) |
2253 | ) |
2254 | << QSizeF() |
2255 | << (RectList() |
2256 | << QRectF(0, 0, 10,20) << QRectF(10, 0, 10,10) |
2257 | ); |
2258 | |
2259 | QTest::newRow(dataTag: "hor_sizepolicy_fixed_alignbottom" ) << (ItemList() |
2260 | << ItemDesc(0,0) |
2261 | .preferredSizeHint(sh: QSizeF(10,20)) |
2262 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2263 | << ItemDesc(0,1) |
2264 | .preferredSizeHint(sh: QSizeF(10,10)) |
2265 | .sizePolicyV(ver: QSizePolicy::Fixed) |
2266 | .alignment(alignment: Qt::AlignBottom) |
2267 | ) |
2268 | << QSizeF() |
2269 | << (RectList() |
2270 | << QRectF(0, 0, 10,20) << QRectF(10, 10, 10,10) |
2271 | ); |
2272 | |
2273 | QTest::newRow(dataTag: "ver_sizepolicy_fixed" ) << (ItemList() |
2274 | << ItemDesc(0,0) |
2275 | .preferredSizeHint(sh: QSizeF(20,10)) |
2276 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2277 | << ItemDesc(1,0) |
2278 | .preferredSizeHint(sh: QSizeF(10,10)) |
2279 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2280 | ) |
2281 | << QSizeF() |
2282 | << (RectList() |
2283 | << QRectF(0, 0, 20,10) << QRectF(0, 10, 10,10) |
2284 | ); |
2285 | |
2286 | QTest::newRow(dataTag: "ver_sizepolicy_fixed_alignhcenter" ) << (ItemList() |
2287 | << ItemDesc(0,0) |
2288 | .preferredSizeHint(sh: QSizeF(20,10)) |
2289 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2290 | << ItemDesc(1,0) |
2291 | .preferredSizeHint(sh: QSizeF(10,10)) |
2292 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2293 | .alignment(alignment: Qt::AlignHCenter) |
2294 | ) |
2295 | << QSizeF() |
2296 | << (RectList() |
2297 | << QRectF(0, 0, 20,10) << QRectF(5, 10, 10,10) |
2298 | ); |
2299 | |
2300 | QTest::newRow(dataTag: "ver_sizepolicy_fixed_alignleft" ) << (ItemList() |
2301 | << ItemDesc(0,0) |
2302 | .preferredSizeHint(sh: QSizeF(20,10)) |
2303 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2304 | << ItemDesc(1,0) |
2305 | .preferredSizeHint(sh: QSizeF(10,10)) |
2306 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2307 | .alignment(alignment: Qt::AlignLeft) |
2308 | ) |
2309 | << QSizeF() |
2310 | << (RectList() |
2311 | << QRectF(0, 0, 20,10) << QRectF(0, 10, 10,10) |
2312 | ); |
2313 | |
2314 | QTest::newRow(dataTag: "ver_sizepolicy_fixed_alignright" ) << (ItemList() |
2315 | << ItemDesc(0,0) |
2316 | .preferredSizeHint(sh: QSizeF(20,10)) |
2317 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2318 | << ItemDesc(1,0) |
2319 | .preferredSizeHint(sh: QSizeF(10,10)) |
2320 | .sizePolicyH(hor: QSizePolicy::Fixed) |
2321 | .alignment(alignment: Qt::AlignRight) |
2322 | ) |
2323 | << QSizeF() |
2324 | << (RectList() |
2325 | << QRectF(0, 0, 20,10) << QRectF(10, 10, 10,10) |
2326 | ); |
2327 | } |
2328 | |
2329 | void tst_QGraphicsGridLayout::alignment2() |
2330 | { |
2331 | QFETCH(ItemList, itemDescriptions); |
2332 | QFETCH(QSizeF, newSize); |
2333 | QFETCH(RectList, expectedGeometries); |
2334 | |
2335 | QGraphicsScene scene; |
2336 | QGraphicsView view(&scene); |
2337 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
2338 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
2339 | scene.addItem(item: widget); |
2340 | widget->setLayout(layout); |
2341 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2342 | layout->setSpacing(0.0); |
2343 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2344 | |
2345 | int i; |
2346 | for (i = 0; i < itemDescriptions.count(); ++i) { |
2347 | ItemDesc desc = itemDescriptions.at(i); |
2348 | RectWidget *item = new RectWidget(widget); |
2349 | desc.apply(layout, item); |
2350 | } |
2351 | |
2352 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
2353 | |
2354 | widget->show(); |
2355 | view.resize(w: 400,h: 300); |
2356 | view.show(); |
2357 | if (newSize.isValid()) |
2358 | widget->resize(size: newSize); |
2359 | |
2360 | QApplication::sendPostedEvents(receiver: 0, event_type: 0); |
2361 | for (i = 0; i < expectedGeometries.count(); ++i) { |
2362 | QRectF itemRect = layout->itemAt(index: i)->geometry(); |
2363 | QCOMPARE(itemRect, expectedGeometries.at(i)); |
2364 | } |
2365 | |
2366 | delete widget; |
2367 | } |
2368 | |
2369 | static QSizeF hfw1(Qt::SizeHint, const QSizeF &constraint) |
2370 | { |
2371 | QSizeF result(constraint); |
2372 | const qreal ch = constraint.height(); |
2373 | const qreal cw = constraint.width(); |
2374 | if (cw < 0 && ch < 0) { |
2375 | return QSizeF(50, 400); |
2376 | } else if (cw > 0) { |
2377 | result.setHeight(20000./cw); |
2378 | } |
2379 | return result; |
2380 | } |
2381 | |
2382 | static QSizeF wfh1(Qt::SizeHint, const QSizeF &constraint) |
2383 | { |
2384 | QSizeF result(constraint); |
2385 | const qreal ch = constraint.height(); |
2386 | const qreal cw = constraint.width(); |
2387 | if (cw < 0 && ch < 0) { |
2388 | return QSizeF(400, 50); |
2389 | } else if (ch > 0) { |
2390 | result.setWidth(20000./ch); |
2391 | } |
2392 | return result; |
2393 | } |
2394 | |
2395 | static QSizeF wfh2(Qt::SizeHint, const QSizeF &constraint) |
2396 | { |
2397 | QSizeF result(constraint); |
2398 | const qreal ch = constraint.height(); |
2399 | const qreal cw = constraint.width(); |
2400 | if (ch < 0 && cw < 0) |
2401 | return QSizeF(50, 50); |
2402 | if (ch >= 0) |
2403 | result.setWidth(ch); |
2404 | return result; |
2405 | } |
2406 | |
2407 | static QSizeF hfw3(Qt::SizeHint, const QSizeF &constraint) |
2408 | { |
2409 | QSizeF result(constraint); |
2410 | const qreal ch = constraint.height(); |
2411 | const qreal cw = constraint.width(); |
2412 | if (cw < 0 && ch < 0) { |
2413 | return QSizeF(10, 10); |
2414 | } else if (cw > 0) { |
2415 | result.setHeight(100./cw); |
2416 | } |
2417 | return result; |
2418 | } |
2419 | |
2420 | static QSizeF hfw2(Qt::SizeHint /*which*/, const QSizeF &constraint) |
2421 | { |
2422 | return QSizeF(constraint.width(), constraint.width()); |
2423 | } |
2424 | |
2425 | void tst_QGraphicsGridLayout::geometries_data() |
2426 | { |
2427 | |
2428 | QTest::addColumn<ItemList>(name: "itemDescriptions" ); |
2429 | QTest::addColumn<QSizeF>(name: "newSize" ); |
2430 | QTest::addColumn<RectList>(name: "expectedGeometries" ); |
2431 | |
2432 | QTest::newRow(dataTag: "combine_max_sizes" ) << (ItemList() |
2433 | << ItemDesc(0,0) |
2434 | .maxSize(sz: QSizeF(50,10)) |
2435 | << ItemDesc(1,0) |
2436 | .maxSize(sz: QSizeF(10,10)) |
2437 | ) |
2438 | << QSizeF(50, 20) |
2439 | << (RectList() |
2440 | << QRectF(0, 0, 50,10) << QRectF(0, 10, 10,10) |
2441 | ); |
2442 | |
2443 | QTest::newRow(dataTag: "combine_min_sizes" ) << (ItemList() |
2444 | << ItemDesc(0,0) |
2445 | .minSize(sz: QSizeF(50,10)) |
2446 | << ItemDesc(1,0) |
2447 | .minSize(sz: QSizeF(10,10)) |
2448 | ) |
2449 | << QSizeF(60, 20) |
2450 | << (RectList() |
2451 | << QRectF(0, 0, 60,10) << QRectF(0, 10, 60,10) |
2452 | ); |
2453 | |
2454 | // change layout height and verify |
2455 | QTest::newRow(dataTag: "hfw-100x401" ) << (ItemList() |
2456 | << ItemDesc(0,0) |
2457 | .minSize(sz: QSizeF(1,1)) |
2458 | .preferredSize(sz: QSizeF(50,10)) |
2459 | .maxSize(sz: QSizeF(100, 100)) |
2460 | << ItemDesc(0,1) |
2461 | .minSize(sz: QSizeF(1,1)) |
2462 | .preferredSize(sz: QSizeF(50,10)) |
2463 | .maxSize(sz: QSizeF(100, 100)) |
2464 | << ItemDesc(1,0) |
2465 | .minSize(sz: QSizeF(1,1)) |
2466 | .preferredSize(sz: QSizeF(50,10)) |
2467 | .maxSize(sz: QSizeF(100, 100)) |
2468 | << ItemDesc(1,1) |
2469 | .minSize(sz: QSizeF(40,-1)) |
2470 | .preferredSize(sz: QSizeF(50,-1)) |
2471 | .maxSize(sz: QSizeF(500, -1)) |
2472 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2473 | ) |
2474 | << QSizeF(100, 401) |
2475 | << (RectList() |
2476 | << QRectF(0, 0, 50, 1) << QRectF(50, 0, 50, 1) |
2477 | << QRectF(0, 1, 50,100) << QRectF(50, 1, 50,400) |
2478 | ); |
2479 | QTest::newRow(dataTag: "hfw-h408" ) << (ItemList() |
2480 | << ItemDesc(0,0) |
2481 | .minSize(sz: QSizeF(1,1)) |
2482 | .preferredSize(sz: QSizeF(50,10)) |
2483 | .maxSize(sz: QSizeF(100, 100)) |
2484 | << ItemDesc(0,1) |
2485 | .minSize(sz: QSizeF(1,1)) |
2486 | .preferredSize(sz: QSizeF(50,10)) |
2487 | .maxSize(sz: QSizeF(100, 100)) |
2488 | << ItemDesc(1,0) |
2489 | .minSize(sz: QSizeF(1,1)) |
2490 | .preferredSize(sz: QSizeF(50,10)) |
2491 | .maxSize(sz: QSizeF(100, 100)) |
2492 | << ItemDesc(1,1) |
2493 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2494 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2495 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(500, 500)) |
2496 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2497 | ) |
2498 | << QSizeF(100, 408) |
2499 | << (RectList() |
2500 | << QRectF(0, 0, 50, 8) << QRectF(50, 0, 50, 8) |
2501 | << QRectF(0, 8, 50,100) << QRectF(50, 8, 50,400) |
2502 | ); |
2503 | QTest::newRow(dataTag: "hfw-h410" ) << (ItemList() |
2504 | << ItemDesc(0,0) |
2505 | .minSize(sz: QSizeF(1,1)) |
2506 | .preferredSize(sz: QSizeF(50,10)) |
2507 | .maxSize(sz: QSizeF(100, 100)) |
2508 | << ItemDesc(0,1) |
2509 | .minSize(sz: QSizeF(1,1)) |
2510 | .preferredSize(sz: QSizeF(50,10)) |
2511 | .maxSize(sz: QSizeF(100, 100)) |
2512 | << ItemDesc(1,0) |
2513 | .minSize(sz: QSizeF(1,1)) |
2514 | .preferredSize(sz: QSizeF(50,10)) |
2515 | .maxSize(sz: QSizeF(100, 100)) |
2516 | << ItemDesc(1,1) |
2517 | .minSize(sz: QSizeF(40,40)) |
2518 | .preferredSize(sz: QSizeF(50,400)) |
2519 | .maxSize(sz: QSizeF(500, 500)) |
2520 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2521 | ) |
2522 | << QSizeF(100, 410) |
2523 | << (RectList() |
2524 | << QRectF(0, 0, 50,10) << QRectF(50, 0, 50,10) |
2525 | << QRectF(0, 10, 50,100) << QRectF(50, 10, 50,400) |
2526 | ); |
2527 | |
2528 | QTest::newRow(dataTag: "hfw-100x470" ) << (ItemList() |
2529 | << ItemDesc(0,0) |
2530 | .minSize(sz: QSizeF(1,1)) |
2531 | .preferredSize(sz: QSizeF(50,10)) |
2532 | .maxSize(sz: QSizeF(100, 100)) |
2533 | << ItemDesc(0,1) |
2534 | .minSize(sz: QSizeF(1,1)) |
2535 | .preferredSize(sz: QSizeF(50,10)) |
2536 | .maxSize(sz: QSizeF(100, 100)) |
2537 | << ItemDesc(1,0) |
2538 | .minSize(sz: QSizeF(1,1)) |
2539 | .preferredSize(sz: QSizeF(50,10)) |
2540 | .maxSize(sz: QSizeF(100, 100)) |
2541 | << ItemDesc(1,1) |
2542 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2543 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2544 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(500,500)) |
2545 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2546 | ) |
2547 | << QSizeF(100, 470) |
2548 | << (RectList() |
2549 | << QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70) |
2550 | << QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400) |
2551 | ); |
2552 | |
2553 | // change layout width and verify |
2554 | QTest::newRow(dataTag: "hfw-100x401" ) << (ItemList() |
2555 | << ItemDesc(0,0) |
2556 | .minSize(sz: QSizeF(1,1)) |
2557 | .preferredSize(sz: QSizeF(50,10)) |
2558 | .maxSize(sz: QSizeF(100, 100)) |
2559 | << ItemDesc(0,1) |
2560 | .minSize(sz: QSizeF(1,1)) |
2561 | .preferredSize(sz: QSizeF(50,10)) |
2562 | .maxSize(sz: QSizeF(100, 100)) |
2563 | << ItemDesc(1,0) |
2564 | .minSize(sz: QSizeF(1,1)) |
2565 | .preferredSize(sz: QSizeF(50,10)) |
2566 | .maxSize(sz: QSizeF(100, 100)) |
2567 | << ItemDesc(1,1) |
2568 | .minSize(sz: QSizeF(-1,-1)) |
2569 | .preferredSize(sz: QSizeF(-1,-1)) |
2570 | .maxSize(sz: QSizeF(-1, -1)) |
2571 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2572 | ) |
2573 | << QSizeF(100, 401) |
2574 | << (RectList() |
2575 | << QRectF( 0, 0, 50, 1) << QRectF( 50, 0, 50, 1) |
2576 | << QRectF( 0, 1, 50, 100) << QRectF( 50, 1, 50, 400) |
2577 | ); |
2578 | |
2579 | QTest::newRow(dataTag: "hfw-160x350" ) << (ItemList() |
2580 | << ItemDesc(0,0) |
2581 | .minSize(sz: QSizeF(1,1)) |
2582 | .preferredSize(sz: QSizeF(50,10)) |
2583 | .maxSize(sz: QSizeF(100, 100)) |
2584 | << ItemDesc(0,1) |
2585 | .minSize(sz: QSizeF(1,1)) |
2586 | .preferredSize(sz: QSizeF(50,10)) |
2587 | .maxSize(sz: QSizeF(100, 100)) |
2588 | << ItemDesc(1,0) |
2589 | .minSize(sz: QSizeF(1,1)) |
2590 | .preferredSize(sz: QSizeF(50,10)) |
2591 | .maxSize(sz: QSizeF(100, 100)) |
2592 | << ItemDesc(1,1) |
2593 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2594 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2595 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000,5000)) |
2596 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2597 | ) |
2598 | << QSizeF(160, 350) |
2599 | << (RectList() |
2600 | << QRectF( 0, 0, 80, 100) << QRectF( 80, 0, 80, 100) |
2601 | << QRectF( 0, 100, 80, 100) << QRectF( 80, 100, 80, 250) |
2602 | ); |
2603 | |
2604 | QTest::newRow(dataTag: "hfw-160x300" ) << (ItemList() |
2605 | << ItemDesc(0,0) |
2606 | .minSize(sz: QSizeF(1,1)) |
2607 | .preferredSize(sz: QSizeF(50,10)) |
2608 | .maxSize(sz: QSizeF(100, 100)) |
2609 | << ItemDesc(0,1) |
2610 | .minSize(sz: QSizeF(1,1)) |
2611 | .preferredSize(sz: QSizeF(50,10)) |
2612 | .maxSize(sz: QSizeF(100, 100)) |
2613 | << ItemDesc(1,0) |
2614 | .minSize(sz: QSizeF(1,1)) |
2615 | .preferredSize(sz: QSizeF(50,10)) |
2616 | .maxSize(sz: QSizeF(100, 100)) |
2617 | << ItemDesc(1,1) |
2618 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2619 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2620 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000, 5000)) |
2621 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2622 | ) |
2623 | << QSizeF(160, 300) |
2624 | << (RectList() |
2625 | << QRectF( 0, 0, 80, 50) << QRectF( 80, 0, 80, 50) |
2626 | << QRectF( 0, 50, 80, 100) << QRectF( 80, 50, 80, 250) |
2627 | ); |
2628 | |
2629 | QTest::newRow(dataTag: "hfw-20x40" ) << (ItemList() |
2630 | << ItemDesc(0,0) |
2631 | .minSize(sz: QSizeF(1,10)) |
2632 | .preferredSize(sz: QSizeF(50,50)) |
2633 | .maxSize(sz: QSizeF(100, 100)) |
2634 | << ItemDesc(0,1) |
2635 | .minSize(sz: QSizeF(1,1)) |
2636 | .preferredSize(sz: QSizeF(50,50)) |
2637 | .maxSize(sz: QSizeF(100, 100)) |
2638 | << ItemDesc(1,0) |
2639 | .minSize(sz: QSizeF(1,1)) |
2640 | .preferredSize(sz: QSizeF(50,50)) |
2641 | .maxSize(sz: QSizeF(100, 100)) |
2642 | << ItemDesc(1,1) |
2643 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(1, 1)) |
2644 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50, 50)) |
2645 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(100, 100)) |
2646 | .dynamicConstraint(fnConstraint: hfw3, orientation: Qt::Vertical) |
2647 | ) |
2648 | << QSizeF(20, 40) |
2649 | << (RectList() |
2650 | << QRectF(0, 0, 10, 20) << QRectF(10, 0, 10, 20) |
2651 | << QRectF(0, 20, 10, 20) << QRectF(10, 20, 10, 10) |
2652 | ); |
2653 | |
2654 | QTest::newRow(dataTag: "wfh-300x160" ) << (ItemList() |
2655 | << ItemDesc(0,0) |
2656 | .minSize(sz: QSizeF(1,1)) |
2657 | .preferredSize(sz: QSizeF(10,50)) |
2658 | .maxSize(sz: QSizeF(100, 100)) |
2659 | << ItemDesc(0,1) |
2660 | .minSize(sz: QSizeF(1,1)) |
2661 | .preferredSize(sz: QSizeF(10,50)) |
2662 | .maxSize(sz: QSizeF(100, 100)) |
2663 | << ItemDesc(1,0) |
2664 | .minSize(sz: QSizeF(1,1)) |
2665 | .preferredSize(sz: QSizeF(10,50)) |
2666 | .maxSize(sz: QSizeF(100, 100)) |
2667 | << ItemDesc(1,1) |
2668 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(10,10)) |
2669 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(400,50)) |
2670 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000, 5000)) |
2671 | .dynamicConstraint(fnConstraint: wfh1, orientation: Qt::Horizontal) |
2672 | ) |
2673 | << QSizeF(300, 160) |
2674 | << (RectList() |
2675 | << QRectF( 0, 0, 50, 80) << QRectF( 50, 0, 100, 80) |
2676 | << QRectF( 0, 80, 50, 80) << QRectF( 50, 80, 250, 80) |
2677 | ); |
2678 | |
2679 | QTest::newRow(dataTag: "wfh-40x20" ) << (ItemList() |
2680 | << ItemDesc(0,0) |
2681 | .minSize(sz: QSizeF(1,1)) |
2682 | .preferredSize(sz: QSizeF(50,50)) |
2683 | .maxSize(sz: QSizeF(100, 100)) |
2684 | << ItemDesc(0,1) |
2685 | .minSize(sz: QSizeF(1,1)) |
2686 | .preferredSize(sz: QSizeF(50,50)) |
2687 | .maxSize(sz: QSizeF(100, 100)) |
2688 | << ItemDesc(1,0) |
2689 | // Note, must be 10 in order to match stretching of wfh item |
2690 | // below (the same stretch makes it easier to test) |
2691 | .minSize(sz: QSizeF(10,1)) |
2692 | .preferredSize(sz: QSizeF(50,50)) |
2693 | .maxSize(sz: QSizeF(100, 100)) |
2694 | << ItemDesc(1,1) |
2695 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(1,1)) |
2696 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,50)) |
2697 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(100, 100)) |
2698 | .dynamicConstraint(fnConstraint: wfh2, orientation: Qt::Horizontal) |
2699 | ) |
2700 | << QSizeF(40, 20) |
2701 | << (RectList() |
2702 | << QRectF(0, 0, 20, 10) << QRectF(20, 0, 20, 10) |
2703 | << QRectF(0, 10, 20, 10) << QRectF(20, 10, 10, 10) |
2704 | ); |
2705 | |
2706 | QTest::newRow(dataTag: "wfh-400x160" ) << (ItemList() |
2707 | << ItemDesc(0,0) |
2708 | .minSize(sz: QSizeF(1,1)) |
2709 | .preferredSize(sz: QSizeF(50,50)) |
2710 | .maxSize(sz: QSizeF(100, 100)) |
2711 | << ItemDesc(0,1) |
2712 | .minSize(sz: QSizeF(1,1)) |
2713 | .preferredSize(sz: QSizeF(50,50)) |
2714 | .maxSize(sz: QSizeF(100, 100)) |
2715 | << ItemDesc(1,0) |
2716 | .minSize(sz: QSizeF(1,1)) |
2717 | .preferredSize(sz: QSizeF(50,50)) |
2718 | .maxSize(sz: QSizeF(100, 100)) |
2719 | << ItemDesc(1,1) |
2720 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(1,1)) |
2721 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,50)) |
2722 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(100, 100)) |
2723 | .dynamicConstraint(fnConstraint: wfh2, orientation: Qt::Horizontal) |
2724 | ) |
2725 | |
2726 | << QSizeF(400, 160) |
2727 | << (RectList() |
2728 | << QRectF(0, 0, 100, 80) << QRectF(100, 0, 100, 80) |
2729 | << QRectF(0, 80, 100, 80) << QRectF(100, 80, 80, 80) |
2730 | ); |
2731 | |
2732 | QTest::newRow(dataTag: "wfh-160x100" ) << (ItemList() |
2733 | << ItemDesc(0,0) |
2734 | .minSize(sz: QSizeF(1,1)) |
2735 | // Note, preferred width must be 50 in order to match |
2736 | // preferred width of wfh item below. |
2737 | // (The same preferred size makes the stretch the same, and |
2738 | // makes it easier to test) (The stretch algorithm is a |
2739 | // blackbox) |
2740 | .preferredSize(sz: QSizeF(50,50)) |
2741 | .maxSize(sz: QSizeF(100, 100)) |
2742 | << ItemDesc(0,1) |
2743 | .minSize(sz: QSizeF(1,1)) |
2744 | .preferredSize(sz: QSizeF(10,50)) |
2745 | .maxSize(sz: QSizeF(100, 100)) |
2746 | << ItemDesc(1,0) |
2747 | .minSize(sz: QSizeF(1,1)) |
2748 | .preferredSize(sz: QSizeF(10,50)) |
2749 | .maxSize(sz: QSizeF(100, 100)) |
2750 | << ItemDesc(1,1) |
2751 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(1,1)) |
2752 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(10,50)) |
2753 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(500, 500)) |
2754 | .dynamicConstraint(fnConstraint: wfh2, orientation: Qt::Horizontal) |
2755 | ) |
2756 | << QSizeF(160, 100) |
2757 | << (RectList() |
2758 | << QRectF(0, 0, 80, 50) << QRectF( 80, 0, 80, 50) |
2759 | << QRectF(0, 50, 80, 50) << QRectF( 80, 50, 50, 50) |
2760 | ); |
2761 | |
2762 | QTest::newRow(dataTag: "hfw-h470" ) << (ItemList() |
2763 | << ItemDesc(0,0) |
2764 | .minSize(sz: QSizeF(1,1)) |
2765 | .preferredSize(sz: QSizeF(50,10)) |
2766 | .maxSize(sz: QSizeF(100, 100)) |
2767 | << ItemDesc(0,1) |
2768 | .minSize(sz: QSizeF(1,1)) |
2769 | .preferredSize(sz: QSizeF(50,10)) |
2770 | .maxSize(sz: QSizeF(100, 100)) |
2771 | << ItemDesc(1,0) |
2772 | .minSize(sz: QSizeF(1,1)) |
2773 | .preferredSize(sz: QSizeF(50,10)) |
2774 | .maxSize(sz: QSizeF(100, 100)) |
2775 | << ItemDesc(1,1) |
2776 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2777 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2778 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(500,500)) |
2779 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2780 | ) |
2781 | << QSizeF(100, 470) |
2782 | << (RectList() |
2783 | << QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70) |
2784 | << QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400) |
2785 | ); |
2786 | |
2787 | // change layout width and verify |
2788 | QTest::newRow(dataTag: "hfw-w100" ) << (ItemList() |
2789 | << ItemDesc(0,0) |
2790 | .minSize(sz: QSizeF(1,1)) |
2791 | .preferredSize(sz: QSizeF(50,10)) |
2792 | .maxSize(sz: QSizeF(100, 100)) |
2793 | << ItemDesc(0,1) |
2794 | .minSize(sz: QSizeF(1,1)) |
2795 | .preferredSize(sz: QSizeF(50,10)) |
2796 | .maxSize(sz: QSizeF(100, 100)) |
2797 | << ItemDesc(1,0) |
2798 | .minSize(sz: QSizeF(1,1)) |
2799 | .preferredSize(sz: QSizeF(50,10)) |
2800 | .maxSize(sz: QSizeF(100, 100)) |
2801 | << ItemDesc(1,1) |
2802 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2803 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2804 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000,5000)) |
2805 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2806 | ) |
2807 | << QSizeF(100, 401) |
2808 | << (RectList() |
2809 | << QRectF( 0, 0, 50, 1) << QRectF( 50, 0, 50, 1) |
2810 | << QRectF( 0, 1, 50, 100) << QRectF( 50, 1, 50, 400) |
2811 | ); |
2812 | |
2813 | QTest::newRow(dataTag: "hfw-w160" ) << (ItemList() |
2814 | << ItemDesc(0,0) |
2815 | .minSize(sz: QSizeF(1,1)) |
2816 | .preferredSize(sz: QSizeF(50,10)) |
2817 | .maxSize(sz: QSizeF(100, 100)) |
2818 | << ItemDesc(0,1) |
2819 | .minSize(sz: QSizeF(1,1)) |
2820 | .preferredSize(sz: QSizeF(50,10)) |
2821 | .maxSize(sz: QSizeF(100, 100)) |
2822 | << ItemDesc(1,0) |
2823 | .minSize(sz: QSizeF(1,1)) |
2824 | .preferredSize(sz: QSizeF(50,10)) |
2825 | .maxSize(sz: QSizeF(100, 100)) |
2826 | << ItemDesc(1,1) |
2827 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2828 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2829 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000,5000)) |
2830 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2831 | ) |
2832 | << QSizeF(160, 350) |
2833 | << (RectList() |
2834 | << QRectF( 0, 0, 80, 100) << QRectF( 80, 0, 80, 100) |
2835 | << QRectF( 0, 100, 80, 100) << QRectF( 80, 100, 80, 250) |
2836 | ); |
2837 | |
2838 | QTest::newRow(dataTag: "hfw-w500" ) << (ItemList() |
2839 | << ItemDesc(0,0) |
2840 | .minSize(sz: QSizeF(1,1)) |
2841 | .preferredSize(sz: QSizeF(50,10)) |
2842 | .maxSize(sz: QSizeF(100, 100)) |
2843 | << ItemDesc(0,1) |
2844 | .minSize(sz: QSizeF(1,1)) |
2845 | .preferredSize(sz: QSizeF(50,10)) |
2846 | .maxSize(sz: QSizeF(100, 100)) |
2847 | << ItemDesc(1,0) |
2848 | .minSize(sz: QSizeF(1,1)) |
2849 | .preferredSize(sz: QSizeF(50,10)) |
2850 | .maxSize(sz: QSizeF(100, 100)) |
2851 | << ItemDesc(1,1) |
2852 | .sizeHint(which: Qt::MinimumSize, sh: QSizeF(40,40)) |
2853 | .sizeHint(which: Qt::PreferredSize, sh: QSizeF(50,400)) |
2854 | .sizeHint(which: Qt::MaximumSize, sh: QSizeF(5000,5000)) |
2855 | .dynamicConstraint(fnConstraint: hfw1, orientation: Qt::Vertical) |
2856 | ) |
2857 | << QSizeF(500, 200) |
2858 | << (RectList() |
2859 | << QRectF( 0, 0, 100, 100) << QRectF(100, 0, 100, 100) |
2860 | << QRectF( 0, 100, 100, 100) << QRectF(100, 100, 400, 50) |
2861 | ); |
2862 | |
2863 | QTest::newRow(dataTag: "hfw-alignment-defaults" ) << (ItemList() |
2864 | << ItemDesc(0,0) |
2865 | .minSize(sz: QSizeF(100, 100)) |
2866 | .maxSize(sz: QSizeF(100, 100)) |
2867 | .dynamicConstraint(fnConstraint: hfw2, orientation: Qt::Vertical) |
2868 | << ItemDesc(1,0) |
2869 | .minSize(sz: QSizeF(200, 200)) |
2870 | .maxSize(sz: QSizeF(200, 200)) |
2871 | .dynamicConstraint(fnConstraint: hfw2, orientation: Qt::Vertical) |
2872 | << ItemDesc(2,0) |
2873 | .minSize(sz: QSizeF(300, 300)) |
2874 | .maxSize(sz: QSizeF(300, 300)) |
2875 | ) |
2876 | << QSizeF(300, 600) |
2877 | << (RectList() |
2878 | << QRectF(0, 0, 100, 100) |
2879 | << QRectF(0, 100, 200, 200) |
2880 | << QRectF(0, 300, 300, 300) |
2881 | ); |
2882 | |
2883 | QTest::newRow(dataTag: "hfw-alignment2" ) << (ItemList() |
2884 | << ItemDesc(0,0) |
2885 | .minSize(sz: QSizeF(100, 100)) |
2886 | .maxSize(sz: QSizeF(100, 100)) |
2887 | .dynamicConstraint(fnConstraint: hfw2, orientation: Qt::Vertical) |
2888 | .alignment(alignment: Qt::AlignRight) |
2889 | << ItemDesc(1,0) |
2890 | .minSize(sz: QSizeF(200, 200)) |
2891 | .maxSize(sz: QSizeF(200, 200)) |
2892 | .dynamicConstraint(fnConstraint: hfw2, orientation: Qt::Vertical) |
2893 | .alignment(alignment: Qt::AlignHCenter) |
2894 | << ItemDesc(2,0) |
2895 | .minSize(sz: QSizeF(300, 300)) |
2896 | .maxSize(sz: QSizeF(300, 300)) |
2897 | ) |
2898 | << QSizeF(300, 600) |
2899 | << (RectList() |
2900 | << QRectF(200, 0, 100, 100) |
2901 | << QRectF( 50, 100, 200, 200) |
2902 | << QRectF( 0, 300, 300, 300) |
2903 | ); |
2904 | |
2905 | } |
2906 | |
2907 | void tst_QGraphicsGridLayout::geometries() |
2908 | { |
2909 | QFETCH(ItemList, itemDescriptions); |
2910 | QFETCH(QSizeF, newSize); |
2911 | QFETCH(RectList, expectedGeometries); |
2912 | |
2913 | QGraphicsScene scene; |
2914 | QGraphicsView view(&scene); |
2915 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
2916 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
2917 | scene.addItem(item: widget); |
2918 | widget->setLayout(layout); |
2919 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2920 | layout->setSpacing(0.0); |
2921 | widget->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2922 | |
2923 | int i; |
2924 | for (i = 0; i < itemDescriptions.count(); ++i) { |
2925 | ItemDesc desc = itemDescriptions.at(i); |
2926 | RectWidget *item = new RectWidget(widget); |
2927 | desc.apply(layout, item); |
2928 | } |
2929 | |
2930 | QApplication::processEvents(); |
2931 | |
2932 | widget->show(); |
2933 | view.resize(w: 400,h: 300); |
2934 | view.show(); |
2935 | if (newSize.isValid()) |
2936 | widget->resize(size: newSize); |
2937 | |
2938 | QApplication::processEvents(); |
2939 | for (i = 0; i < expectedGeometries.count(); ++i) { |
2940 | QRectF itemRect = layout->itemAt(index: i)->geometry(); |
2941 | QCOMPARE(itemRect, expectedGeometries.at(i)); |
2942 | } |
2943 | |
2944 | delete widget; |
2945 | } |
2946 | |
2947 | void tst_QGraphicsGridLayout::avoidRecursionInInsertItem() |
2948 | { |
2949 | QGraphicsWidget window(0, Qt::Window); |
2950 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(&window); |
2951 | QCOMPARE(layout->count(), 0); |
2952 | QTest::ignoreMessage(type: QtWarningMsg, message: "QGraphicsGridLayout::addItem: cannot insert itself" ); |
2953 | layout->addItem(aitem: layout, arow: 0, acolumn: 0); |
2954 | QCOMPARE(layout->count(), 0); |
2955 | } |
2956 | |
2957 | void tst_QGraphicsGridLayout::styleInfoLeak() |
2958 | { |
2959 | QGraphicsGridLayout grid; |
2960 | grid.horizontalSpacing(); |
2961 | } |
2962 | |
2963 | void tst_QGraphicsGridLayout::task236367_maxSizeHint() |
2964 | { |
2965 | QGraphicsWidget *widget = new QGraphicsWidget; |
2966 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
2967 | widget->setLayout(layout); |
2968 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
2969 | int w = 203; |
2970 | int h = 204; |
2971 | widget->resize(w, h); |
2972 | QCOMPARE(widget->size(), QSizeF(w, h)); |
2973 | } |
2974 | |
2975 | static QSizeF hfw(Qt::SizeHint /*which*/, const QSizeF &constraint) |
2976 | { |
2977 | QSizeF result(constraint); |
2978 | const qreal cw = constraint.width(); |
2979 | const qreal ch = constraint.height(); |
2980 | if (cw < 0 && ch < 0) { |
2981 | return QSizeF(200, 100); |
2982 | } else if (cw >= 0) { |
2983 | result.setHeight(20000./cw); |
2984 | } else if (cw == 0) { |
2985 | result.setHeight(20000); |
2986 | } else if (ch >= 0) { |
2987 | result.setWidth(20000./ch); |
2988 | } else if (ch == 0) { |
2989 | result.setWidth(20000); |
2990 | } |
2991 | return result; |
2992 | } |
2993 | |
2994 | static QSizeF wfh(Qt::SizeHint /*which*/, const QSizeF &constraint) |
2995 | { |
2996 | QSizeF result(constraint); |
2997 | const qreal ch = constraint.height(); |
2998 | if (ch >= 0) { |
2999 | result.setWidth(ch); |
3000 | } |
3001 | return result; |
3002 | } |
3003 | |
3004 | bool qFuzzyCompare(const QSizeF &a, const QSizeF &b) |
3005 | { |
3006 | return qFuzzyCompare(p1: a.width(), p2: b.width()) && qFuzzyCompare(p1: a.height(), p2: b.height()); |
3007 | } |
3008 | |
3009 | void tst_QGraphicsGridLayout::heightForWidth() |
3010 | { |
3011 | QGraphicsWidget *widget = new QGraphicsWidget; |
3012 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
3013 | widget->setLayout(layout); |
3014 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3015 | layout->setSpacing(0); |
3016 | RectWidget *w00 = new RectWidget; |
3017 | w00->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3018 | w00->setSizeHint(which: Qt::PreferredSize, size: QSizeF(10,10)); |
3019 | w00->setSizeHint(which: Qt::MaximumSize, size: QSizeF(100,100)); |
3020 | layout->addItem(aitem: w00, arow: 0, acolumn: 0); |
3021 | |
3022 | RectWidget *w01 = new RectWidget; |
3023 | w01->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3024 | w01->setSizeHint(which: Qt::PreferredSize, size: QSizeF(10,10)); |
3025 | w01->setSizeHint(which: Qt::MaximumSize, size: QSizeF(100,100)); |
3026 | layout->addItem(aitem: w01, arow: 0, acolumn: 1); |
3027 | |
3028 | RectWidget *w10 = new RectWidget; |
3029 | w10->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3030 | w10->setSizeHint(which: Qt::PreferredSize, size: QSizeF(10,10)); |
3031 | w10->setSizeHint(which: Qt::MaximumSize, size: QSizeF(100,100)); |
3032 | layout->addItem(aitem: w10, arow: 1, acolumn: 0); |
3033 | |
3034 | RectWidget *w11 = new RectWidget; |
3035 | w11->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3036 | w11->setSizeHint(which: Qt::MaximumSize, size: QSizeF(30000,30000)); |
3037 | w11->setConstraintFunction(hfw); |
3038 | QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred); |
3039 | sp.setHeightForWidth(true); |
3040 | w11->setSizePolicy(sp); |
3041 | layout->addItem(aitem: w11, arow: 1, acolumn: 1); |
3042 | |
3043 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(2, 2)); |
3044 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(210, 110)); |
3045 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30100, 30100)); |
3046 | |
3047 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 20001)); |
3048 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 20010)); |
3049 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 20100)); |
3050 | |
3051 | // Since 20 is somewhere between "minimum width hint" (2) and |
3052 | // "preferred width hint" (210), it will try to do distribution by |
3053 | // stretching them with different factors. |
3054 | // Since column 1 has a "preferred width" of 200 it means that |
3055 | // column 1 will be a bit wider than column 0. Thus it will also be a bit |
3056 | // shorter than 2001, (the expected height if all columns had width=10) |
3057 | QSizeF sh = layout->effectiveSizeHint(which: Qt::MinimumSize, constraint: QSizeF(20, -1)); |
3058 | // column 1 cannot be wider than 19, which means that it must be taller than 20000/19~=1052 |
3059 | QVERIFY(sh.height() < 2000 + 1 && sh.height() > 1052 + 1); |
3060 | |
3061 | sh = layout->effectiveSizeHint(which: Qt::PreferredSize, constraint: QSizeF(20, -1)); |
3062 | QVERIFY(sh.height() < 2000 + 10 && sh.height() > 1052 + 10); |
3063 | |
3064 | sh = layout->effectiveSizeHint(which: Qt::MaximumSize, constraint: QSizeF(20, -1)); |
3065 | QVERIFY(sh.height() < 2000 + 100 && sh.height() > 1052 + 100); |
3066 | |
3067 | // the height of the hfw widget is shorter than the one to the left, which is 100, so |
3068 | // the total height of the last row is 100 (which leaves the layout height to be 200) |
3069 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(500, -1)), QSizeF(500, 100 + 100)); |
3070 | |
3071 | } |
3072 | |
3073 | void tst_QGraphicsGridLayout::widthForHeight() |
3074 | { |
3075 | QGraphicsWidget *widget = new QGraphicsWidget; |
3076 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
3077 | widget->setLayout(layout); |
3078 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3079 | layout->setSpacing(0); |
3080 | |
3081 | RectWidget *w00 = new RectWidget; |
3082 | w00->setMinimumSize(aw: 1, ah: 1); |
3083 | w00->setPreferredSize(aw: 50, ah: 50); |
3084 | w00->setMaximumSize(aw: 100, ah: 100); |
3085 | |
3086 | layout->addItem(aitem: w00, arow: 0, acolumn: 0); |
3087 | |
3088 | RectWidget *w01 = new RectWidget; |
3089 | w01->setMinimumSize(aw: 1,ah: 1); |
3090 | w01->setPreferredSize(aw: 50,ah: 50); |
3091 | w01->setMaximumSize(aw: 100,ah: 100); |
3092 | layout->addItem(aitem: w01, arow: 0, acolumn: 1); |
3093 | |
3094 | RectWidget *w10 = new RectWidget; |
3095 | w10->setMinimumSize(aw: 1,ah: 1); |
3096 | w10->setPreferredSize(aw: 50,ah: 50); |
3097 | w10->setMaximumSize(aw: 100,ah: 100); |
3098 | layout->addItem(aitem: w10, arow: 1, acolumn: 0); |
3099 | |
3100 | RectWidget *w11 = new RectWidget; |
3101 | w11->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3102 | w11->setSizeHint(which: Qt::PreferredSize, size: QSizeF(50,50)); |
3103 | w11->setSizeHint(which: Qt::MaximumSize, size: QSizeF(30000,30000)); |
3104 | |
3105 | // This will make sure its always square. |
3106 | w11->setConstraintFunction(wfh); |
3107 | QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred); |
3108 | sp.setWidthForHeight(true); |
3109 | w11->setSizePolicy(sp); |
3110 | layout->addItem(aitem: w11, arow: 1, acolumn: 1); |
3111 | |
3112 | /* |
3113 | | 1, 50, 100 | 1, 50, 100 | |
3114 | -----+--------------+--------------+ |
3115 | 1| | | |
3116 | 50| | | |
3117 | 100| | | |
3118 | -----|--------------+--------------+ |
3119 | 1| | | |
3120 | 50| | WFH | |
3121 | 100| | | |
3122 | -----------------------------------+ |
3123 | */ |
3124 | |
3125 | |
3126 | QSizeF prefSize = layout->effectiveSizeHint(which: Qt::PreferredSize, constraint: QSizeF(-1, -1)); |
3127 | QCOMPARE(prefSize, QSizeF(50+50, 50+50)); |
3128 | |
3129 | // wfh(1): = 1 |
3130 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 2)), QSizeF(1 + 1, 2)); |
3131 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 2)), QSizeF(50 + 50, 2)); |
3132 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 2)), QSizeF(100 + 100, 2)); |
3133 | |
3134 | // wfh(40) = 40 |
3135 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 80)), QSizeF(1 + 40, 80)); |
3136 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 80)), QSizeF(50 + 50, 80)); |
3137 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 80)), QSizeF(100 + 100, 80)); |
3138 | |
3139 | // wfh(80) = 80 |
3140 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 160)), QSizeF(1 + 80, 160)); |
3141 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 160)), QSizeF(50 + 80, 160)); |
3142 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 160)), QSizeF(100 + 100, 160)); |
3143 | |
3144 | // wfh(200) = 200 |
3145 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 300)), QSizeF(1 + 200, 300)); |
3146 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 300)), QSizeF(50 + 200, 300)); |
3147 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 300)), QSizeF(100 + 200, 300)); |
3148 | } |
3149 | |
3150 | void tst_QGraphicsGridLayout::heightForWidthWithSpanning() |
3151 | { |
3152 | QGraphicsWidget *widget = new QGraphicsWidget; |
3153 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
3154 | widget->setLayout(layout); |
3155 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3156 | layout->setSpacing(0); |
3157 | |
3158 | RectWidget *w = new RectWidget; |
3159 | w->setSizeHint(which: Qt::MinimumSize, size: QSizeF(1,1)); |
3160 | w->setSizeHint(which: Qt::MaximumSize, size: QSizeF(30000,30000)); |
3161 | w->setConstraintFunction(hfw); |
3162 | QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred); |
3163 | sp.setHeightForWidth(true); |
3164 | w->setSizePolicy(sp); |
3165 | layout->addItem(item: w, row: 0,column: 0,rowSpan: 2,columnSpan: 2); |
3166 | |
3167 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 1)); |
3168 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(200, 100)); |
3169 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30000, 30000)); |
3170 | |
3171 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3172 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3173 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3174 | |
3175 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 10000)); |
3176 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 10000)); |
3177 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 10000)); |
3178 | |
3179 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3180 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3181 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100)); |
3182 | } |
3183 | |
3184 | Q_DECLARE_METATYPE(QSizePolicy::Policy) |
3185 | void tst_QGraphicsGridLayout::spanningItem2x2_data() |
3186 | { |
3187 | QTest::addColumn<QSizePolicy::Policy>(name: "sizePolicy" ); |
3188 | QTest::addColumn<int>(name: "itemHeight" ); |
3189 | QTest::addColumn<int>(name: "expectedHeight" ); |
3190 | |
3191 | QTest::newRow(dataTag: "A larger spanning item with 2 widgets with fixed policy" ) << QSizePolicy::Fixed << 39 << 80; |
3192 | QTest::newRow(dataTag: "A larger spanning item with 2 widgets with preferred policy" ) << QSizePolicy::Preferred << 39 << 80; |
3193 | QTest::newRow(dataTag: "An equally-sized spanning item with 2 widgets with fixed policy" ) << QSizePolicy::Fixed << 40 << 80; |
3194 | QTest::newRow(dataTag: "An equally-sized spanning item with 2 widgets with preferred policy" ) << QSizePolicy::Preferred << 40 << 80; |
3195 | QTest::newRow(dataTag: "A smaller spanning item with 2 widgets with fixed policy" ) << QSizePolicy::Fixed << 41 << 82; |
3196 | QTest::newRow(dataTag: "A smaller spanning item with 2 widgets with preferred policy" ) << QSizePolicy::Preferred << 41 << 82; |
3197 | } |
3198 | |
3199 | void tst_QGraphicsGridLayout::spanningItem2x2() |
3200 | { |
3201 | QFETCH(QSizePolicy::Policy, sizePolicy); |
3202 | QFETCH(int, itemHeight); |
3203 | QFETCH(int, expectedHeight); |
3204 | QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); |
3205 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); |
3206 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3207 | layout->setSpacing(0); |
3208 | |
3209 | QGraphicsWidget *w1 = new QGraphicsWidget; |
3210 | w1->setMinimumSize(aw: 80,ah: 80); |
3211 | w1->setMaximumSize(aw: 80,ah: 80); |
3212 | |
3213 | QGraphicsWidget *w2 = new QGraphicsWidget; |
3214 | w2->setMinimumSize(aw: 80,ah: itemHeight); |
3215 | w2->setPreferredSize(aw: 80,ah: itemHeight); |
3216 | w2->setSizePolicy(hPolicy: QSizePolicy::Fixed, vPolicy: sizePolicy); |
3217 | |
3218 | QGraphicsWidget *w3 = new QGraphicsWidget; |
3219 | w3->setMinimumSize(aw: 80,ah: itemHeight); |
3220 | w3->setPreferredSize(aw: 80,ah: itemHeight); |
3221 | w3->setSizePolicy(hPolicy: QSizePolicy::Fixed, vPolicy: sizePolicy); |
3222 | |
3223 | layout->addItem(item: w1, row: 0, column: 0, rowSpan: 2, columnSpan: 1); |
3224 | layout->addItem(aitem: w2, arow: 0, acolumn: 1); |
3225 | layout->addItem(aitem: w3, arow: 1, acolumn: 1); |
3226 | |
3227 | QCOMPARE(layout->minimumSize(), QSizeF(160,expectedHeight)); |
3228 | if(sizePolicy == QSizePolicy::Fixed) |
3229 | QCOMPARE(layout->maximumSize(), QSizeF(160,expectedHeight)); |
3230 | else |
3231 | QCOMPARE(layout->maximumSize(), QSizeF(160,QWIDGETSIZE_MAX)); |
3232 | } |
3233 | |
3234 | void tst_QGraphicsGridLayout::spanningItem2x3_data() |
3235 | { |
3236 | QTest::addColumn<bool>(name: "w1_fixed" ); |
3237 | QTest::addColumn<bool>(name: "w2_fixed" ); |
3238 | QTest::addColumn<bool>(name: "w3_fixed" ); |
3239 | QTest::addColumn<bool>(name: "w4_fixed" ); |
3240 | QTest::addColumn<bool>(name: "w5_fixed" ); |
3241 | |
3242 | for(int w1 = 0; w1 < 2; w1++) |
3243 | for(int w2 = 0; w2 < 2; w2++) |
3244 | for(int w3 = 0; w3 < 2; w3++) |
3245 | for(int w4 = 0; w4 < 2; w4++) |
3246 | for(int w5 = 0; w5 < 2; w5++) { |
3247 | QString description = QString("Fixed sizes:" ) + (w1?" w1" :"" ) + (w2?" w2" :"" ) + (w3?" w3" :"" ) + (w4?" w4" :"" ) + (w5?" w5" :"" ); |
3248 | QTest::newRow(dataTag: description.toLatin1()) << (bool)w1 << (bool)w2 << (bool)w3 << (bool)w4 << (bool)w5; |
3249 | } |
3250 | } |
3251 | |
3252 | void tst_QGraphicsGridLayout::spanningItem2x3() |
3253 | { |
3254 | QFETCH(bool, w1_fixed); |
3255 | QFETCH(bool, w2_fixed); |
3256 | QFETCH(bool, w3_fixed); |
3257 | QFETCH(bool, w4_fixed); |
3258 | QFETCH(bool, w5_fixed); |
3259 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
3260 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3261 | layout->setSpacing(0); |
3262 | |
3263 | QGraphicsWidget *w1 = new QGraphicsWidget; |
3264 | w1->setMinimumSize(aw: 80,ah: 80); |
3265 | w1->setMaximumSize(aw: 80,ah: 80); |
3266 | if (w1_fixed) |
3267 | w1->setSizePolicy(hPolicy: QSizePolicy::Preferred, vPolicy: QSizePolicy::Fixed); |
3268 | |
3269 | QGraphicsWidget *w2 = new QGraphicsWidget; |
3270 | w2->setMinimumSize(aw: 80,ah: 48); |
3271 | w2->setPreferredSize(aw: 80,ah: 48); |
3272 | if (w2_fixed) |
3273 | w2->setSizePolicy(hPolicy: QSizePolicy::Preferred, vPolicy: QSizePolicy::Fixed); |
3274 | |
3275 | QGraphicsWidget *w3 = new QGraphicsWidget; |
3276 | w3->setMinimumSize(aw: 80,ah: 30); |
3277 | w3->setPreferredSize(aw: 80,ah: 30); |
3278 | if (w3_fixed) |
3279 | w3->setSizePolicy(hPolicy: QSizePolicy::Preferred, vPolicy: QSizePolicy::Fixed); |
3280 | |
3281 | QGraphicsWidget *w4 = new QGraphicsWidget; |
3282 | w4->setMinimumSize(aw: 80,ah: 30); |
3283 | w4->setMaximumSize(aw: 80,ah: 30); |
3284 | if (w4_fixed) |
3285 | w4->setSizePolicy(hPolicy: QSizePolicy::Preferred, vPolicy: QSizePolicy::Fixed); |
3286 | |
3287 | QGraphicsWidget *w5 = new QGraphicsWidget; |
3288 | w5->setMinimumSize(aw: 40,ah: 24); |
3289 | w5->setMaximumSize(aw: 40,ah: 24); |
3290 | if (w5_fixed) |
3291 | w5->setSizePolicy(hPolicy: QSizePolicy::Preferred, vPolicy: QSizePolicy::Fixed); |
3292 | |
3293 | layout->addItem(item: w1, row: 0, column: 0, rowSpan: 2, columnSpan: 1); |
3294 | layout->addItem(aitem: w2, arow: 0, acolumn: 1); |
3295 | layout->addItem(aitem: w3, arow: 1, acolumn: 1); |
3296 | layout->addItem(aitem: w4, arow: 0, acolumn: 2); |
3297 | layout->addItem(aitem: w5, arow: 1, acolumn: 2); |
3298 | |
3299 | QCOMPARE(layout->minimumSize(), QSizeF(240,80)); |
3300 | // Only w2 and w3 grow vertically, so when they have a fixed vertical size policy, |
3301 | // the whole layout cannot grow vertically. |
3302 | if (w2_fixed && w3_fixed) |
3303 | QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,80)); |
3304 | else |
3305 | QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX)); |
3306 | } |
3307 | |
3308 | void tst_QGraphicsGridLayout::spanningItem() |
3309 | { |
3310 | QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); |
3311 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); |
3312 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3313 | layout->setSpacing(0); |
3314 | |
3315 | QGraphicsWidget *w1 = new QGraphicsWidget; |
3316 | w1->setMinimumSize(aw: 80,ah: 80); |
3317 | w1->setMaximumSize(aw: 80,ah: 80); |
3318 | |
3319 | QGraphicsWidget *w2 = new QGraphicsWidget; |
3320 | w2->setMinimumSize(aw: 80,ah: 38); |
3321 | w2->setPreferredSize(aw: 80,ah: 38); |
3322 | w2->setSizePolicy(hPolicy: QSizePolicy::Fixed, vPolicy: QSizePolicy::Fixed); |
3323 | |
3324 | QGraphicsWidget *w3 = new QGraphicsWidget; |
3325 | w3->setMinimumSize(aw: 80,ah: 38); |
3326 | w3->setPreferredSize(aw: 80,ah: 38); |
3327 | w3->setSizePolicy(hPolicy: QSizePolicy::Fixed, vPolicy: QSizePolicy::Fixed); |
3328 | |
3329 | layout->addItem(item: w1, row: 0, column: 0, rowSpan: 2, columnSpan: 1); |
3330 | layout->addItem(aitem: w2, arow: 0, acolumn: 1); |
3331 | layout->addItem(aitem: w3, arow: 1, acolumn: 1); |
3332 | |
3333 | QCOMPARE(layout->minimumSize(), QSizeF(160,80)); |
3334 | QCOMPARE(layout->maximumSize(), QSizeF(160,80)); |
3335 | } |
3336 | |
3337 | void tst_QGraphicsGridLayout::spanAcrossEmptyRow() |
3338 | { |
3339 | QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); |
3340 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); |
3341 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3342 | layout->setSpacing(0); |
3343 | RectWidget *w1 = new RectWidget; |
3344 | RectWidget *w2 = new RectWidget; |
3345 | RectWidget *w3 = new RectWidget; |
3346 | |
3347 | QSizeF size(10, 10); |
3348 | for (int i = 0; i < 3; ++i) { |
3349 | w1->setSizeHint(which: (Qt::SizeHint)i, size); |
3350 | w2->setSizeHint(which: (Qt::SizeHint)i, size); |
3351 | w3->setSizeHint(which: (Qt::SizeHint)i, size); |
3352 | size+=size; //[(10,10), (20,20), (40,40)] |
3353 | } |
3354 | layout->addItem(item: w1, row: 0, column: 0, rowSpan: 1, columnSpan: 1); |
3355 | layout->addItem(item: w2, row: 0, column: 1, rowSpan: 1, columnSpan: 2); |
3356 | layout->addItem(item: w3, row: 0, column: 99, rowSpan: 1, columnSpan: 1); |
3357 | |
3358 | form->resize(w: 60,h: 20); |
3359 | QCOMPARE(w1->geometry(), QRectF( 0, 0, 20, 20)); |
3360 | QCOMPARE(w2->geometry(), QRectF(20, 0, 20, 20)); |
3361 | QCOMPARE(w3->geometry(), QRectF(40, 0, 20, 20)); |
3362 | |
3363 | QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize), QSizeF(30, 10)); |
3364 | QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 20)); |
3365 | QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize), QSizeF(120, 40)); |
3366 | } |
3367 | |
3368 | void tst_QGraphicsGridLayout::stretchAndHeightForWidth() |
3369 | { |
3370 | QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
3371 | QGraphicsGridLayout *layout = new QGraphicsGridLayout; |
3372 | widget->setLayout(layout); |
3373 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3374 | layout->setSpacing(0); |
3375 | |
3376 | RectWidget *w1 = new RectWidget; |
3377 | w1->setSizeHint(which: Qt::MinimumSize, size: QSizeF(10, 10)); |
3378 | w1->setSizeHint(which: Qt::PreferredSize, size: QSizeF(100, 100)); |
3379 | w1->setSizeHint(which: Qt::MaximumSize, size: QSizeF(500, 500)); |
3380 | layout->addItem(item: w1, row: 0,column: 0,rowSpan: 1,columnSpan: 1); |
3381 | |
3382 | RectWidget *w2 = new RectWidget; |
3383 | w2->setSizeHint(which: Qt::MinimumSize, size: QSizeF(10, 10)); |
3384 | w2->setSizeHint(which: Qt::PreferredSize, size: QSizeF(100, 100)); |
3385 | w2->setSizeHint(which: Qt::MaximumSize, size: QSizeF(500, 500)); |
3386 | layout->addItem(item: w2, row: 0,column: 1,rowSpan: 1,columnSpan: 1); |
3387 | layout->setColumnStretchFactor(column: 1, stretch: 2); |
3388 | |
3389 | QApplication::sendPostedEvents(); |
3390 | QGraphicsScene scene; |
3391 | QGraphicsView *view = new QGraphicsView(&scene); |
3392 | |
3393 | scene.addItem(item: widget); |
3394 | |
3395 | view->show(); |
3396 | |
3397 | widget->resize(w: 500, h: 100); |
3398 | // w1 should stay at its preferred size |
3399 | QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100)); |
3400 | QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 100)); |
3401 | |
3402 | |
3403 | // only w1 has hfw |
3404 | w1->setConstraintFunction(hfw); |
3405 | QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred); |
3406 | sp.setHeightForWidth(true); |
3407 | w1->setSizePolicy(sp); |
3408 | QApplication::sendPostedEvents(); |
3409 | |
3410 | QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 200)); |
3411 | QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 200)); |
3412 | |
3413 | // only w2 has hfw |
3414 | w2->setConstraintFunction(hfw); |
3415 | w2->setSizePolicy(sp); |
3416 | |
3417 | w1->setConstraintFunction(0); |
3418 | sp.setHeightForWidth(false); |
3419 | w1->setSizePolicy(sp); |
3420 | QApplication::sendPostedEvents(); |
3421 | |
3422 | QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100)); |
3423 | QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 50)); |
3424 | |
3425 | } |
3426 | |
3427 | void tst_QGraphicsGridLayout::testDefaultAlignment() |
3428 | { |
3429 | QGraphicsWidget *widget = new QGraphicsWidget; |
3430 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget); |
3431 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3432 | layout->setSpacing(0); |
3433 | |
3434 | QGraphicsWidget *w = new QGraphicsWidget; |
3435 | w->setMinimumSize(aw: 50,ah: 50); |
3436 | w->setMaximumSize(aw: 50,ah: 50); |
3437 | layout->addItem(aitem: w,arow: 0,acolumn: 0); |
3438 | |
3439 | //Default alignment should be to the top-left |
3440 | |
3441 | //First, check by forcing the layout to be bigger |
3442 | layout->setMinimumSize(aw: 100,ah: 100); |
3443 | layout->activate(); |
3444 | QCOMPARE(layout->geometry(), QRectF(0,0,100,100)); |
3445 | QCOMPARE(w->geometry(), QRectF(0,0,50,50)); |
3446 | layout->setMinimumSize(aw: -1,ah: -1); |
3447 | |
3448 | //Second, check by forcing the column and row to be bigger instead |
3449 | layout->setColumnMinimumWidth(column: 0, width: 100); |
3450 | layout->setRowMinimumHeight(row: 0, height: 100); |
3451 | layout->activate(); |
3452 | QCOMPARE(layout->geometry(), QRectF(0,0,100,100)); |
3453 | QCOMPARE(w->geometry(), QRectF(0,0,50,50)); |
3454 | layout->setMinimumSize(aw: -1,ah: -1); |
3455 | layout->setColumnMinimumWidth(column: 0, width: 0); |
3456 | layout->setRowMinimumHeight(row: 0, height: 0); |
3457 | |
3458 | |
3459 | //Third, check by adding a larger item in the column |
3460 | QGraphicsWidget *w2 = new QGraphicsWidget; |
3461 | w2->setMinimumSize(aw: 100,ah: 100); |
3462 | w2->setMaximumSize(aw: 100,ah: 100); |
3463 | layout->addItem(aitem: w2,arow: 1,acolumn: 0); |
3464 | layout->activate(); |
3465 | QCOMPARE(layout->geometry(), QRectF(0,0,100,150)); |
3466 | QCOMPARE(w->geometry(), QRectF(0,0,50,50)); |
3467 | QCOMPARE(w2->geometry(), QRectF(0,50,100,100)); |
3468 | } |
3469 | |
3470 | static RectWidget *addWidget(QGraphicsGridLayout *grid, int row, int column) |
3471 | { |
3472 | RectWidget *w = new RectWidget; |
3473 | w->setPreferredSize(aw: 20, ah: 20); |
3474 | grid->addItem(aitem: w, arow: row, acolumn: column); |
3475 | return w; |
3476 | } |
3477 | |
3478 | static void setVisible(bool visible, QGraphicsWidget **widgets) |
3479 | { |
3480 | for (int i = 0; i < 3; ++i) |
3481 | if (widgets[i]) widgets[i]->setVisible(visible); |
3482 | } |
3483 | |
3484 | static void setRetainSizeWhenHidden(bool retainSize, QGraphicsWidget **widgets) |
3485 | { |
3486 | QSizePolicy sp = widgets[0]->sizePolicy(); |
3487 | sp.setRetainSizeWhenHidden(retainSize); |
3488 | for (int i = 0; i < 3; ++i) |
3489 | if (widgets[i]) widgets[i]->setSizePolicy(sp); |
3490 | } |
3491 | |
3492 | void tst_QGraphicsGridLayout::hiddenItems() |
3493 | { |
3494 | QGraphicsWidget *widget = new QGraphicsWidget; |
3495 | QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget); |
3496 | layout->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
3497 | layout->setSpacing(2); |
3498 | |
3499 | // Create a 3x3 layout |
3500 | addWidget(grid: layout, row: 0, column: 0); |
3501 | RectWidget *w01 = addWidget(grid: layout, row: 0, column: 1); |
3502 | addWidget(grid: layout, row: 0, column: 2); |
3503 | RectWidget *w10 = addWidget(grid: layout, row: 1, column: 0); |
3504 | RectWidget *w11 = addWidget(grid: layout, row: 1, column: 1); |
3505 | RectWidget *w12 = addWidget(grid: layout, row: 1, column: 2); |
3506 | addWidget(grid: layout, row: 2, column: 0); |
3507 | RectWidget *w21 = addWidget(grid: layout, row: 2, column: 1); |
3508 | addWidget(grid: layout, row: 2, column: 2); |
3509 | |
3510 | QGraphicsWidget *middleColumn[] = {w01, w11, w21 }; |
3511 | QGraphicsWidget *topTwoOfMiddleColumn[] = {w01, w11, 0 }; |
3512 | |
3513 | // hide and show middle column |
3514 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3515 | setVisible(visible: false, widgets: middleColumn); // hide middle column |
3516 | QCOMPARE(layout->preferredWidth(), qreal(42)); |
3517 | setVisible(visible: true, widgets: middleColumn); // show middle column |
3518 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3519 | setRetainSizeWhenHidden(retainSize: true, widgets: middleColumn); |
3520 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3521 | setVisible(visible: false, widgets: middleColumn); // hide middle column |
3522 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3523 | setRetainSizeWhenHidden(retainSize: false, widgets: middleColumn); |
3524 | QCOMPARE(layout->preferredWidth(), qreal(42)); |
3525 | setVisible(visible: true, widgets: middleColumn); |
3526 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3527 | |
3528 | // Hide only two items, => column should not collapse |
3529 | setVisible(visible: false, widgets: topTwoOfMiddleColumn); |
3530 | QCOMPARE(layout->preferredWidth(), qreal(64)); |
3531 | |
3532 | |
3533 | QGraphicsWidget *middleRow[] = {w10, w11, w12 }; |
3534 | QGraphicsWidget *leftMostTwoOfMiddleRow[] = {w10, w11, 0 }; |
3535 | |
3536 | // hide and show middle row |
3537 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3538 | setVisible(visible: false, widgets: middleRow); |
3539 | QCOMPARE(layout->preferredHeight(), qreal(42)); |
3540 | setVisible(visible: true, widgets: middleRow); |
3541 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3542 | setRetainSizeWhenHidden(retainSize: true, widgets: middleColumn); |
3543 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3544 | setVisible(visible: false, widgets: middleRow); |
3545 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3546 | setRetainSizeWhenHidden(retainSize: false, widgets: middleRow); |
3547 | QCOMPARE(layout->preferredHeight(), qreal(42)); |
3548 | setVisible(visible: true, widgets: middleRow); |
3549 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3550 | |
3551 | // Hide only two items => row should not collapse |
3552 | setVisible(visible: false, widgets: leftMostTwoOfMiddleRow); |
3553 | QCOMPARE(layout->preferredHeight(), qreal(64)); |
3554 | |
3555 | } |
3556 | |
3557 | QTEST_MAIN(tst_QGraphicsGridLayout) |
3558 | #include "tst_qgraphicsgridlayout.moc" |
3559 | |
3560 | |