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;
|