diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc
index 1707dd19..2f04a1bd 100644
--- a/src/timeline/TimelineItem.cc
+++ b/src/timeline/TimelineItem.cc
@@ -137,6 +137,8 @@ TimelineItem::TimelineItem(ImageItem *image,
init();
setupLocalWidgetLayout<ImageItem>(image, userid, "sent an image", withSender);
+
+ addSaveImageAction(image);
}
TimelineItem::TimelineItem(FileItem *file, const QString &userid, bool withSender, QWidget *parent)
@@ -177,6 +179,8 @@ TimelineItem::TimelineItem(ImageItem *image,
{
setupWidgetLayout<mtx::events::RoomEvent<mtx::events::msg::Image>, ImageItem>(
image, event, " sent an image", with_sender);
+
+ addSaveImageAction(image);
}
TimelineItem::TimelineItem(FileItem *file,
@@ -518,3 +522,14 @@ TimelineItem::paintEvent(QPaintEvent *)
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
+
+void
+TimelineItem::addSaveImageAction(ImageItem *image)
+{
+ if (contextMenu_) {
+ auto saveImage = new QAction("Save image", this);
+ contextMenu_->addAction(saveImage);
+
+ connect(saveImage, &QAction::triggered, image, &ImageItem::saveAs);
+ }
+}
diff --git a/src/timeline/widgets/ImageItem.cc b/src/timeline/widgets/ImageItem.cc
index 2784f386..d28a4017 100644
--- a/src/timeline/widgets/ImageItem.cc
+++ b/src/timeline/widgets/ImageItem.cc
@@ -18,6 +18,7 @@
#include <QBrush>
#include <QDebug>
#include <QDesktopServices>
+#include <QFileDialog>
#include <QFileInfo>
#include <QPainter>
#include <QPixmap>
@@ -219,3 +220,32 @@ ImageItem::paintEvent(QPaintEvent *event)
painter.drawText(textRegion_, Qt::AlignVCenter, elidedText);
}
}
+
+void
+ImageItem::saveAs()
+{
+ auto filename = QFileDialog::getSaveFileName(this, tr("Save image"), text_);
+
+ if (filename.isEmpty())
+ return;
+
+ auto proxy = client_->downloadFile(url_);
+ connect(proxy,
+ &DownloadMediaProxy::fileDownloaded,
+ this,
+ [proxy, this, filename](const QByteArray &data) {
+ proxy->deleteLater();
+
+ try {
+ QFile file(filename);
+
+ if (!file.open(QIODevice::WriteOnly))
+ return;
+
+ file.write(data);
+ file.close();
+ } catch (const std::exception &ex) {
+ qDebug() << "Error while saving file to:" << ex.what();
+ }
+ });
+}
|