diff --git a/src/private/dquickdciiconimage.cpp b/src/private/dquickdciiconimage.cpp index 3dfb6439..4bb04c39 100644 --- a/src/private/dquickdciiconimage.cpp +++ b/src/private/dquickdciiconimage.cpp @@ -72,6 +72,19 @@ void DQuickDciIconImageItemPrivate::maybeUpdateUrl() return DQuickIconImagePrivate::maybeUpdateUrl(); } + QString iconPath = findDciIconPath(parentPriv->imageItem->name(), appIconThemeName()); + if (iconPath.isEmpty()) { + QUrl url; + url.setScheme(QLatin1String("image")); + url.setHost(QLatin1String("dtk.dci.icon")); + QUrlQuery query = getUrlQuery(); + // alread find dci and failed... + query.addQueryItem(QLatin1String("_d_ignore_dci"), "true"); + url.setQuery(query); + q_func()->setSource(url); + return; + } + updatePlayer(); if (player) @@ -109,6 +122,20 @@ QUrlQuery DQuickDciIconImageItemPrivate::getUrlQuery() return query; } +void DQuickDciIconImageItemPrivate::updatePlayerIconSize() +{ + if (!player) + return; + + int boundingSize = qMax(q_func()->sourceSize().width(), q_func()->sourceSize().height()); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) +#endif + boundingSize = qRound(boundingSize / devicePixelRatio); + player->setIconSize(boundingSize); + +} + void DQuickDciIconImageItemPrivate::updatePlayer() { if (!player) { @@ -117,6 +144,9 @@ void DQuickDciIconImageItemPrivate::updatePlayer() QObject::connect(player, &DDciIconPlayer::updated, parentPriv->imageItem, [this](){ parentPriv->imageItem->setImage(player->currentImage()); }); + QObject::connect(parentPriv->imageItem, &DQuickIconImage::sourceSizeChanged, player, [this](){ + updatePlayerIconSize(); + }); } QString iconPath = findDciIconPath(parentPriv->imageItem->name(), appIconThemeName()); @@ -138,13 +168,7 @@ void DQuickDciIconImageItemPrivate::updatePlayer() player->setPalette(palette); - int boundingSize = qMax(q_func()->sourceSize().width(), q_func()->sourceSize().height()); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - if (qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) -#endif - boundingSize = qRound(boundingSize / devicePixelRatio); - - player->setIconSize(boundingSize); + updatePlayerIconSize(); player->setDevicePixelRatio(devicePixelRatio); } diff --git a/src/private/dquickdciiconimage_p_p.h b/src/private/dquickdciiconimage_p_p.h index b79d6908..0c002423 100644 --- a/src/private/dquickdciiconimage_p_p.h +++ b/src/private/dquickdciiconimage_p_p.h @@ -27,6 +27,7 @@ class DQuickDciIconImageItemPrivate : public DQuickIconImagePrivate QUrlQuery getUrlQuery(); void updatePlayer(); + void updatePlayerIconSize(); private: DQuickDciIconImagePrivate *parentPriv; DDciIconPlayer *player = nullptr; diff --git a/src/private/dquickimageprovider.cpp b/src/private/dquickimageprovider.cpp index 0cb0b62b..2ee0414d 100644 --- a/src/private/dquickimageprovider.cpp +++ b/src/private/dquickimageprovider.cpp @@ -160,10 +160,12 @@ QImage DQuickDciIconProvider::requestImage(const QString &id, QSize *size, const const QString themeName = urlQuery.queryItemValue("themeName"); QString iconPath; - if (auto cached = DIconTheme::cached()) { - iconPath = cached->findDciIconFile(name, themeName); - } else { - iconPath = DIconTheme::findDciIconFile(name, themeName); + if (!urlQuery.hasQueryItem("_d_ignore_dci")) { + if (auto cached = DIconTheme::cached()) { + iconPath = cached->findDciIconFile(name, themeName); + } else { + iconPath = DIconTheme::findDciIconFile(name, themeName); + } } const bool fallbackToQIcon = urlQuery.queryItemValue("fallbackToQIcon").toInt();