40void qGeomCalc(QList<QLayoutStruct> &chain,
int start,
int count,
int pos,
int space,
int spacer)
46 int expandingCount = 0;
48 bool allEmptyNonstretch =
true;
49 int pendingSpacing = -1;
53 for (i = start; i < start + count; i++) {
54 QLayoutStruct *data = &chain[i];
57 cHint += data->smartSizeHint();
58 cMin += data->minimumSize;
59 sumStretch += data->stretch;
62
63
64
65 if (pendingSpacing >= 0) {
66 sumSpacing += pendingSpacing;
69 pendingSpacing = data->effectiveSpacer(spacer);
73 allEmptyNonstretch = allEmptyNonstretch && data->empty && !data->expansive && data->stretch <= 0;
78 if (space < cMin + sumSpacing) {
80
81
83 int minSize = cMin + sumSpacing;
87 spacer = minSize > 0 ? spacer * space / minSize : 0;
88 sumSpacing = spacer * spacerCount;
92 minimumSizes.reserve(count);
94 for (i = start; i < start + count; i++)
95 minimumSizes << chain.at(i).minimumSize;
97 std::sort(minimumSizes.begin(), minimumSizes.end());
99 int space_left = space - sumSpacing;
105 while (idx < count && space_used < space_left) {
106 current = minimumSizes.at(idx);
107 space_used = sum + current * (count - idx);
112 int deficit = space_used - space_left;
114 int items = count - idx;
116
117
118
119
120 int deficitPerItem = deficit/items;
121 int remainder = deficit % items;
122 int maxval = current - deficitPerItem;
125 for (i = start; i < start + count; i++) {
132 QLayoutStruct *data = &chain[i];
133 data->size = qMin(data->minimumSize, maxv);
136 }
else if (space < cHint + sumSpacing) {
138
139
140
141
142
144 int space_left = space - sumSpacing;
145 int overdraft = cHint - space_left;
148 for (i = start; i < start + count; i++) {
149 QLayoutStruct *data = &chain[i];
151 && data->minimumSize >= data->smartSizeHint()) {
152 data->size = data->smartSizeHint();
154 space_left -= data->smartSizeHint();
159 bool finished = n == 0;
165 for (i = start; i < start+count; i++) {
166 QLayoutStruct *data = &chain[i];
174 data->size = data->smartSizeHint() - w;
176 if (data->size < data->minimumSize) {
178 data->size = data->minimumSize;
180 overdraft -= data->smartSizeHint() - data->minimumSize;
189 int space_left = space - sumSpacing;
191 for (i = start; i < start + count; i++) {
192 QLayoutStruct *data = &chain[i];
194 && (data->maximumSize <= data->smartSizeHint()
195 || (!allEmptyNonstretch && data->empty &&
196 !data->expansive && data->stretch == 0))) {
197 data->size = data->smartSizeHint();
199 space_left -= data->size;
200 sumStretch -= data->stretch;
206 extraspace = space_left;
209
210
211
212
213
214
215
216
217
218 int surplus, deficit;
220 surplus = deficit = 0;
223 for (i = start; i < start + count; i++) {
224 QLayoutStruct *data = &chain[i];
228 if (sumStretch > 0) {
229 fp_w += (fp_space * data->stretch) / sumStretch;
230 }
else if (expandingCount > 0) {
231 fp_w += (fp_space * (data->expansive ? 1 : 0)) / expandingCount;
233 fp_w += fp_space * 1 / n;
238 if (w < data->smartSizeHint()) {
239 deficit += data->smartSizeHint() - w;
240 }
else if (w > data->maximumSize) {
241 surplus += w - data->maximumSize;
244 if (deficit > 0 && surplus <= deficit) {
246 for (i = start; i < start+count; i++) {
247 QLayoutStruct *data = &chain[i];
248 if (!data->done && data->size < data->smartSizeHint()) {
249 data->size = data->smartSizeHint();
251 space_left -= data->smartSizeHint();
252 sumStretch -= data->stretch;
259 if (surplus > 0 && surplus >= deficit) {
261 for (i = start; i < start + count; i++) {
262 QLayoutStruct *data = &chain[i];
263 if (!data->done && data->size > data->maximumSize) {
264 data->size = data->maximumSize;
266 space_left -= data->maximumSize;
267 sumStretch -= data->stretch;
274 }
while (n > 0 && surplus != deficit);
276 extraspace = space_left;
280
281
282
283
284
285 int extra = extraspace / (spacerCount + 2);
287 for (i = start; i < start+count; i++) {
288 QLayoutStruct *data = &chain[i];
292 p += data->effectiveSpacer(spacer) + extra;
295#ifdef QLAYOUT_EXTRA_DEBUG
296 qDebug() <<
"qGeomCalc" <<
"start" << start <<
"count" << count <<
"pos" << pos
297 <<
"space" << space <<
"spacer" << spacer;
298 for (i = start; i < start + count; ++i) {
299 qDebug() << i <<
':' << chain[i].minimumSize << chain[i].smartSizeHint()
300 << chain[i].maximumSize <<
"stretch" << chain[i].stretch
301 <<
"empty" << chain[i].empty <<
"expansive" << chain[i].expansive
302 <<
"spacing" << chain[i].spacing;
303 qDebug() <<
"result pos" << chain[i].pos <<
"size" << chain[i].size;
308Q_WIDGETS_EXPORT
QSize qSmartMinSize(
const QSize &sizeHint,
const QSize &minSizeHint,
309 const QSize &minSize,
const QSize &maxSize,
310 const QSizePolicy &sizePolicy)
314 if (sizePolicy.horizontalPolicy() != QSizePolicy::Ignored) {
315 if (sizePolicy.horizontalPolicy() & QSizePolicy::ShrinkFlag)
316 s.setWidth(minSizeHint.width());
318 s.setWidth(qMax(sizeHint.width(), minSizeHint.width()));
321 if (sizePolicy.verticalPolicy() != QSizePolicy::Ignored) {
322 if (sizePolicy.verticalPolicy() & QSizePolicy::ShrinkFlag) {
323 s.setHeight(minSizeHint.height());
325 s.setHeight(qMax(sizeHint.height(), minSizeHint.height()));
329 s = s.boundedTo(maxSize);
330 if (minSize.width() > 0)
331 s.setWidth(minSize.width());
332 if (minSize.height() > 0)
333 s.setHeight(minSize.height());
335 return s.expandedTo(QSize(0,0));
353Q_WIDGETS_EXPORT
QSize qSmartMaxSize(
const QSize &sizeHint,
354 const QSize &minSize,
const QSize &maxSize,
355 const QSizePolicy &sizePolicy, Qt::Alignment align)
357 if (align & Qt::AlignHorizontal_Mask && align & Qt::AlignVertical_Mask)
358 return QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX);
360 QSize hint = sizeHint.expandedTo(minSize);
361 if (s.width() ==
QWIDGETSIZE_MAX && !(align & Qt::AlignHorizontal_Mask))
362 if (!(sizePolicy.horizontalPolicy() & QSizePolicy::GrowFlag))
363 s.setWidth(hint.width());
365 if (s.height() ==
QWIDGETSIZE_MAX && !(align & Qt::AlignVertical_Mask))
366 if (!(sizePolicy.verticalPolicy() & QSizePolicy::GrowFlag))
367 s.setHeight(hint.height());
369 if (align & Qt::AlignHorizontal_Mask)
370 s.setWidth(QLAYOUTSIZE_MAX);
371 if (align & Qt::AlignVertical_Mask)
372 s.setHeight(QLAYOUTSIZE_MAX);