summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/timeline/TimelineItem.cc15
-rw-r--r--src/timeline/widgets/ImageItem.cc30
2 files changed, 45 insertions, 0 deletions
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(); + } + }); +}