82class QQuickFlexboxLayoutPrivate :
public QQuickLayoutPrivate
84 Q_DECLARE_PUBLIC(QQuickFlexboxLayout)
87 QQuickFlexboxLayoutPrivate() : QQuickLayoutPrivate() {}
88 const QQuickFlexboxLayoutEngine& getFlexEngine()
const {
return m_flexEngine; }
91 QQuickFlexboxLayoutEngine m_flexEngine;
92 QQuickFlexboxLayout::FlexboxDirection m_direction = QQuickFlexboxLayout::Row;
93 QQuickFlexboxLayout::FlexboxWrap m_wrap = QQuickFlexboxLayout::NoWrap;
94 QQuickFlexboxLayout::FlexboxAlignment m_alignItems = QQuickFlexboxLayout::AlignStart;
97 QQuickFlexboxLayout::FlexboxAlignment m_alignContent = QQuickFlexboxLayout::AlignStart;
100 QQuickFlexboxLayout::FlexboxJustify m_justifyContent = QQuickFlexboxLayout::JustifyStart;
103 qreal m_columnGap = 0.;
104 std::bitset<QQuickFlexboxLayout::GapMax> m_gapBitSet;
113QQuickFlexboxLayout::QQuickFlexboxLayout(QQuickItem *parent) :
114 QQuickLayout(*
new QQuickFlexboxLayoutPrivate, parent)
116 Q_D(QQuickFlexboxLayout);
117 d->m_flexEngine.setFlexboxParentItem(
new QQuickFlexboxLayoutItem(
this));
234void QQuickFlexboxLayout::setAlignItems(QQuickFlexboxLayout::FlexboxAlignment alignment)
236 Q_D(QQuickFlexboxLayout);
237 if (alignment >= QQuickFlexboxLayout::AlignStretch || alignment <= QQuickFlexboxLayout::AlignAuto) {
238 qWarning(
"Not applicable for Flexbox layout container");
241 if (d->m_alignItems == alignment)
243 d->m_alignItems = alignment;
245 emit alignItemsChanged();
288void QQuickFlexboxLayout::setAlignContent(QQuickFlexboxLayout::FlexboxAlignment alignment)
290 Q_D(QQuickFlexboxLayout);
291 if (alignment == QQuickFlexboxLayout::AlignSpaceEvenly) {
292 qmlWarning(
this) <<
"Currently not supported for Flexbox layout container";
295 if (d->m_alignContent == alignment)
297 d->m_alignContent = alignment;
299 emit alignContentChanged();
339void QQuickFlexboxLayout::setJustifyContent(QQuickFlexboxLayout::FlexboxJustify justifyContent)
341 Q_D(QQuickFlexboxLayout);
342 if (d->m_justifyContent == justifyContent)
344 d->m_justifyContent = justifyContent;
346 emit justifyContentChanged();
467void QQuickFlexboxLayout::updateLayoutItems()
469 Q_D(QQuickFlexboxLayout);
471 d->m_flexEngine.clearItems();
473 if (
auto *flexParentItem = d->m_flexEngine.getFlexboxParentItem()) {
474 flexParentItem->setFlexDirection(d->m_direction);
475 flexParentItem->setFlexWrap(d->m_wrap);
476 flexParentItem->setFlexAlignItemsProperty(d->m_alignItems);
477 flexParentItem->setFlexAlignContentProperty(d->m_alignContent);
478 flexParentItem->setFlexJustifyContentProperty(d->m_justifyContent);
479 if (isGapBitSet(QQuickFlexboxLayout::GapAll))
480 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapAll, d->m_gap);
481 if (isGapBitSet(QQuickFlexboxLayout::GapRow))
482 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapRow, d->m_rowGap);
483 if (isGapBitSet(QQuickFlexboxLayout::GapColumn))
484 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapColumn, d->m_columnGap);
488 const QList<QQuickItem *> items = childItems();
489 for (
auto *childItem : items) {
491 checkAnchors(childItem);
492 if (shouldIgnoreItem(childItem))
495 auto *flexLayoutItem =
new QQuickFlexboxLayoutItem(childItem);
496 if (
auto *flexItemAttachedProperties = attachedFlexboxLayoutObject(childItem))
497 flexLayoutItem->setFlexAlignSelfProperty(flexItemAttachedProperties->alignSelf());
498 d->m_flexEngine.insertItem(flexLayoutItem);
509void QQuickFlexboxLayout::componentComplete()
511 QQuickLayout::componentComplete();
512 ensureLayoutItemsUpdated(ApplySizeHints);
513 if (qobject_cast<QQuickLayout*>(parentItem()))
515 rearrange(QSizeF(width(), height()));
571void QQuickFlexboxLayout::invalidate(QQuickItem *childItem)
573 Q_D(QQuickFlexboxLayout);
574 d->m_flexEngine.invalidateItemSizeHint(childItem);
575 QQuickLayout::invalidate(
this);
576 if (QQuickLayout *parentLayout = qobject_cast<QQuickLayout *>(parentItem()))
577 parentLayout->invalidate(
this);
589void QQuickFlexboxLayout::rearrange(
const QSizeF &newSize)
591 Q_D(QQuickFlexboxLayout);
592 if (newSize.isNull() || !newSize.isValid())
594 d->m_flexEngine.setGeometries(newSize);
595 QQuickLayout::rearrange(newSize);
605QQuickFlexboxLayoutAttached::QQuickFlexboxLayoutAttached(QObject *object)
607 auto item = qobject_cast<QQuickItem*>(object);
609 qmlWarning(object) <<
"FlexboxLayout attached property must be attached to an object deriving from Item";
613 if (
auto flexboxLayout = qobject_cast<QQuickFlexboxLayout*>(item->parentItem())) {
614 if (!flexboxLayout->isComponentComplete()) {
623 flexboxLayout->childItemsChanged();
648void QQuickFlexboxLayoutAttached::setAlignSelf(QQuickFlexboxLayout::FlexboxAlignment alignment)
650 if (m_alignSelf == alignment)
653 m_alignSelf = alignment;
654 const auto *item = qobject_cast<QQuickItem*>(parent());
655 if (
auto *flexLayout = qobject_cast<QQuickFlexboxLayout *>(item->parent())) {
656 auto *priv =
dynamic_cast<QQuickFlexboxLayoutPrivate *>(QQuickLayoutPrivate::get(flexLayout));
657 auto &flexEngine = priv->getFlexEngine();
658 auto *item = qobject_cast<QQuickItem *>(parent());
659 if (
auto *flexLayoutItem = flexEngine.findFlexboxLayoutItem(item)) {
660 flexLayoutItem->setFlexAlignSelfProperty(alignment);
661 flexLayout->invalidate();
664 emit alignSelfChanged();