[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;
 };
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.