diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index b949e4c3..44f288c6 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -5,7 +5,9 @@
#include "TimelineViewManager.h"
#include <QApplication>
+#include <QClipboard>
#include <QFileDialog>
+#include <QMimeData>
#include <QStandardPaths>
#include <QString>
@@ -29,8 +31,6 @@
#include "voip/CallManager.h"
#include "voip/WebRTCSession.h"
-namespace msgs = mtx::events::msg;
-
namespace {
template<template<class...> class Op, class... Args>
using is_detected = typename nheko::detail::detector<nheko::nonesuch, void, Op, Args...>::value_t;
@@ -319,6 +319,37 @@ TimelineViewManager::saveMedia(QString mxcUrl)
}
void
+TimelineViewManager::copyImage(const QString &mxcUrl) const
+{
+ const auto url = mxcUrl.toStdString();
+ QString mimeType;
+
+ http::client()->download(
+ url,
+ [url, mimeType](const std::string &data,
+ const std::string &,
+ const std::string &,
+ mtx::http::RequestErr err) {
+ if (err) {
+ nhlog::net()->warn("failed to retrieve media {}: {} {}",
+ url,
+ err->matrix_error.error,
+ static_cast<int>(err->status_code));
+ return;
+ }
+
+ try {
+ auto img = utils::readImage(QByteArray(data.data(), (qsizetype)data.size()));
+ QGuiApplication::clipboard()->setImage(img);
+
+ return;
+ } catch (const std::exception &e) {
+ nhlog::ui()->warn("Error while copying file to clipboard: {}", e.what());
+ }
+ });
+}
+
+void
TimelineViewManager::updateReadReceipts(const QString &room_id,
const std::vector<QString> &event_ids)
{
|