5#include "private/qlayoutengine_p.h"
22 return (
i % 256 < 128) ?
i / 256 : 1 +
i / 256;
46 int expandingCount = 0;
48 bool allEmptyNonstretch =
true;
49 int pendingSpacing = -1;
57 cHint +=
data->smartSizeHint();
58 cMin +=
data->minimumSize;
59 sumStretch +=
data->stretch;
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) {
83 int minSize = cMin + sumSpacing;
87 spacer = minSize > 0 ? spacer * space / minSize : 0;
88 sumSpacing = spacer * spacerCount;
91 QVarLengthArray<int, 32> minimumSizes;
92 minimumSizes.reserve(
count);
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;
120 int deficitPerItem = deficit/
items;
121 int remainder = deficit %
items;
122 int maxval = current - deficitPerItem;
136 }
else if (space < cHint + sumSpacing) {
144 int space_left = space - sumSpacing;
145 int overdraft = cHint - space_left;
151 &&
data->minimumSize >=
data->smartSizeHint()) {
154 space_left -=
data->smartSizeHint();
159 bool finished =
n == 0;
176 if (
data->size <
data->minimumSize) {
180 overdraft -=
data->smartSizeHint() -
data->minimumSize;
189 int space_left = space - sumSpacing;
194 && (
data->maximumSize <=
data->smartSizeHint()
195 || (!allEmptyNonstretch &&
data->empty &&
196 !
data->expansive &&
data->stretch == 0))) {
199 space_left -=
data->size;
200 sumStretch -=
data->stretch;
206 extraspace = space_left;
218 int surplus, deficit;
220 surplus = deficit = 0;
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) {
248 if (!
data->done &&
data->size <
data->smartSizeHint()) {
251 space_left -=
data->smartSizeHint();
252 sumStretch -=
data->stretch;
259 if (surplus > 0 && surplus >= deficit) {
266 space_left -=
data->maximumSize;
267 sumStretch -=
data->stretch;
274 }
while (
n > 0 && surplus != deficit);
276 extraspace = space_left;
285 int extra = extraspace / (spacerCount + 2);
292 p +=
data->effectiveSpacer(spacer) + extra;
295#ifdef QLAYOUT_EXTRA_DEBUG
297 <<
"space" << space <<
"spacer" << spacer;
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;
316 s.setWidth(minSizeHint.width());
318 s.setWidth(
qMax(sizeHint.
width(), minSizeHint.width()));
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());
335 return s.expandedTo(
QSize(0,0));
342 w->minimumSize(),
w->maximumSize(),
349 w->minimumSize(),
w->maximumSize(),
355 const QSizePolicy &sizePolicy, Qt::Alignment align)
363 s.setWidth(
hint.width());
367 s.setHeight(
hint.height());
379 return qSmartMaxSize(
w->sizeHint().expandedTo(
w->minimumSizeHint()),
w->minimumSize(),
w->maximumSize(),
380 w->sizePolicy(), align);
385 return qSmartMaxSize(
w->sizeHint().expandedTo(
w->minimumSizeHint()),
w->minimumSize(),
w->maximumSize(),
386 w->sizePolicy(), align);
The QLayout class is the base class of geometry managers.
QObject * parent() const
Returns a pointer to the parent object.
bool isWidgetType() const
Returns true if the object is a widget; otherwise returns false.
The QSizePolicy class is a layout attribute describing horizontal and vertical resizing policy.
constexpr int height() const noexcept
Returns the height.
constexpr int width() const noexcept
Returns the width.
constexpr QSize expandedTo(const QSize &) const noexcept
Returns a size holding the maximum width and height of this size and the given otherSize.
PixelMetric
This enum describes the various available pixel metrics.
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option=nullptr, const QWidget *widget=nullptr) const =0
Returns the value of the given pixel metric.
Combined button and popup list for selecting options.
Q_WIDGETS_EXPORT QSize qSmartMinSize(const QSize &sizeHint, const QSize &minSizeHint, const QSize &minSize, const QSize &maxSize, const QSizePolicy &sizePolicy)
Q_WIDGETS_EXPORT int qSmartSpacing(const QLayout *layout, QStyle::PixelMetric pm)
void qGeomCalc(QList< QLayoutStruct > &chain, int start, int count, int pos, int space, int spacer)
Q_WIDGETS_EXPORT QSize qSmartMaxSize(const QSize &sizeHint, const QSize &minSize, const QSize &maxSize, const QSizePolicy &sizePolicy, Qt::Alignment align)
static int fRound(Fixed64 i)
static Fixed64 toFixed(int i)
QT_BEGIN_NAMESPACE typedef qint64 Fixed64
QT_BEGIN_NAMESPACE constexpr int QLAYOUTSIZE_MAX
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
GLfloat GLfloat GLfloat w
[0]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)