79void QQuickIconLabelPrivate::syncImage()
81 if (!image || icon.isEmpty())
84 image->setName(icon.name());
85 image->setSource(icon.resolvedSource());
86 image->setSourceSize(QSize(icon.width(), icon.height()));
87 image->setColor(icon.color());
88 image->setCache(icon.cache());
89 const int valign = alignment & Qt::AlignVertical_Mask;
90 image->setVerticalAlignment(
static_cast<QQuickImage::VAlignment>(valign));
91 const int halign = alignment & Qt::AlignHorizontal_Mask;
92 image->setHorizontalAlignment(
static_cast<QQuickImage::HAlignment>(halign));
168void QQuickIconLabelPrivate::updateImplicitSize()
170 Q_Q(QQuickIconLabel);
171 const bool showIcon = image && hasIcon();
172 const bool showText = label && hasText();
173 const qreal horizontalPadding = leftPadding + rightPadding;
174 const qreal verticalPadding = topPadding + bottomPadding;
175 const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
176 const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
177 const qreal textImplicitWidth = showText ? label->implicitWidth() : 0;
178 const qreal textImplicitHeight = showText ? label->implicitHeight() : 0;
179 const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0;
180 const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
181 : qMax(iconImplicitWidth, textImplicitWidth);
182 const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
183 : qMax(iconImplicitHeight, textImplicitHeight);
184 q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding);
206void QQuickIconLabelPrivate::layout()
208 Q_Q(QQuickIconLabel);
209 if (!componentComplete)
212 const qreal availableWidth = width - leftPadding - rightPadding;
213 const qreal availableHeight = height - topPadding - bottomPadding;
216 case QQuickIconLabel::IconOnly:
218 const QRectF iconRect = alignedRect(mirrored, alignment,
219 QSizeF(qMin(image->implicitWidth(), availableWidth),
220 qMin(image->implicitHeight(), availableHeight)),
221 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
222 image->setSize(iconRect.size());
223 image->snapPositionTo(iconRect.topLeft());
226 case QQuickIconLabel::TextOnly:
228 const QRectF textRect = alignedRect(mirrored, alignment,
229 QSizeF(qMin(label->implicitWidth(), availableWidth),
230 qMin(label->implicitHeight(), availableHeight)),
231 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
232 label->setSize(textRect.size());
233 label->setPosition(textRect.topLeft());
237 case QQuickIconLabel::TextUnderIcon: {
242 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
243 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
245 qreal effectiveSpacing = 0;
247 if (!iconSize.isEmpty())
248 effectiveSpacing = spacing;
249 textSize.setWidth(qMin(label->implicitWidth(), availableWidth));
250 textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing));
253 QRectF combinedRect = alignedRect(mirrored, alignment,
254 QSizeF(qMax(iconSize.width(), textSize.width()),
255 iconSize.height() + effectiveSpacing + textSize.height()),
256 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
258 QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect);
259 image->setSize(iconRect.size());
260 image->snapPositionTo(iconRect.topLeft());
263 QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize, combinedRect);
264 label->setSize(textRect.size());
265 label->setPosition(textRect.topLeft());
270 case QQuickIconLabel::TextBesideIcon:
273 QSizeF iconSize(0, 0);
274 QSizeF textSize(0, 0);
276 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
277 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
279 qreal effectiveSpacing = 0;
281 if (!iconSize.isEmpty())
282 effectiveSpacing = spacing;
283 textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing));
284 textSize.setHeight(qMin(label->implicitHeight(), availableHeight));
287 const QRectF combinedRect = alignedRect(mirrored, alignment,
288 QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
289 qMax(iconSize.height(), textSize.height())),
290 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
292 const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect);
293 image->setSize(iconRect.size());
294 image->snapPositionTo(iconRect.topLeft());
297 const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect);
298 label->setSize(textRect.size());
299 label->setPosition(textRect.topLeft());
304 q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0);
595void QQuickIconLabel::componentComplete()
597 Q_D(QQuickIconLabel);
599 completeComponent(d->image);
601 completeComponent(d->label);
602 QQuickItem::componentComplete();
607 const auto paintOrderChildItems = QQuickItemPrivate::get(
this)->paintOrderChildItems();
608 const auto bottomMostFosterChildIt = std::find_if(paintOrderChildItems.constBegin(),
609 paintOrderChildItems.constEnd(), [d](QQuickItem *item) {
610 return item != d->label && item != d->image;
612 if (bottomMostFosterChildIt != paintOrderChildItems.constEnd()) {
613 const QQuickItem *bottomMostFosterChild = *bottomMostFosterChildIt;
615 d->label->stackBefore(bottomMostFosterChild);
617 d->image->stackBefore(bottomMostFosterChild);