57QQuickFlexboxLayoutItem *QQuickFlexboxLayoutEngine::findFlexboxLayoutItem(QQuickItem *item)
const
59 if (!item || (m_flexLayoutItems.count() <= 0))
61 auto iterator = std::find_if(m_flexLayoutItems.cbegin(), m_flexLayoutItems.cend(),
62 [item] (QQuickFlexboxLayoutItem *flexLayoutItem){
63 return (flexLayoutItem->quickItem() == item);
65 return (iterator == m_flexLayoutItems.cend()) ?
nullptr : *iterator;
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 if (parentLayoutItem->direction() == QQuickFlexboxLayout::Row ||
101 parentLayoutItem->direction() == QQuickFlexboxLayout::RowReverse) {
104 if (!info->fillHeight())
105 flexItem->setHeight(sizeHints[Qt::PreferredSize].height());
106 flexItem->setFlexBasis(sizeHints[Qt::PreferredSize].width(), !info->fillWidth());
109 flexItem->setItemGrowAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
112 flexItem->setItemShrinkAlongMainAxis(info->fillWidth() ? 1.0f : 0.0f);
117 if (!info->fillWidth())
118 flexItem->setWidth(sizeHints[Qt::PreferredSize].width());
119 flexItem->setFlexBasis(sizeHints[Qt::PreferredSize].height(), !info->fillHeight());
122 flexItem->setItemGrowAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
125 flexItem->setItemShrinkAlongMainAxis(info->fillHeight() ? 1.0f : 0.0f);
133 if ((qt_is_nan(flexItem->size().width()) && info->fillWidth()) ||
134 (qt_is_nan(flexItem->size().height()) && info->fillHeight())) {
135 flexItem->setItemStretchAlongCrossSection();
137 flexItem->inheritItemStretchAlongCrossSection();
152QSizeF QQuickFlexboxLayoutEngine::sizeHint(Qt::SizeHint whichSizeHint)
const
154 QSizeF &askingFor = m_cachedSizeHints[whichSizeHint];
155 if (!askingFor.isValid()) {
156 QSizeF &minS = m_cachedSizeHints[Qt::MinimumSize];
157 QSizeF &prefS = m_cachedSizeHints[Qt::PreferredSize];
158 QSizeF &maxS = m_cachedSizeHints[Qt::MaximumSize];
162 maxS = QSizeF(std::numeric_limits<qreal>::infinity(), std::numeric_limits<qreal>::infinity());
164 const int count = itemCount();
165 for (
int i = 0; i < count; ++i) {
166 SizeHints &hints = cachedItemSizeHints(i);
167 auto &flexLayoutItem = m_flexLayoutItems.at(i);
168 flexLayoutItem->setMinSize(hints.min());
169 if (flexLayoutItem->isFlexBasisUndefined()) {
173 if (flexLayoutItem->isItemStreched()) {
174 if (
auto *parentLayoutItem = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem())) {
180 flexLayoutItem->resetSize();
181 if (parentLayoutItem->direction() == QQuickFlexboxLayout::Row ||
182 parentLayoutItem->direction() == QQuickFlexboxLayout::RowReverse) {
183 flexLayoutItem->setWidth(hints.pref().width());
185 flexLayoutItem->setHeight(hints.pref().height());
189 flexLayoutItem->setSize(hints.pref());
192 flexLayoutItem->setMaxSize(hints.max());
217 if (
auto *qFlexLayout = qobject_cast<QQuickFlexboxLayout *>(m_flexboxParentItem->quickItem())) {
218 if (qFlexLayout->wrap() == QQuickFlexboxLayout::NoWrap) {
219 if (qFlexLayout->direction() == QQuickFlexboxLayout::Row ||
220 qFlexLayout->direction() == QQuickFlexboxLayout::RowReverse) {
222 minS.setWidth(minS.width() + hints.min().width());
223 minS.setHeight(qMax(minS.height(), hints.min().height()));
225 prefS.setWidth(prefS.width() + hints.pref().width());
226 prefS.setHeight(qMax(prefS.height(), hints.pref().height()));
228 maxS.setWidth(maxS.width() + hints.max().width());
229 maxS.setHeight(qMax(maxS.height(), hints.max().height()));
230 }
else if (qFlexLayout->direction() == QQuickFlexboxLayout::Column ||
231 qFlexLayout->direction() == QQuickFlexboxLayout::ColumnReverse) {
233 minS.setWidth(qMax(minS.width(), hints.min().width()));
234 minS.setHeight(minS.height() + hints.min().height());
236 prefS.setWidth(qMax(prefS.width(), hints.pref().width()));
237 prefS.setHeight(prefS.height() + hints.pref().height());
239 maxS.setWidth(qMax(maxS.width(), hints.max().width()));
240 maxS.setHeight(maxS.height() + hints.max().height());
242 }
else if (qFlexLayout->wrap() == QQuickFlexboxLayout::Wrap ||
243 qFlexLayout->wrap() == QQuickFlexboxLayout::WrapReverse) {
245 prefS += hints.pref();
264void QQuickFlexboxLayoutEngine::setGeometries(
const QSizeF &contentSize)
266 m_flexboxParentItem->setSize(contentSize);
267 m_flexboxParentItem->computeLayout(contentSize);
268 for (
auto *item : m_flexLayoutItems) {
269 item->quickItem()->setPosition(item->position());
270 QSizeF oldSize = item->quickItem()->size();
271 QSizeF newSize = item->size();
272 if (oldSize == newSize) {
276 if (
auto *layout = qobject_cast<QQuickLayout *>(item->quickItem())) {
277 if (layout->invalidatedArrangement())
278 layout->rearrange(newSize);
281 item->quickItem()->setSize(newSize);