68void QQuickFlexboxLayoutEngine::collectItemSizeHints(QQuickFlexboxLayoutItem *flexItem, QSizeF *sizeHints)
const
70 QQuickLayoutAttached *info =
nullptr;
71 QQuickLayout::effectiveSizeHints_helper(flexItem->quickItem(), sizeHints, &info,
true);
77 auto m = info->qMargins();
78 const QSizeF margins{m.left() + m.right(), m.top() + m.bottom()};
79 flexItem->cachedItemSizeHints().margins = margins;
81 QSizeF noMarginsHints[Qt::NSizeHints];
82 for (
int i = 0; i < Qt::NSizeHints; ++i)
83 noMarginsHints[i] = sizeHints[i] - margins;
86 if (info->isMarginsSet())
87 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeAll, info->margins());
88 if (info->isLeftMarginSet())
89 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeLeft, info->leftMargin());
90 if (info->isRightMarginSet())
91 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeRight, info->rightMargin());
92 if (info->isTopMarginSet())
93 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeTop, info->topMargin());
94 if (info->isBottomMarginSet())
95 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeBottom, info->bottomMargin());
106 if (info->isFillWidthSet() || info->isFillHeightSet()) {
108 if (
auto *parentLayoutItem = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem())) {
109 const bool horz = parentLayoutItem->direction() == QQuickFlexboxLayout::Row ||
110 parentLayoutItem->direction() == QQuickFlexboxLayout::RowReverse;
114 if (!info->fillHeight())
115 flexItem->setHeight(noMarginsHints[Qt::PreferredSize].height());
116 flexItem->setFlexBasis(noMarginsHints[Qt::PreferredSize].width(), !info->fillWidth());
119 flexItem->setItemGrowAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
122 flexItem->setItemShrinkAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
127 if (!info->fillWidth())
128 flexItem->setWidth(noMarginsHints[Qt::PreferredSize].width());
129 flexItem->setFlexBasis(noMarginsHints[Qt::PreferredSize].height(), !info->fillHeight());
132 flexItem->setItemGrowAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
135 flexItem->setItemShrinkAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
142 if ((horz && (qt_is_nan(flexItem->size().height()) && info->fillHeight()))
143 || (!horz && (qt_is_nan(flexItem->size().width()) && info->fillWidth()))) {
144 flexItem->setItemStretchAlongCrossSection();
146 flexItem->inheritItemStretchAlongCrossSection();
162QSizeF QQuickFlexboxLayoutEngine::sizeHint(Qt::SizeHint whichSizeHint)
const
164 QSizeF &askingFor = m_cachedSizeHints[whichSizeHint];
165 if (!askingFor.isValid()) {
166 QSizeF &minS = m_cachedSizeHints[Qt::MinimumSize];
167 QSizeF &prefS = m_cachedSizeHints[Qt::PreferredSize];
168 QSizeF &maxS = m_cachedSizeHints[Qt::MaximumSize];
174 qreal flexColumnGap = 0;
175 qreal flexRowGap = 0;
177 auto *qFlexLayout = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem());
179 flexColumnGap = qFlexLayout->columnGap();
180 flexRowGap = qFlexLayout->rowGap();
181 wrap = qFlexLayout->wrap() != QQuickFlexboxLayout::NoWrap;
184 const int count = itemCount();
185 for (
int i = 0; i < count; ++i) {
186 SizeHints &hints = cachedItemSizeHints(i);
188 QSizeF noMarginsHints[Qt::NSizeHints];
189 for (
int i = 0; i < Qt::NSizeHints; ++i)
190 noMarginsHints[i] = hints.array[i] - hints.margins;
192 auto &flexLayoutItem = m_flexLayoutItems.at(i);
193 flexLayoutItem->setMinSize(noMarginsHints[Qt::MinimumSize]);
194 if (flexLayoutItem->isFlexBasisUndefined()) {
198 if (flexLayoutItem->isItemStreched()) {
205 flexLayoutItem->resetSize();
206 if (qFlexLayout->direction() == QQuickFlexboxLayout::Row ||
207 qFlexLayout->direction() == QQuickFlexboxLayout::RowReverse) {
208 flexLayoutItem->setWidth(noMarginsHints[Qt::PreferredSize].width());
210 flexLayoutItem->setHeight(noMarginsHints[Qt::PreferredSize].height());
214 flexLayoutItem->setSize(noMarginsHints[Qt::PreferredSize]);
217 flexLayoutItem->setMaxSize(noMarginsHints[Qt::MaximumSize]);
243 const bool last = (i == count - 1);
244 if (qFlexLayout->direction() == QQuickFlexboxLayout::Row ||
245 qFlexLayout->direction() == QQuickFlexboxLayout::RowReverse) {
248 minS.setWidth(qMax(minS.width(), hints.min().width()));
249 minS.setHeight(qMax(minS.height(), hints.min().height()));
251 prefS.setWidth(prefS.width() + hints.pref().width());
252 prefS.setHeight(qMax(prefS.height(), hints.pref().height()));
254 maxS.setWidth(maxS.width() + hints.max().width());
255 maxS.setHeight(maxS.height() + hints.max().height());
258 prefS.rwidth() += flexColumnGap;
259 maxS.rwidth() += flexColumnGap;
260 maxS.rheight() += flexRowGap;
264 minS.setWidth(minS.width() + hints.min().width());
265 minS.setHeight(qMax(minS.height(), hints.min().height()));
267 prefS.setWidth(prefS.width() + hints.pref().width());
268 prefS.setHeight(qMax(prefS.height(), hints.pref().height()));
270 maxS.setWidth(maxS.width() + hints.max().width());
271 maxS.setHeight(qMax(maxS.height(), hints.max().height()));
274 minS.rwidth() += flexColumnGap;
275 prefS.rwidth() += flexColumnGap;
276 maxS.rwidth() += flexColumnGap;
280 }
else if (qFlexLayout->direction() == QQuickFlexboxLayout::Column ||
281 qFlexLayout->direction() == QQuickFlexboxLayout::ColumnReverse) {
284 minS.setWidth(qMax(minS.width(), hints.min().width()));
285 minS.setHeight(qMax(minS.height(), hints.min().height()));
287 prefS.setWidth(qMax(prefS.width(), hints.pref().width()));
288 prefS.setHeight(prefS.height() + hints.pref().height());
290 maxS.setWidth(maxS.width() + hints.max().width());
291 maxS.setHeight(maxS.height() + hints.max().height());
294 prefS.rheight() += flexRowGap;
295 maxS.rwidth() += flexColumnGap;
296 maxS.rheight() += flexRowGap;
300 minS.setWidth(qMax(minS.width(), hints.min().width()));
301 minS.setHeight(minS.height() + hints.min().height());
303 prefS.setWidth(qMax(prefS.width(), hints.pref().width()));
304 prefS.setHeight(prefS.height() + hints.pref().height());
306 maxS.setWidth(qMax(maxS.width(), hints.max().width()));
307 maxS.setHeight(maxS.height() + hints.max().height());
310 minS.rheight() += flexRowGap;
311 prefS.rheight() += flexRowGap;
312 maxS.rheight() += flexRowGap;