int GraphicsFlowLayout::doLayout(const QRectF &rect) { double x = rect.x(); double y = rect.y(); double lineHeight = 0; for(int i=0; i < count(); i++) { QGraphicsLayoutItem* item = itemAt(i); int nextX = x + item->preferredSize().width() + spacing(); QSizePolicy policy = item->sizePolicy(); if (item->sizePolicy().horizontalPolicy() == QSizePolicy::Expanding) { int myY = y + lineHeight + spacing() + SpaceBefore; QRectF r(QPoint(rect.x(), myY), item->preferredSize()); item->setGeometry(r); x = rect.x(); y = myY + item->preferredSize().height() + spacing() + SpaceAfter; continue; } if (nextX - spacing() > rect.right() && lineHeight > 0) { x = rect.x(); y = y + lineHeight + spacing(); nextX = x + item->preferredSize().width() + spacing(); lineHeight = 0; } item->setGeometry(QRectF(QPoint(x, y), item->preferredSize())); x = nextX; // item->preferredSize().height() returns qreal, armel compiler complains lineHeight = qMax(lineHeight, (double) item->preferredSize().height()); } m_lastWidth = rect.width(); return y + lineHeight - rect.y(); }
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; }
qreal QGraphicsFlowLayout::doLayout(const QRectF &rect, bool testOnly) const { qreal left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); QRectF effectiveRect = rect.adjusted(+left, +top, -right, -bottom); qreal x = effectiveRect.x(); qreal y = effectiveRect.y(); qreal lineHeight = 0; //! [9] //! [10] QGraphicsLayoutItem *item; foreach (item, m_itemList) { QGraphicsItem *wid = item->graphicsItem(); qreal spaceX = spacing(false); if (spaceX == -1) { } qreal spaceY = spacing(true); if (spaceY == -1) { } //! [10] //! [11] int nextX = x + item->geometry().width() + spaceX; if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { x = effectiveRect.x(); y = y + lineHeight + spaceY; nextX = x + item->geometry().width() + spaceX; lineHeight = 0; } if (!testOnly) item->setGeometry(QRectF(QPointF(x, y), item->geometry().size())); x = nextX; lineHeight = qMax(lineHeight, item->geometry().height()); }
/*! From QGraphicsLayout. */ void HbListLayout::setGeometry( const QRectF &rect ) { QGraphicsLayout::setGeometry(rect); QRectF effectiveRect = geometry(); // TODO: Apply margins? //qreal left, top, right, bottom; //getContentsMargins(&left, &top, &right, &bottom); //effectiveRect.adjust(+left, +top, -right, -bottom); qreal y = effectiveRect.y(); int itemCount = count(); for ( int i = 0; i < itemCount; i++ ) { QGraphicsLayoutItem *item = itemAt( i ); qreal itemHeight = item->preferredHeight(); if (item->graphicsItem()->transform().isScaling()) { itemHeight *= item->graphicsItem()->transform().m22(); } QRectF itemRect(effectiveRect.x(), y, effectiveRect.width(), itemHeight); item->setGeometry(itemRect); y += itemHeight; } }