From 5547ddc160b6bf15a12917c05155f03e945d2d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= Date: Fri, 10 Sep 2010 14:08:19 +0200 Subject: [PATCH] Alignments got wrong after the hfw commit Task-number: PMO-189091 --- src/gui/graphicsview/qgridlayoutengine.cpp | 75 +++++++++++--------- src/gui/graphicsview/qgridlayoutengine_p.h | 2 +- .../tst_qgraphicsgridlayout.cpp | 54 ++++++++++++++ 3 files changed, 96 insertions(+), 35 deletions(-) diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp index f3b2026..f1bade5 100644 --- a/src/gui/graphicsview/qgridlayoutengine.cpp +++ b/src/gui/graphicsview/qgridlayoutengine.cpp @@ -580,6 +580,11 @@ QGridLayoutBox QGridLayoutItem::box(Qt::Orientation orientation, qreal constrain QSizePolicy::Policy policy = sizePolicy(orientation); if (orientation == Qt::Horizontal) { + // Make sure the constraint is not higher than the max height. + if (constraint >= 0) { + const qreal maxItemHeight = effectiveMaxSize(Qt::Vertical); + constraint = qMin(maxItemHeight, constraint); + } QSizeF constraintSize(-1.0, constraint); result.q_preferredSize = sizeHint(Qt::PreferredSize, constraintSize).width(); @@ -596,6 +601,12 @@ QGridLayoutBox QGridLayoutItem::box(Qt::Orientation orientation, qreal constrain result.q_maximumSize = result.q_preferredSize; } } else { + // Make sure the constraint is not wider than the max width. + if (constraint >= 0) { + const qreal maxItemWidth = effectiveMaxSize(Qt::Horizontal); + constraint = qMin(maxItemWidth, constraint); + } + QSizeF constraintSize(constraint, -1.0); result.q_preferredSize = sizeHint(Qt::PreferredSize, constraintSize).height(); @@ -629,37 +640,43 @@ QRectF QGridLayoutItem::geometryWithin(qreal x, qreal y, qreal width, qreal heig QGridLayoutBox vBox = box(Qt::Vertical); if (vBox.q_minimumDescent < 0.0 || rowDescent < 0.0) { - qreal cellWidth = width; - qreal cellHeight = height; - QSize constraint; + const QSizeF cellSize(width, height); + QSizeF maxSize(box(Qt::Horizontal).q_maximumSize, box(Qt::Vertical).q_maximumSize); + + qreal constraint = -1; if (hasDynamicConstraint()) { - if (dynamicConstraintOrientation() == Qt::Vertical) - constraint.setWidth(cellWidth); - else - constraint.setHeight(cellHeight); + maxSize = maxSize.boundedTo(cellSize); + constraint = (dynamicConstraintOrientation() == Qt::Vertical) + ? maxSize.width() : maxSize.height(); + QGridLayoutBox itemBox = box(dynamicConstraintOrientation(), constraint); + if (dynamicConstraintOrientation() == Qt::Vertical) { + maxSize.setHeight(itemBox.q_maximumSize); + } else { + maxSize.setWidth(itemBox.q_maximumSize); + } } - QSizeF size = effectiveMaxSize(constraint).boundedTo(QSizeF(cellWidth, cellHeight)); - width = size.width(); - height = size.height(); + maxSize = maxSize.boundedTo(cellSize); + width = maxSize.width(); + height = maxSize.height(); Qt::Alignment align = q_engine->effectiveAlignment(this); switch (align & Qt::AlignHorizontal_Mask) { case Qt::AlignHCenter: - x += (cellWidth - width)/2; + x += (cellSize.width() - width)/2; break; case Qt::AlignRight: - x += cellWidth - width; + x += cellSize.width() - width; break; default: break; } switch (align & Qt::AlignVertical_Mask) { case Qt::AlignVCenter: - y += (cellHeight - height)/2; + y += (cellSize.height() - height)/2; break; case Qt::AlignBottom: - y += cellHeight - height; + y += cellSize.height() - height; break; default: break; @@ -701,27 +718,17 @@ void QGridLayoutItem::insertOrRemoveRows(int row, int delta, Qt::Orientation ori Note that effectiveSizeHint does not take sizePolicy into consideration, (since it only evaluates the hints, as the name implies) */ -QSizeF QGridLayoutItem::effectiveMaxSize(const QSizeF &constraint) const -{ - QSizeF size = constraint; - bool vGrow = (sizePolicy(Qt::Vertical) & QSizePolicy::GrowFlag) == QSizePolicy::GrowFlag; - bool hGrow = (sizePolicy(Qt::Horizontal) & QSizePolicy::GrowFlag) == QSizePolicy::GrowFlag; - if (!vGrow || !hGrow) { - QSizeF pref = layoutItem()->effectiveSizeHint(Qt::PreferredSize, constraint); - if (!vGrow) - size.setHeight(pref.height()); - if (!hGrow) - size.setWidth(pref.width()); - } - - if (!size.isValid()) { - QSizeF maxSize = layoutItem()->effectiveSizeHint(Qt::MaximumSize, constraint); - if (size.width() == -1) - size.setWidth(maxSize.width()); - if (size.height() == -1) - size.setHeight(maxSize.height()); +qreal QGridLayoutItem::effectiveMaxSize(Qt::Orientation orientation) const +{ + const QSizeF prefSize = sizeHint(Qt::PreferredSize); + const QSizePolicy::Policy policy = sizePolicy(orientation); + QSizeF result; + if (policy & (QSizePolicy::GrowFlag | QSizePolicy::ExpandFlag)) { + result = sizeHint(Qt::MaximumSize); + } else { + result = prefSize; } - return size; + return (orientation == Qt::Horizontal ? result.width() : result.height()); } #ifdef QT_DEBUG diff --git a/src/gui/graphicsview/qgridlayoutengine_p.h b/src/gui/graphicsview/qgridlayoutengine_p.h index 580af7e..f94671f 100644 --- a/src/gui/graphicsview/qgridlayoutengine_p.h +++ b/src/gui/graphicsview/qgridlayoutengine_p.h @@ -292,7 +292,7 @@ public: void setGeometry(const QRectF &rect); void transpose(); void insertOrRemoveRows(int row, int delta, Qt::Orientation orientation = Qt::Vertical); - QSizeF effectiveMaxSize(const QSizeF &constraint) const; + qreal effectiveMaxSize(Qt::Orientation orientation) const; #ifdef QT_DEBUG void dump(int indent = 0) const; diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp index 03c1d5b..3b16580 100644 --- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp +++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp @@ -108,6 +108,7 @@ private slots: void styleInfoLeak(); void task236367_maxSizeHint(); void heightForWidth(); + void PMO_189091(); }; class RectWidget : public QGraphicsWidget @@ -2570,6 +2571,59 @@ void tst_QGraphicsGridLayout::heightForWidth() QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(500, -1)), QSizeF(500, 200)); } +static QSizeF hfw2(Qt::SizeHint /*which*/, const QSizeF &constraint) +{ + return QSizeF(constraint.width(), constraint.width()); +} + +void tst_QGraphicsGridLayout::PMO_189091() +{ + QGraphicsScene scene; + + QGraphicsWidget widget; + widget.setGeometry(0,0,300,600); + + QGraphicsGridLayout *layout = new QGraphicsGridLayout(&widget); + layout->setSpacing(0); + layout->setContentsMargins(0,0,0,0); + layout->setMinimumWidth(300); + + RectWidget *item100 = new RectWidget; + layout->addItem(item100, 0, 0); + item100->setMinimumSize(100,100); + item100->setMaximumSize(100,100); + QSizePolicy sizePolicy = item100->sizePolicy(); + sizePolicy.setHeightForWidth(true); + item100->setSizePolicy(sizePolicy); + item100->setConstraintFunction(hfw2); + + RectWidget *item200 = new RectWidget; + layout->addItem(item200, 1, 0); + item200->setMinimumSize(200,200); + item200->setMaximumSize(200,200); + item200->setSizePolicy(sizePolicy); + item200->setConstraintFunction(hfw2); + + // Place an object with a definite size. Comment these 4 lines out to get NAN positions! + QGraphicsWidget *item300 = new QGraphicsWidget; + item300->setMinimumSize(300,300); + item300->setMaximumSize(300,300); + layout->addItem(item300, 2, 0); + + qApp->processEvents(); + + QCOMPARE(item100->geometry(), QRectF(0, 0, 100, 100)); + QCOMPARE(item200->geometry(), QRectF(0, 100, 200, 200)); + QCOMPARE(item300->geometry(), QRectF(0, 300, 300, 300)); + + layout->setAlignment(item100, Qt::AlignRight); + layout->setAlignment(item200, Qt::AlignCenter); + qApp->processEvents(); + QCOMPARE(item100->geometry(), QRectF(200, 0, 100, 100)); + QCOMPARE(item200->geometry(), QRectF(50, 100, 200, 200)); + QCOMPARE(item300->geometry(), QRectF(0, 300, 300, 300)); + +} QTEST_MAIN(tst_QGraphicsGridLayout) #include "tst_qgraphicsgridlayout.moc" -- 1.7.0.2.msysgit.0