Also cache totalBoxes if we have HFW/WFH
Change-Id: Iea71c11b88df84b9c0949b1020a6bcc5395d62de Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
This commit is contained in:
parent
718c5eafa0
commit
b72880d213
@ -983,9 +983,10 @@ void QGridLayoutEngine::invalidate()
|
|||||||
q_cachedEffectiveFirstRows[Ver] = -1;
|
q_cachedEffectiveFirstRows[Ver] = -1;
|
||||||
q_cachedEffectiveLastRows[Hor] = -1;
|
q_cachedEffectiveLastRows[Hor] = -1;
|
||||||
q_cachedEffectiveLastRows[Ver] = -1;
|
q_cachedEffectiveLastRows[Ver] = -1;
|
||||||
q_totalBoxesValid = false;
|
|
||||||
q_sizeHintValid[Hor] = false;
|
q_totalBoxCachedConstraints[Hor] = NotCached;
|
||||||
q_sizeHintValid[Ver] = false;
|
q_totalBoxCachedConstraints[Ver] = NotCached;
|
||||||
|
|
||||||
q_cachedSize = QSizeF();
|
q_cachedSize = QSizeF();
|
||||||
q_cachedConstraintOrientation = UnknownConstraint;
|
q_cachedConstraintOrientation = UnknownConstraint;
|
||||||
}
|
}
|
||||||
@ -1530,7 +1531,11 @@ void QGridLayoutEngine::ensureColumnAndRowData(QGridLayoutRowData *rowData, QGri
|
|||||||
const QAbstractLayoutStyleInfo *styleInfo) const
|
const QAbstractLayoutStyleInfo *styleInfo) const
|
||||||
{
|
{
|
||||||
const int o = (orientation == Qt::Vertical ? Ver : Hor);
|
const int o = (orientation == Qt::Vertical ? Ver : Hor);
|
||||||
if (q_sizeHintValid[o] && !colPositions && !colSizes) {
|
const int cc = columnCount(orientation);
|
||||||
|
|
||||||
|
const qreal constraint = (colPositions && colSizes && hasDynamicConstraint()) ? (colPositions[cc - 1] + colSizes[cc - 1]) : qreal(CachedWithNoConstraint);
|
||||||
|
qreal &cachedConstraint = q_totalBoxCachedConstraints[o];
|
||||||
|
if (cachedConstraint == constraint) {
|
||||||
if (totalBox != &q_totalBoxes[o])
|
if (totalBox != &q_totalBoxes[o])
|
||||||
*totalBox = q_totalBoxes[o];
|
*totalBox = q_totalBoxes[o];
|
||||||
return;
|
return;
|
||||||
@ -1541,10 +1546,10 @@ void QGridLayoutEngine::ensureColumnAndRowData(QGridLayoutRowData *rowData, QGri
|
|||||||
rowData->distributeMultiCells(rowInfo);
|
rowData->distributeMultiCells(rowInfo);
|
||||||
*totalBox = rowData->totalBox(0, rowCount(orientation));
|
*totalBox = rowData->totalBox(0, rowCount(orientation));
|
||||||
|
|
||||||
if (!colPositions && !colSizes) {
|
if (totalBox != &q_totalBoxes[o])
|
||||||
q_totalBoxes[o] = *totalBox;
|
q_totalBoxes[o] = *totalBox;
|
||||||
q_sizeHintValid[o] = true;
|
|
||||||
}
|
cachedConstraint = constraint;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1593,10 +1598,9 @@ Qt::Orientation QGridLayoutEngine::constraintOrientation() const
|
|||||||
void QGridLayoutEngine::ensureGeometries(const QSizeF &size,
|
void QGridLayoutEngine::ensureGeometries(const QSizeF &size,
|
||||||
const QAbstractLayoutStyleInfo *styleInfo) const
|
const QAbstractLayoutStyleInfo *styleInfo) const
|
||||||
{
|
{
|
||||||
if (!styleInfo->hasChanged() && q_totalBoxesValid && q_cachedSize == size)
|
if (!styleInfo->hasChanged() && q_cachedSize == size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
q_totalBoxesValid = true;
|
|
||||||
q_cachedSize = size;
|
q_cachedSize = size;
|
||||||
|
|
||||||
q_xx.resize(columnCount());
|
q_xx.resize(columnCount());
|
||||||
@ -1606,7 +1610,7 @@ void QGridLayoutEngine::ensureGeometries(const QSizeF &size,
|
|||||||
q_descents.resize(rowCount());
|
q_descents.resize(rowCount());
|
||||||
|
|
||||||
if (constraintOrientation() != Qt::Horizontal) {
|
if (constraintOrientation() != Qt::Horizontal) {
|
||||||
//We might have items whose width depends on their height
|
//We might have items whose height depends on their width (HFW)
|
||||||
ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], NULL, NULL, Qt::Horizontal, styleInfo);
|
ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], NULL, NULL, Qt::Horizontal, styleInfo);
|
||||||
//Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
|
//Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
|
||||||
//constraints to find the row heights
|
//constraints to find the row heights
|
||||||
@ -1617,7 +1621,7 @@ void QGridLayoutEngine::ensureGeometries(const QSizeF &size,
|
|||||||
q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
|
q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
|
||||||
q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
|
q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
|
||||||
} else {
|
} else {
|
||||||
//We have items whose height depends on their width
|
//We have items whose width depends on their height (WFH)
|
||||||
ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], NULL, NULL, Qt::Vertical, styleInfo);
|
ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], NULL, NULL, Qt::Vertical, styleInfo);
|
||||||
//Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
|
//Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
|
||||||
//constraints to find the column widths
|
//constraints to find the column widths
|
||||||
|
@ -450,15 +450,21 @@ private:
|
|||||||
mutable int q_cachedEffectiveLastRows[NOrientations];
|
mutable int q_cachedEffectiveLastRows[NOrientations];
|
||||||
mutable quint8 q_cachedConstraintOrientation : 3;
|
mutable quint8 q_cachedConstraintOrientation : 3;
|
||||||
|
|
||||||
|
// this is useful to cache
|
||||||
|
mutable QGridLayoutBox q_totalBoxes[NOrientations];
|
||||||
|
enum {
|
||||||
|
NotCached = -2, // Cache is empty. Happens when the engine is invalidated.
|
||||||
|
CachedWithNoConstraint = -1 // cache has a totalBox without any HFW/WFH constraints.
|
||||||
|
// >= 0 // cache has a totalBox with this specific constraint.
|
||||||
|
};
|
||||||
|
mutable qreal q_totalBoxCachedConstraints[NOrientations]; // holds the constraint used for the cached totalBox
|
||||||
|
|
||||||
// Layout item input
|
// Layout item input
|
||||||
mutable QGridLayoutRowData q_columnData;
|
mutable QGridLayoutRowData q_columnData;
|
||||||
mutable QGridLayoutRowData q_rowData;
|
mutable QGridLayoutRowData q_rowData;
|
||||||
mutable QGridLayoutBox q_totalBoxes[NOrientations];
|
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
mutable QSizeF q_cachedSize;
|
mutable QSizeF q_cachedSize;
|
||||||
mutable bool q_totalBoxesValid;
|
|
||||||
mutable bool q_sizeHintValid[NOrientations];
|
|
||||||
mutable QVector<qreal> q_xx;
|
mutable QVector<qreal> q_xx;
|
||||||
mutable QVector<qreal> q_yy;
|
mutable QVector<qreal> q_yy;
|
||||||
mutable QVector<qreal> q_widths;
|
mutable QVector<qreal> q_widths;
|
||||||
|
Loading…
Reference in New Issue
Block a user