[plasma/discover] libdiscover/backends/FlatpakBackend: flatpak: Delay icon resolution
Aleix Pol Gonzalez <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 7632c068241ed33462db1f2153040ea8c8acf904 by Aleix Pol Gonzalez, on behalf of Aleix Pol.
Committed on 24/07/2026 at 09:42.
Pushed by apol into branch 'master'.
flatpak: Delay icon resolution
A bit like we have done elsewhere.
M +36 -36 libdiscover/backends/FlatpakBackend/FlatpakResource.cpp
M +2 -1 libdiscover/backends/FlatpakBackend/FlatpakResource.h
https://invent.kde.org/plasma/discover/-/commit/7632c068241ed33462db1f2153040ea8c8acf904
diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp
index 2565f279c..2e6660da9 100644
--- a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp
+++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp
@@ -80,45 +80,9 @@ FlatpakResource::FlatpakResource(const AppStream::Component &component, FlatpakI
{
setObjectName(packageName());
- // Start fetching remote icons during initialization
- const auto icons = m_appdata.icons();
- m_stockIcon = std::ranges::any_of(icons, [](const AppStream::Icon &icon) {
- return icon.kind() == AppStream::Icon::KindStock && AppStreamUtils::kIconLoaderHasIcon(icon.name());
- });
connect(this, &AbstractResource::iconChanged, this, [this] {
Q_EMIT backend()->resourcesChanged(this, {"icon"});
});
- if (!m_stockIcon && !icons.isEmpty() && !std::ranges::any_of(icons, [](const AppStream::Icon &icon) {
- return icon.kind() == AppStream::Icon::KindLocal || icon.kind() == AppStream::Icon::KindCached;
- })) {
- for (const auto &icon : icons) {
- if (icon.kind() != AppStream::Icon::KindRemote) {
- continue;
- }
- const QString fileName = iconCachePath(icon);
- if (!QFileInfo::exists(fileName)) {
- const QDir cacheDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
- // Create $HOME/.cache/discover/icons folder
- cacheDir.mkdir(QStringLiteral("icons"));
- auto reply = manager->get(QNetworkRequest(icon.url()));
- connect(reply, &QNetworkReply::finished, this, [this, icon, fileName, reply] {
- if (reply->error() == QNetworkReply::NoError) {
- QByteArray iconData = reply->readAll();
- QFile file(fileName);
- if (file.open(QIODevice::WriteOnly)) {
- file.write(iconData);
- } else {
- qCDebug(LIBDISCOVER_BACKEND_FLATPAK_LOG) << "could not find icon for" << packageName() << reply->url();
- QIcon::fromTheme(QStringLiteral("package-x-generic")).pixmap(32, 32).toImage().save(fileName);
- }
- file.close();
- Q_EMIT iconChanged();
- reply->deleteLater();
- }
- });
- }
- }
- }
connect(this, &FlatpakResource::stateChanged, this, &FlatpakResource::hasDataChanged);
}
@@ -228,6 +192,42 @@ void FlatpakResource::resolveIcon()
m_icon = QIcon();
const auto icons = m_appdata.icons();
+ m_stockIcon = std::ranges::any_of(icons, [](const AppStream::Icon &icon) {
+ return icon.kind() == AppStream::Icon::KindStock && AppStreamUtils::kIconLoaderHasIcon(icon.name());
+ });
+ if (!m_remoteIconFetchInitiated && !m_stockIcon && !icons.isEmpty() && !std::ranges::any_of(icons, [](const AppStream::Icon &icon) {
+ return icon.kind() == AppStream::Icon::KindLocal || icon.kind() == AppStream::Icon::KindCached;
+ })) {
+ m_remoteIconFetchInitiated = true;
+ for (const auto &icon : icons) {
+ if (icon.kind() != AppStream::Icon::KindRemote) {
+ continue;
+ }
+ const QString fileName = iconCachePath(icon);
+ if (!QFileInfo::exists(fileName)) {
+ const QDir cacheDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
+ // Create $HOME/.cache/discover/icons folder
+ cacheDir.mkdir(QStringLiteral("icons"));
+ auto reply = manager->get(QNetworkRequest(icon.url()));
+ connect(reply, &QNetworkReply::finished, this, [this, icon, fileName, reply] {
+ if (reply->error() == QNetworkReply::NoError) {
+ QByteArray iconData = reply->readAll();
+ QFile file(fileName);
+ if (file.open(QIODevice::WriteOnly)) {
+ file.write(iconData);
+ } else {
+ qCDebug(LIBDISCOVER_BACKEND_FLATPAK_LOG) << "could not find icon for" << packageName() << reply->url();
+ QIcon::fromTheme(QStringLiteral("package-x-generic")).pixmap(32, 32).toImage().save(fileName);
+ }
+ file.close();
+ Q_EMIT iconChanged();
+ reply->deleteLater();
+ }
+ });
+ }
+ }
+ }
+
if (!m_bundledIcon.isNull()) {
m_icon = QIcon(m_bundledIcon);
} else if (icons.isEmpty()) {
diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.h b/libdiscover/backends/FlatpakBackend/FlatpakResource.h
index 55f7c4e33..22436362f 100644
--- a/libdiscover/backends/FlatpakBackend/FlatpakResource.h
+++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.h
@@ -263,7 +263,8 @@ private:
static const QStringList s_topObjects;
static const QStringList s_bottomObjects;
QVector<QByteArray> m_toUpdate;
- bool m_stockIcon;
+ bool m_stockIcon = false;
+ bool m_remoteIconFetchInitiated = false;
std::optional<QIcon> m_icon;
QString m_newPermissions;
};