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));
173void QQuickIconLabelPrivate::updateImplicitSize()
175 Q_Q(QQuickIconLabel);
176 const bool showIcon = image && hasIcon();
177 const bool showText = label && hasText();
178 const qreal horizontalPadding = leftPadding + rightPadding;
179 const qreal verticalPadding = topPadding + bottomPadding;
180 const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
181 const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
182 const qreal textImplicitWidth = showText ? label->implicitWidth() : 0;
183 const qreal textImplicitHeight = showText ? label->implicitHeight() : 0;
184 const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0;
185 const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
186 : qMax(iconImplicitWidth, textImplicitWidth);
187 const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
188 : qMax(iconImplicitHeight, textImplicitHeight);
189 q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding);
193QRectF QQuickIconLabelPrivate::alignedRect(
bool mirrored, Qt::Alignment alignment,
194 const QSizeF &size,
const QRectF &rectangle)
196 alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment);
197 qreal x = rectangle.x();
198 qreal y = rectangle.y();
199 const qreal w = size.width();
200 const qreal h = size.height();
201 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
202 y += rectangle.height() / 2 - h / 2;
203 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
204 y += rectangle.height() - h;
205 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
206 x += rectangle.width() - w;
207 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
208 x += rectangle.width() / 2 - w / 2;
209 return QRectF(x, y, w, h);
212void QQuickIconLabelPrivate::layout()
214 Q_Q(QQuickIconLabel);
215 if (!componentComplete)
218 const qreal availableWidth = width - leftPadding - rightPadding;
219 const qreal availableHeight = height - topPadding - bottomPadding;
222 case QQuickIconLabel::IconOnly:
224 const QRectF iconRect = alignedRect(mirrored, alignment,
225 QSizeF(qMin(image->implicitWidth(), availableWidth),
226 qMin(image->implicitHeight(), availableHeight)),
227 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
228 image->setSize(iconRect.size());
229 image->snapPositionTo(iconRect.topLeft());
232 case QQuickIconLabel::TextOnly:
234 const QRectF textRect = alignedRect(mirrored, alignment,
235 QSizeF(qMin(label->implicitWidth(), availableWidth),
236 qMin(label->implicitHeight(), availableHeight)),
237 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
238 label->setSize(textRect.size());
239 label->setPosition(textRect.topLeft());
243 case QQuickIconLabel::TextUnderIcon: {
248 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
249 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
251 qreal effectiveSpacing = 0;
253 if (!iconSize.isEmpty())
254 effectiveSpacing = spacing;
255 textSize.setWidth(qMin(label->implicitWidth(), availableWidth));
256 textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing));
259 QRectF combinedRect = alignedRect(mirrored, alignment,
260 QSizeF(qMax(iconSize.width(), textSize.width()),
261 iconSize.height() + effectiveSpacing + textSize.height()),
262 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
264 QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect);
265 image->setSize(iconRect.size());
266 image->snapPositionTo(iconRect.topLeft());
269 QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize, combinedRect);
270 label->setSize(textRect.size());
271 label->setPosition(textRect.topLeft());
276 case QQuickIconLabel::TextBesideIcon:
279 QSizeF iconSize(0, 0);
280 QSizeF textSize(0, 0);
282 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
283 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
285 qreal effectiveSpacing = 0;
287 if (!iconSize.isEmpty())
288 effectiveSpacing = spacing;
289 textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing));
290 textSize.setHeight(qMin(label->implicitHeight(), availableHeight));
293 const QRectF combinedRect = alignedRect(mirrored, alignment,
294 QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
295 qMax(iconSize.height(), textSize.height())),
296 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
298 const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect);
299 image->setSize(iconRect.size());
300 image->snapPositionTo(iconRect.topLeft());
303 const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect);
304 label->setSize(textRect.size());
305 label->setPosition(textRect.topLeft());
310 q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0);
678void QQuickIconLabel::componentComplete()
680 Q_D(QQuickIconLabel);
682 QQuickIconLabelPrivate::completeComponent(d->image);
684 QQuickIconLabelPrivate::completeComponent(d->label);
685 QQuickItem::componentComplete();
690 const auto paintOrderChildItems = QQuickItemPrivate::get(
this)->paintOrderChildItems();
691 const auto bottomMostFosterChildIt = std::find_if(paintOrderChildItems.constBegin(),
692 paintOrderChildItems.constEnd(), [d](QQuickItem *item) {
693 return item != d->label && item != d->image;
695 if (bottomMostFosterChildIt != paintOrderChildItems.constEnd()) {
696 const QQuickItem *bottomMostFosterChild = *bottomMostFosterChildIt;
698 d->label->stackBefore(bottomMostFosterChild);
700 d->image->stackBefore(bottomMostFosterChild);