79class QQuickFlexboxLayoutPrivate :
public QQuickLayoutPrivate
81 Q_DECLARE_PUBLIC(QQuickFlexboxLayout)
84 QQuickFlexboxLayoutPrivate() : QQuickLayoutPrivate() {}
85 const QQuickFlexboxLayoutEngine& getFlexEngine()
const {
return m_flexEngine; }
88 QQuickFlexboxLayoutEngine m_flexEngine;
89 QQuickFlexboxLayout::FlexboxDirection m_direction = QQuickFlexboxLayout::Row;
90 QQuickFlexboxLayout::FlexboxWrap m_wrap = QQuickFlexboxLayout::NoWrap;
91 QQuickFlexboxLayout::FlexboxAlignment m_alignItems = QQuickFlexboxLayout::AlignStart;
94 QQuickFlexboxLayout::FlexboxAlignment m_alignContent = QQuickFlexboxLayout::AlignStretch;
97 QQuickFlexboxLayout::FlexboxJustify m_justifyContent = QQuickFlexboxLayout::JustifyStart;
100 qreal m_columnGap = 0.;
101 std::bitset<QQuickFlexboxLayout::GapMax> m_gapBitSet;
110QQuickFlexboxLayout::QQuickFlexboxLayout(QQuickItem *parent) :
111 QQuickLayout(*
new QQuickFlexboxLayoutPrivate, parent)
113 Q_D(QQuickFlexboxLayout);
114 d->m_flexEngine.setFlexboxParentItem(
new QQuickFlexboxLayoutItem(
this));
231void QQuickFlexboxLayout::setAlignItems(QQuickFlexboxLayout::FlexboxAlignment alignment)
233 Q_D(QQuickFlexboxLayout);
234 if (alignment >= QQuickFlexboxLayout::AlignStretch || alignment <= QQuickFlexboxLayout::AlignAuto) {
235 qWarning(
"Not applicable for Flexbox layout container");
238 if (d->m_alignItems == alignment)
240 d->m_alignItems = alignment;
242 emit alignItemsChanged();
285void QQuickFlexboxLayout::setAlignContent(QQuickFlexboxLayout::FlexboxAlignment alignment)
287 Q_D(QQuickFlexboxLayout);
288 if (alignment == QQuickFlexboxLayout::AlignSpaceEvenly) {
289 qmlWarning(
this) <<
"Currently not supported for Flexbox layout container";
292 if (d->m_alignContent == alignment)
294 d->m_alignContent = alignment;
296 emit alignContentChanged();
336void QQuickFlexboxLayout::setJustifyContent(QQuickFlexboxLayout::FlexboxJustify justifyContent)
338 Q_D(QQuickFlexboxLayout);
339 if (d->m_justifyContent == justifyContent)
341 d->m_justifyContent = justifyContent;
343 emit justifyContentChanged();
464void QQuickFlexboxLayout::updateLayoutItems()
466 Q_D(QQuickFlexboxLayout);
468 d->m_flexEngine.clearItems();
470 if (
auto *flexParentItem = d->m_flexEngine.getFlexboxParentItem()) {
471 flexParentItem->setFlexDirection(d->m_direction);
472 flexParentItem->setFlexWrap(d->m_wrap);
473 flexParentItem->setFlexAlignItemsProperty(d->m_alignItems);
474 flexParentItem->setFlexAlignContentProperty(d->m_alignContent);
475 flexParentItem->setFlexJustifyContentProperty(d->m_justifyContent);
476 if (isGapBitSet(QQuickFlexboxLayout::GapAll))
477 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapAll, d->m_gap);
478 if (isGapBitSet(QQuickFlexboxLayout::GapRow))
479 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapRow, d->m_rowGap);
480 if (isGapBitSet(QQuickFlexboxLayout::GapColumn))
481 flexParentItem->setFlexGap(QQuickFlexboxLayout::GapColumn, d->m_columnGap);
485 const QList<QQuickItem *> items = childItems();
486 for (
auto *childItem : items) {
488 checkAnchors(childItem);
489 if (shouldIgnoreItem(childItem))
492 auto *flexLayoutItem =
new QQuickFlexboxLayoutItem(childItem);
493 if (
auto *flexItemAttachedProperties = attachedFlexboxLayoutObject(childItem))
494 flexLayoutItem->setFlexAlignSelfProperty(flexItemAttachedProperties->alignSelf());
495 d->m_flexEngine.insertItem(flexLayoutItem);
506void QQuickFlexboxLayout::componentComplete()
508 QQuickLayout::componentComplete();
509 ensureLayoutItemsUpdated(ApplySizeHints);
510 if (qobject_cast<QQuickLayout*>(parentItem()))
512 rearrange(QSizeF(width(), height()));
568void QQuickFlexboxLayout::invalidate(QQuickItem *childItem)
570 Q_D(QQuickFlexboxLayout);
571 d->m_flexEngine.invalidateItemSizeHint(childItem);
572 QQuickLayout::invalidate(
this);
573 if (QQuickLayout *parentLayout = qobject_cast<QQuickLayout *>(parentItem()))
574 parentLayout->invalidate(
this);
586void QQuickFlexboxLayout::rearrange(
const QSizeF &newSize)
588 Q_D(QQuickFlexboxLayout);
589 if (newSize.isNull() || !newSize.isValid())
591 d->m_flexEngine.setGeometries(newSize);
592 QQuickLayout::rearrange(newSize);
602QQuickFlexboxLayoutAttached::QQuickFlexboxLayoutAttached(QObject *object)
604 auto item = qobject_cast<QQuickItem*>(object);
606 qmlWarning(object) <<
"FlexboxLayout attached property must be attached to an object deriving from Item";
610 if (
auto flexboxLayout = qobject_cast<QQuickFlexboxLayout*>(item->parentItem())) {
611 if (!flexboxLayout->isComponentComplete()) {
620 flexboxLayout->childItemsChanged();
645void QQuickFlexboxLayoutAttached::setAlignSelf(QQuickFlexboxLayout::FlexboxAlignment alignment)
647 if (m_alignSelf == alignment)
650 m_alignSelf = alignment;
651 const auto *item = qobject_cast<QQuickItem*>(parent());
652 if (
auto *flexLayout = qobject_cast<QQuickFlexboxLayout *>(item->parent())) {
653 auto *priv =
dynamic_cast<QQuickFlexboxLayoutPrivate *>(QQuickLayoutPrivate::get(flexLayout));
654 auto &flexEngine = priv->getFlexEngine();
655 auto *item = qobject_cast<QQuickItem *>(parent());
656 if (
auto *flexLayoutItem = flexEngine.findFlexboxLayoutItem(item)) {
657 flexLayoutItem->setFlexAlignSelfProperty(alignment);
658 flexLayout->invalidate();
661 emit alignSelfChanged();