28void QQuickIconImage::load()
37 d->updatingIcon =
true;
39 QSize size = d->sourcesize;
41 if (size.width() <= 0)
42 size.setWidth(width());
43 if (size.height() <= 0)
44 size.setHeight(height());
46 const qreal dpr = d->effectiveDevicePixelRatio();
48 if (
const auto *entry = QIconLoaderEngine::entryForSize(d->icon, size * dpr, qCeil(dpr))) {
50 QQmlContext *context = qmlContext(
this);
51 const QUrl entryUrl = QUrl::fromLocalFile(entry->filename);
52 d->url = context ? context->resolvedUrl(entryUrl) : entryUrl;
53 d->isThemeIcon =
true;
54 }
else if (d->source.isEmpty()) {
56 std::unique_ptr<QIconEngine> iconEngine(QIconLoader::instance()->iconEngine(d->icon.iconName));
57 if (iconEngine && !iconEngine->isNull()) {
61 const QIcon::Mode mode = isEnabled() ? QIcon::Normal : QIcon::Disabled;
62 const QImage image = iconEngine->scaledPixmap(size, mode, QIcon::Off, dpr).toImage();
63 d->devicePixelRatio = image.devicePixelRatio();
69 d->isThemeIcon =
false;
71 if (!d->url.isEmpty())
74 d->updatingIcon =
false;
77void QQuickIconImagePrivate::updateFillMode()
87 updatingFillMode =
true;
89 const QSize pixmapSize = QSize(currentPix->width(), currentPix->height()) / effectiveDevicePixelRatio();
90 if (pixmapSize.width() > q->width() || pixmapSize.height() > q->height())
91 q->setFillMode(QQuickImage::PreserveAspectFit);
93 q->setFillMode(QQuickImage::Pad);
95 updatingFillMode =
false;
155void QQuickIconImage::snapPositionTo(QPointF pos)
163 offset = parentItem()->position();
164 QPointF offsetPos(std::round(offset.x() + pos.x()), std::round(offset.y() + pos.y()));
165 setPosition(offsetPos - offset);
181void QQuickIconImage::pixmapChange()
183 Q_D(QQuickIconImage);
184 QQuickImage::pixmapChange();
188 if (!d->updatingFillMode && d->color.alpha() > 0) {
189 QImage image = d->currentPix->image();
190 if (!image.isNull()) {
191 QPainter painter(&image);
192 painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
193 painter.fillRect(image.rect(), d->color);
194 d->currentPix->setImage(image);