diff options
author | Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> | 2009-08-17 22:52:17 (GMT) |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> | 2009-08-18 04:24:36 (GMT) |
commit | a5a925748ff3893e4acf2d41bd8aee0d11a3285a (patch) | |
tree | 63bbe23c3f811fd6ab738f42091a54bad125ebf7 | |
parent | f127c4708db2f6825d7b37b9aa5dec52f9ee989c (diff) | |
download | Qt-a5a925748ff3893e4acf2d41bd8aee0d11a3285a.zip Qt-a5a925748ff3893e4acf2d41bd8aee0d11a3285a.tar.gz Qt-a5a925748ff3893e4acf2d41bd8aee0d11a3285a.tar.bz2 |
QGraphicsAnchorLayout: fix calculation of sizeAt* values for Sequential
This commit implements what's described in the previous commit
QGraphicsAnchorLayout: fix expected values for parallel test
When filling the sizeAt* values (the three points used for interpolation
when setting geometry), now sequential anchors distribute the sizes
to the children in a fair way, i.e. proportionally in relation to the
existing min/pref/max hints.
Each value is defined in relation of the pref (either as a shrinkage in
pref or a grow in pref). In both cases the shrinking/growing factor is
the same for all children.
When we implement support for QSizePolicies, this distribution might be
changed by setting size policies for a certain item or anchor.
This makes two tests work -- so no more expected fail. Also fixed a typo
in one test's expected results.
-rw-r--r-- | src/gui/graphicsview/qgraphicsanchorlayout_p.cpp | 80 | ||||
-rw-r--r-- | tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp | 6 |
2 files changed, 75 insertions, 11 deletions
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp index 9f18781..d54ea8d 100644 --- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp +++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp @@ -127,17 +127,83 @@ void ParallelAnchorData::refreshSizeHints(qreal effectiveSpacing) sizeAtMaximum = prefSize; } +static qreal getFactor(qreal value, qreal min, qreal pref, qreal max, bool *minToPref) +{ + // ### Maybe remove some of the assertions? (since outside is asserting us) + Q_ASSERT(value > min || qFuzzyCompare(value, min)); + Q_ASSERT(value < max || qFuzzyCompare(value, max)); + + if (qFuzzyCompare(value, min)) { + *minToPref = true; + return 0.0; + + } else if (qFuzzyCompare(value, pref)) { + *minToPref = true; + return 1.0; + + } else if (qFuzzyCompare(value, max)) { + *minToPref = false; + return 1.0; + + } else if (value < pref) { + *minToPref = true; + // Since value < pref and value != pref and min <= value, + // we can assert that min < pref. + Q_ASSERT(min < pref); + return (value - min) / (pref - min); + + } else { + *minToPref = false; + // Since value > pref and value != pref and max >= value, + // we can assert that max > pref. + Q_ASSERT(max > pref); + return (value - pref) / (max - pref); + } +} + void SequentialAnchorData::updateChildrenSizes() { - qreal minFactor = sizeAtMinimum / minSize; - qreal prefFactor = sizeAtPreferred / prefSize; - qreal maxFactor = sizeAtMaximum / maxSize; + // ### REMOVE ME + // ### check whether we are guarantee to get those or we need to warn stuff at this + // point. + Q_ASSERT(sizeAtMinimum > minSize || qFuzzyCompare(sizeAtMinimum, minSize)); + Q_ASSERT(sizeAtMinimum < maxSize || qFuzzyCompare(sizeAtMinimum, maxSize)); + Q_ASSERT(sizeAtPreferred > minSize || qFuzzyCompare(sizeAtPreferred, minSize)); + Q_ASSERT(sizeAtPreferred < maxSize || qFuzzyCompare(sizeAtPreferred, maxSize)); + Q_ASSERT(sizeAtMaximum > minSize || qFuzzyCompare(sizeAtMaximum, minSize)); + Q_ASSERT(sizeAtMaximum < maxSize || qFuzzyCompare(sizeAtMaximum, maxSize)); + + // Band here refers if the value is in the Minimum To Preferred + // band (the lower band) or the Preferred To Maximum (the upper band). + + bool minLowerBand; + qreal minFactor = getFactor(sizeAtMinimum, minSize, prefSize, maxSize, &minLowerBand); + + bool prefLowerBand; + qreal prefFactor = getFactor(sizeAtPreferred, minSize, prefSize, maxSize, &prefLowerBand); + + bool maxLowerBand; + qreal maxFactor = getFactor(sizeAtMaximum, minSize, prefSize, maxSize, &maxLowerBand); for (int i = 0; i < m_edges.count(); ++i) { - m_edges[i]->sizeAtMinimum = m_edges[i]->minSize * minFactor; - m_edges[i]->sizeAtPreferred = m_edges[i]->prefSize * prefFactor; - m_edges[i]->sizeAtMaximum = m_edges[i]->maxSize * maxFactor; - m_edges[i]->updateChildrenSizes(); + AnchorData *e = m_edges.at(i); + + if (minLowerBand) + e->sizeAtMinimum = e->minSize + ((e->prefSize - e->minSize) * minFactor); + else + e->sizeAtMinimum = e->prefSize + ((e->maxSize - e->prefSize) * minFactor); + + if (prefLowerBand) + e->sizeAtPreferred = e->minSize + ((e->prefSize - e->minSize) * prefFactor); + else + e->sizeAtPreferred = e->prefSize + ((e->maxSize - e->prefSize) * prefFactor); + + if (maxLowerBand) + e->sizeAtMaximum = e->minSize + ((e->prefSize - e->minSize) * maxFactor); + else + e->sizeAtMaximum = e->prefSize + ((e->maxSize - e->prefSize) * maxFactor); + + e->updateChildrenSizes(); } } diff --git a/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp b/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp index 3bab0ce..dcda12d 100644 --- a/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp +++ b/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp @@ -234,7 +234,6 @@ void tst_QGraphicsAnchorLayout::parallel() // solution found by the solver at runtime. p.resize(layoutMaximumSize); QCOMPARE(a->geometry(), QRectF(0, 0, 200, 100)); - QEXPECT_FAIL("", "see commit 23441f49a23cbf936b60140c5c8a6d5cb3ca00a7 for explanation", Abort); QCOMPARE(b->geometry(), QRectF(200, 100, 175, 100)); QCOMPARE(c->geometry(), QRectF(200, 200, 350, 100)); QCOMPARE(d->geometry(), QRectF(375, 300, 175, 100)); @@ -609,9 +608,8 @@ void tst_QGraphicsAnchorLayout::proportionalPreferred() qreal factor = 12.0 / 24.0; QCOMPARE(c->size().width(), d->size().width()); - QEXPECT_FAIL("", "see commit 23441f49a23cbf936b60140c5c8a6d5cb3ca00a7 for explanation", Abort); - QCOMPARE(a->size().width() * factor, 10 * factor); - QCOMPARE(c->size().width() * factor, 14 * factor); + QCOMPARE(a->size().width(), 10 * factor); + QCOMPARE(c->size().width(), 14 * factor); QCOMPARE(p.size(), QSizeF(12, 400)); } |