diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml index a3bc78e5..f4f5e369 100644 --- a/resources/qml/delegates/ImageMessage.qml +++ b/resources/qml/delegates/ImageMessage.qml @@ -5,10 +5,16 @@ Item { height: 300 * eventData.proportionalHeight Image { + id: img anchors.fill: parent source: eventData.url.replace("mxc://", "image://MxcImage/") asynchronous: true fillMode: Image.PreserveAspectFit + + MouseArea { + anchors.fill: parent + onClicked: timelineManager.openImageOverlay(img.source) + } } } diff --git a/src/timeline2/TimelineViewManager.cpp b/src/timeline2/TimelineViewManager.cpp index 18297370..bf09ef5a 100644 --- a/src/timeline2/TimelineViewManager.cpp +++ b/src/timeline2/TimelineViewManager.cpp @@ -5,8 +5,10 @@ #include "Logging.h" #include "MxcImageProvider.h" +#include "dialogs/ImageOverlay.h" TimelineViewManager::TimelineViewManager(QWidget *parent) + : imgProvider(new MxcImageProvider()) { qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject, "com.github.nheko", @@ -18,7 +20,7 @@ TimelineViewManager::TimelineViewManager(QWidget *parent) container = QWidget::createWindowContainer(view, parent); container->setMinimumSize(200, 200); view->rootContext()->setContextProperty("timelineManager", this); - view->engine()->addImageProvider("MxcImage", new MxcImageProvider()); + view->engine()->addImageProvider("MxcImage", imgProvider); view->setSource(QUrl("qrc:///qml/TimelineView.qml")); } @@ -52,6 +54,27 @@ TimelineViewManager::setHistoryView(const QString &room_id) } } +void +TimelineViewManager::openImageOverlay(QString url) const +{ + QQuickImageResponse *imgResponse = + imgProvider->requestImageResponse(url.remove("image://mxcimage/"), QSize()); + connect(imgResponse, &QQuickImageResponse::finished, this, [imgResponse]() { + if (!imgResponse->errorString().isEmpty()) { + nhlog::ui()->error("Error when retrieving image for overlay: {}", + imgResponse->errorString().toStdString()); + return; + } + auto pixmap = QPixmap::fromImage(imgResponse->textureFactory()->image()); + + auto imgDialog = new dialogs::ImageOverlay(pixmap); + imgDialog->show(); + // connect(imgDialog, &dialogs::ImageOverlay::saving, this, + // &ImageItem::saveAs); + Q_UNUSED(imgDialog); + }); +} + void TimelineViewManager::updateReadReceipts(const QString &room_id, const std::vector &event_ids) diff --git a/src/timeline2/TimelineViewManager.h b/src/timeline2/TimelineViewManager.h index 52070b97..68f6ddb0 100644 --- a/src/timeline2/TimelineViewManager.h +++ b/src/timeline2/TimelineViewManager.h @@ -15,6 +15,8 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" +class MxcImageProvider; + class TimelineViewManager : public QObject { Q_OBJECT @@ -33,6 +35,7 @@ public: void clearAll() { models.clear(); } Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; } + Q_INVOKABLE void openImageOverlay(QString url) const; signals: void clearRoomMessageCount(QString roomid); @@ -75,6 +78,7 @@ private: QQuickView *view; QWidget *container; TimelineModel *timeline_ = nullptr; + MxcImageProvider *imgProvider; QHash> models; };