8static qreal width(QQStyleKitLayoutItem *li, qreal availableWidth = .0)
12 QQuickItem *item = li->item();
13 qreal w = item->implicitWidth();
15 w = qMax(.0, availableWidth - li->margins().left() - li->margins().right());
19static qreal height(QQStyleKitLayoutItem *li, qreal availableHeight = .0)
23 QQuickItem *item = li->item();
24 qreal h = item->implicitHeight();
26 h = qMax(.0, availableHeight - li->margins().top() - li->margins().bottom());
33 for (QQStyleKitLayoutItem *li : items) {
34 if (li->item() && li->item()->isVisible())
35 total += width(li) + li->margins().left() + li->margins().right() + spacing;
43 for (QQStyleKitLayoutItem *li : items) {
44 if (li->item() && li->item()->isVisible()) {
45 const qreal h = height(li) + li->margins().top() + li->margins().bottom();
53static qreal vAlignY(QQStyleKitLayoutItem *li, qreal containerY, qreal containerHeight)
58 const auto itemHeight = height(li, containerHeight);
59 const auto vAlign = li->alignment() & Qt::AlignVertical_Mask;
60 const auto margins = li->margins();
63 return containerY + margins.top();
65 return containerY + containerHeight - itemHeight - margins.bottom();
67 return containerY + margins.top()
68 + (containerHeight - margins.top() - margins.bottom() - itemHeight) / 2.0;
72QQStyleKitLayoutItem::QQStyleKitLayoutItem(QObject *parent)
77QQuickItem *QQStyleKitLayoutItem::item()
const
82void QQStyleKitLayoutItem::setItem(QQuickItem *item)
88 disconnect(m_item,
nullptr,
this,
nullptr);
92 connect(m_item, &QQuickItem::implicitWidthChanged,
this, [
this]() { emit itemChanged(); });
93 connect(m_item, &QQuickItem::implicitHeightChanged,
this, [
this]() { emit itemChanged(); });
94 connect(m_item, &QQuickItem::visibleChanged,
this, [
this]() { emit itemChanged(); });
100qreal QQStyleKitLayoutItem::x()
const
105void QQStyleKitLayoutItem::setX(qreal x)
107 if (qFuzzyCompare(m_x, x))
114qreal QQStyleKitLayoutItem::y()
const
119void QQStyleKitLayoutItem::setY(qreal y)
121 if (qFuzzyCompare(m_y, y))
128qreal QQStyleKitLayoutItem::width()
const
133void QQStyleKitLayoutItem::setWidth(qreal width)
135 if (qFuzzyCompare(m_width, width))
142qreal QQStyleKitLayoutItem::height()
const
147void QQStyleKitLayoutItem::setHeight(qreal height)
149 if (qFuzzyCompare(m_height, height))
153 emit heightChanged();
156Qt::Alignment QQStyleKitLayoutItem::alignment()
const
161void QQStyleKitLayoutItem::setAlignment(Qt::Alignment alignment)
163 if (m_alignment == alignment)
166 m_alignment = alignment;
167 emit alignmentChanged();
170QMarginsF QQStyleKitLayoutItem::margins()
const
175void QQStyleKitLayoutItem::setMargins(
const QMarginsF &margins)
177 if (m_margins == margins)
181 emit marginsChanged();
184bool QQStyleKitLayoutItem::fillWidth()
const
189void QQStyleKitLayoutItem::setFillWidth(
bool fill)
191 if (m_fillWidth == fill)
195 emit fillWidthChanged();
198bool QQStyleKitLayoutItem::fillHeight()
const
203void QQStyleKitLayoutItem::setFillHeight(
bool fill)
205 if (m_fillHeight == fill)
209 emit fillHeightChanged();
216 , m_updatingLayout(
false)
218 m_updateTimer.setSingleShot(
true);
219 connect(&m_updateTimer, &QTimer::timeout,
this, &
QQStyleKitLayout::updateLayout);
229 if (m_container == container)
232 m_container = container;
233 emit containerChanged();
234 connect(m_container, &QQuickItem::widthChanged,
this, &
QQStyleKitLayout::scheduleUpdate);
235 connect(m_container, &QQuickItem::heightChanged,
this, &
QQStyleKitLayout::scheduleUpdate);
242 return QQmlListProperty<QQStyleKitLayoutItem>(
const_cast<
QQStyleKitLayout *>(
this),
244 &QQStyleKitLayout::layoutItem_append,
245 &QQStyleKitLayout::layoutItem_count,
246 &QQStyleKitLayout::layoutItem_at,
247 &QQStyleKitLayout::layoutItem_clear);
250void QQStyleKitLayout::layoutItem_append(QQmlListProperty<QQStyleKitLayoutItem> *list, QQStyleKitLayoutItem *item)
253 if (layout && item) {
254 layout->m_layoutItems.append(item);
255 connect(item, &QQStyleKitLayoutItem::itemChanged, layout, &
QQStyleKitLayout::scheduleUpdate);
256 connect(item, &QQStyleKitLayoutItem::alignmentChanged, layout, &
QQStyleKitLayout::scheduleUpdate);
257 connect(item, &QQStyleKitLayoutItem::marginsChanged, layout, &
QQStyleKitLayout::scheduleUpdate);
258 connect(item, &QQStyleKitLayoutItem::fillWidthChanged, layout, &
QQStyleKitLayout::scheduleUpdate);
259 connect(item, &QQStyleKitLayoutItem::fillHeightChanged, layout, &
QQStyleKitLayout::scheduleUpdate);
260 emit layout->layoutItemsChanged();
261 layout->scheduleUpdate();
265qsizetype
QQStyleKitLayout::layoutItem_count(QQmlListProperty<QQStyleKitLayoutItem> *list)
269 return layout->m_layoutItems.size();
273QQStyleKitLayoutItem *
QQStyleKitLayout::layoutItem_at(QQmlListProperty<QQStyleKitLayoutItem> *list, qsizetype index)
277 return layout->m_layoutItems.value(index);
281void QQStyleKitLayout::layoutItem_clear(QQmlListProperty<QQStyleKitLayoutItem> *list)
285 layout->m_layoutItems.clear();
286 emit layout->layoutItemsChanged();
287 layout->scheduleUpdate();
298 return m_contentMargins;
303 if (m_contentMargins == margins)
306 m_contentMargins = margins;
307 emit contentMarginsChanged();
318 if (qFuzzyCompare(m_spacing, spacing))
322 emit spacingChanged();
333 if (m_mirrored == mirrored)
336 m_mirrored = mirrored;
337 emit mirroredChanged();
343 return m_implicitWidth;
348 return m_implicitHeight;
353 if (qFuzzyCompare(m_implicitWidth, width))
356 m_implicitWidth = width;
357 emit implicitWidthChanged();
363 if (qFuzzyCompare(m_implicitHeight, height))
366 m_implicitHeight = height;
367 emit implicitHeightChanged();
378 if (m_enabled == enabled)
382 emit enabledChanged();
393 if (!m_container || m_container->width() <= 0 || m_container->height() <= 0)
396 if (m_updatingLayout)
398 m_updatingLayout =
true;
400 QList<QQStyleKitLayoutItem *> left;
401 QList<QQStyleKitLayoutItem *> right;
402 QList<QQStyleKitLayoutItem *> center;
404 for (QQStyleKitLayoutItem *li : m_layoutItems) {
405 if (!li->item() || !li->item()->isVisible())
407 const auto hAlign = li->alignment() & Qt::AlignHorizontal_Mask;
408 const bool isMirrored = m_mirrored && !(hAlign & Qt::AlignAbsolute);
428 const qreal containerWidth = m_container->width() ? m_container->width() : m_container->implicitWidth();
429 const qreal containerHeight = m_container->height() ? m_container->height() : m_container->implicitHeight();
430 const qreal paddedX = m_contentMargins.left();
431 const qreal paddedY = m_contentMargins.top();
432 const qreal paddedWidth = qMax(containerWidth - m_contentMargins.left() - m_contentMargins.right(), .0);
433 const qreal paddedHeight = qMax(containerHeight - m_contentMargins.top() - m_contentMargins.bottom(), .0);
438 for (QQStyleKitLayoutItem *li : left) {
439 QQuickItem *item = li->item();
440 if (!item || !item->isVisible())
443 const QMarginsF margins = li->margins();
444 const qreal itemWidth = width(li, paddedWidth);
445 const qreal itemHeight = height(li, paddedHeight);
446 auto y = vAlignY(li, paddedY, paddedHeight);
447 li->setX(x + margins.left());
449 li->setWidth(itemWidth);
450 li->setHeight(itemHeight);
451 x += itemWidth + margins.left() + margins.right() + m_spacing;
457 qreal x = paddedX + paddedWidth;
458 for (QQStyleKitLayoutItem *li : right) {
459 QQuickItem *item = li->item();
460 if (!item || !item->isVisible())
463 const QMarginsF margins = li->margins();
464 const qreal itemWidth = width(li, paddedWidth);
465 const qreal itemHeight = height(li, paddedHeight);
466 x -= itemWidth + margins.right() + margins.left();
467 auto y = vAlignY(li, paddedY, paddedHeight);
468 li->setX(x + margins.left());
470 li->setWidth(itemWidth);
471 li->setHeight(itemHeight);
478 qreal x = paddedX + (paddedWidth - totalWidth(center, m_spacing)) / 2;
479 for (QQStyleKitLayoutItem *li : center) {
480 QQuickItem *item = li->item();
481 if (!item || !item->isVisible())
484 const QMarginsF margins = li->margins();
485 const qreal itemWidth = width(li, paddedWidth);
486 const qreal itemHeight = height(li, paddedHeight);
487 auto y = vAlignY(li, paddedY, paddedHeight);
488 li->setX(x + margins.left());
490 li->setWidth(itemWidth);
491 li->setHeight(itemHeight);
492 x += itemWidth + margins.left() + margins.right() + m_spacing;
496 const auto leftWidth = totalWidth(left, m_spacing);
497 const auto leftHeight = totalHeight(left);
498 const auto rightWidth = totalWidth(right, m_spacing);
499 const auto rightHeight = totalHeight(right);
500 const auto centerWidth = totalWidth(center, m_spacing);
501 const auto centerHeight = totalHeight(center);
503 const auto implicitWidth = leftWidth + rightWidth + centerWidth
504 - m_spacing * (left.isEmpty() ? 0 : 1)
505 - m_spacing * (right.isEmpty() ? 0 : 1)
506 - m_spacing * (center.isEmpty() ? 0 : 1)
507 + m_contentMargins.left() + m_contentMargins.right();
508 setImplicitWidth(implicitWidth);
509 const auto implicitHeight = qMax(qMax(leftHeight, rightHeight), centerHeight)
510 + m_contentMargins.top() + m_contentMargins.bottom();
511 setImplicitHeight(implicitHeight);
516 auto leftPadding = m_contentMargins.left() + leftWidth;
517 auto topPadding = m_contentMargins.top();
518 auto rightPadding = m_contentMargins.right() + rightWidth;
519 auto bottomPadding = m_contentMargins.bottom();
521 std::swap(leftPadding, rightPadding);
522 QMarginsF newPadding = QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding);
523 if (m_padding != newPadding) {
524 m_padding = newPadding;
525 emit paddingChanged();
527 m_updatingLayout =
false;
532 if (!m_updateTimer.isActive())
533 m_updateTimer.start(0);
538#include "moc_qqstylekitlayout_p.cpp"
void setImplicitHeight(qreal height)
QMarginsF padding() const
void setSpacing(qreal spacing)
qreal implicitHeight() const
qreal implicitWidth() const
QMarginsF contentMargins() const
void setContentMargins(const QMarginsF &margins)
void setEnabled(bool enabled)
void setImplicitWidth(qreal width)
void setContainer(QQuickItem *item)
QQuickItem * container() const
QQmlListProperty< QQStyleKitLayoutItem > layoutItems()
void setMirrored(bool mirrored)
Combined button and popup list for selecting options.
static qreal height(QQStyleKitLayoutItem *li, qreal availableHeight=.0)
static qreal vAlignY(QQStyleKitLayoutItem *li, qreal containerY, qreal containerHeight)
static qreal totalWidth(const QList< QQStyleKitLayoutItem * > &items, qreal spacing)
static QT_BEGIN_NAMESPACE qreal width(QQStyleKitLayoutItem *li, qreal availableWidth=.0)
static qreal totalHeight(const QList< QQStyleKitLayoutItem * > &items)