OSDN Git Service

It's 2011 now.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / coreplugin / flowlayout.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
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
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
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.
24 **
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.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #include "flowlayout.h"
35
36 #include <QRect>
37 #include <QWidgetItem>
38
39 using namespace Core::Internal;
40
41 FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing)
42   : QLayout(parent)
43 {
44     setMargin(margin);
45     setSpacing(spacing);
46 }
47
48 FlowLayout::FlowLayout(int spacing)
49 {
50     setSpacing(spacing);
51 }
52
53 FlowLayout::~FlowLayout()
54 {
55     QLayoutItem *item;
56     while ((item = takeAt(0)))
57         delete item;
58 }
59
60 void FlowLayout::addItem(QLayoutItem *item)
61 {
62     itemList.append(item);
63 }
64
65 int FlowLayout::count() const
66 {
67     return itemList.size();
68 }
69
70 QLayoutItem *FlowLayout::itemAt(int index) const
71 {
72     return itemList.value(index);
73 }
74
75 QLayoutItem *FlowLayout::takeAt(int index)
76 {
77     if (index >= 0 && index < itemList.size())
78         return itemList.takeAt(index);
79     else
80         return 0;
81 }
82
83 Qt::Orientations FlowLayout::expandingDirections() const
84 {
85     return 0;
86 }
87
88 bool FlowLayout::hasHeightForWidth() const
89 {
90     return true;
91 }
92
93 int FlowLayout::heightForWidth(int width) const
94 {
95     int height = doLayout(QRect(0, 0, width, 0), true);
96     return height;
97 }
98
99 void FlowLayout::setGeometry(const QRect &rect)
100 {
101     QLayout::setGeometry(rect);
102     doLayout(rect, false);
103 }
104
105 QSize FlowLayout::sizeHint() const
106 {
107     return minimumSize();
108 }
109
110 QSize FlowLayout::minimumSize() const
111 {
112     QSize size;
113     foreach (QLayoutItem *item, itemList)
114         size = size.expandedTo(item->minimumSize());
115
116     size += QSize(2 * margin(), 2 * margin());
117     return size;
118 }
119
120 int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
121 {
122     int x = rect.x();
123     int y = rect.y();
124     int lineHeight = 0;
125
126     foreach (QLayoutItem *item, itemList) {
127         int nextX = x + item->sizeHint().width() + spacing();
128         if (nextX - spacing() > rect.right() && lineHeight > 0) {
129             x = rect.x();
130             y = y + lineHeight + spacing();
131             nextX = x + item->sizeHint().width() + spacing();
132             lineHeight = 0;
133         }
134
135         if (!testOnly)
136             item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
137
138         x = nextX;
139         lineHeight = qMax(lineHeight, item->sizeHint().height());
140     }
141     return y + lineHeight - rect.y() + margin();
142 }