summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/timeline/TimelineViewManager.cpp62
-rw-r--r--src/timeline/TimelineViewManager.h6
2 files changed, 40 insertions, 28 deletions
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 3ed1c21c..45abff98 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -256,6 +256,11 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
                 isInitialSync_ = true;
                 emit initialSyncChanged(true);
         });
+
+        connect(this,
+                &TimelineViewManager::openImageOverlayInternalCb,
+                this,
+                &TimelineViewManager::openImageOverlayInternal);
 }
 
 void
@@ -350,37 +355,40 @@ TimelineViewManager::escapeEmoji(QString str) const
 }
 
 void
-TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
+TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId)
 {
         if (mxcUrl.isEmpty()) {
                 return;
         }
-        QQuickImageResponse *imgResponse =
-          imgProvider->requestImageResponse(mxcUrl.remove("mxc://"), QSize());
-        connect(imgResponse, &QQuickImageResponse::finished, this, [this, eventId, imgResponse]() {
-                if (!imgResponse->errorString().isEmpty()) {
-                        nhlog::ui()->error("Error when retrieving image for overlay: {}",
-                                           imgResponse->errorString().toStdString());
-                        return;
+
+        MxcImageProvider::download(
+          mxcUrl.remove("mxc://"), QSize(), [this, eventId](QString, QSize, QImage img, QString) {
+                  if (img.isNull()) {
+                          nhlog::ui()->error("Error when retrieving image for overlay.");
+                          return;
+                  }
+
+                  emit openImageOverlayInternalCb(eventId, std::move(img));
+          });
+}
+
+void
+TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
+{
+        auto pixmap = QPixmap::fromImage(img);
+
+        auto imgDialog = new dialogs::ImageOverlay(pixmap);
+        imgDialog->showFullScreen();
+        connect(imgDialog, &dialogs::ImageOverlay::saving, timeline_, [this, eventId, imgDialog]() {
+                // hide the overlay while presenting the save dialog for better
+                // cross platform support.
+                imgDialog->hide();
+
+                if (!timeline_->saveMedia(eventId)) {
+                        imgDialog->show();
+                } else {
+                        imgDialog->close();
                 }
-                auto pixmap = QPixmap::fromImage(imgResponse->textureFactory()->image());
-
-                auto imgDialog = new dialogs::ImageOverlay(pixmap);
-                imgDialog->showFullScreen();
-                connect(imgDialog,
-                        &dialogs::ImageOverlay::saving,
-                        timeline_,
-                        [this, eventId, imgDialog]() {
-                                // hide the overlay while presenting the save dialog for better
-                                // cross platform support.
-                                imgDialog->hide();
-
-                                if (!timeline_->saveMedia(eventId)) {
-                                        imgDialog->show();
-                                } else {
-                                        imgDialog->close();
-                                }
-                        });
         });
 }
 
@@ -597,4 +605,4 @@ void
 TimelineViewManager::focusTimeline()
 {
         getWidget()->setFocus();
-}
\ No newline at end of file
+}
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index e3ed4991..3b405142 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -61,7 +61,7 @@ public:
         Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
         bool isNarrowView() const { return isNarrowView_; }
         bool isWindowFocused() const { return isWindowFocused_; }
-        Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const;
+        Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId);
         Q_INVOKABLE QColor userColor(QString id, QColor background);
         Q_INVOKABLE QString escapeEmoji(QString str) const;
 
@@ -92,6 +92,7 @@ signals:
         void narrowViewChanged();
         void focusChanged();
         void focusInput();
+        void openImageOverlayInternalCb(QString eventId, QImage img);
 
 public slots:
         void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
@@ -146,6 +147,9 @@ public slots:
         void backToRooms() { emit showRoomList(); }
         QObject *completerFor(QString completerName, QString roomId = "");
 
+private slots:
+        void openImageOverlayInternal(QString eventId, QImage img);
+
 private:
 #ifdef USE_QUICK_VIEW
         QQuickView *view;