lbajardsilogic@164
|
1 /****************************************************************************
|
lbajardsilogic@164
|
2 **
|
lbajardsilogic@164
|
3 ** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.
|
lbajardsilogic@164
|
4 **
|
lbajardsilogic@164
|
5 ** This file is part of the example classes of the Qt Toolkit.
|
lbajardsilogic@164
|
6 **
|
lbajardsilogic@164
|
7 ** This file may be used under the terms of the GNU General Public
|
lbajardsilogic@164
|
8 ** License version 2.0 as published by the Free Software Foundation
|
lbajardsilogic@164
|
9 ** and appearing in the file LICENSE.GPL included in the packaging of
|
lbajardsilogic@164
|
10 ** this file. Please review the following information to ensure GNU
|
lbajardsilogic@164
|
11 ** General Public Licensing requirements will be met:
|
lbajardsilogic@164
|
12 ** http://www.trolltech.com/products/qt/opensource.html
|
lbajardsilogic@164
|
13 **
|
lbajardsilogic@164
|
14 ** If you are unsure which license is appropriate for your use, please
|
lbajardsilogic@164
|
15 ** review the following information:
|
lbajardsilogic@164
|
16 ** http://www.trolltech.com/products/qt/licensing.html or contact the
|
lbajardsilogic@164
|
17 ** sales department at sales@trolltech.com.
|
lbajardsilogic@164
|
18 **
|
lbajardsilogic@164
|
19 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
lbajardsilogic@164
|
20 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
lbajardsilogic@164
|
21 **
|
lbajardsilogic@164
|
22 ****************************************************************************/
|
lbajardsilogic@164
|
23
|
lbajardsilogic@164
|
24 #include <QtGui>
|
lbajardsilogic@164
|
25
|
lbajardsilogic@164
|
26 #include "FlowLayout.h"
|
lbajardsilogic@164
|
27
|
lbajardsilogic@164
|
28 FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing)
|
lbajardsilogic@164
|
29 : QLayout(parent)
|
lbajardsilogic@164
|
30 {
|
lbajardsilogic@164
|
31 setMargin(margin);
|
lbajardsilogic@164
|
32 setSpacing(spacing);
|
lbajardsilogic@164
|
33 }
|
lbajardsilogic@164
|
34
|
lbajardsilogic@164
|
35 FlowLayout::FlowLayout(int spacing)
|
lbajardsilogic@164
|
36 {
|
lbajardsilogic@164
|
37 setSpacing(spacing);
|
lbajardsilogic@164
|
38 }
|
lbajardsilogic@164
|
39
|
lbajardsilogic@164
|
40 FlowLayout::~FlowLayout()
|
lbajardsilogic@164
|
41 {
|
lbajardsilogic@164
|
42 QLayoutItem *item;
|
lbajardsilogic@164
|
43 while ((item = takeAt(0)))
|
lbajardsilogic@164
|
44 delete item;
|
lbajardsilogic@164
|
45 }
|
lbajardsilogic@164
|
46
|
lbajardsilogic@164
|
47 void FlowLayout::addItem(QLayoutItem *item)
|
lbajardsilogic@164
|
48 {
|
lbajardsilogic@164
|
49 m_itemList.append(item);
|
lbajardsilogic@164
|
50 }
|
lbajardsilogic@164
|
51
|
lbajardsilogic@164
|
52 int FlowLayout::count() const
|
lbajardsilogic@164
|
53 {
|
lbajardsilogic@164
|
54 return m_itemList.size();
|
lbajardsilogic@164
|
55 }
|
lbajardsilogic@164
|
56
|
lbajardsilogic@164
|
57 QLayoutItem *FlowLayout::itemAt(int index) const
|
lbajardsilogic@164
|
58 {
|
lbajardsilogic@164
|
59 return m_itemList.value(index);
|
lbajardsilogic@164
|
60 }
|
lbajardsilogic@164
|
61
|
lbajardsilogic@164
|
62 QLayoutItem *FlowLayout::takeAt(int index)
|
lbajardsilogic@164
|
63 {
|
lbajardsilogic@164
|
64 if (index >= 0 && index < m_itemList.size())
|
lbajardsilogic@164
|
65 return m_itemList.takeAt(index);
|
lbajardsilogic@164
|
66 else
|
lbajardsilogic@164
|
67 return 0;
|
lbajardsilogic@164
|
68 }
|
lbajardsilogic@164
|
69
|
lbajardsilogic@164
|
70 Qt::Orientations FlowLayout::expandingDirections() const
|
lbajardsilogic@164
|
71 {
|
lbajardsilogic@164
|
72 return 0;
|
lbajardsilogic@164
|
73 }
|
lbajardsilogic@164
|
74
|
lbajardsilogic@164
|
75 bool FlowLayout::hasHeightForWidth() const
|
lbajardsilogic@164
|
76 {
|
lbajardsilogic@164
|
77 return true;
|
lbajardsilogic@164
|
78 }
|
lbajardsilogic@164
|
79
|
lbajardsilogic@164
|
80 int FlowLayout::heightForWidth(int width) const
|
lbajardsilogic@164
|
81 {
|
lbajardsilogic@164
|
82 int height = doLayout(QRect(0, 0, width, 0), true);
|
lbajardsilogic@164
|
83 return height;
|
lbajardsilogic@164
|
84 }
|
lbajardsilogic@164
|
85
|
lbajardsilogic@164
|
86 void FlowLayout::setGeometry(const QRect &rect)
|
lbajardsilogic@164
|
87 {
|
lbajardsilogic@164
|
88 QLayout::setGeometry(rect);
|
lbajardsilogic@164
|
89 doLayout(rect, false);
|
lbajardsilogic@164
|
90 }
|
lbajardsilogic@164
|
91
|
lbajardsilogic@164
|
92 QSize FlowLayout::sizeHint() const
|
lbajardsilogic@164
|
93 {
|
lbajardsilogic@166
|
94 return minimumSize();
|
lbajardsilogic@164
|
95 }
|
lbajardsilogic@164
|
96
|
lbajardsilogic@164
|
97 QSize FlowLayout::minimumSize() const
|
lbajardsilogic@164
|
98 {
|
lbajardsilogic@164
|
99 QSize size;
|
lbajardsilogic@164
|
100 QLayoutItem *item;
|
lbajardsilogic@164
|
101 QLayoutItem *itemXMax = 0;
|
lbajardsilogic@164
|
102 QLayoutItem *itemYMax = 0;
|
lbajardsilogic@164
|
103 foreach (item, m_itemList)
|
lbajardsilogic@164
|
104 {
|
lbajardsilogic@164
|
105 //init itemXMax and itemYMax
|
lbajardsilogic@164
|
106 if ((itemXMax == 0) && (itemYMax == 0))
|
lbajardsilogic@164
|
107 {
|
lbajardsilogic@164
|
108 itemXMax = item;
|
lbajardsilogic@164
|
109 itemYMax = item;
|
lbajardsilogic@164
|
110 }
|
lbajardsilogic@164
|
111
|
lbajardsilogic@164
|
112 //find XMax
|
lbajardsilogic@166
|
113 if ( (itemXMax->geometry().x() < item->geometry().x()) ||
|
lbajardsilogic@166
|
114 ( (itemXMax->geometry().x() == item->geometry().x()) && (itemXMax->geometry().width() < item->geometry().width()) ) )
|
lbajardsilogic@164
|
115 {
|
lbajardsilogic@164
|
116 itemXMax = item;
|
lbajardsilogic@164
|
117 }
|
lbajardsilogic@164
|
118
|
lbajardsilogic@164
|
119 //find YMax
|
lbajardsilogic@166
|
120 if ( (itemYMax->geometry().y() < item->geometry().y()) ||
|
lbajardsilogic@166
|
121 ( (itemYMax->geometry().y() == item->geometry().y()) && (itemYMax->geometry().height() < item->geometry().height()) ) )
|
lbajardsilogic@164
|
122 {
|
lbajardsilogic@164
|
123 itemYMax = item;
|
lbajardsilogic@164
|
124 }
|
lbajardsilogic@164
|
125 }
|
lbajardsilogic@164
|
126
|
lbajardsilogic@164
|
127 if ((itemXMax != 0) && (itemYMax != 0))
|
lbajardsilogic@164
|
128 size = QSize(itemXMax->geometry().x() + itemXMax->minimumSize().width(), itemYMax->geometry().y() + itemYMax->minimumSize().height());
|
lbajardsilogic@164
|
129
|
lbajardsilogic@164
|
130 size += QSize(2*margin(), 2*margin());
|
lbajardsilogic@164
|
131 return size;
|
lbajardsilogic@164
|
132 }
|
lbajardsilogic@164
|
133
|
lbajardsilogic@164
|
134 int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
|
lbajardsilogic@164
|
135 {
|
lbajardsilogic@164
|
136 int x = rect.x();
|
lbajardsilogic@164
|
137 int y = rect.y();
|
lbajardsilogic@164
|
138 int lineHeight = 0;
|
lbajardsilogic@164
|
139
|
lbajardsilogic@164
|
140 QLayoutItem *item;
|
lbajardsilogic@164
|
141 foreach (item, m_itemList) {
|
lbajardsilogic@164
|
142 int nextX = x + item->sizeHint().width() + spacing();
|
lbajardsilogic@164
|
143 if (nextX - spacing() > rect.right() && lineHeight > 0) {
|
lbajardsilogic@164
|
144 x = rect.x();
|
lbajardsilogic@164
|
145 y = y + lineHeight + spacing();
|
lbajardsilogic@164
|
146 nextX = x + item->sizeHint().width() + spacing();
|
lbajardsilogic@164
|
147 lineHeight = 0;
|
lbajardsilogic@164
|
148 }
|
lbajardsilogic@164
|
149
|
lbajardsilogic@164
|
150 if (!testOnly)
|
lbajardsilogic@164
|
151 item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
|
lbajardsilogic@164
|
152
|
lbajardsilogic@164
|
153 x = nextX;
|
lbajardsilogic@164
|
154 lineHeight = qMax(lineHeight, item->sizeHint().height());
|
lbajardsilogic@164
|
155 }
|
lbajardsilogic@164
|
156
|
lbajardsilogic@164
|
157 return y + lineHeight - rect.y();
|
lbajardsilogic@164
|
158 }
|