diff --git a/include/timeline/TimelineItem.h b/include/timeline/TimelineItem.h
index 69bb89e2..7c04e167 100644
--- a/include/timeline/TimelineItem.h
+++ b/include/timeline/TimelineItem.h
@@ -99,6 +99,8 @@ protected:
private:
void init();
+ //! Add a context menu option to save the image of the timeline item.
+ void addSaveImageAction(ImageItem *image);
template<class Widget>
void setupLocalWidgetLayout(Widget *widget,
diff --git a/include/timeline/widgets/ImageItem.h b/include/timeline/widgets/ImageItem.h
index 210394bc..d8a12c22 100644
--- a/include/timeline/widgets/ImageItem.h
+++ b/include/timeline/widgets/ImageItem.h
@@ -48,6 +48,10 @@ public:
QSize sizeHint() const override;
+public slots:
+ //! Show a save as dialog for the image.
+ void saveAs();
+
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
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();
+ }
+ });
+}
|