82void QQuickIconLabelPrivate::syncImage()
84 if (!image || icon.isEmpty())
87 image->setName(icon.name());
88 image->setSource(icon.resolvedSource());
89 image->setSourceSize(QSize(icon.width(), icon.height()));
90 const bool explicitColor = QQuickIconPrivate::isResolved(icon, QQuickIconPrivate::ColorResolved);
91 image->setColor(explicitColor ? icon.color() : defaultIconColor);
92 image->setCache(icon.cache());
93 const int valign = alignment & Qt::AlignVertical_Mask;
94 image->setVerticalAlignment(
static_cast<QQuickImage::VAlignment>(valign));
95 const int halign = alignment & Qt::AlignHorizontal_Mask;
96 image->setHorizontalAlignment(
static_cast<QQuickImage::HAlignment>(halign));
172void QQuickIconLabelPrivate::updateImplicitSize()
174 Q_Q(QQuickIconLabel);
175 const bool showIcon = image && hasIcon();
176 const bool showText = label && hasText();
177 const qreal horizontalPadding = leftPadding + rightPadding;
178 const qreal verticalPadding = topPadding + bottomPadding;
179 const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
180 const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
181 const qreal textImplicitWidth = showText ? label->implicitWidth() : 0;
182 const qreal textImplicitHeight = showText ? label->implicitHeight() : 0;
183 const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0;
184 const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
185 : qMax(iconImplicitWidth, textImplicitWidth);
186 const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
187 : qMax(iconImplicitHeight, textImplicitHeight);
188 q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding);
192QRectF QQuickIconLabelPrivate::alignedRect(
bool mirrored, Qt::Alignment alignment,
193 const QSizeF &size,
const QRectF &rectangle)
195 alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment);
196 qreal x = rectangle.x();
197 qreal y = rectangle.y();
198 const qreal w = size.width();
199 const qreal h = size.height();
200 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
201 y += rectangle.height() / 2 - h / 2;
202 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
203 y += rectangle.height() - h;
204 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
205 x += rectangle.width() - w;
206 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
207 x += rectangle.width() / 2 - w / 2;
208 return QRectF(x, y, w, h);
211void QQuickIconLabelPrivate::layout()
213 Q_Q(QQuickIconLabel);
214 if (!componentComplete)
217 const qreal availableWidth = width - leftPadding - rightPadding;
218 const qreal availableHeight = height - topPadding - bottomPadding;
221 case QQuickIconLabel::IconOnly:
223 const QRectF iconRect = alignedRect(mirrored, alignment,
224 QSizeF(qMin(image->implicitWidth(), availableWidth),
225 qMin(image->implicitHeight(), availableHeight)),
226 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
227 image->setSize(iconRect.size());
228 image->snapPositionTo(iconRect.topLeft());
231 case QQuickIconLabel::TextOnly:
233 const QRectF textRect = alignedRect(mirrored, alignment,
234 QSizeF(qMin(label->implicitWidth(), availableWidth),
235 qMin(label->implicitHeight(), availableHeight)),
236 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
237 label->setSize(textRect.size());
238 label->setPosition(textRect.topLeft());
242 case QQuickIconLabel::TextUnderIcon: {
247 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
248 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
250 qreal effectiveSpacing = 0;
252 if (!iconSize.isEmpty())
253 effectiveSpacing = spacing;
254 textSize.setWidth(qMin(label->implicitWidth(), availableWidth));
255 textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing));
258 QRectF combinedRect = alignedRect(mirrored, alignment,
259 QSizeF(qMax(iconSize.width(), textSize.width()),
260 iconSize.height() + effectiveSpacing + textSize.height()),
261 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
263 QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect);
264 image->setSize(iconRect.size());
265 image->snapPositionTo(iconRect.topLeft());
268 QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize, combinedRect);
269 label->setSize(textRect.size());
270 label->setPosition(textRect.topLeft());
275 case QQuickIconLabel::TextBesideIcon:
278 QSizeF iconSize(0, 0);
279 QSizeF textSize(0, 0);
281 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
282 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
284 qreal effectiveSpacing = 0;
286 if (!iconSize.isEmpty())
287 effectiveSpacing = spacing;
288 textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing));
289 textSize.setHeight(qMin(label->implicitHeight(), availableHeight));
292 const QRectF combinedRect = alignedRect(mirrored, alignment,
293 QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
294 qMax(iconSize.height(), textSize.height())),
295 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
297 const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect);
298 image->setSize(iconRect.size());
299 image->snapPositionTo(iconRect.topLeft());
302 const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect);
303 label->setSize(textRect.size());
304 label->setPosition(textRect.topLeft());
309 q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0);
648void QQuickIconLabel::componentComplete()
650 Q_D(QQuickIconLabel);
652 QQuickIconLabelPrivate::completeComponent(d->image);
654 QQuickIconLabelPrivate::completeComponent(d->label);
655 QQuickItem::componentComplete();
660 const auto paintOrderChildItems = QQuickItemPrivate::get(
this)->paintOrderChildItems();
661 const auto bottomMostFosterChildIt = std::find_if(paintOrderChildItems.constBegin(),
662 paintOrderChildItems.constEnd(), [d](QQuickItem *item) {
663 return item != d->label && item != d->image;
665 if (bottomMostFosterChildIt != paintOrderChildItems.constEnd()) {
666 const QQuickItem *bottomMostFosterChild = *bottomMostFosterChildIt;
668 d->label->stackBefore(bottomMostFosterChild);
670 d->image->stackBefore(bottomMostFosterChild);