41void qGeomCalc(QList<QLayoutStruct> &chain,
int start,
int count,
int pos,
int space,
int spacer)
47 int expandingCount = 0;
49 bool allEmptyNonstretch =
true;
50 int pendingSpacing = -1;
54 for (i = start; i < start + count; i++) {
55 QLayoutStruct *data = &chain[i];
58 cHint += data->smartSizeHint();
59 cMin += data->minimumSize;
60 sumStretch += data->stretch;
63
64
65
66 if (pendingSpacing >= 0) {
67 sumSpacing += pendingSpacing;
70 pendingSpacing = data->effectiveSpacer(spacer);
74 allEmptyNonstretch = allEmptyNonstretch && data->empty && !data->expansive && data->stretch <= 0;
79 if (space < cMin + sumSpacing) {
81
82
84 int minSize = cMin + sumSpacing;
88 spacer = minSize > 0 ? spacer * space / minSize : 0;
89 sumSpacing = spacer * spacerCount;
93 minimumSizes.reserve(count);
95 for (i = start; i < start + count; i++)
96 minimumSizes << chain.at(i).minimumSize;
98 std::sort(minimumSizes.begin(), minimumSizes.end());
100 int space_left = space - sumSpacing;
106 while (idx < count && space_used < space_left) {
107 current = minimumSizes.at(idx);
108 space_used = sum + current * (count - idx);
113 int deficit = space_used - space_left;
115 int items = count - idx;
117
118
119
120
121 int deficitPerItem = deficit/items;
122 int remainder = deficit % items;
123 int maxval = current - deficitPerItem;
126 for (i = start; i < start + count; i++) {
133 QLayoutStruct *data = &chain[i];
134 data->size = qMin(data->minimumSize, maxv);
137 }
else if (space < cHint + sumSpacing) {
139
140
141
142
143
145 int space_left = space - sumSpacing;
146 int overdraft = cHint - space_left;
149 for (i = start; i < start + count; i++) {
150 QLayoutStruct *data = &chain[i];
152 && data->minimumSize >= data->smartSizeHint()) {
153 data->size = data->smartSizeHint();
155 space_left -= data->smartSizeHint();
160 bool finished = n == 0;
166 for (i = start; i < start+count; i++) {
167 QLayoutStruct *data = &chain[i];
175 data->size = data->smartSizeHint() - w;
177 if (data->size < data->minimumSize) {
179 data->size = data->minimumSize;
181 overdraft -= data->smartSizeHint() - data->minimumSize;
190 int space_left = space - sumSpacing;
192 for (i = start; i < start + count; i++) {
193 QLayoutStruct *data = &chain[i];
195 && (data->maximumSize <= data->smartSizeHint()
196 || (!allEmptyNonstretch && data->empty &&
197 !data->expansive && data->stretch == 0))) {
198 data->size = data->smartSizeHint();
200 space_left -= data->size;
201 sumStretch -= data->stretch;
207 extraspace = space_left;
210
211
212
213
214
215
216
217
218
219 int surplus, deficit;
221 surplus = deficit = 0;
224 for (i = start; i < start + count; i++) {
225 QLayoutStruct *data = &chain[i];
229 if (sumStretch > 0) {
230 fp_w += (fp_space * data->stretch) / sumStretch;
231 }
else if (expandingCount > 0) {
232 fp_w += (fp_space * (data->expansive ? 1 : 0)) / expandingCount;
234 fp_w += fp_space * 1 / n;
239 if (w < data->smartSizeHint()) {
240 deficit += data->smartSizeHint() - w;
241 }
else if (w > data->maximumSize) {
242 surplus += w - data->maximumSize;
245 if (deficit > 0 && surplus <= deficit) {
247 for (i = start; i < start+count; i++) {
248 QLayoutStruct *data = &chain[i];
249 if (!data->done && data->size < data->smartSizeHint()) {
250 data->size = data->smartSizeHint();
252 space_left -= data->smartSizeHint();
253 sumStretch -= data->stretch;
260 if (surplus > 0 && surplus >= deficit) {
262 for (i = start; i < start + count; i++) {
263 QLayoutStruct *data = &chain[i];
264 if (!data->done && data->size > data->maximumSize) {
265 data->size = data->maximumSize;
267 space_left -= data->maximumSize;
268 sumStretch -= data->stretch;
275 }
while (n > 0 && surplus != deficit);
277 extraspace = space_left;
281
282
283
284
285
286 int extra = extraspace / (spacerCount + 2);
288 for (i = start; i < start+count; i++) {
289 QLayoutStruct *data = &chain[i];
293 p += data->effectiveSpacer(spacer) + extra;
296#ifdef QLAYOUT_EXTRA_DEBUG
297 qDebug() <<
"qGeomCalc" <<
"start" << start <<
"count" << count <<
"pos" << pos
298 <<
"space" << space <<
"spacer" << spacer;
299 for (i = start; i < start + count; ++i) {
300 qDebug() << i <<
':' << chain[i].minimumSize << chain[i].smartSizeHint()
301 << chain[i].maximumSize <<
"stretch" << chain[i].stretch
302 <<
"empty" << chain[i].empty <<
"expansive" << chain[i].expansive
303 <<
"spacing" << chain[i].spacing;
304 qDebug() <<
"result pos" << chain[i].pos <<
"size" << chain[i].size;
309Q_WIDGETS_EXPORT
QSize qSmartMinSize(
const QSize &sizeHint,
const QSize &minSizeHint,
310 const QSize &minSize,
const QSize &maxSize,
311 const QSizePolicy &sizePolicy)
315 if (sizePolicy.horizontalPolicy() != QSizePolicy::Ignored) {
316 if (sizePolicy.horizontalPolicy() & QSizePolicy::ShrinkFlag)
317 s.setWidth(minSizeHint.width());
319 s.setWidth(qMax(sizeHint.width(), minSizeHint.width()));
322 if (sizePolicy.verticalPolicy() != QSizePolicy::Ignored) {
323 if (sizePolicy.verticalPolicy() & QSizePolicy::ShrinkFlag) {
324 s.setHeight(minSizeHint.height());
326 s.setHeight(qMax(sizeHint.height(), minSizeHint.height()));
330 s = s.boundedTo(maxSize);
331 if (minSize.width() > 0)
332 s.setWidth(minSize.width());
333 if (minSize.height() > 0)
334 s.setHeight(minSize.height());
336 return s.expandedTo(QSize(0,0));
354Q_WIDGETS_EXPORT
QSize qSmartMaxSize(
const QSize &sizeHint,
355 const QSize &minSize,
const QSize &maxSize,
356 const QSizePolicy &sizePolicy, Qt::Alignment align)
358 if (align & Qt::AlignHorizontal_Mask && align & Qt::AlignVertical_Mask)
359 return QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX);
361 QSize hint = sizeHint.expandedTo(minSize);
362 if (s.width() ==
QWIDGETSIZE_MAX && !(align & Qt::AlignHorizontal_Mask))
363 if (!(sizePolicy.horizontalPolicy() & QSizePolicy::GrowFlag))
364 s.setWidth(hint.width());
366 if (s.height() ==
QWIDGETSIZE_MAX && !(align & Qt::AlignVertical_Mask))
367 if (!(sizePolicy.verticalPolicy() & QSizePolicy::GrowFlag))
368 s.setHeight(hint.height());
370 if (align & Qt::AlignHorizontal_Mask)
371 s.setWidth(QLAYOUTSIZE_MAX);
372 if (align & Qt::AlignVertical_Mask)
373 s.setHeight(QLAYOUTSIZE_MAX);