qreal FlowLayout::doLayout(const QRectF &geom, bool applyNewGeometry) const { qreal left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); const qreal maxw = geom.width() - left - right; qreal x = 0; qreal y = 0; qreal maxRowHeight = 0; QSizeF pref; for (int i = 0; i < m_items.count(); ++i) { QGraphicsLayoutItem *item = m_items.at(i); pref = item->effectiveSizeHint(Qt::PreferredSize); maxRowHeight = qMax(maxRowHeight, pref.height()); qreal next_x; next_x = x + pref.width(); if (next_x > maxw) { if (x == 0) { pref.setWidth(maxw); } else { x = 0; next_x = pref.width(); } y += maxRowHeight + spacing(Qt::Vertical); maxRowHeight = 0; } if (applyNewGeometry) item->setGeometry(QRectF(QPointF(left + x, top + y), pref)); x = next_x + spacing(Qt::Horizontal); } maxRowHeight = qMax(maxRowHeight, pref.height()); return top + y + maxRowHeight + bottom; }
QSizeF FlowLayout::minSize(const QSizeF &constraint) const { QSizeF size(0, 0); qreal left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); if (constraint.width() >= 0) { // height for width const qreal height = doLayout(QRectF(QPointF(0,0), constraint), false); size = QSizeF(constraint.width(), height); } else if (constraint.height() >= 0) { // width for height? // not supported } else { QGraphicsLayoutItem *item; foreach (item, m_items) size = size.expandedTo(item->effectiveSizeHint(Qt::MinimumSize)); size += QSize(left + right, top + bottom); } return size; }
QSizeF FlowLayout::maxSize() const { QGraphicsLayoutItem *item; qreal totalWidth = 0; qreal totalHeight = 0; foreach (item, m_items) { if (totalWidth > 0) totalWidth += spacing(Qt::Horizontal); if (totalHeight > 0) totalHeight += spacing(Qt::Vertical); QSizeF pref = item->effectiveSizeHint(Qt::PreferredSize); totalWidth += pref.width(); totalHeight += pref.height(); } qreal left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); return QSizeF(left + totalWidth + right, top + totalHeight + bottom); }
/*! Returns the minimum sizeHint. */ QSizeF HbListLayoutPrivate::minimumSizeHint() { QSizeF sizeHint(0, 0); if (uniformSizedItems()) { QGraphicsLayoutItem *firstItem = mItems.value(0); if (firstItem) { sizeHint = firstItem->effectiveSizeHint(Qt::MinimumSize); } } else { int itemCount = mItems.count(); for (int i = 0; i < itemCount; ++i) { QSizeF itemSize(0, 0); itemSize = mItems.at(i)->effectiveSizeHint(Qt::MinimumSize); if (itemSize.isValid()) { sizeHint.rwidth() = qMax(itemSize.width(), sizeHint.width()); sizeHint.rheight() = qMax(sizeHint.height(), itemSize.height()); } } } return sizeHint; }
QSizeF FlowLayout::prefSize() const { qreal left, right; getContentsMargins(&left, 0, &right, 0); QGraphicsLayoutItem *item; qreal maxh = 0; qreal totalWidth = 0; foreach (item, m_items) { if (totalWidth > 0) totalWidth += spacing(Qt::Horizontal); QSizeF pref = item->effectiveSizeHint(Qt::PreferredSize); totalWidth += pref.width(); maxh = qMax(maxh, pref.height()); } maxh += spacing(Qt::Vertical); const qreal goldenAspectRatio = 1.61803399; qreal w = qSqrt(totalWidth * maxh * goldenAspectRatio) + left + right; return minSize(QSizeF(w, -1)); }