45 #include <QWidgetItem>
47 #include "flowlayout.h"
48 FlowLayout::FlowLayout(QWidget *parent,
int margin,
int hSpacing,
int vSpacing)
49 : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
51 setContentsMargins(margin, margin, margin, margin);
54 FlowLayout::FlowLayout(
int margin,
int hSpacing,
int vSpacing)
55 : m_hSpace(hSpacing), m_vSpace(vSpacing)
57 setContentsMargins(margin, margin, margin, margin);
60 FlowLayout::~FlowLayout()
63 while ((item = takeAt(0)))
67 void FlowLayout::addItem(QLayoutItem *item)
69 itemList.append(item);
72 int FlowLayout::horizontalSpacing()
const
77 return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
81 int FlowLayout::verticalSpacing()
const
86 return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
90 int FlowLayout::count()
const
92 return itemList.size();
95 QLayoutItem *FlowLayout::itemAt(
int index)
const
97 return itemList.value(index);
100 QLayoutItem *FlowLayout::takeAt(
int index)
102 if (index >= 0 && index < itemList.size())
103 return itemList.takeAt(index);
108 Qt::Orientations FlowLayout::expandingDirections()
const
113 bool FlowLayout::hasHeightForWidth()
const
118 int FlowLayout::heightForWidth(
int width)
const
120 int height = doLayout(QRect(0, 0, width, 0),
true);
124 void FlowLayout::setGeometry(
const QRect &rect)
126 QLayout::setGeometry(rect);
127 doLayout(rect,
false);
130 QSize FlowLayout::sizeHint()
const
132 return minimumSize();
135 QSize FlowLayout::minimumSize()
const
139 foreach (item, itemList)
140 size = size.expandedTo(item->minimumSize());
142 size += QSize(2*margin(), 2*margin());
146 int FlowLayout::doLayout(
const QRect &rect,
bool testOnly)
const
148 int left, top, right, bottom;
149 getContentsMargins(&left, &top, &right, &bottom);
150 QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
151 int x = effectiveRect.x();
152 int y = effectiveRect.y();
156 foreach (item, itemList) {
157 QWidget *wid = item->widget();
158 int spaceX = horizontalSpacing();
160 spaceX = wid->style()->layoutSpacing(
161 QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
162 int spaceY = verticalSpacing();
164 spaceY = wid->style()->layoutSpacing(
165 QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
166 int nextX = x + item->sizeHint().width() + spaceX;
167 if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
168 x = effectiveRect.x();
169 y = y + lineHeight + spaceY;
170 nextX = x + item->sizeHint().width() + spaceX;
175 item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
178 lineHeight = qMax(lineHeight, item->sizeHint().height());
180 return y + lineHeight - rect.y() + bottom;
183 int FlowLayout::smartSpacing(QStyle::PixelMetric pm)
const
185 QObject *parent = this->parent();
188 }
else if (parent->isWidgetType()) {
189 QWidget *pw =
static_cast<QWidget *
>(parent);
190 return pw->style()->pixelMetric(pm, 0, pw);
192 return static_cast<QLayout *
>(parent)->spacing();