lbajardsilogic@164: /**************************************************************************** lbajardsilogic@164: ** lbajardsilogic@164: ** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved. lbajardsilogic@164: ** lbajardsilogic@164: ** This file is part of the example classes of the Qt Toolkit. lbajardsilogic@164: ** lbajardsilogic@164: ** This file may be used under the terms of the GNU General Public lbajardsilogic@164: ** License version 2.0 as published by the Free Software Foundation lbajardsilogic@164: ** and appearing in the file LICENSE.GPL included in the packaging of lbajardsilogic@164: ** this file. Please review the following information to ensure GNU lbajardsilogic@164: ** General Public Licensing requirements will be met: lbajardsilogic@164: ** http://www.trolltech.com/products/qt/opensource.html lbajardsilogic@164: ** lbajardsilogic@164: ** If you are unsure which license is appropriate for your use, please lbajardsilogic@164: ** review the following information: lbajardsilogic@164: ** http://www.trolltech.com/products/qt/licensing.html or contact the lbajardsilogic@164: ** sales department at sales@trolltech.com. lbajardsilogic@164: ** lbajardsilogic@164: ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE lbajardsilogic@164: ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. lbajardsilogic@164: ** lbajardsilogic@164: ****************************************************************************/ lbajardsilogic@164: lbajardsilogic@164: #include lbajardsilogic@164: lbajardsilogic@164: #include "FlowLayout.h" lbajardsilogic@164: lbajardsilogic@164: FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing) lbajardsilogic@164: : QLayout(parent) lbajardsilogic@164: { lbajardsilogic@164: setMargin(margin); lbajardsilogic@164: setSpacing(spacing); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: FlowLayout::FlowLayout(int spacing) lbajardsilogic@164: { lbajardsilogic@164: setSpacing(spacing); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: FlowLayout::~FlowLayout() lbajardsilogic@164: { lbajardsilogic@164: QLayoutItem *item; lbajardsilogic@164: while ((item = takeAt(0))) lbajardsilogic@164: delete item; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: void FlowLayout::addItem(QLayoutItem *item) lbajardsilogic@164: { lbajardsilogic@164: m_itemList.append(item); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: int FlowLayout::count() const lbajardsilogic@164: { lbajardsilogic@164: return m_itemList.size(); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: QLayoutItem *FlowLayout::itemAt(int index) const lbajardsilogic@164: { lbajardsilogic@164: return m_itemList.value(index); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: QLayoutItem *FlowLayout::takeAt(int index) lbajardsilogic@164: { lbajardsilogic@164: if (index >= 0 && index < m_itemList.size()) lbajardsilogic@164: return m_itemList.takeAt(index); lbajardsilogic@164: else lbajardsilogic@164: return 0; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: Qt::Orientations FlowLayout::expandingDirections() const lbajardsilogic@164: { lbajardsilogic@164: return 0; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: bool FlowLayout::hasHeightForWidth() const lbajardsilogic@164: { lbajardsilogic@164: return true; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: int FlowLayout::heightForWidth(int width) const lbajardsilogic@164: { lbajardsilogic@164: int height = doLayout(QRect(0, 0, width, 0), true); lbajardsilogic@164: return height; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: void FlowLayout::setGeometry(const QRect &rect) lbajardsilogic@164: { lbajardsilogic@164: QLayout::setGeometry(rect); lbajardsilogic@164: doLayout(rect, false); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: QSize FlowLayout::sizeHint() const lbajardsilogic@164: { lbajardsilogic@166: return minimumSize(); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: QSize FlowLayout::minimumSize() const lbajardsilogic@164: { lbajardsilogic@164: QSize size; lbajardsilogic@164: QLayoutItem *item; lbajardsilogic@164: QLayoutItem *itemXMax = 0; lbajardsilogic@164: QLayoutItem *itemYMax = 0; lbajardsilogic@164: foreach (item, m_itemList) lbajardsilogic@164: { lbajardsilogic@164: //init itemXMax and itemYMax lbajardsilogic@164: if ((itemXMax == 0) && (itemYMax == 0)) lbajardsilogic@164: { lbajardsilogic@164: itemXMax = item; lbajardsilogic@164: itemYMax = item; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: //find XMax lbajardsilogic@166: if ( (itemXMax->geometry().x() < item->geometry().x()) || lbajardsilogic@166: ( (itemXMax->geometry().x() == item->geometry().x()) && (itemXMax->geometry().width() < item->geometry().width()) ) ) lbajardsilogic@164: { lbajardsilogic@164: itemXMax = item; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: //find YMax lbajardsilogic@166: if ( (itemYMax->geometry().y() < item->geometry().y()) || lbajardsilogic@166: ( (itemYMax->geometry().y() == item->geometry().y()) && (itemYMax->geometry().height() < item->geometry().height()) ) ) lbajardsilogic@164: { lbajardsilogic@164: itemYMax = item; lbajardsilogic@164: } lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: if ((itemXMax != 0) && (itemYMax != 0)) lbajardsilogic@164: size = QSize(itemXMax->geometry().x() + itemXMax->minimumSize().width(), itemYMax->geometry().y() + itemYMax->minimumSize().height()); lbajardsilogic@164: lbajardsilogic@164: size += QSize(2*margin(), 2*margin()); lbajardsilogic@164: return size; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: int FlowLayout::doLayout(const QRect &rect, bool testOnly) const lbajardsilogic@164: { lbajardsilogic@164: int x = rect.x(); lbajardsilogic@164: int y = rect.y(); lbajardsilogic@164: int lineHeight = 0; lbajardsilogic@164: lbajardsilogic@164: QLayoutItem *item; lbajardsilogic@164: foreach (item, m_itemList) { lbajardsilogic@164: int nextX = x + item->sizeHint().width() + spacing(); lbajardsilogic@164: if (nextX - spacing() > rect.right() && lineHeight > 0) { lbajardsilogic@164: x = rect.x(); lbajardsilogic@164: y = y + lineHeight + spacing(); lbajardsilogic@164: nextX = x + item->sizeHint().width() + spacing(); lbajardsilogic@164: lineHeight = 0; lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: if (!testOnly) lbajardsilogic@164: item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); lbajardsilogic@164: lbajardsilogic@164: x = nextX; lbajardsilogic@164: lineHeight = qMax(lineHeight, item->sizeHint().height()); lbajardsilogic@164: } lbajardsilogic@164: lbajardsilogic@164: return y + lineHeight - rect.y(); lbajardsilogic@164: }