mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2024-12-02 08:33:00 +08:00
3534 lines
142 KiB
C++
3534 lines
142 KiB
C++
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
|
|
|
|
|
#include <QTest>
|
|
#include <qgraphicsgridlayout.h>
|
|
#include <qgraphicswidget.h>
|
|
#include <qgraphicsscene.h>
|
|
#include <qgraphicsview.h>
|
|
|
|
class tst_QGraphicsGridLayout : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
private slots:
|
|
void qgraphicsgridlayout_data();
|
|
void qgraphicsgridlayout();
|
|
void addItem_data();
|
|
void addItem();
|
|
void alignment_data();
|
|
void alignment();
|
|
void alignment2();
|
|
void alignment2_data();
|
|
void columnAlignment_data();
|
|
void columnAlignment();
|
|
void columnCount_data();
|
|
void columnCount();
|
|
void columnMaximumWidth_data();
|
|
void columnMaximumWidth();
|
|
void columnMinimumWidth_data();
|
|
void columnMinimumWidth();
|
|
void columnPreferredWidth_data();
|
|
void columnPreferredWidth();
|
|
void setColumnFixedWidth();
|
|
void columnSpacing();
|
|
void columnStretchFactor();
|
|
void count();
|
|
void contentsMargins();
|
|
void horizontalSpacing_data();
|
|
void horizontalSpacing();
|
|
void itemAt();
|
|
void removeAt();
|
|
void removeItem();
|
|
void rowAlignment_data();
|
|
void rowAlignment();
|
|
void rowCount_data();
|
|
void rowCount();
|
|
void rowMaximumHeight_data();
|
|
void rowMaximumHeight();
|
|
void rowMinimumHeight_data();
|
|
void rowMinimumHeight();
|
|
void rowPreferredHeight_data();
|
|
void rowPreferredHeight();
|
|
void rowSpacing();
|
|
void rowStretchFactor_data();
|
|
void rowStretchFactor();
|
|
void setColumnSpacing_data();
|
|
void setColumnSpacing();
|
|
void setGeometry_data();
|
|
void setGeometry();
|
|
void setRowFixedHeight();
|
|
void setRowSpacing_data();
|
|
void setRowSpacing();
|
|
void setSpacing_data();
|
|
void setSpacing();
|
|
void sizeHint_data();
|
|
void sizeHint();
|
|
void verticalSpacing_data();
|
|
void verticalSpacing();
|
|
void layoutDirection_data();
|
|
void layoutDirection();
|
|
void removeLayout();
|
|
void defaultStretchFactors_data();
|
|
void defaultStretchFactors();
|
|
void geometries_data();
|
|
void geometries();
|
|
void avoidRecursionInInsertItem();
|
|
void styleInfoLeak();
|
|
void task236367_maxSizeHint();
|
|
void spanningItem2x2_data();
|
|
void spanningItem2x2();
|
|
void spanningItem2x3_data();
|
|
void spanningItem2x3();
|
|
void spanningItem();
|
|
void spanAcrossEmptyRow();
|
|
void heightForWidth();
|
|
void widthForHeight();
|
|
void heightForWidthWithSpanning();
|
|
void stretchAndHeightForWidth();
|
|
void testDefaultAlignment();
|
|
void hiddenItems();
|
|
};
|
|
|
|
class RectWidget : public QGraphicsWidget
|
|
{
|
|
public:
|
|
RectWidget(QGraphicsItem *parent = nullptr) : QGraphicsWidget(parent), m_fnConstraint(0) {}
|
|
|
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
|
|
{
|
|
Q_UNUSED(option);
|
|
Q_UNUSED(widget);
|
|
painter->drawRoundedRect(rect(), 25, 25, Qt::RelativeSize);
|
|
painter->drawLine(rect().topLeft(), rect().bottomRight());
|
|
painter->drawLine(rect().bottomLeft(), rect().topRight());
|
|
}
|
|
|
|
QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override
|
|
{
|
|
if (constraint.width() < 0 && constraint.height() < 0 && m_sizeHints[which].isValid()) {
|
|
return m_sizeHints[which];
|
|
}
|
|
if (m_fnConstraint) {
|
|
return m_fnConstraint(which, constraint);
|
|
}
|
|
return QGraphicsWidget::sizeHint(which, constraint);
|
|
}
|
|
|
|
void setSizeHint(Qt::SizeHint which, const QSizeF &size) {
|
|
m_sizeHints[which] = size;
|
|
updateGeometry();
|
|
}
|
|
|
|
void setConstraintFunction(QSizeF (*fnConstraint)(Qt::SizeHint, const QSizeF &)) {
|
|
m_fnConstraint = fnConstraint;
|
|
}
|
|
|
|
// Initializer {} is a workaround for gcc bug 68949
|
|
QSizeF m_sizeHints[Qt::NSizeHints] {};
|
|
QSizeF (*m_fnConstraint)(Qt::SizeHint, const QSizeF &);
|
|
|
|
};
|
|
|
|
struct ItemDesc
|
|
{
|
|
ItemDesc(int row, int col)
|
|
: m_pos(qMakePair(row, col))
|
|
{
|
|
}
|
|
|
|
ItemDesc &rowSpan(int span) {
|
|
m_rowSpan = span;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &colSpan(int span) {
|
|
m_colSpan = span;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizePolicy(const QSizePolicy &sp) {
|
|
m_sizePolicy = sp;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizePolicy(QSizePolicy::Policy horAndVer) {
|
|
m_sizePolicy = QSizePolicy(horAndVer, horAndVer);
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizePolicyH(QSizePolicy::Policy hor) {
|
|
m_sizePolicy.setHorizontalPolicy(hor);
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizePolicyV(QSizePolicy::Policy ver) {
|
|
m_sizePolicy.setVerticalPolicy(ver);
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizePolicy(QSizePolicy::Policy hor, QSizePolicy::Policy ver) {
|
|
m_sizePolicy = QSizePolicy(hor, ver);
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &sizeHint(Qt::SizeHint which, const QSizeF &sh) {
|
|
m_sizeHints[which] = sh;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &preferredSizeHint(const QSizeF &sh) {
|
|
m_sizeHints[Qt::PreferredSize] = sh;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &minSize(const QSizeF &sz) {
|
|
m_sizes[Qt::MinimumSize] = sz;
|
|
return (*this);
|
|
}
|
|
ItemDesc &preferredSize(const QSizeF &sz) {
|
|
m_sizes[Qt::PreferredSize] = sz;
|
|
return (*this);
|
|
}
|
|
ItemDesc &maxSize(const QSizeF &sz) {
|
|
m_sizes[Qt::MaximumSize] = sz;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &alignment(Qt::Alignment alignment) {
|
|
m_align = alignment;
|
|
return (*this);
|
|
}
|
|
|
|
ItemDesc &dynamicConstraint(QSizeF (*fnConstraint)(Qt::SizeHint, const QSizeF &),
|
|
Qt::Orientation orientation) {
|
|
m_fnConstraint = fnConstraint;
|
|
m_constraintOrientation = orientation;
|
|
return (*this);
|
|
}
|
|
|
|
void apply(QGraphicsGridLayout *layout, QGraphicsWidget *item) {
|
|
QSizePolicy sp = m_sizePolicy;
|
|
if (m_fnConstraint) {
|
|
sp.setHeightForWidth(m_constraintOrientation == Qt::Vertical);
|
|
sp.setWidthForHeight(m_constraintOrientation == Qt::Horizontal);
|
|
}
|
|
|
|
item->setSizePolicy(sp);
|
|
for (int i = 0; i < Qt::NSizeHints; ++i) {
|
|
if (!m_sizes[i].isValid())
|
|
continue;
|
|
switch ((Qt::SizeHint)i) {
|
|
case Qt::MinimumSize:
|
|
item->setMinimumSize(m_sizes[i]);
|
|
break;
|
|
case Qt::PreferredSize:
|
|
item->setPreferredSize(m_sizes[i]);
|
|
break;
|
|
case Qt::MaximumSize:
|
|
item->setMaximumSize(m_sizes[i]);
|
|
break;
|
|
default:
|
|
qWarning("not implemented");
|
|
break;
|
|
}
|
|
}
|
|
|
|
layout->addItem(item, m_pos.first, m_pos.second, m_rowSpan, m_colSpan);
|
|
layout->setAlignment(item, m_align);
|
|
}
|
|
|
|
void apply(QGraphicsGridLayout *layout, RectWidget *item) {
|
|
for (int i = 0; i < Qt::NSizeHints; ++i)
|
|
item->setSizeHint((Qt::SizeHint)i, m_sizeHints[i]);
|
|
item->setConstraintFunction(m_fnConstraint);
|
|
apply(layout, static_cast<QGraphicsWidget*>(item));
|
|
}
|
|
|
|
//private:
|
|
QPair<int,int> m_pos; // row,col
|
|
int m_rowSpan = 1;
|
|
int m_colSpan = 1;
|
|
QSizePolicy m_sizePolicy{QSizePolicy::Preferred, QSizePolicy::Preferred};
|
|
|
|
// Initializer {} is a workaround for gcc bug 68949
|
|
QSizeF m_sizeHints[Qt::NSizeHints] {};
|
|
QSizeF m_sizes[Qt::NSizeHints] {};
|
|
Qt::Alignment m_align;
|
|
|
|
Qt::Orientation m_constraintOrientation = Qt::Horizontal;
|
|
QSizeF (*m_fnConstraint)(Qt::SizeHint, const QSizeF &) = nullptr;
|
|
};
|
|
|
|
typedef QList<ItemDesc> ItemList;
|
|
Q_DECLARE_METATYPE(ItemList);
|
|
|
|
typedef QList<QSizeF> SizeList;
|
|
|
|
void tst_QGraphicsGridLayout::qgraphicsgridlayout_data()
|
|
{
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::qgraphicsgridlayout()
|
|
{
|
|
QGraphicsGridLayout layout;
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::addItem: invalid row span/column span: 0");
|
|
layout.addItem(0, 0, 0, 0, 0);
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::addItem: cannot add null item");
|
|
layout.addItem(0, 0, 0);
|
|
layout.alignment(0);
|
|
layout.columnAlignment(0);
|
|
layout.columnCount();
|
|
layout.columnMaximumWidth(0);
|
|
layout.columnMinimumWidth(0);
|
|
layout.columnPreferredWidth(0);
|
|
layout.columnSpacing(0);
|
|
layout.columnStretchFactor(0);
|
|
layout.count();
|
|
layout.horizontalSpacing();
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::itemAt: invalid row, column 0, 0");
|
|
layout.itemAt(0, 0);
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::itemAt: invalid index 0");
|
|
layout.itemAt(0);
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::removeAt: invalid index 0");
|
|
layout.removeAt(0);
|
|
layout.rowAlignment(0);
|
|
layout.rowCount();
|
|
layout.rowMaximumHeight(0);
|
|
layout.rowMinimumHeight(0);
|
|
layout.rowPreferredHeight(0);
|
|
layout.rowSpacing(0);
|
|
layout.rowStretchFactor(0);
|
|
layout.setAlignment(0, Qt::AlignRight);
|
|
layout.setColumnAlignment(0, Qt::AlignRight);
|
|
layout.setColumnFixedWidth(0, 0);
|
|
layout.setColumnMaximumWidth(0, 0);
|
|
layout.setColumnMinimumWidth(0, 0);
|
|
layout.setColumnPreferredWidth(0, 0);
|
|
layout.setColumnSpacing(0, 0);
|
|
layout.setColumnStretchFactor(0, 0);
|
|
layout.setGeometry(QRectF());
|
|
layout.setHorizontalSpacing(0);
|
|
layout.setRowAlignment(0, { });
|
|
layout.setRowFixedHeight(0, 0);
|
|
layout.setRowMaximumHeight(0, 0);
|
|
layout.setRowMinimumHeight(0, 0);
|
|
layout.setRowPreferredHeight(0, 0);
|
|
layout.setRowSpacing(0, 0);
|
|
layout.setRowStretchFactor(0, 0);
|
|
layout.setSpacing(0);
|
|
layout.setVerticalSpacing(0);
|
|
layout.sizeHint(Qt::MinimumSize);
|
|
layout.verticalSpacing();
|
|
}
|
|
|
|
static void populateLayout(QGraphicsGridLayout *gridLayout, int width, int height, bool hasHeightForWidth = false)
|
|
{
|
|
for (int y = 0; y < height; ++y) {
|
|
for (int x = 0; x < width; ++x) {
|
|
QGraphicsWidget *item = new RectWidget();
|
|
item->setMinimumSize(10, 10);
|
|
item->setPreferredSize(25, 25);
|
|
item->setMaximumSize(50, 50);
|
|
gridLayout->addItem(item, y, x);
|
|
QSizePolicy policy = item->sizePolicy();
|
|
policy.setHeightForWidth(hasHeightForWidth);
|
|
item->setSizePolicy(policy);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/** populates \a gridLayout with a 3x2 layout:
|
|
* +----+----+----+
|
|
* |+---|---+|xxxx|
|
|
* ||span=2 ||hole|
|
|
* |+---|---+|xxxx|
|
|
* +----+----+----+
|
|
* |xxxx|+---|---+|
|
|
* |hole||span=2 ||
|
|
* |xxxx|+---|---+|
|
|
* +----+----+----+
|
|
*/
|
|
static void populateLayoutWithSpansAndHoles(QGraphicsGridLayout *gridLayout, bool hasHeightForWidth = false)
|
|
{
|
|
QGraphicsWidget *item = new RectWidget();
|
|
item->setMinimumSize(10, 10);
|
|
item->setPreferredSize(25, 25);
|
|
item->setMaximumSize(50, 50);
|
|
QSizePolicy sizepolicy = item->sizePolicy();
|
|
sizepolicy.setHeightForWidth(hasHeightForWidth);
|
|
item->setSizePolicy(sizepolicy);
|
|
gridLayout->addItem(item, 0, 0, 1, 2);
|
|
|
|
item = new RectWidget();
|
|
item->setMinimumSize(10, 10);
|
|
item->setPreferredSize(25, 25);
|
|
item->setMaximumSize(50, 50);
|
|
item->setSizePolicy(sizepolicy);
|
|
gridLayout->addItem(item, 1, 1, 1, 2);
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(Qt::Alignment)
|
|
void tst_QGraphicsGridLayout::addItem_data()
|
|
{
|
|
QTest::addColumn<int>("row");
|
|
QTest::addColumn<int>("column");
|
|
QTest::addColumn<int>("rowSpan");
|
|
QTest::addColumn<int>("columnSpan");
|
|
QTest::addColumn<Qt::Alignment>("alignment");
|
|
|
|
for (int a = -1; a < 3; ++a) {
|
|
for (int b = -1; b < 2; ++b) {
|
|
for (int c = -1; c < 2; ++c) {
|
|
for (int d = -1; d < 2; ++d) {
|
|
int row = a;
|
|
int column = b;
|
|
int rowSpan = c;
|
|
int columnSpan = d;
|
|
const QByteArray name = '(' + QByteArray::number(a) + ',' + QByteArray::number(b)
|
|
+ ',' + QByteArray::number(c) + ',' + QByteArray::number(d);
|
|
Qt::Alignment alignment = Qt::AlignLeft;
|
|
QTest::newRow(name.constData()) << row << column << rowSpan << columnSpan << alignment;
|
|
}}}}
|
|
}
|
|
|
|
// public void addItem(QGraphicsLayoutItem* item, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
|
|
void tst_QGraphicsGridLayout::addItem()
|
|
{
|
|
QFETCH(int, row);
|
|
QFETCH(int, column);
|
|
QFETCH(int, rowSpan);
|
|
QFETCH(int, columnSpan);
|
|
QFETCH(Qt::Alignment, alignment);
|
|
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
|
|
QGraphicsWidget *wid = new QGraphicsWidget;
|
|
if (row < 0 || column < 0) {
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::addItem: invalid row/column: -1");
|
|
} else if (rowSpan < 1 || columnSpan < 1) {
|
|
char buf[1024];
|
|
::qsnprintf(buf, sizeof(buf), "QGraphicsGridLayout::addItem: invalid row span/column span: %d",
|
|
rowSpan < 1 ? rowSpan : columnSpan);
|
|
QTest::ignoreMessage(QtWarningMsg, buf);
|
|
}
|
|
layout->addItem(wid, row, column, rowSpan, columnSpan, alignment);
|
|
|
|
delete layout;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::alignment_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public Qt::Alignment alignment(QGraphicsLayoutItem* item) const
|
|
void tst_QGraphicsGridLayout::alignment()
|
|
{
|
|
#ifdef Q_OS_MAC
|
|
QSKIP("Resizing a QGraphicsWidget to effectiveSizeHint(Qt::MaximumSize) is currently not supported on mac");
|
|
#endif
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
// no alignment (the default)
|
|
QCOMPARE(layout->itemAt(0, 0)->geometry().left(), 0.0);
|
|
QCOMPARE(layout->itemAt(0, 0)->geometry().right(), layout->itemAt(0, 1)->geometry().left());
|
|
QCOMPARE(layout->itemAt(0, 1)->geometry().left(), 25.0);
|
|
QCOMPARE(layout->itemAt(0, 1)->geometry().right(), layout->itemAt(0, 2)->geometry().left());
|
|
QCOMPARE(layout->itemAt(0, 2)->geometry().left(), 50.0);
|
|
QCOMPARE(layout->itemAt(0, 2)->geometry().right(), 75.0);
|
|
|
|
QCOMPARE(layout->itemAt(1, 0)->geometry().left(), 0.0);
|
|
QCOMPARE(layout->itemAt(1, 0)->geometry().right(), layout->itemAt(1, 1)->geometry().left());
|
|
QCOMPARE(layout->itemAt(1, 1)->geometry().left(), 25.0);
|
|
QCOMPARE(layout->itemAt(1, 1)->geometry().right(), layout->itemAt(1, 2)->geometry().left());
|
|
QCOMPARE(layout->itemAt(1, 2)->geometry().left(), 50.0);
|
|
QCOMPARE(layout->itemAt(1, 2)->geometry().right(), 75.0);
|
|
|
|
QCOMPARE(layout->itemAt(0, 0)->geometry().top(), 0.0);
|
|
QCOMPARE(layout->itemAt(0, 0)->geometry().bottom(), layout->itemAt(1, 0)->geometry().top());
|
|
QCOMPARE(layout->itemAt(1, 0)->geometry().top(), 25.0);
|
|
QCOMPARE(layout->itemAt(1, 0)->geometry().bottom(), 50.0);
|
|
|
|
// align first column left, second hcenter, third right
|
|
layout->setColumnMinimumWidth(0, 100);
|
|
layout->setAlignment(layout->itemAt(0,0), Qt::AlignLeft);
|
|
layout->setAlignment(layout->itemAt(1,0), Qt::AlignLeft);
|
|
layout->setColumnMinimumWidth(1, 100);
|
|
layout->setAlignment(layout->itemAt(0,1), Qt::AlignHCenter);
|
|
layout->setAlignment(layout->itemAt(1,1), Qt::AlignHCenter);
|
|
layout->setColumnMinimumWidth(2, 100);
|
|
layout->setAlignment(layout->itemAt(0,2), Qt::AlignRight);
|
|
layout->setAlignment(layout->itemAt(1,2), Qt::AlignRight);
|
|
|
|
widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 50, 50));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(125, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(125, 50, 50, 50));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(250, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(250, 50, 50, 50));
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::columnAlignment_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public void setColumnAlignment(int column, Qt::Alignment alignment)
|
|
// public Qt::Alignment columnAlignment(int column) const
|
|
void tst_QGraphicsGridLayout::columnAlignment()
|
|
{
|
|
#ifdef Q_OS_MAC
|
|
QSKIP("Resizing a QGraphicsWidget to effectiveSizeHint(Qt::MaximumSize) is currently not supported on mac");
|
|
#endif
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(1);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
layout->setColumnMinimumWidth(0, 100);
|
|
layout->setColumnMinimumWidth(1, 100);
|
|
layout->setColumnMinimumWidth(2, 100);
|
|
|
|
view.resize(450,150);
|
|
widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
|
|
view.show();
|
|
widget->show();
|
|
QApplication::sendPostedEvents(0, 0);
|
|
// Check default
|
|
QCOMPARE(layout->columnAlignment(0), 0);
|
|
QCOMPARE(layout->columnAlignment(1), 0);
|
|
QCOMPARE(layout->columnAlignment(2), 0);
|
|
|
|
layout->setColumnAlignment(0, Qt::AlignLeft);
|
|
layout->setColumnAlignment(1, Qt::AlignHCenter);
|
|
layout->setColumnAlignment(2, Qt::AlignRight);
|
|
|
|
// see if item alignment takes preference over columnAlignment
|
|
layout->setAlignment(layout->itemAt(1,0), Qt::AlignHCenter);
|
|
layout->setAlignment(layout->itemAt(1,1), Qt::AlignRight);
|
|
layout->setAlignment(layout->itemAt(1,2), Qt::AlignLeft);
|
|
|
|
QApplication::sendPostedEvents(0, 0); // process LayoutRequest
|
|
/*
|
|
+----------+------------+---------+
|
|
| Left | HCenter | Right |
|
|
+----------+------------+---------+
|
|
| HCenter | Right | Left |
|
|
+---------------------------------+
|
|
*/
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(25, 51, 50, 50)); // item is king
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(126, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(151, 51, 50, 50)); // item is king
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(252, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(202, 51, 50, 50)); // item is king
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::columnCount_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public int columnCount() const
|
|
void tst_QGraphicsGridLayout::columnCount()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
view.show();
|
|
widget->show();
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->columnCount(), 0);
|
|
layout->addItem(new RectWidget(widget), 0, 0);
|
|
QCOMPARE(layout->columnCount(), 1);
|
|
layout->addItem(new RectWidget(widget), 1, 1);
|
|
QCOMPARE(layout->columnCount(), 2);
|
|
layout->addItem(new RectWidget(widget), 0, 2);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->addItem(new RectWidget(widget), 1, 0);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->addItem(new RectWidget(widget), 0, 1);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->addItem(new RectWidget(widget), 1, 2);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
|
|
// ### Talk with Jasmin. Not sure if removeAt() should adjust columnCount().
|
|
widget->setLayout(0);
|
|
layout = new QGraphicsGridLayout();
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->removeAt(5);
|
|
layout->removeAt(3);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->removeAt(1);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->columnCount(), 2);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::columnMaximumWidth_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public qreal columnMaximumWidth(int column) const
|
|
void tst_QGraphicsGridLayout::columnMaximumWidth()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
|
|
QCOMPARE(layout->preferredSize(), QSizeF(25+25+25, 25+25));
|
|
QCOMPARE(layout->maximumSize(), QSizeF(50+50+50, 50+50));
|
|
|
|
// should at least be a very large number
|
|
QVERIFY(layout->columnMaximumWidth(0) >= 10000);
|
|
QCOMPARE(layout->columnMaximumWidth(0), layout->columnMaximumWidth(1));
|
|
QCOMPARE(layout->columnMaximumWidth(1), layout->columnMaximumWidth(2));
|
|
layout->setColumnMaximumWidth(0, 20);
|
|
layout->setColumnMaximumWidth(2, 60);
|
|
|
|
QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
|
|
QCOMPARE(layout->preferredSize(), QSizeF(20+25+25, 25+25));
|
|
QCOMPARE(layout->maximumSize(), QSizeF(20+50+60, 50+50));
|
|
QCOMPARE(layout->maximumSize(), widget->maximumSize());
|
|
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
layout->activate();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 25));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 25, 20, 25));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 25, 25));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 25, 25, 25));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(45, 0, 25, 25));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(45, 25, 25, 25));
|
|
|
|
layout->setColumnAlignment(2, Qt::AlignCenter);
|
|
widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
|
|
layout->activate();
|
|
QCOMPARE(layout->geometry(), QRectF(0,0,20+50+60, 50+50));
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(75, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(75, 50, 50, 50));
|
|
|
|
for (int i = 0; i < layout->count(); i++)
|
|
layout->setAlignment(layout->itemAt(i), Qt::AlignRight | Qt::AlignBottom);
|
|
layout->activate();
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(80, 0, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(80, 50, 50, 50));
|
|
for (int i = 0; i < layout->count(); i++)
|
|
layout->setAlignment(layout->itemAt(i), Qt::AlignCenter);
|
|
|
|
layout->setMaximumSize(layout->maximumSize() + QSizeF(60,60));
|
|
widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
|
|
layout->activate();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 15, 20, 50));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 95, 20, 50));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20+30, 15, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20+30, 95, 50, 50));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(20+60+50+5, 15, 50, 50));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(20+60+50+5, 95, 50, 50));
|
|
|
|
layout->setMaximumSize(layout->preferredSize() + QSizeF(20,20));
|
|
widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
|
|
layout->activate();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 35));
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 35, 20, 35));
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 35, 35));
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 35, 35, 35));
|
|
QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(55, 0, 35, 35));
|
|
QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(55, 35, 35, 35));
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::columnMinimumWidth_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public qreal columnMinimumWidth(int column) const
|
|
void tst_QGraphicsGridLayout::columnMinimumWidth()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
// should at least be a very large number
|
|
QCOMPARE(layout->columnMinimumWidth(0), 0.0);
|
|
QCOMPARE(layout->columnMinimumWidth(0), layout->columnMinimumWidth(1));
|
|
QCOMPARE(layout->columnMinimumWidth(1), layout->columnMinimumWidth(2));
|
|
layout->setColumnMinimumWidth(0, 20);
|
|
layout->setColumnMinimumWidth(2, 40);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0);
|
|
QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::columnPreferredWidth_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public qreal columnPreferredWidth(int column) const
|
|
void tst_QGraphicsGridLayout::columnPreferredWidth()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
// default preferred width ??
|
|
QCOMPARE(layout->columnPreferredWidth(0), 0.0);
|
|
QCOMPARE(layout->columnPreferredWidth(0), layout->columnPreferredWidth(1));
|
|
QCOMPARE(layout->columnPreferredWidth(1), layout->columnPreferredWidth(2));
|
|
layout->setColumnPreferredWidth(0, 20);
|
|
layout->setColumnPreferredWidth(2, 40);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0);
|
|
QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
// public void setColumnFixedWidth(int row, qreal height)
|
|
void tst_QGraphicsGridLayout::setColumnFixedWidth()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
layout->setColumnFixedWidth(0, 20);
|
|
layout->setColumnFixedWidth(2, 40);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().width(), 20.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().width(), 20.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().width(), 40.0);
|
|
QCOMPARE(layout->itemAt(1,2)->geometry().width(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
// public qreal columnSpacing(int column) const
|
|
void tst_QGraphicsGridLayout::columnSpacing()
|
|
{
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
QCOMPARE(layout->columnSpacing(0), 0.0);
|
|
|
|
layout->setColumnSpacing(0, 20);
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0);
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
{
|
|
// don't include items and spacings that was previously part of the layout
|
|
// (horizontal)
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
populateLayout(layout, 3, 1);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
layout->setColumnSpacing(0, 10);
|
|
layout->setColumnSpacing(1, 10);
|
|
layout->setColumnSpacing(2, 10);
|
|
layout->setColumnSpacing(3, 10);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(95, 25));
|
|
layout->removeAt(2);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(60, 25));
|
|
layout->removeAt(1);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(25, 25));
|
|
delete layout;
|
|
}
|
|
{
|
|
// don't include items and spacings that was previously part of the layout
|
|
// (vertical)
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
populateLayout(layout, 2, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
layout->setColumnSpacing(0, 10);
|
|
layout->setColumnSpacing(1, 10);
|
|
layout->setRowSpacing(0, 10);
|
|
layout->setRowSpacing(1, 10);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(60, 60));
|
|
layout->removeAt(3);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(60, 60));
|
|
layout->removeAt(2);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(60, 25));
|
|
layout->removeAt(1);
|
|
QCOMPARE(layout->preferredSize(), QSizeF(25, 25));
|
|
delete layout;
|
|
}
|
|
|
|
}
|
|
|
|
// public int columnStretchFactor(int column) const
|
|
void tst_QGraphicsGridLayout::columnStretchFactor()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
layout->setColumnStretchFactor(0, 1);
|
|
layout->setColumnStretchFactor(1, 2);
|
|
layout->setColumnStretchFactor(2, 3);
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(130, 50);
|
|
QApplication::processEvents();
|
|
|
|
QVERIFY(layout->itemAt(0,0)->geometry().width() < layout->itemAt(0,1)->geometry().width());
|
|
QVERIFY(layout->itemAt(0,1)->geometry().width() < layout->itemAt(0,2)->geometry().width());
|
|
QVERIFY(layout->itemAt(1,0)->geometry().width() < layout->itemAt(1,1)->geometry().width());
|
|
QVERIFY(layout->itemAt(1,1)->geometry().width() < layout->itemAt(1,2)->geometry().width());
|
|
|
|
delete widget;
|
|
}
|
|
|
|
|
|
// public int count() const
|
|
void tst_QGraphicsGridLayout::count()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
QCOMPARE(layout->count(), 6);
|
|
layout->removeAt(5);
|
|
layout->removeAt(3);
|
|
QCOMPARE(layout->count(), 4);
|
|
layout->removeAt(1);
|
|
QCOMPARE(layout->count(), 3);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 2);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 1);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::horizontalSpacing_data()
|
|
{
|
|
QTest::addColumn<qreal>("horizontalSpacing");
|
|
QTest::newRow("zero") << qreal(0.0);
|
|
QTest::newRow("10") << qreal(10.0);
|
|
}
|
|
|
|
// public qreal horizontalSpacing() const
|
|
void tst_QGraphicsGridLayout::horizontalSpacing()
|
|
{
|
|
QFETCH(qreal, horizontalSpacing);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
qreal w = layout->sizeHint(Qt::PreferredSize, QSizeF()).width();
|
|
qreal oldSpacing = layout->horizontalSpacing();
|
|
|
|
// The remainder of this test is only applicable if the current style uses uniform layout spacing
|
|
if (oldSpacing != -1) {
|
|
layout->setHorizontalSpacing(horizontalSpacing);
|
|
QApplication::processEvents();
|
|
qreal new_w = layout->sizeHint(Qt::PreferredSize, QSizeF()).width();
|
|
QCOMPARE(new_w, w - (3-1)*(oldSpacing - horizontalSpacing));
|
|
}
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::contentsMargins()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
QGraphicsGridLayout *sublayout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->addItem(sublayout,0, 1);
|
|
|
|
qreal left, top, right, bottom;
|
|
// sublayouts have 0 margin
|
|
sublayout->getContentsMargins(&left, &top, &right, &bottom);
|
|
QCOMPARE(left, 0.0);
|
|
QCOMPARE(top, 0.0);
|
|
QCOMPARE(right, 0.0);
|
|
QCOMPARE(bottom, 0.0);
|
|
|
|
// top level layouts have style dependent margins.
|
|
// we'll just check if its different from 0. (applies to all our styles)
|
|
layout->getContentsMargins(&left, &top, &right, &bottom);
|
|
QVERIFY(left >= 0.0);
|
|
QVERIFY(top >= 0.0);
|
|
QVERIFY(right >= 0.0);
|
|
QVERIFY(bottom >= 0.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
// public QGraphicsLayoutItem* itemAt(int index) const
|
|
void tst_QGraphicsGridLayout::itemAt()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayoutWithSpansAndHoles(layout);
|
|
|
|
//itemAt(int row, int column)
|
|
QVERIFY( layout->itemAt(0,0));
|
|
QVERIFY( layout->itemAt(0,1));
|
|
QCOMPARE(layout->itemAt(0,2), static_cast<QGraphicsLayoutItem*>(0));
|
|
QCOMPARE(layout->itemAt(1,0), static_cast<QGraphicsLayoutItem*>(0));
|
|
QVERIFY( layout->itemAt(1,1));
|
|
QVERIFY( layout->itemAt(1,2));
|
|
|
|
|
|
//itemAt(int index)
|
|
for (int i = -2; i < layout->count() + 2; ++i) {
|
|
if (i >= 0 && i < layout->count()) {
|
|
QVERIFY(layout->itemAt(i));
|
|
} else {
|
|
const QByteArray message = "QGraphicsGridLayout::itemAt: invalid index " + QByteArray::number(i);
|
|
QTest::ignoreMessage(QtWarningMsg, message.constData());
|
|
QCOMPARE(layout->itemAt(i), nullptr);
|
|
}
|
|
}
|
|
delete widget;
|
|
}
|
|
|
|
// public void removeAt(int index)
|
|
void tst_QGraphicsGridLayout::removeAt()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
QCOMPARE(layout->count(), 6);
|
|
layout->removeAt(5);
|
|
layout->removeAt(3);
|
|
QCOMPARE(layout->count(), 4);
|
|
layout->removeAt(1);
|
|
QCOMPARE(layout->count(), 3);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 2);
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 1);
|
|
QGraphicsLayoutItem *item0 = layout->itemAt(0);
|
|
QCOMPARE(item0->parentLayoutItem(), static_cast<QGraphicsLayoutItem *>(layout));
|
|
layout->removeAt(0);
|
|
QCOMPARE(item0->parentLayoutItem(), nullptr);
|
|
QCOMPARE(layout->count(), 0);
|
|
QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index 0").toLatin1().constData());
|
|
layout->removeAt(0);
|
|
QCOMPARE(layout->count(), 0);
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::removeItem()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
scene.addItem(widget);
|
|
QGraphicsGridLayout *l = new QGraphicsGridLayout();
|
|
widget->setLayout(l);
|
|
|
|
populateLayout(l, 3, 2);
|
|
QCOMPARE(l->count(), 6);
|
|
l->removeItem(l->itemAt(5));
|
|
l->removeItem(l->itemAt(4));
|
|
QCOMPARE(l->count(), 4);
|
|
|
|
// Avoid crashing. Note that the warning message might change in the future.
|
|
QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
|
|
l->removeItem(0);
|
|
QCOMPARE(l->count(), 4);
|
|
|
|
QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index -1").toLatin1().constData());
|
|
l->removeItem(new QGraphicsWidget);
|
|
QCOMPARE(l->count(), 4);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowAlignment_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public Qt::Alignment rowAlignment(int row) const
|
|
void tst_QGraphicsGridLayout::rowAlignment()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(1);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
view.resize(330,450);
|
|
widget->resize(300, 400);
|
|
view.show();
|
|
widget->show();
|
|
QApplication::sendPostedEvents(0, 0);
|
|
// Check default
|
|
QCOMPARE(layout->rowAlignment(0), 0);
|
|
QCOMPARE(layout->rowAlignment(1), 0);
|
|
QCOMPARE(layout->rowAlignment(2), 0);
|
|
|
|
// make the grids larger than the items, so that alignment kicks in
|
|
layout->setRowMinimumHeight(0, 100.0);
|
|
layout->setRowMinimumHeight(1, 100.0);
|
|
layout->setRowMinimumHeight(2, 100.0);
|
|
// expand columns also, so we can test combination of horiz and vertical alignment
|
|
layout->setColumnMinimumWidth(0, 100.0);
|
|
layout->setColumnMinimumWidth(1, 100.0);
|
|
|
|
layout->setRowAlignment(0, Qt::AlignBottom);
|
|
layout->setRowAlignment(1, Qt::AlignVCenter);
|
|
layout->setRowAlignment(2, Qt::AlignTop);
|
|
|
|
// see if item alignment takes preference over rowAlignment
|
|
layout->setAlignment(layout->itemAt(0,0), Qt::AlignRight);
|
|
layout->setAlignment(layout->itemAt(1,0), Qt::AlignTop);
|
|
layout->setAlignment(layout->itemAt(2,0), Qt::AlignHCenter);
|
|
|
|
QApplication::sendPostedEvents(0, 0); // process LayoutRequest
|
|
|
|
QCOMPARE(layout->alignment(layout->itemAt(0,0)), Qt::AlignRight); //Qt::AlignRight | Qt::AlignBottom
|
|
QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(50, 50, 50, 50));
|
|
QCOMPARE(layout->rowAlignment(0), Qt::AlignBottom);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(101, 50, 50, 50));
|
|
QCOMPARE(layout->alignment(layout->itemAt(1,0)), Qt::AlignTop);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 101, 50, 50));
|
|
QCOMPARE(layout->rowAlignment(1), Qt::AlignVCenter);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(101, 126, 50, 50));
|
|
QCOMPARE(layout->alignment(layout->itemAt(2,0)), Qt::AlignHCenter);
|
|
QCOMPARE(layout->itemAt(2,0)->geometry(), QRectF(25, 202, 50, 50));
|
|
QCOMPARE(layout->rowAlignment(2), Qt::AlignTop);
|
|
QCOMPARE(layout->itemAt(2,1)->geometry(), QRectF(101,202, 50, 50));
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowCount_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public int rowCount() const
|
|
// public int columnCount() const
|
|
void tst_QGraphicsGridLayout::rowCount()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
QCOMPARE(layout->rowCount(), 3);
|
|
QCOMPARE(layout->columnCount(), 2);
|
|
|
|
// with spans and holes...
|
|
widget->setLayout(0);
|
|
layout = new QGraphicsGridLayout();
|
|
populateLayoutWithSpansAndHoles(layout, hasHeightForWidth);
|
|
QCOMPARE(layout->rowCount(), 2);
|
|
QCOMPARE(layout->columnCount(), 3);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowMaximumHeight_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public qreal rowMaximumHeight(int row) const
|
|
void tst_QGraphicsGridLayout::rowMaximumHeight()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
// should at least be a very large number
|
|
QVERIFY(layout->rowMaximumHeight(0) >= 10000);
|
|
QCOMPARE(layout->rowMaximumHeight(0), layout->rowMaximumHeight(1));
|
|
QCOMPARE(layout->rowMaximumHeight(1), layout->rowMaximumHeight(2));
|
|
layout->setRowMaximumHeight(0, 20);
|
|
layout->setRowMaximumHeight(2, 60);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().height(), 20.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().height(), 20.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(2,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(2,1)->geometry().height(), 25.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowMinimumHeight_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public qreal rowMinimumHeight(int row) const
|
|
void tst_QGraphicsGridLayout::rowMinimumHeight()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
// should at least be a very large number
|
|
QCOMPARE(layout->rowMinimumHeight(0), 0.0);
|
|
QCOMPARE(layout->rowMinimumHeight(0), layout->rowMinimumHeight(1));
|
|
QCOMPARE(layout->rowMinimumHeight(1), layout->rowMinimumHeight(2));
|
|
layout->setRowMinimumHeight(0, 20);
|
|
layout->setRowMinimumHeight(2, 40);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0);
|
|
QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowPreferredHeight_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
// public qreal rowPreferredHeight(int row) const
|
|
void tst_QGraphicsGridLayout::rowPreferredHeight()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
// default preferred height ??
|
|
QCOMPARE(layout->rowPreferredHeight(0), 0.0);
|
|
QCOMPARE(layout->rowPreferredHeight(0), layout->rowPreferredHeight(1));
|
|
QCOMPARE(layout->rowPreferredHeight(1), layout->rowPreferredHeight(2));
|
|
layout->setRowPreferredHeight(0, 20);
|
|
layout->setRowPreferredHeight(2, 40);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
// ### Jasmin: Should rowPreferredHeight have precedence over sizeHint(Qt::PreferredSize) ?
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0);
|
|
QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
// public void setRowFixedHeight(int row, qreal height)
|
|
void tst_QGraphicsGridLayout::setRowFixedHeight()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
layout->setRowFixedHeight(0, 20.);
|
|
layout->setRowFixedHeight(2, 40.);
|
|
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().height(), 20.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().height(), 20.0);
|
|
QCOMPARE(layout->itemAt(1,0)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(1,1)->geometry().height(), 25.0);
|
|
QCOMPARE(layout->itemAt(2,0)->geometry().height(), 40.0);
|
|
QCOMPARE(layout->itemAt(2,1)->geometry().height(), 40.0);
|
|
|
|
delete widget;
|
|
}
|
|
|
|
// public qreal rowSpacing(int row) const
|
|
void tst_QGraphicsGridLayout::rowSpacing()
|
|
{
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
QCOMPARE(layout->columnSpacing(0), 0.0);
|
|
|
|
layout->setColumnSpacing(0, 20);
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
|
|
QApplication::processEvents();
|
|
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().left(), 0.0);
|
|
QCOMPARE(layout->itemAt(0,0)->geometry().right(), 25.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().left(), 45.0);
|
|
QCOMPARE(layout->itemAt(0,1)->geometry().right(), 70.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().left(), 70.0);
|
|
QCOMPARE(layout->itemAt(0,2)->geometry().right(), 95.0);
|
|
|
|
delete widget;
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::rowStretchFactor_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
// public int rowStretchFactor(int row) const
|
|
void tst_QGraphicsGridLayout::rowStretchFactor()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 2, 3, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
layout->setRowStretchFactor(0, 1);
|
|
layout->setRowStretchFactor(1, 2);
|
|
layout->setRowStretchFactor(2, 3);
|
|
view.show();
|
|
widget->show();
|
|
widget->resize(50, 130);
|
|
QApplication::processEvents();
|
|
|
|
QVERIFY(layout->itemAt(0,0)->geometry().height() < layout->itemAt(1,0)->geometry().height());
|
|
QVERIFY(layout->itemAt(1,0)->geometry().height() < layout->itemAt(2,0)->geometry().height());
|
|
QVERIFY(layout->itemAt(0,1)->geometry().height() < layout->itemAt(1,1)->geometry().height());
|
|
QVERIFY(layout->itemAt(1,1)->geometry().height() < layout->itemAt(2,1)->geometry().height());
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::setColumnSpacing_data()
|
|
{
|
|
QTest::addColumn<int>("column");
|
|
QTest::addColumn<qreal>("spacing");
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("null") << 0 << qreal(0.0) << false;
|
|
QTest::newRow("10") << 0 << qreal(10.0) << false;
|
|
QTest::newRow("null, hasHeightForWidth") << 0 << qreal(0.0) << true;
|
|
QTest::newRow("10, hasHeightForWidth") << 0 << qreal(10.0) << true;
|
|
}
|
|
|
|
// public void setColumnSpacing(int column, qreal spacing)
|
|
void tst_QGraphicsGridLayout::setColumnSpacing()
|
|
{
|
|
QFETCH(int, column);
|
|
QFETCH(qreal, spacing);
|
|
QFETCH(bool, hasHeightForWidth);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setSpacing(0);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
qreal oldSpacing = layout->columnSpacing(column);
|
|
QCOMPARE(oldSpacing, 0.0);
|
|
qreal w = layout->sizeHint(Qt::PreferredSize, QSizeF()).width();
|
|
layout->setColumnSpacing(column, spacing);
|
|
QApplication::processEvents();
|
|
QCOMPARE(layout->sizeHint(Qt::PreferredSize, QSizeF()).width(), w + spacing);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::setGeometry_data()
|
|
{
|
|
QTest::addColumn<QRectF>("rect");
|
|
QTest::newRow("null") << QRectF();
|
|
QTest::newRow("normal") << QRectF(0,0, 50, 50);
|
|
}
|
|
|
|
// public void setGeometry(QRectF const& rect)
|
|
void tst_QGraphicsGridLayout::setGeometry()
|
|
{
|
|
QFETCH(QRectF, rect);
|
|
|
|
QGraphicsWidget *window = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
window->setLayout(layout);
|
|
QGraphicsGridLayout *layout2 = new QGraphicsGridLayout();
|
|
layout2->setMaximumSize(100, 100);
|
|
layout->addItem(layout2, 0, 0);
|
|
layout2->setGeometry(rect);
|
|
QCOMPARE(layout2->geometry(), rect);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::setRowSpacing_data()
|
|
{
|
|
QTest::addColumn<int>("row");
|
|
QTest::addColumn<qreal>("spacing");
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("null") << 0 << qreal(0.0) << false;
|
|
QTest::newRow("10") << 0 << qreal(10.0) << false;
|
|
QTest::newRow("null, hasHeightForWidth") << 0 << qreal(0.0) << true;
|
|
QTest::newRow("10, hasHeightForWidth") << 0 << qreal(10.0) << true;
|
|
}
|
|
|
|
// public void setRowSpacing(int row, qreal spacing)
|
|
void tst_QGraphicsGridLayout::setRowSpacing()
|
|
{
|
|
QFETCH(int, row);
|
|
QFETCH(qreal, spacing);
|
|
QFETCH(bool, hasHeightForWidth);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setSpacing(0);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
qreal oldSpacing = layout->rowSpacing(row);
|
|
QCOMPARE(oldSpacing, 0.0);
|
|
qreal h = layout->sizeHint(Qt::PreferredSize, QSizeF()).height();
|
|
layout->setRowSpacing(row, spacing);
|
|
QApplication::processEvents();
|
|
QCOMPARE(layout->sizeHint(Qt::PreferredSize, QSizeF()).height(), h + spacing);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::setSpacing_data()
|
|
{
|
|
QTest::addColumn<qreal>("spacing");
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
QTest::newRow("zero") << qreal(0.0) << false;
|
|
QTest::newRow("17") << qreal(17.0) << false;
|
|
QTest::newRow("zero, hasHeightForWidth") << qreal(0.0) << true;
|
|
QTest::newRow("17, hasHeightForWidth") << qreal(17.0) << true;
|
|
}
|
|
|
|
// public void setSpacing(qreal spacing)
|
|
void tst_QGraphicsGridLayout::setSpacing()
|
|
{
|
|
QFETCH(qreal, spacing);
|
|
QFETCH(bool, hasHeightForWidth);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2, hasHeightForWidth);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
QSizeF sh = layout->sizeHint(Qt::PreferredSize, QSizeF());
|
|
qreal oldVSpacing = layout->verticalSpacing();
|
|
qreal oldHSpacing = layout->horizontalSpacing();
|
|
|
|
// The remainder of this test is only applicable if the current style uses uniform layout spacing
|
|
if (oldVSpacing != -1) {
|
|
layout->setSpacing(spacing);
|
|
QApplication::processEvents();
|
|
QSizeF newSH = layout->sizeHint(Qt::PreferredSize, QSizeF());
|
|
QCOMPARE(newSH.height(), sh.height() - (2-1)*(oldVSpacing - spacing));
|
|
QCOMPARE(newSH.width(), sh.width() - (3-1)*(oldHSpacing - spacing));
|
|
}
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::sizeHint_data()
|
|
{
|
|
QTest::addColumn<ItemList>("itemDescriptions");
|
|
QTest::addColumn<QSizeF>("expectedMinimumSizeHint");
|
|
QTest::addColumn<QSizeF>("expectedPreferredSizeHint");
|
|
QTest::addColumn<QSizeF>("expectedMaximumSizeHint");
|
|
|
|
QTest::newRow("rowSpan_larger_than_rows") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(50,300))
|
|
.maxSize(QSizeF(50,300))
|
|
.rowSpan(2)
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(50,0))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSize(50, 1000))
|
|
<< ItemDesc(1,1)
|
|
.minSize(QSizeF(50,0))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSize(50, 1000))
|
|
)
|
|
<< QSizeF(100, 300)
|
|
<< QSizeF(100, 300)
|
|
<< QSizeF(100, 2000);
|
|
|
|
QTest::newRow("rowSpan_smaller_than_rows") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(50, 0))
|
|
.preferredSize(QSizeF(50, 50))
|
|
.maxSize(QSizeF(50, 300))
|
|
.rowSpan(2)
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(50, 50))
|
|
.preferredSize(QSizeF(50, 50))
|
|
.maxSize(QSize(50, 50))
|
|
<< ItemDesc(1,1)
|
|
.minSize(QSizeF(50, 50))
|
|
.preferredSize(QSizeF(50, 50))
|
|
.maxSize(QSize(50, 50))
|
|
)
|
|
<< QSizeF(100, 100)
|
|
<< QSizeF(100, 100)
|
|
<< QSizeF(100, 100);
|
|
|
|
QTest::newRow("colSpan_with_ignored_column") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(40,20))
|
|
.maxSize(QSizeF(60,20))
|
|
.colSpan(2)
|
|
<< ItemDesc(0,2)
|
|
.minSize(QSizeF(20, 20))
|
|
.maxSize(QSizeF(30, 20))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(60, 20))
|
|
.maxSize(QSizeF(90, 20))
|
|
.colSpan(3)
|
|
)
|
|
<< QSizeF(60, 40)
|
|
<< QSizeF(80, 40)
|
|
<< QSizeF(90, 40);
|
|
|
|
}
|
|
|
|
// public QSizeF sizeHint(Qt::SizeHint which, QSizeF const& constraint = QSizeF()) const
|
|
void tst_QGraphicsGridLayout::sizeHint()
|
|
{
|
|
QFETCH(ItemList, itemDescriptions);
|
|
QFETCH(QSizeF, expectedMinimumSizeHint);
|
|
QFETCH(QSizeF, expectedPreferredSizeHint);
|
|
QFETCH(QSizeF, expectedMaximumSizeHint);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0.0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
int i;
|
|
for (i = 0; i < itemDescriptions.size(); ++i) {
|
|
ItemDesc desc = itemDescriptions.at(i);
|
|
RectWidget *item = new RectWidget(widget);
|
|
desc.apply(layout, item);
|
|
}
|
|
|
|
QApplication::sendPostedEvents(0, 0);
|
|
|
|
widget->show();
|
|
view.show();
|
|
view.resize(400,300);
|
|
QCOMPARE(layout->sizeHint(Qt::MinimumSize), expectedMinimumSizeHint);
|
|
QCOMPARE(layout->sizeHint(Qt::PreferredSize), expectedPreferredSizeHint);
|
|
QCOMPARE(layout->sizeHint(Qt::MaximumSize), expectedMaximumSizeHint);
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::verticalSpacing_data()
|
|
{
|
|
QTest::addColumn<qreal>("verticalSpacing");
|
|
QTest::newRow("zero") << qreal(0.0);
|
|
QTest::newRow("17") << qreal(10.0);
|
|
}
|
|
|
|
// public qreal verticalSpacing() const
|
|
void tst_QGraphicsGridLayout::verticalSpacing()
|
|
{
|
|
QFETCH(qreal, verticalSpacing);
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout();
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
populateLayout(layout, 3, 2);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
qreal h = layout->sizeHint(Qt::PreferredSize, QSizeF()).height();
|
|
qreal oldSpacing = layout->verticalSpacing();
|
|
|
|
// The remainder of this test is only applicable if the current style uses uniform layout spacing
|
|
if (oldSpacing != -1) {
|
|
layout->setVerticalSpacing(verticalSpacing);
|
|
QApplication::processEvents();
|
|
qreal new_h = layout->sizeHint(Qt::PreferredSize, QSizeF()).height();
|
|
QCOMPARE(new_h, h - (2-1)*(oldSpacing - verticalSpacing));
|
|
}
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::layoutDirection_data()
|
|
{
|
|
QTest::addColumn<bool>("hasHeightForWidth");
|
|
|
|
QTest::newRow("") << false;
|
|
QTest::newRow("hasHeightForWidth") << true;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::layoutDirection()
|
|
{
|
|
QFETCH(bool, hasHeightForWidth);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
|
|
QGraphicsWidget *window = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
layout->setContentsMargins(1, 2, 3, 4);
|
|
layout->setSpacing(6);
|
|
RectWidget *w1 = new RectWidget;
|
|
w1->setMinimumSize(30, 20);
|
|
layout->addItem(w1, 0, 0);
|
|
RectWidget *w2 = new RectWidget;
|
|
w2->setMinimumSize(20, 20);
|
|
w2->setMaximumSize(20, 20);
|
|
layout->addItem(w2, 0, 1);
|
|
RectWidget *w3 = new RectWidget;
|
|
w3->setMinimumSize(20, 20);
|
|
w3->setMaximumSize(20, 20);
|
|
layout->addItem(w3, 1, 0);
|
|
RectWidget *w4 = new RectWidget;
|
|
w4->setMinimumSize(30, 20);
|
|
layout->addItem(w4, 1, 1);
|
|
|
|
QSizePolicy policy = w1->sizePolicy();
|
|
policy.setHeightForWidth(hasHeightForWidth);
|
|
w1->setSizePolicy(policy);
|
|
w2->setSizePolicy(policy);
|
|
w4->setSizePolicy(policy);
|
|
|
|
layout->setAlignment(w2, Qt::AlignRight);
|
|
layout->setAlignment(w3, Qt::AlignLeft);
|
|
|
|
scene.addItem(window);
|
|
window->setLayout(layout);
|
|
view.show();
|
|
window->resize(70, 52);
|
|
QApplication::processEvents();
|
|
QCOMPARE(w1->geometry().left(), 1.0);
|
|
QCOMPARE(w1->geometry().right(), 31.0);
|
|
QCOMPARE(w2->geometry().left(), 47.0);
|
|
QCOMPARE(w2->geometry().right(), 67.0);
|
|
QCOMPARE(w3->geometry().left(), 1.0);
|
|
QCOMPARE(w3->geometry().right(), 21.0);
|
|
QCOMPARE(w4->geometry().left(), 37.0);
|
|
QCOMPARE(w4->geometry().right(), 67.0);
|
|
|
|
window->setLayoutDirection(Qt::RightToLeft);
|
|
QApplication::processEvents();
|
|
QCOMPARE(w1->geometry().left(), 39.0);
|
|
QCOMPARE(w1->geometry().right(), 69.0);
|
|
QCOMPARE(w2->geometry().left(), 3.0);
|
|
QCOMPARE(w2->geometry().right(), 23.0);
|
|
QCOMPARE(w3->geometry().left(), 49.0);
|
|
QCOMPARE(w3->geometry().right(), 69.0);
|
|
QCOMPARE(w4->geometry().left(), 3.0);
|
|
QCOMPARE(w4->geometry().right(), 33.0);
|
|
|
|
delete window;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::removeLayout()
|
|
{
|
|
QGraphicsScene scene;
|
|
RectWidget *textEdit = new RectWidget;
|
|
RectWidget *pushButton = new RectWidget;
|
|
scene.addItem(textEdit);
|
|
scene.addItem(pushButton);
|
|
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
layout->addItem(textEdit, 0, 0);
|
|
layout->addItem(pushButton, 1, 0);
|
|
|
|
QGraphicsWidget *form = new QGraphicsWidget;
|
|
form->setLayout(layout);
|
|
scene.addItem(form);
|
|
|
|
QGraphicsView view(&scene);
|
|
view.show();
|
|
QVERIFY(QTest::qWaitForWindowExposed(&view));
|
|
|
|
QRectF r1 = textEdit->geometry();
|
|
QRectF r2 = pushButton->geometry();
|
|
form->setLayout(0);
|
|
//documentation of QGraphicsWidget::setLayout:
|
|
//If layout is 0, the widget is left without a layout. Existing subwidgets' geometries will remain unaffected.
|
|
QCOMPARE(textEdit->geometry(), r1);
|
|
QCOMPARE(pushButton->geometry(), r2);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::defaultStretchFactors_data()
|
|
{
|
|
QTest::addColumn<ItemList>("itemDescriptions");
|
|
QTest::addColumn<QSizeF>("newSize");
|
|
QTest::addColumn<SizeList>("expectedSizes");
|
|
|
|
QTest::newRow("usepreferredsize") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("preferredsizeIsZero") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(0,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.maxSize(QSizeF(20, 10))
|
|
)
|
|
<< QSizeF(30, 10)
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(20,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem01") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem01_resize120x40") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
)
|
|
<< QSizeF(120, 40)
|
|
<< (SizeList()
|
|
<< QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20)
|
|
<< QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem11_resize120x40") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
<< ItemDesc(1,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(20,20))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(30,20))
|
|
)
|
|
<< QSizeF(120, 60)
|
|
<< (SizeList()
|
|
<< QSizeF(20,20) << QSizeF(40,20) << QSizeF(60,20)
|
|
<< QSizeF(20,40) << QSizeF(40,40) << QSizeF(60,40)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem01_span01_resize70x60") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.rowSpan(2)
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(30,20))
|
|
)
|
|
<< QSizeF(70, 60)
|
|
<< (SizeList()
|
|
<< QSizeF(20,20) << QSizeF(10,60) << QSizeF(40,20)
|
|
<< QSizeF(20,40) << QSizeF(40,40)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem10_resize40x120") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
<< ItemDesc(2,0)
|
|
.preferredSizeHint(QSizeF(10,30))
|
|
<< ItemDesc(2,1)
|
|
.preferredSizeHint(QSizeF(10,30))
|
|
)
|
|
<< QSizeF(40, 120)
|
|
<< (SizeList()
|
|
<< QSizeF(20,20) << QSizeF(20,20)
|
|
<< QSizeF(20,40) << QSizeF(20,40)
|
|
<< QSizeF(20,60) << QSizeF(20,60)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem01_span02") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.rowSpan(2)
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(0,20) << QSizeF(10,10)
|
|
<< QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem02_span02") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.rowSpan(2)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(0,20)
|
|
<< QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem02_span00_span02") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.rowSpan(2)
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.rowSpan(2)
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,20) << QSizeF(10,10) << QSizeF(0,20)
|
|
<< QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem00_colspan00") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.colSpan(2)
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(20,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
<< QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignoreitem01_colspan01") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.colSpan(2)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(20,10) << QSizeF(10,10)
|
|
<< QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignorecolumn1_resize70x60") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
<< ItemDesc(1,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(20,20))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(30,20))
|
|
)
|
|
<< QSizeF(70, 60)
|
|
<< (SizeList()
|
|
<< QSizeF(20,20) << QSizeF(10,20) << QSizeF(40,20)
|
|
<< QSizeF(20,40) << QSizeF(10,40) << QSizeF(40,40)
|
|
);
|
|
|
|
QTest::newRow("ignorerow0") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,0) << QSizeF(10,0) << QSizeF(10,0)
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
);
|
|
|
|
QTest::newRow("ignorerow1") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,2)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,0)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(1,2)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
)
|
|
<< QSizeF()
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
|
|
<< QSizeF(10,0) << QSizeF(10,0) << QSizeF(10,0)
|
|
);
|
|
|
|
QTest::newRow("ignorerow0_resize60x50") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
<< ItemDesc(0,1)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
<< ItemDesc(0,2)
|
|
.sizePolicy(QSizePolicy::Ignored)
|
|
.preferredSizeHint(QSizeF(30,10))
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,30))
|
|
<< ItemDesc(1,1)
|
|
.preferredSizeHint(QSizeF(20,30))
|
|
<< ItemDesc(1,2)
|
|
.preferredSizeHint(QSizeF(30,30))
|
|
)
|
|
<< QSizeF(60, 50)
|
|
<< (SizeList()
|
|
<< QSizeF(10,10) << QSizeF(20,10) << QSizeF(30,10)
|
|
<< QSizeF(10,40) << QSizeF(20,40) << QSizeF(30,40)
|
|
);
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::defaultStretchFactors()
|
|
{
|
|
QFETCH(ItemList, itemDescriptions);
|
|
QFETCH(QSizeF, newSize);
|
|
QFETCH(SizeList, expectedSizes);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0.0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
int i;
|
|
for (i = 0; i < itemDescriptions.size(); ++i) {
|
|
ItemDesc desc = itemDescriptions.at(i);
|
|
RectWidget *item = new RectWidget(widget);
|
|
desc.apply(layout, item);
|
|
}
|
|
|
|
QApplication::sendPostedEvents(0, 0);
|
|
|
|
widget->show();
|
|
view.show();
|
|
view.resize(400,300);
|
|
if (newSize.isValid())
|
|
widget->resize(newSize);
|
|
|
|
QApplication::sendPostedEvents(0, 0);
|
|
for (i = 0; i < expectedSizes.size(); ++i) {
|
|
QSizeF itemSize = layout->itemAt(i)->geometry().size();
|
|
QCOMPARE(itemSize, expectedSizes.at(i));
|
|
}
|
|
|
|
delete widget;
|
|
}
|
|
|
|
typedef QList<QRectF> RectList;
|
|
|
|
void tst_QGraphicsGridLayout::alignment2_data()
|
|
{
|
|
QTest::addColumn<ItemList>("itemDescriptions");
|
|
QTest::addColumn<QSizeF>("newSize");
|
|
QTest::addColumn<RectList>("expectedGeometries");
|
|
|
|
QTest::newRow("hor_sizepolicy_fixed") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 10,20) << QRectF(10, 0, 10,10)
|
|
);
|
|
|
|
QTest::newRow("hor_sizepolicy_fixed_alignvcenter") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignVCenter)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 10,20) << QRectF(10, 5, 10,10)
|
|
);
|
|
|
|
QTest::newRow("hor_sizepolicy_fixed_aligntop") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignTop)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 10,20) << QRectF(10, 0, 10,10)
|
|
);
|
|
|
|
QTest::newRow("hor_sizepolicy_fixed_alignbottom") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(10,20))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
<< ItemDesc(0,1)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyV(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignBottom)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 10,20) << QRectF(10, 10, 10,10)
|
|
);
|
|
|
|
QTest::newRow("ver_sizepolicy_fixed") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 20,10) << QRectF(0, 10, 10,10)
|
|
);
|
|
|
|
QTest::newRow("ver_sizepolicy_fixed_alignhcenter") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignHCenter)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 20,10) << QRectF(5, 10, 10,10)
|
|
);
|
|
|
|
QTest::newRow("ver_sizepolicy_fixed_alignleft") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignLeft)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 20,10) << QRectF(0, 10, 10,10)
|
|
);
|
|
|
|
QTest::newRow("ver_sizepolicy_fixed_alignright") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.preferredSizeHint(QSizeF(20,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
<< ItemDesc(1,0)
|
|
.preferredSizeHint(QSizeF(10,10))
|
|
.sizePolicyH(QSizePolicy::Fixed)
|
|
.alignment(Qt::AlignRight)
|
|
)
|
|
<< QSizeF()
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 20,10) << QRectF(10, 10, 10,10)
|
|
);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::alignment2()
|
|
{
|
|
QFETCH(ItemList, itemDescriptions);
|
|
QFETCH(QSizeF, newSize);
|
|
QFETCH(RectList, expectedGeometries);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0.0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
int i;
|
|
for (i = 0; i < itemDescriptions.size(); ++i) {
|
|
ItemDesc desc = itemDescriptions.at(i);
|
|
RectWidget *item = new RectWidget(widget);
|
|
desc.apply(layout, item);
|
|
}
|
|
|
|
QApplication::sendPostedEvents(0, 0);
|
|
|
|
widget->show();
|
|
view.resize(400,300);
|
|
view.show();
|
|
if (newSize.isValid())
|
|
widget->resize(newSize);
|
|
|
|
QApplication::sendPostedEvents(0, 0);
|
|
for (i = 0; i < expectedGeometries.size(); ++i) {
|
|
QRectF itemRect = layout->itemAt(i)->geometry();
|
|
QCOMPARE(itemRect, expectedGeometries.at(i));
|
|
}
|
|
|
|
delete widget;
|
|
}
|
|
|
|
static QSizeF hfw1(Qt::SizeHint, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal ch = constraint.height();
|
|
const qreal cw = constraint.width();
|
|
if (cw < 0 && ch < 0) {
|
|
return QSizeF(50, 400);
|
|
} else if (cw > 0) {
|
|
result.setHeight(20000./cw);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static QSizeF wfh1(Qt::SizeHint, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal ch = constraint.height();
|
|
const qreal cw = constraint.width();
|
|
if (cw < 0 && ch < 0) {
|
|
return QSizeF(400, 50);
|
|
} else if (ch > 0) {
|
|
result.setWidth(20000./ch);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static QSizeF wfh2(Qt::SizeHint, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal ch = constraint.height();
|
|
const qreal cw = constraint.width();
|
|
if (ch < 0 && cw < 0)
|
|
return QSizeF(50, 50);
|
|
if (ch >= 0)
|
|
result.setWidth(ch);
|
|
return result;
|
|
}
|
|
|
|
static QSizeF hfw3(Qt::SizeHint, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal ch = constraint.height();
|
|
const qreal cw = constraint.width();
|
|
if (cw < 0 && ch < 0) {
|
|
return QSizeF(10, 10);
|
|
} else if (cw > 0) {
|
|
result.setHeight(100./cw);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static QSizeF hfw2(Qt::SizeHint /*which*/, const QSizeF &constraint)
|
|
{
|
|
return QSizeF(constraint.width(), constraint.width());
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::geometries_data()
|
|
{
|
|
|
|
QTest::addColumn<ItemList>("itemDescriptions");
|
|
QTest::addColumn<QSizeF>("newSize");
|
|
QTest::addColumn<RectList>("expectedGeometries");
|
|
|
|
QTest::newRow("combine_max_sizes") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.maxSize(QSizeF(50,10))
|
|
<< ItemDesc(1,0)
|
|
.maxSize(QSizeF(10,10))
|
|
)
|
|
<< QSizeF(50, 20)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50,10) << QRectF(0, 10, 10,10)
|
|
);
|
|
|
|
QTest::newRow("combine_min_sizes") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(50,10))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(10,10))
|
|
)
|
|
<< QSizeF(60, 20)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 60,10) << QRectF(0, 10, 60,10)
|
|
);
|
|
|
|
// change layout height and verify
|
|
QTest::newRow("hfw-100x401") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.minSize(QSizeF(40,-1))
|
|
.preferredSize(QSizeF(50,-1))
|
|
.maxSize(QSizeF(500, -1))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 401)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50, 1) << QRectF(50, 0, 50, 1)
|
|
<< QRectF(0, 1, 50,100) << QRectF(50, 1, 50,400)
|
|
);
|
|
QTest::newRow("hfw-h408") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(500, 500))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 408)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50, 8) << QRectF(50, 0, 50, 8)
|
|
<< QRectF(0, 8, 50,100) << QRectF(50, 8, 50,400)
|
|
);
|
|
QTest::newRow("hfw-h410") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.minSize(QSizeF(40,40))
|
|
.preferredSize(QSizeF(50,400))
|
|
.maxSize(QSizeF(500, 500))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 410)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50,10) << QRectF(50, 0, 50,10)
|
|
<< QRectF(0, 10, 50,100) << QRectF(50, 10, 50,400)
|
|
);
|
|
|
|
QTest::newRow("hfw-100x470") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(500,500))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 470)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70)
|
|
<< QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400)
|
|
);
|
|
|
|
// change layout width and verify
|
|
QTest::newRow("hfw-100x401") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.minSize(QSizeF(-1,-1))
|
|
.preferredSize(QSizeF(-1,-1))
|
|
.maxSize(QSizeF(-1, -1))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 401)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 50, 1) << QRectF( 50, 0, 50, 1)
|
|
<< QRectF( 0, 1, 50, 100) << QRectF( 50, 1, 50, 400)
|
|
);
|
|
|
|
QTest::newRow("hfw-160x350") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(160, 350)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 80, 100) << QRectF( 80, 0, 80, 100)
|
|
<< QRectF( 0, 100, 80, 100) << QRectF( 80, 100, 80, 250)
|
|
);
|
|
|
|
QTest::newRow("hfw-160x300") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000, 5000))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(160, 300)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 80, 50) << QRectF( 80, 0, 80, 50)
|
|
<< QRectF( 0, 50, 80, 100) << QRectF( 80, 50, 80, 250)
|
|
);
|
|
|
|
QTest::newRow("hfw-20x40") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,10))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(1, 1))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50, 50))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(100, 100))
|
|
.dynamicConstraint(hfw3, Qt::Vertical)
|
|
)
|
|
<< QSizeF(20, 40)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 10, 20) << QRectF(10, 0, 10, 20)
|
|
<< QRectF(0, 20, 10, 20) << QRectF(10, 20, 10, 10)
|
|
);
|
|
|
|
QTest::newRow("wfh-300x160") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(10,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(10,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(10,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(10,10))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(400,50))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000, 5000))
|
|
.dynamicConstraint(wfh1, Qt::Horizontal)
|
|
)
|
|
<< QSizeF(300, 160)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 50, 80) << QRectF( 50, 0, 100, 80)
|
|
<< QRectF( 0, 80, 50, 80) << QRectF( 50, 80, 250, 80)
|
|
);
|
|
|
|
QTest::newRow("wfh-40x20") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
// Note, must be 10 in order to match stretching of wfh item
|
|
// below (the same stretch makes it easier to test)
|
|
.minSize(QSizeF(10,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(1,1))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,50))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(100, 100))
|
|
.dynamicConstraint(wfh2, Qt::Horizontal)
|
|
)
|
|
<< QSizeF(40, 20)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 20, 10) << QRectF(20, 0, 20, 10)
|
|
<< QRectF(0, 10, 20, 10) << QRectF(20, 10, 10, 10)
|
|
);
|
|
|
|
QTest::newRow("wfh-400x160") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(1,1))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,50))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(100, 100))
|
|
.dynamicConstraint(wfh2, Qt::Horizontal)
|
|
)
|
|
|
|
<< QSizeF(400, 160)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 100, 80) << QRectF(100, 0, 100, 80)
|
|
<< QRectF(0, 80, 100, 80) << QRectF(100, 80, 80, 80)
|
|
);
|
|
|
|
QTest::newRow("wfh-160x100") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
// Note, preferred width must be 50 in order to match
|
|
// preferred width of wfh item below.
|
|
// (The same preferred size makes the stretch the same, and
|
|
// makes it easier to test) (The stretch algorithm is a
|
|
// blackbox)
|
|
.preferredSize(QSizeF(50,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(10,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(10,50))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(1,1))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(10,50))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(500, 500))
|
|
.dynamicConstraint(wfh2, Qt::Horizontal)
|
|
)
|
|
<< QSizeF(160, 100)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 80, 50) << QRectF( 80, 0, 80, 50)
|
|
<< QRectF(0, 50, 80, 50) << QRectF( 80, 50, 50, 50)
|
|
);
|
|
|
|
QTest::newRow("hfw-h470") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(500,500))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 470)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70)
|
|
<< QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400)
|
|
);
|
|
|
|
// change layout width and verify
|
|
QTest::newRow("hfw-w100") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(100, 401)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 50, 1) << QRectF( 50, 0, 50, 1)
|
|
<< QRectF( 0, 1, 50, 100) << QRectF( 50, 1, 50, 400)
|
|
);
|
|
|
|
QTest::newRow("hfw-w160") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(160, 350)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 80, 100) << QRectF( 80, 0, 80, 100)
|
|
<< QRectF( 0, 100, 80, 100) << QRectF( 80, 100, 80, 250)
|
|
);
|
|
|
|
QTest::newRow("hfw-w500") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(0,1)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(1,1))
|
|
.preferredSize(QSizeF(50,10))
|
|
.maxSize(QSizeF(100, 100))
|
|
<< ItemDesc(1,1)
|
|
.sizeHint(Qt::MinimumSize, QSizeF(40,40))
|
|
.sizeHint(Qt::PreferredSize, QSizeF(50,400))
|
|
.sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
|
|
.dynamicConstraint(hfw1, Qt::Vertical)
|
|
)
|
|
<< QSizeF(500, 200)
|
|
<< (RectList()
|
|
<< QRectF( 0, 0, 100, 100) << QRectF(100, 0, 100, 100)
|
|
<< QRectF( 0, 100, 100, 100) << QRectF(100, 100, 400, 50)
|
|
);
|
|
|
|
QTest::newRow("hfw-alignment-defaults") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(100, 100))
|
|
.maxSize(QSizeF(100, 100))
|
|
.dynamicConstraint(hfw2, Qt::Vertical)
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(200, 200))
|
|
.maxSize(QSizeF(200, 200))
|
|
.dynamicConstraint(hfw2, Qt::Vertical)
|
|
<< ItemDesc(2,0)
|
|
.minSize(QSizeF(300, 300))
|
|
.maxSize(QSizeF(300, 300))
|
|
)
|
|
<< QSizeF(300, 600)
|
|
<< (RectList()
|
|
<< QRectF(0, 0, 100, 100)
|
|
<< QRectF(0, 100, 200, 200)
|
|
<< QRectF(0, 300, 300, 300)
|
|
);
|
|
|
|
QTest::newRow("hfw-alignment2") << (ItemList()
|
|
<< ItemDesc(0,0)
|
|
.minSize(QSizeF(100, 100))
|
|
.maxSize(QSizeF(100, 100))
|
|
.dynamicConstraint(hfw2, Qt::Vertical)
|
|
.alignment(Qt::AlignRight)
|
|
<< ItemDesc(1,0)
|
|
.minSize(QSizeF(200, 200))
|
|
.maxSize(QSizeF(200, 200))
|
|
.dynamicConstraint(hfw2, Qt::Vertical)
|
|
.alignment(Qt::AlignHCenter)
|
|
<< ItemDesc(2,0)
|
|
.minSize(QSizeF(300, 300))
|
|
.maxSize(QSizeF(300, 300))
|
|
)
|
|
<< QSizeF(300, 600)
|
|
<< (RectList()
|
|
<< QRectF(200, 0, 100, 100)
|
|
<< QRectF( 50, 100, 200, 200)
|
|
<< QRectF( 0, 300, 300, 300)
|
|
);
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::geometries()
|
|
{
|
|
QFETCH(ItemList, itemDescriptions);
|
|
QFETCH(QSizeF, newSize);
|
|
QFETCH(RectList, expectedGeometries);
|
|
|
|
QGraphicsScene scene;
|
|
QGraphicsView view(&scene);
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
scene.addItem(widget);
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0.0);
|
|
widget->setContentsMargins(0, 0, 0, 0);
|
|
|
|
int i;
|
|
for (i = 0; i < itemDescriptions.size(); ++i) {
|
|
ItemDesc desc = itemDescriptions.at(i);
|
|
RectWidget *item = new RectWidget(widget);
|
|
desc.apply(layout, item);
|
|
}
|
|
|
|
QApplication::processEvents();
|
|
|
|
widget->show();
|
|
view.resize(400,300);
|
|
view.show();
|
|
if (newSize.isValid())
|
|
widget->resize(newSize);
|
|
|
|
QApplication::processEvents();
|
|
for (i = 0; i < expectedGeometries.size(); ++i) {
|
|
QRectF itemRect = layout->itemAt(i)->geometry();
|
|
QCOMPARE(itemRect, expectedGeometries.at(i));
|
|
}
|
|
|
|
delete widget;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::avoidRecursionInInsertItem()
|
|
{
|
|
QGraphicsWidget window(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(&window);
|
|
QCOMPARE(layout->count(), 0);
|
|
QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::addItem: cannot insert itself");
|
|
layout->addItem(layout, 0, 0);
|
|
QCOMPARE(layout->count(), 0);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::styleInfoLeak()
|
|
{
|
|
QGraphicsGridLayout grid;
|
|
grid.horizontalSpacing();
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::task236367_maxSizeHint()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
int w = 203;
|
|
int h = 204;
|
|
widget->resize(w, h);
|
|
QCOMPARE(widget->size(), QSizeF(w, h));
|
|
}
|
|
|
|
static QSizeF hfw(Qt::SizeHint /*which*/, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal cw = constraint.width();
|
|
const qreal ch = constraint.height();
|
|
if (cw < 0 && ch < 0) {
|
|
return QSizeF(200, 100);
|
|
} else if (cw >= 0) {
|
|
result.setHeight(20000./cw);
|
|
} else if (cw == 0) {
|
|
result.setHeight(20000);
|
|
} else if (ch >= 0) {
|
|
result.setWidth(20000./ch);
|
|
} else if (ch == 0) {
|
|
result.setWidth(20000);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static QSizeF wfh(Qt::SizeHint /*which*/, const QSizeF &constraint)
|
|
{
|
|
QSizeF result(constraint);
|
|
const qreal ch = constraint.height();
|
|
if (ch >= 0) {
|
|
result.setWidth(ch);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool qFuzzyCompare(const QSizeF &a, const QSizeF &b)
|
|
{
|
|
return qFuzzyCompare(a.width(), b.width()) && qFuzzyCompare(a.height(), b.height());
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::heightForWidth()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
RectWidget *w00 = new RectWidget;
|
|
w00->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w00->setSizeHint(Qt::PreferredSize, QSizeF(10,10));
|
|
w00->setSizeHint(Qt::MaximumSize, QSizeF(100,100));
|
|
layout->addItem(w00, 0, 0);
|
|
|
|
RectWidget *w01 = new RectWidget;
|
|
w01->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w01->setSizeHint(Qt::PreferredSize, QSizeF(10,10));
|
|
w01->setSizeHint(Qt::MaximumSize, QSizeF(100,100));
|
|
layout->addItem(w01, 0, 1);
|
|
|
|
RectWidget *w10 = new RectWidget;
|
|
w10->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w10->setSizeHint(Qt::PreferredSize, QSizeF(10,10));
|
|
w10->setSizeHint(Qt::MaximumSize, QSizeF(100,100));
|
|
layout->addItem(w10, 1, 0);
|
|
|
|
RectWidget *w11 = new RectWidget;
|
|
w11->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w11->setSizeHint(Qt::MaximumSize, QSizeF(30000,30000));
|
|
w11->setConstraintFunction(hfw);
|
|
QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
sp.setHeightForWidth(true);
|
|
w11->setSizePolicy(sp);
|
|
layout->addItem(w11, 1, 1);
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(2, 2));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(210, 110));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30100, 30100));
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 20001));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 20010));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 20100));
|
|
|
|
// Since 20 is somewhere between "minimum width hint" (2) and
|
|
// "preferred width hint" (210), it will try to do distribution by
|
|
// stretching them with different factors.
|
|
// Since column 1 has a "preferred width" of 200 it means that
|
|
// column 1 will be a bit wider than column 0. Thus it will also be a bit
|
|
// shorter than 2001, (the expected height if all columns had width=10)
|
|
QSizeF sh = layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(20, -1));
|
|
// column 1 cannot be wider than 19, which means that it must be taller than 20000/19~=1052
|
|
QVERIFY(sh.height() < 2000 + 1 && sh.height() > 1052 + 1);
|
|
|
|
sh = layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(20, -1));
|
|
QVERIFY(sh.height() < 2000 + 10 && sh.height() > 1052 + 10);
|
|
|
|
sh = layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(20, -1));
|
|
QVERIFY(sh.height() < 2000 + 100 && sh.height() > 1052 + 100);
|
|
|
|
// the height of the hfw widget is shorter than the one to the left, which is 100, so
|
|
// the total height of the last row is 100 (which leaves the layout height to be 200)
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(500, -1)), QSizeF(500, 100 + 100));
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::widthForHeight()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
RectWidget *w00 = new RectWidget;
|
|
w00->setMinimumSize(1, 1);
|
|
w00->setPreferredSize(50, 50);
|
|
w00->setMaximumSize(100, 100);
|
|
|
|
layout->addItem(w00, 0, 0);
|
|
|
|
RectWidget *w01 = new RectWidget;
|
|
w01->setMinimumSize(1,1);
|
|
w01->setPreferredSize(50,50);
|
|
w01->setMaximumSize(100,100);
|
|
layout->addItem(w01, 0, 1);
|
|
|
|
RectWidget *w10 = new RectWidget;
|
|
w10->setMinimumSize(1,1);
|
|
w10->setPreferredSize(50,50);
|
|
w10->setMaximumSize(100,100);
|
|
layout->addItem(w10, 1, 0);
|
|
|
|
RectWidget *w11 = new RectWidget;
|
|
w11->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w11->setSizeHint(Qt::PreferredSize, QSizeF(50,50));
|
|
w11->setSizeHint(Qt::MaximumSize, QSizeF(30000,30000));
|
|
|
|
// This will make sure its always square.
|
|
w11->setConstraintFunction(wfh);
|
|
QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
sp.setWidthForHeight(true);
|
|
w11->setSizePolicy(sp);
|
|
layout->addItem(w11, 1, 1);
|
|
|
|
/*
|
|
| 1, 50, 100 | 1, 50, 100 |
|
|
-----+--------------+--------------+
|
|
1| | |
|
|
50| | |
|
|
100| | |
|
|
-----|--------------+--------------+
|
|
1| | |
|
|
50| | WFH |
|
|
100| | |
|
|
-----------------------------------+
|
|
*/
|
|
|
|
|
|
QSizeF prefSize = layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1));
|
|
QCOMPARE(prefSize, QSizeF(50+50, 50+50));
|
|
|
|
// wfh(1): = 1
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 2)), QSizeF(1 + 1, 2));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 2)), QSizeF(50 + 50, 2));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 2)), QSizeF(100 + 100, 2));
|
|
|
|
// wfh(40) = 40
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 80)), QSizeF(1 + 40, 80));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 80)), QSizeF(50 + 50, 80));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 80)), QSizeF(100 + 100, 80));
|
|
|
|
// wfh(80) = 80
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 160)), QSizeF(1 + 80, 160));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 160)), QSizeF(50 + 80, 160));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 160)), QSizeF(100 + 100, 160));
|
|
|
|
// wfh(200) = 200
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, 300)), QSizeF(1 + 200, 300));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, 300)), QSizeF(50 + 200, 300));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, 300)), QSizeF(100 + 200, 300));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
RectWidget *w = new RectWidget;
|
|
w->setSizeHint(Qt::MinimumSize, QSizeF(1,1));
|
|
w->setSizeHint(Qt::MaximumSize, QSizeF(30000,30000));
|
|
w->setConstraintFunction(hfw);
|
|
QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
sp.setHeightForWidth(true);
|
|
w->setSizePolicy(sp);
|
|
layout->addItem(w, 0,0,2,2);
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 1));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(200, 100));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30000, 30000));
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 10000));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 10000));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 10000));
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanningItem2x2_data()
|
|
{
|
|
QTest::addColumn<QSizePolicy::Policy>("sizePolicy");
|
|
QTest::addColumn<int>("itemHeight");
|
|
QTest::addColumn<int>("expectedHeight");
|
|
|
|
QTest::newRow("A larger spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 39 << 80;
|
|
QTest::newRow("A larger spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 39 << 80;
|
|
QTest::newRow("An equally-sized spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 40 << 80;
|
|
QTest::newRow("An equally-sized spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 40 << 80;
|
|
QTest::newRow("A smaller spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 41 << 82;
|
|
QTest::newRow("A smaller spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 41 << 82;
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanningItem2x2()
|
|
{
|
|
QFETCH(QSizePolicy::Policy, sizePolicy);
|
|
QFETCH(int, itemHeight);
|
|
QFETCH(int, expectedHeight);
|
|
QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
QGraphicsWidget *w1 = new QGraphicsWidget;
|
|
w1->setMinimumSize(80,80);
|
|
w1->setMaximumSize(80,80);
|
|
|
|
QGraphicsWidget *w2 = new QGraphicsWidget;
|
|
w2->setMinimumSize(80,itemHeight);
|
|
w2->setPreferredSize(80,itemHeight);
|
|
w2->setSizePolicy(QSizePolicy::Fixed, sizePolicy);
|
|
|
|
QGraphicsWidget *w3 = new QGraphicsWidget;
|
|
w3->setMinimumSize(80,itemHeight);
|
|
w3->setPreferredSize(80,itemHeight);
|
|
w3->setSizePolicy(QSizePolicy::Fixed, sizePolicy);
|
|
|
|
layout->addItem(w1, 0, 0, 2, 1);
|
|
layout->addItem(w2, 0, 1);
|
|
layout->addItem(w3, 1, 1);
|
|
|
|
QCOMPARE(layout->minimumSize(), QSizeF(160,expectedHeight));
|
|
if(sizePolicy == QSizePolicy::Fixed)
|
|
QCOMPARE(layout->maximumSize(), QSizeF(160,expectedHeight));
|
|
else
|
|
QCOMPARE(layout->maximumSize(), QSizeF(160,QWIDGETSIZE_MAX));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanningItem2x3_data()
|
|
{
|
|
QTest::addColumn<bool>("w1_fixed");
|
|
QTest::addColumn<bool>("w2_fixed");
|
|
QTest::addColumn<bool>("w3_fixed");
|
|
QTest::addColumn<bool>("w4_fixed");
|
|
QTest::addColumn<bool>("w5_fixed");
|
|
|
|
for(int w1 = 0; w1 < 2; w1++)
|
|
for(int w2 = 0; w2 < 2; w2++)
|
|
for(int w3 = 0; w3 < 2; w3++)
|
|
for(int w4 = 0; w4 < 2; w4++)
|
|
for(int w5 = 0; w5 < 2; w5++) {
|
|
QString description = QString("Fixed sizes:") + (w1?" w1":"") + (w2?" w2":"") + (w3?" w3":"") + (w4?" w4":"") + (w5?" w5":"");
|
|
QTest::newRow(description.toLatin1()) << (bool)w1 << (bool)w2 << (bool)w3 << (bool)w4 << (bool)w5;
|
|
}
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanningItem2x3()
|
|
{
|
|
QFETCH(bool, w1_fixed);
|
|
QFETCH(bool, w2_fixed);
|
|
QFETCH(bool, w3_fixed);
|
|
QFETCH(bool, w4_fixed);
|
|
QFETCH(bool, w5_fixed);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
QGraphicsWidget *w1 = new QGraphicsWidget;
|
|
w1->setMinimumSize(80,80);
|
|
w1->setMaximumSize(80,80);
|
|
if (w1_fixed)
|
|
w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
|
|
QGraphicsWidget *w2 = new QGraphicsWidget;
|
|
w2->setMinimumSize(80,48);
|
|
w2->setPreferredSize(80,48);
|
|
if (w2_fixed)
|
|
w2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
|
|
QGraphicsWidget *w3 = new QGraphicsWidget;
|
|
w3->setMinimumSize(80,30);
|
|
w3->setPreferredSize(80,30);
|
|
if (w3_fixed)
|
|
w3->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
|
|
QGraphicsWidget *w4 = new QGraphicsWidget;
|
|
w4->setMinimumSize(80,30);
|
|
w4->setMaximumSize(80,30);
|
|
if (w4_fixed)
|
|
w4->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
|
|
QGraphicsWidget *w5 = new QGraphicsWidget;
|
|
w5->setMinimumSize(40,24);
|
|
w5->setMaximumSize(40,24);
|
|
if (w5_fixed)
|
|
w5->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
|
|
layout->addItem(w1, 0, 0, 2, 1);
|
|
layout->addItem(w2, 0, 1);
|
|
layout->addItem(w3, 1, 1);
|
|
layout->addItem(w4, 0, 2);
|
|
layout->addItem(w5, 1, 2);
|
|
|
|
QCOMPARE(layout->minimumSize(), QSizeF(240,80));
|
|
// Only w2 and w3 grow vertically, so when they have a fixed vertical size policy,
|
|
// the whole layout cannot grow vertically.
|
|
if (w2_fixed && w3_fixed)
|
|
QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,80));
|
|
else
|
|
QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanningItem()
|
|
{
|
|
QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
QGraphicsWidget *w1 = new QGraphicsWidget;
|
|
w1->setMinimumSize(80,80);
|
|
w1->setMaximumSize(80,80);
|
|
|
|
QGraphicsWidget *w2 = new QGraphicsWidget;
|
|
w2->setMinimumSize(80,38);
|
|
w2->setPreferredSize(80,38);
|
|
w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
|
|
QGraphicsWidget *w3 = new QGraphicsWidget;
|
|
w3->setMinimumSize(80,38);
|
|
w3->setPreferredSize(80,38);
|
|
w3->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
|
|
layout->addItem(w1, 0, 0, 2, 1);
|
|
layout->addItem(w2, 0, 1);
|
|
layout->addItem(w3, 1, 1);
|
|
|
|
QCOMPARE(layout->minimumSize(), QSizeF(160,80));
|
|
QCOMPARE(layout->maximumSize(), QSizeF(160,80));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::spanAcrossEmptyRow()
|
|
{
|
|
QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(form);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
RectWidget *w1 = new RectWidget;
|
|
RectWidget *w2 = new RectWidget;
|
|
RectWidget *w3 = new RectWidget;
|
|
|
|
QSizeF size(10, 10);
|
|
for (int i = 0; i < 3; ++i) {
|
|
w1->setSizeHint((Qt::SizeHint)i, size);
|
|
w2->setSizeHint((Qt::SizeHint)i, size);
|
|
w3->setSizeHint((Qt::SizeHint)i, size);
|
|
size+=size; //[(10,10), (20,20), (40,40)]
|
|
}
|
|
layout->addItem(w1, 0, 0, 1, 1);
|
|
layout->addItem(w2, 0, 1, 1, 2);
|
|
layout->addItem(w3, 0, 99, 1, 1);
|
|
|
|
form->resize(60,20);
|
|
QCOMPARE(w1->geometry(), QRectF( 0, 0, 20, 20));
|
|
QCOMPARE(w2->geometry(), QRectF(20, 0, 20, 20));
|
|
QCOMPARE(w3->geometry(), QRectF(40, 0, 20, 20));
|
|
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize), QSizeF(30, 10));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 20));
|
|
QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize), QSizeF(120, 40));
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
|
|
widget->setLayout(layout);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
RectWidget *w1 = new RectWidget;
|
|
w1->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
|
|
w1->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
|
|
w1->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
|
|
layout->addItem(w1, 0,0,1,1);
|
|
|
|
RectWidget *w2 = new RectWidget;
|
|
w2->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
|
|
w2->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
|
|
w2->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
|
|
layout->addItem(w2, 0,1,1,1);
|
|
layout->setColumnStretchFactor(1, 2);
|
|
|
|
QApplication::sendPostedEvents();
|
|
QGraphicsScene scene;
|
|
QGraphicsView *view = new QGraphicsView(&scene);
|
|
|
|
scene.addItem(widget);
|
|
|
|
view->show();
|
|
|
|
widget->resize(500, 100);
|
|
// w1 should stay at its preferred size
|
|
QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
|
|
QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 100));
|
|
|
|
|
|
// only w1 has hfw
|
|
w1->setConstraintFunction(hfw);
|
|
QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
sp.setHeightForWidth(true);
|
|
w1->setSizePolicy(sp);
|
|
QApplication::sendPostedEvents();
|
|
|
|
QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 200));
|
|
QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 200));
|
|
|
|
// only w2 has hfw
|
|
w2->setConstraintFunction(hfw);
|
|
w2->setSizePolicy(sp);
|
|
|
|
w1->setConstraintFunction(0);
|
|
sp.setHeightForWidth(false);
|
|
w1->setSizePolicy(sp);
|
|
QApplication::sendPostedEvents();
|
|
|
|
QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
|
|
QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 50));
|
|
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::testDefaultAlignment()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(0);
|
|
|
|
QGraphicsWidget *w = new QGraphicsWidget;
|
|
w->setMinimumSize(50,50);
|
|
w->setMaximumSize(50,50);
|
|
layout->addItem(w,0,0);
|
|
|
|
//Default alignment should be to the top-left
|
|
|
|
//First, check by forcing the layout to be bigger
|
|
layout->setMinimumSize(100,100);
|
|
layout->activate();
|
|
QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
|
|
QCOMPARE(w->geometry(), QRectF(0,0,50,50));
|
|
layout->setMinimumSize(-1,-1);
|
|
|
|
//Second, check by forcing the column and row to be bigger instead
|
|
layout->setColumnMinimumWidth(0, 100);
|
|
layout->setRowMinimumHeight(0, 100);
|
|
layout->activate();
|
|
QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
|
|
QCOMPARE(w->geometry(), QRectF(0,0,50,50));
|
|
layout->setMinimumSize(-1,-1);
|
|
layout->setColumnMinimumWidth(0, 0);
|
|
layout->setRowMinimumHeight(0, 0);
|
|
|
|
|
|
//Third, check by adding a larger item in the column
|
|
QGraphicsWidget *w2 = new QGraphicsWidget;
|
|
w2->setMinimumSize(100,100);
|
|
w2->setMaximumSize(100,100);
|
|
layout->addItem(w2,1,0);
|
|
layout->activate();
|
|
QCOMPARE(layout->geometry(), QRectF(0,0,100,150));
|
|
QCOMPARE(w->geometry(), QRectF(0,0,50,50));
|
|
QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
|
|
}
|
|
|
|
static RectWidget *addWidget(QGraphicsGridLayout *grid, int row, int column)
|
|
{
|
|
RectWidget *w = new RectWidget;
|
|
w->setPreferredSize(20, 20);
|
|
grid->addItem(w, row, column);
|
|
return w;
|
|
}
|
|
|
|
static void setVisible(bool visible, QGraphicsWidget **widgets)
|
|
{
|
|
for (int i = 0; i < 3; ++i)
|
|
if (widgets[i]) widgets[i]->setVisible(visible);
|
|
}
|
|
|
|
static void setRetainSizeWhenHidden(bool retainSize, QGraphicsWidget **widgets)
|
|
{
|
|
QSizePolicy sp = widgets[0]->sizePolicy();
|
|
sp.setRetainSizeWhenHidden(retainSize);
|
|
for (int i = 0; i < 3; ++i)
|
|
if (widgets[i]) widgets[i]->setSizePolicy(sp);
|
|
}
|
|
|
|
void tst_QGraphicsGridLayout::hiddenItems()
|
|
{
|
|
QGraphicsWidget *widget = new QGraphicsWidget;
|
|
QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
layout->setSpacing(2);
|
|
|
|
// Create a 3x3 layout
|
|
addWidget(layout, 0, 0);
|
|
RectWidget *w01 = addWidget(layout, 0, 1);
|
|
addWidget(layout, 0, 2);
|
|
RectWidget *w10 = addWidget(layout, 1, 0);
|
|
RectWidget *w11 = addWidget(layout, 1, 1);
|
|
RectWidget *w12 = addWidget(layout, 1, 2);
|
|
addWidget(layout, 2, 0);
|
|
RectWidget *w21 = addWidget(layout, 2, 1);
|
|
addWidget(layout, 2, 2);
|
|
|
|
QGraphicsWidget *middleColumn[] = {w01, w11, w21 };
|
|
QGraphicsWidget *topTwoOfMiddleColumn[] = {w01, w11, 0 };
|
|
|
|
// hide and show middle column
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
setVisible(false, middleColumn); // hide middle column
|
|
QCOMPARE(layout->preferredWidth(), qreal(42));
|
|
setVisible(true, middleColumn); // show middle column
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
setRetainSizeWhenHidden(true, middleColumn);
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
setVisible(false, middleColumn); // hide middle column
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
setRetainSizeWhenHidden(false, middleColumn);
|
|
QCOMPARE(layout->preferredWidth(), qreal(42));
|
|
setVisible(true, middleColumn);
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
|
|
// Hide only two items, => column should not collapse
|
|
setVisible(false, topTwoOfMiddleColumn);
|
|
QCOMPARE(layout->preferredWidth(), qreal(64));
|
|
|
|
|
|
QGraphicsWidget *middleRow[] = {w10, w11, w12 };
|
|
QGraphicsWidget *leftMostTwoOfMiddleRow[] = {w10, w11, 0 };
|
|
|
|
// hide and show middle row
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
setVisible(false, middleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(42));
|
|
setVisible(true, middleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
setRetainSizeWhenHidden(true, middleColumn);
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
setVisible(false, middleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
setRetainSizeWhenHidden(false, middleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(42));
|
|
setVisible(true, middleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
|
|
// Hide only two items => row should not collapse
|
|
setVisible(false, leftMostTwoOfMiddleRow);
|
|
QCOMPARE(layout->preferredHeight(), qreal(64));
|
|
|
|
}
|
|
|
|
QTEST_MAIN(tst_QGraphicsGridLayout)
|
|
#include "tst_qgraphicsgridlayout.moc"
|
|
|