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