1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "flowlayout.h"
37 #include <QWidgetItem>
39 using namespace Core::Internal;
41 FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing)
48 FlowLayout::FlowLayout(int spacing)
53 FlowLayout::~FlowLayout()
56 while ((item = takeAt(0)))
60 void FlowLayout::addItem(QLayoutItem *item)
62 itemList.append(item);
65 int FlowLayout::count() const
67 return itemList.size();
70 QLayoutItem *FlowLayout::itemAt(int index) const
72 return itemList.value(index);
75 QLayoutItem *FlowLayout::takeAt(int index)
77 if (index >= 0 && index < itemList.size())
78 return itemList.takeAt(index);
83 Qt::Orientations FlowLayout::expandingDirections() const
88 bool FlowLayout::hasHeightForWidth() const
93 int FlowLayout::heightForWidth(int width) const
95 int height = doLayout(QRect(0, 0, width, 0), true);
99 void FlowLayout::setGeometry(const QRect &rect)
101 QLayout::setGeometry(rect);
102 doLayout(rect, false);
105 QSize FlowLayout::sizeHint() const
107 return minimumSize();
110 QSize FlowLayout::minimumSize() const
113 foreach (QLayoutItem *item, itemList)
114 size = size.expandedTo(item->minimumSize());
116 size += QSize(2 * margin(), 2 * margin());
120 int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
126 foreach (QLayoutItem *item, itemList) {
127 int nextX = x + item->sizeHint().width() + spacing();
128 if (nextX - spacing() > rect.right() && lineHeight > 0) {
130 y = y + lineHeight + spacing();
131 nextX = x + item->sizeHint().width() + spacing();
136 item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
139 lineHeight = qMax(lineHeight, item->sizeHint().height());
141 return y + lineHeight - rect.y() + margin();