Convert ImageProvider in an async image provider using an internal image response
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Sun, 20 Oct 2024 17:46:27 +0000 (01:46 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 22 Nov 2024 08:33:49 +0000 (16:33 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/tray/usermodel.cpp
src/gui/tray/usermodel.h

index c39b1406e57c39f4010da4fd78520c9ffc6fa7e0..c094b5090a9894eccfa55b85e8d8035753c34286 100644 (file)
@@ -1618,35 +1618,53 @@ int UserModel::findUserIdForAccount(AccountState *account) const
 }
 /*-------------------------------------------------------------------------------------*/
 
-ImageProvider::ImageProvider()
-    : QQuickImageProvider(QQuickImageProvider::Image)
-{
-}
+class ImageResponse : public QQuickImageResponse
+{
+public:
+    ImageResponse(const QString &id, const QSize &requestedSize, QThreadPool *pool)
+    {
+        Q_UNUSED(pool)
+
+        const auto makeIcon = [](const QString &path) {
+            QImage image(128, 128, QImage::Format_ARGB32);
+            image.fill(Qt::GlobalColor::transparent);
+            QPainter painter(&image);
+            QSvgRenderer renderer(path);
+            renderer.render(&painter);
+            return image;
+        };
+
+        if (id == QLatin1String("fallbackWhite")) {
+            handleDone(makeIcon(QStringLiteral(":/client/theme/white/user.svg")));
+            return;
+        } else if (id == QLatin1String("fallbackBlack")) {
+            handleDone(makeIcon(QStringLiteral(":/client/theme/black/user.svg")));
+            return;
+        }
 
-QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
-{
-    Q_UNUSED(size)
-    Q_UNUSED(requestedSize)
 
-    const auto makeIcon = [](const QString &path) {
-        QImage image(128, 128, QImage::Format_ARGB32);
-        image.fill(Qt::GlobalColor::transparent);
-        QPainter painter(&image);
-        QSvgRenderer renderer(path);
-        renderer.render(&painter);
-        return image;
-    };
+        handleDone(UserModel::instance()->avatarById(id.toInt()));
+    }
 
-    if (id == QLatin1String("fallbackWhite")) {
-        return makeIcon(QStringLiteral(":/client/theme/white/user.svg"));
+    void handleDone(const QImage &image)
+    {
+        _image = image;
+        emit finished();
     }
 
-    if (id == QLatin1String("fallbackBlack")) {
-        return makeIcon(QStringLiteral(":/client/theme/black/user.svg"));
+    QQuickTextureFactory *textureFactory() const override
+    {
+        return QQuickTextureFactory::textureFactoryForImage(_image);
     }
 
-    const int uid = id.toInt();
-    return UserModel::instance()->avatarById(uid);
+private:
+    QImage _image;
+};
+
+QQuickImageResponse *ImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize)
+{
+    const auto response = new class ImageResponse(id, requestedSize, &pool);
+    return response;
 }
 
 /*-------------------------------------------------------------------------------------*/
@@ -1725,3 +1743,6 @@ QHash<int, QByteArray> UserAppsModel::roleNames() const
     return roles;
 }
 }
+
+#include "usermodel.moc"
+
index 466cd6ab81976a5fbea423e6389576086596ff88..73227168062f2e089af50a7e01c8bb1514c39014 100644 (file)
@@ -276,11 +276,13 @@ private:
     void buildUserList();
 };
 
-class ImageProvider : public QQuickImageProvider
+class ImageProvider : public QQuickAsyncImageProvider
 {
+    Q_OBJECT
+
 public:
-    ImageProvider();
-    QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
+    ImageProvider() = default;
+    QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override;
 };
 
 class UserAppsModel : public QAbstractListModel