68void QQuickFlexboxLayoutEngine::collectItemSizeHints(QQuickFlexboxLayoutItem *flexItem, QSizeF *sizeHints)
const
70 QQuickLayoutAttached *info =
nullptr;
71 QQuickLayout::effectiveSizeHints_helper(flexItem->quickItem(), sizeHints, &info,
true);
77 if (info->isMarginsSet())
78 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeAll, info->margins());
79 if (info->isLeftMarginSet())
80 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeLeft, info->leftMargin());
81 if (info->isRightMarginSet())
82 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeRight, info->rightMargin());
83 if (info->isTopMarginSet())
84 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeTop, info->topMargin());
85 if (info->isBottomMarginSet())
86 flexItem->setFlexMargin(QQuickFlexboxLayout::EdgeBottom, info->bottomMargin());
97 if (info->isFillWidthSet() || info->isFillHeightSet()) {
99 if (
auto *parentLayoutItem = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem())) {
100 const bool horz = parentLayoutItem->direction() == QQuickFlexboxLayout::Row ||
101 parentLayoutItem->direction() == QQuickFlexboxLayout::RowReverse;
105 if (!info->fillHeight())
106 flexItem->setHeight(sizeHints[Qt::PreferredSize].height());
107 flexItem->setFlexBasis(sizeHints[Qt::PreferredSize].width(), !info->fillWidth());
110 flexItem->setItemGrowAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
113 flexItem->setItemShrinkAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
118 if (!info->fillWidth())
119 flexItem->setWidth(sizeHints[Qt::PreferredSize].width());
120 flexItem->setFlexBasis(sizeHints[Qt::PreferredSize].height(), !info->fillHeight());
123 flexItem->setItemGrowAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
126 flexItem->setItemShrinkAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
133 if ((horz && (qt_is_nan(flexItem->size().height()) && info->fillHeight()))
134 || (!horz && (qt_is_nan(flexItem->size().width()) && info->fillWidth()))) {
135 flexItem->setItemStretchAlongCrossSection();
137 flexItem->inheritItemStretchAlongCrossSection();
153QSizeF QQuickFlexboxLayoutEngine::sizeHint(Qt::SizeHint whichSizeHint)
const
155 QSizeF &askingFor = m_cachedSizeHints[whichSizeHint];
156 if (!askingFor.isValid()) {
157 QSizeF &minS = m_cachedSizeHints[Qt::MinimumSize];
158 QSizeF &prefS = m_cachedSizeHints[Qt::PreferredSize];
159 QSizeF &maxS = m_cachedSizeHints[Qt::MaximumSize];
165 qreal flexColumnGap = 0;
166 qreal flexRowGap = 0;
168 auto *qFlexLayout = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem());
170 flexColumnGap = qFlexLayout->columnGap();
171 flexRowGap = qFlexLayout->rowGap();
172 wrap = qFlexLayout->wrap() != QQuickFlexboxLayout::NoWrap;
175 const int count = itemCount();
176 for (
int i = 0; i < count; ++i) {
177 SizeHints &hints = cachedItemSizeHints(i);
178 auto &flexLayoutItem = m_flexLayoutItems.at(i);
179 flexLayoutItem->setMinSize(hints.min());
180 if (flexLayoutItem->isFlexBasisUndefined()) {
184 if (flexLayoutItem->isItemStreched()) {
191 flexLayoutItem->resetSize();
192 if (qFlexLayout->direction() == QQuickFlexboxLayout::Row ||
193 qFlexLayout->direction() == QQuickFlexboxLayout::RowReverse) {
194 flexLayoutItem->setWidth(hints.pref().width());
196 flexLayoutItem->setHeight(hints.pref().height());
200 flexLayoutItem->setSize(hints.pref());
203 flexLayoutItem->setMaxSize(hints.max());
229 const bool last = (i == count - 1);
230 if (qFlexLayout->direction() == QQuickFlexboxLayout::Row ||
231 qFlexLayout->direction() == QQuickFlexboxLayout::RowReverse) {
234 minS.setWidth(qMax(minS.width(), hints.min().width()));
235 minS.setHeight(qMax(minS.height(), hints.min().height()));
237 prefS.setWidth(prefS.width() + hints.pref().width());
238 prefS.setHeight(qMax(prefS.height(), hints.pref().height()));
240 maxS.setWidth(maxS.width() + hints.max().width());
241 maxS.setHeight(maxS.height() + hints.max().height());
244 prefS.rwidth() += flexColumnGap;
245 maxS.rwidth() += flexColumnGap;
246 maxS.rheight() += flexRowGap;
250 minS.setWidth(minS.width() + hints.min().width());
251 minS.setHeight(qMax(minS.height(), hints.min().height()));
253 prefS.setWidth(prefS.width() + hints.pref().width());
254 prefS.setHeight(qMax(prefS.height(), hints.pref().height()));
256 maxS.setWidth(maxS.width() + hints.max().width());
257 maxS.setHeight(qMax(maxS.height(), hints.max().height()));
260 minS.rwidth() += flexColumnGap;
261 prefS.rwidth() += flexColumnGap;
262 maxS.rwidth() += flexColumnGap;
266 }
else if (qFlexLayout->direction() == QQuickFlexboxLayout::Column ||
267 qFlexLayout->direction() == QQuickFlexboxLayout::ColumnReverse) {
270 minS.setWidth(qMax(minS.width(), hints.min().width()));
271 minS.setHeight(qMax(minS.height(), hints.min().height()));
273 prefS.setWidth(qMax(prefS.width(), hints.pref().width()));
274 prefS.setHeight(prefS.height() + hints.pref().height());
276 maxS.setWidth(maxS.width() + hints.max().width());
277 maxS.setHeight(maxS.height() + hints.max().height());
280 prefS.rheight() += flexRowGap;
281 maxS.rwidth() += flexColumnGap;
282 maxS.rheight() += flexRowGap;
286 minS.setWidth(qMax(minS.width(), hints.min().width()));
287 minS.setHeight(minS.height() + hints.min().height());
289 prefS.setWidth(qMax(prefS.width(), hints.pref().width()));
290 prefS.setHeight(prefS.height() + hints.pref().height());
292 maxS.setWidth(qMax(maxS.width(), hints.max().width()));
293 maxS.setHeight(maxS.height() + hints.max().height());
296 minS.rheight() += flexRowGap;
297 prefS.rheight() += flexRowGap;
298 maxS.rheight() += flexRowGap;
318void QQuickFlexboxLayoutEngine::setGeometries(
const QSizeF &contentSize)
320 m_flexboxParentItem->setSize(contentSize);
321 m_flexboxParentItem->computeLayout(contentSize);
322 for (
auto *item : m_flexLayoutItems) {
323 item->quickItem()->setPosition(item->position());
324 QSizeF oldSize = item->quickItem()->size();
325 QSizeF newSize = item->size();
326 if (oldSize == newSize) {
330 if (
auto *layout = qobject_cast<QQuickLayout *>(item->quickItem())) {
331 if (layout->invalidatedArrangement())
332 layout->rearrange(newSize);
335 item->quickItem()->setSize(newSize);