2019-11-09 05:06:10 +03:00
|
|
|
#include "TimelineViewManager.h"
|
|
|
|
|
|
|
|
#include <QMetaType>
|
|
|
|
#include <QPalette>
|
|
|
|
#include <QQmlContext>
|
|
|
|
|
2020-03-01 21:55:43 +03:00
|
|
|
#include "BlurhashProvider.h"
|
2019-11-09 05:06:10 +03:00
|
|
|
#include "ChatPage.h"
|
|
|
|
#include "ColorImageProvider.h"
|
|
|
|
#include "DelegateChooser.h"
|
2018-07-17 16:37:25 +03:00
|
|
|
#include "Logging.h"
|
2020-01-17 03:25:14 +03:00
|
|
|
#include "MatrixClient.h"
|
2019-11-09 05:06:10 +03:00
|
|
|
#include "MxcImageProvider.h"
|
|
|
|
#include "UserSettingsPage.h"
|
|
|
|
#include "dialogs/ImageOverlay.h"
|
2017-04-06 02:06:42 +03:00
|
|
|
|
2020-01-11 20:53:32 +03:00
|
|
|
Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents)
|
|
|
|
|
2020-04-23 02:52:30 +03:00
|
|
|
void
|
|
|
|
TimelineViewManager::updateEncryptedDescriptions()
|
|
|
|
{
|
2020-04-24 02:05:44 +03:00
|
|
|
auto decrypt = settings->isDecryptSidebarEnabled();
|
2020-04-23 02:52:30 +03:00
|
|
|
QHash<QString, QSharedPointer<TimelineModel>>::iterator i;
|
|
|
|
for (i = models.begin(); i != models.end(); ++i) {
|
|
|
|
auto ptr = i.value();
|
|
|
|
|
|
|
|
if (!ptr.isNull()) {
|
2020-04-24 02:21:20 +03:00
|
|
|
ptr->setDecryptDescription(decrypt);
|
|
|
|
ptr->updateLastMessage();
|
2020-04-23 02:52:30 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-17 23:50:18 +03:00
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::updateColorPalette()
|
2018-07-17 23:50:18 +03:00
|
|
|
{
|
2020-02-20 22:51:07 +03:00
|
|
|
userColors.clear();
|
|
|
|
|
2020-01-27 17:59:25 +03:00
|
|
|
if (settings->theme() == "light") {
|
2020-03-30 22:48:28 +03:00
|
|
|
view->rootContext()->setContextProperty("currentActivePalette", QPalette());
|
|
|
|
view->rootContext()->setContextProperty("currentInactivePalette", QPalette());
|
2020-01-27 17:59:25 +03:00
|
|
|
} else if (settings->theme() == "dark") {
|
2020-03-30 22:48:28 +03:00
|
|
|
view->rootContext()->setContextProperty("currentActivePalette", QPalette());
|
|
|
|
view->rootContext()->setContextProperty("currentInactivePalette", QPalette());
|
2019-11-09 05:06:10 +03:00
|
|
|
} else {
|
|
|
|
view->rootContext()->setContextProperty("currentActivePalette", QPalette());
|
|
|
|
view->rootContext()->setContextProperty("currentInactivePalette", nullptr);
|
2018-07-17 23:50:18 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-20 22:51:07 +03:00
|
|
|
QColor
|
|
|
|
TimelineViewManager::userColor(QString id, QColor background)
|
|
|
|
{
|
|
|
|
if (!userColors.contains(id))
|
|
|
|
userColors.insert(
|
|
|
|
id, QColor(utils::generateContrastingHexColor(id, background.name())));
|
|
|
|
return userColors.value(id);
|
|
|
|
}
|
|
|
|
|
2020-01-27 17:59:25 +03:00
|
|
|
TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettings, QWidget *parent)
|
2019-11-09 05:06:10 +03:00
|
|
|
: imgProvider(new MxcImageProvider())
|
|
|
|
, colorImgProvider(new ColorImageProvider())
|
2020-03-01 21:55:43 +03:00
|
|
|
, blurhashProvider(new BlurhashProvider())
|
2020-01-27 17:59:25 +03:00
|
|
|
, settings(userSettings)
|
2017-04-13 04:11:22 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject,
|
2019-11-30 03:43:39 +03:00
|
|
|
"im.nheko",
|
2019-11-09 05:06:10 +03:00
|
|
|
1,
|
|
|
|
0,
|
|
|
|
"MtxEvent",
|
|
|
|
"Can't instantiate enum!");
|
2019-11-30 03:43:39 +03:00
|
|
|
qmlRegisterType<DelegateChoice>("im.nheko", 1, 0, "DelegateChoice");
|
|
|
|
qmlRegisterType<DelegateChooser>("im.nheko", 1, 0, "DelegateChooser");
|
2020-01-11 20:53:32 +03:00
|
|
|
qRegisterMetaType<mtx::events::collections::TimelineEvents>();
|
2019-11-09 05:06:10 +03:00
|
|
|
|
|
|
|
#ifdef USE_QUICK_VIEW
|
|
|
|
view = new QQuickView();
|
|
|
|
container = QWidget::createWindowContainer(view, parent);
|
|
|
|
#else
|
|
|
|
view = new QQuickWidget(parent);
|
|
|
|
container = view;
|
|
|
|
view->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
|
|
|
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
|
|
|
|
|
|
|
connect(view, &QQuickWidget::statusChanged, this, [](QQuickWidget::Status status) {
|
|
|
|
nhlog::ui()->debug("Status changed to {}", status);
|
|
|
|
});
|
|
|
|
#endif
|
|
|
|
container->setMinimumSize(200, 200);
|
|
|
|
view->rootContext()->setContextProperty("timelineManager", this);
|
2020-05-26 23:27:05 +03:00
|
|
|
view->rootContext()->setContextProperty("settings", settings.data());
|
2019-11-09 05:06:10 +03:00
|
|
|
updateColorPalette();
|
|
|
|
view->engine()->addImageProvider("MxcImage", imgProvider);
|
|
|
|
view->engine()->addImageProvider("colorimage", colorImgProvider);
|
2020-03-01 21:55:43 +03:00
|
|
|
view->engine()->addImageProvider("blurhash", blurhashProvider);
|
2019-11-09 05:06:10 +03:00
|
|
|
view->setSource(QUrl("qrc:///qml/TimelineView.qml"));
|
|
|
|
|
|
|
|
connect(dynamic_cast<ChatPage *>(parent),
|
|
|
|
&ChatPage::themeChanged,
|
|
|
|
this,
|
|
|
|
&TimelineViewManager::updateColorPalette);
|
2020-04-23 02:52:30 +03:00
|
|
|
connect(dynamic_cast<ChatPage *>(parent),
|
|
|
|
&ChatPage::decryptSidebarChanged,
|
|
|
|
this,
|
|
|
|
&TimelineViewManager::updateEncryptedDescriptions);
|
2017-11-15 19:38:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::sync(const mtx::responses::Rooms &rooms)
|
2017-04-13 04:11:22 +03:00
|
|
|
{
|
2020-01-17 03:25:14 +03:00
|
|
|
for (const auto &[room_id, room] : rooms.join) {
|
2019-11-09 05:06:10 +03:00
|
|
|
// addRoom will only add the room, if it doesn't exist
|
2020-01-17 03:25:14 +03:00
|
|
|
addRoom(QString::fromStdString(room_id));
|
|
|
|
const auto &room_model = models.value(QString::fromStdString(room_id));
|
|
|
|
room_model->addEvents(room.timeline);
|
|
|
|
|
|
|
|
if (ChatPage::instance()->userSettings()->isTypingNotificationsEnabled()) {
|
|
|
|
std::vector<QString> typing;
|
|
|
|
typing.reserve(room.ephemeral.typing.size());
|
|
|
|
for (const auto &user : room.ephemeral.typing) {
|
|
|
|
if (user != http::client()->user_id().to_string())
|
|
|
|
typing.push_back(QString::fromStdString(user));
|
|
|
|
}
|
|
|
|
room_model->updateTypingUsers(typing);
|
|
|
|
}
|
2019-11-09 05:06:10 +03:00
|
|
|
}
|
2019-11-10 02:30:02 +03:00
|
|
|
|
|
|
|
this->isInitialSync_ = false;
|
|
|
|
emit initialSyncChanged(false);
|
2017-09-03 11:43:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::addRoom(const QString &room_id)
|
2017-09-03 11:43:45 +03:00
|
|
|
{
|
2019-12-04 01:34:16 +03:00
|
|
|
if (!models.contains(room_id)) {
|
|
|
|
QSharedPointer<TimelineModel> newRoom(new TimelineModel(this, room_id));
|
2020-04-24 02:21:20 +03:00
|
|
|
newRoom->setDecryptDescription(settings->isDecryptSidebarEnabled());
|
|
|
|
|
2019-12-04 01:34:16 +03:00
|
|
|
connect(newRoom.data(),
|
|
|
|
&TimelineModel::newEncryptedImage,
|
|
|
|
imgProvider,
|
|
|
|
&MxcImageProvider::addEncryptionInfo);
|
|
|
|
models.insert(room_id, std::move(newRoom));
|
|
|
|
}
|
2017-04-13 04:11:22 +03:00
|
|
|
}
|
|
|
|
|
2019-06-10 02:03:18 +03:00
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::setHistoryView(const QString &room_id)
|
2019-06-10 02:03:18 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
nhlog::ui()->info("Trying to activate room {}", room_id.toStdString());
|
2019-06-10 02:03:18 +03:00
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
auto room = models.find(room_id);
|
|
|
|
if (room != models.end()) {
|
|
|
|
timeline_ = room.value().data();
|
|
|
|
emit activeTimelineChanged(timeline_);
|
|
|
|
nhlog::ui()->info("Activated room {}", room_id.toStdString());
|
|
|
|
}
|
2019-06-10 02:03:18 +03:00
|
|
|
}
|
|
|
|
|
2017-09-10 12:58:00 +03:00
|
|
|
void
|
2019-12-03 04:26:41 +03:00
|
|
|
TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
|
2017-09-10 12:58:00 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
QQuickImageResponse *imgResponse =
|
|
|
|
imgProvider->requestImageResponse(mxcUrl.remove("mxc://"), QSize());
|
2019-12-03 04:26:41 +03:00
|
|
|
connect(imgResponse, &QQuickImageResponse::finished, this, [this, eventId, 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());
|
2019-11-09 05:06:10 +03:00
|
|
|
|
2019-12-03 04:26:41 +03:00
|
|
|
auto imgDialog = new dialogs::ImageOverlay(pixmap);
|
2020-02-13 17:11:15 +03:00
|
|
|
imgDialog->showFullScreen();
|
2020-03-20 16:05:12 +03:00
|
|
|
connect(imgDialog,
|
|
|
|
&dialogs::ImageOverlay::saving,
|
|
|
|
timeline_,
|
|
|
|
[this, eventId, imgDialog]() {
|
|
|
|
// hide the overlay while presenting the save dialog for better
|
|
|
|
// cross platform support.
|
|
|
|
imgDialog->hide();
|
|
|
|
|
|
|
|
if (!timeline_->saveMedia(eventId)) {
|
|
|
|
imgDialog->show();
|
|
|
|
} else {
|
|
|
|
imgDialog->close();
|
|
|
|
}
|
|
|
|
});
|
2019-12-03 04:26:41 +03:00
|
|
|
});
|
2017-12-01 18:33:49 +03:00
|
|
|
}
|
|
|
|
|
2017-08-20 13:47:22 +03:00
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::updateReadReceipts(const QString &room_id,
|
|
|
|
const std::vector<QString> &event_ids)
|
2017-04-06 02:06:42 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
auto room = models.find(room_id);
|
|
|
|
if (room != models.end()) {
|
|
|
|
room.value()->markEventsAsRead(event_ids);
|
2017-08-26 11:33:26 +03:00
|
|
|
}
|
2017-04-06 02:06:42 +03:00
|
|
|
}
|
|
|
|
|
2018-06-28 16:16:43 +03:00
|
|
|
void
|
|
|
|
TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs)
|
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
for (const auto &e : msgs) {
|
|
|
|
addRoom(e.first);
|
2018-06-28 16:16:43 +03:00
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
models.value(e.first)->addEvents(e.second);
|
2018-06-28 16:16:43 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-20 13:47:22 +03:00
|
|
|
void
|
2020-04-13 17:22:30 +03:00
|
|
|
TimelineViewManager::queueTextMessage(const QString &msg)
|
2017-07-29 11:49:00 +03:00
|
|
|
{
|
2020-04-13 17:22:30 +03:00
|
|
|
if (!timeline_)
|
|
|
|
return;
|
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::Text text = {};
|
|
|
|
text.body = msg.trimmed().toStdString();
|
2020-01-27 19:05:40 +03:00
|
|
|
|
|
|
|
if (settings->isMarkdownEnabled()) {
|
|
|
|
text.formatted_body = utils::markdownToHtml(msg).toStdString();
|
2020-01-27 19:25:09 +03:00
|
|
|
|
|
|
|
// Don't send formatted_body, when we don't need to
|
2020-02-20 19:09:49 +03:00
|
|
|
if (text.formatted_body.find("<") == std::string::npos)
|
2020-01-27 19:25:09 +03:00
|
|
|
text.formatted_body = "";
|
|
|
|
else
|
|
|
|
text.format = "org.matrix.custom.html";
|
2020-01-27 19:05:40 +03:00
|
|
|
}
|
2019-11-09 05:06:10 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
if (!timeline_->reply().isEmpty()) {
|
|
|
|
auto related = timeline_->relatedInfo(timeline_->reply());
|
|
|
|
|
2020-01-12 18:39:01 +03:00
|
|
|
QString body;
|
|
|
|
bool firstLine = true;
|
2020-04-13 17:22:30 +03:00
|
|
|
for (const auto &line : related.quoted_body.split("\n")) {
|
2020-01-12 18:39:01 +03:00
|
|
|
if (firstLine) {
|
|
|
|
firstLine = false;
|
2020-04-13 17:22:30 +03:00
|
|
|
body = QString("> <%1> %2\n").arg(related.quoted_user).arg(line);
|
2020-01-12 18:39:01 +03:00
|
|
|
} else {
|
|
|
|
body = QString("%1\n> %2\n").arg(body).arg(line);
|
|
|
|
}
|
2019-11-09 05:06:10 +03:00
|
|
|
}
|
2017-08-26 11:33:26 +03:00
|
|
|
|
2020-01-12 18:39:01 +03:00
|
|
|
text.body = QString("%1\n%2").arg(body).arg(msg).toStdString();
|
2017-08-26 11:33:26 +03:00
|
|
|
|
2020-01-27 19:05:40 +03:00
|
|
|
// NOTE(Nico): rich replies always need a formatted_body!
|
|
|
|
text.format = "org.matrix.custom.html";
|
|
|
|
if (settings->isMarkdownEnabled())
|
|
|
|
text.formatted_body =
|
2020-04-13 17:22:30 +03:00
|
|
|
utils::getFormattedQuoteBody(related, utils::markdownToHtml(msg))
|
2020-01-27 19:05:40 +03:00
|
|
|
.toStdString();
|
|
|
|
else
|
|
|
|
text.formatted_body =
|
2020-04-13 17:22:30 +03:00
|
|
|
utils::getFormattedQuoteBody(related, msg.toHtmlEscaped()).toStdString();
|
2020-01-27 19:05:40 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
text.relates_to.in_reply_to.event_id = related.related_event;
|
|
|
|
timeline_->resetReply();
|
2020-01-12 18:39:01 +03:00
|
|
|
}
|
2017-08-26 11:33:26 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
timeline_->sendMessage(text);
|
2017-10-01 19:49:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::queueEmoteMessage(const QString &msg)
|
2017-10-01 19:49:36 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
auto html = utils::markdownToHtml(msg);
|
2018-04-21 16:34:50 +03:00
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::Emote emote;
|
|
|
|
emote.body = msg.trimmed().toStdString();
|
2017-10-01 19:49:36 +03:00
|
|
|
|
2020-01-27 17:59:25 +03:00
|
|
|
if (html != msg.trimmed().toHtmlEscaped() && settings->isMarkdownEnabled()) {
|
2019-11-09 05:06:10 +03:00
|
|
|
emote.formatted_body = html.toStdString();
|
2020-01-27 17:59:25 +03:00
|
|
|
emote.format = "org.matrix.custom.html";
|
|
|
|
}
|
2017-10-01 19:49:36 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
if (!timeline_->reply().isEmpty()) {
|
|
|
|
emote.relates_to.in_reply_to.event_id = timeline_->reply().toStdString();
|
|
|
|
timeline_->resetReply();
|
|
|
|
}
|
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
if (timeline_)
|
|
|
|
timeline_->sendMessage(emote);
|
2017-07-29 11:49:00 +03:00
|
|
|
}
|
|
|
|
|
2017-08-20 13:47:22 +03:00
|
|
|
void
|
2019-11-09 05:06:10 +03:00
|
|
|
TimelineViewManager::queueImageMessage(const QString &roomid,
|
|
|
|
const QString &filename,
|
2019-12-14 19:08:36 +03:00
|
|
|
const std::optional<mtx::crypto::EncryptedFile> &file,
|
2019-11-09 05:06:10 +03:00
|
|
|
const QString &url,
|
|
|
|
const QString &mime,
|
|
|
|
uint64_t dsize,
|
2020-01-12 18:39:01 +03:00
|
|
|
const QSize &dimensions,
|
2020-04-13 17:22:30 +03:00
|
|
|
const QString &blurhash)
|
2017-04-06 02:06:42 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::Image image;
|
|
|
|
image.info.mimetype = mime.toStdString();
|
|
|
|
image.info.size = dsize;
|
2020-03-01 21:55:43 +03:00
|
|
|
image.info.blurhash = blurhash.toStdString();
|
2019-11-09 05:06:10 +03:00
|
|
|
image.body = filename.toStdString();
|
|
|
|
image.url = url.toStdString();
|
|
|
|
image.info.h = dimensions.height();
|
|
|
|
image.info.w = dimensions.width();
|
2019-12-05 17:31:53 +03:00
|
|
|
image.file = file;
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
auto model = models.value(roomid);
|
|
|
|
if (!model->reply().isEmpty()) {
|
|
|
|
image.relates_to.in_reply_to.event_id = model->reply().toStdString();
|
|
|
|
model->resetReply();
|
|
|
|
}
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
model->sendMessage(image);
|
2017-04-06 02:06:42 +03:00
|
|
|
}
|
|
|
|
|
2017-08-20 13:47:22 +03:00
|
|
|
void
|
2019-12-05 17:31:53 +03:00
|
|
|
TimelineViewManager::queueFileMessage(
|
|
|
|
const QString &roomid,
|
|
|
|
const QString &filename,
|
2019-12-14 19:08:36 +03:00
|
|
|
const std::optional<mtx::crypto::EncryptedFile> &encryptedFile,
|
2019-12-05 17:31:53 +03:00
|
|
|
const QString &url,
|
|
|
|
const QString &mime,
|
2020-04-13 17:22:30 +03:00
|
|
|
uint64_t dsize)
|
2017-04-06 02:06:42 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::File file;
|
|
|
|
file.info.mimetype = mime.toStdString();
|
|
|
|
file.info.size = dsize;
|
|
|
|
file.body = filename.toStdString();
|
|
|
|
file.url = url.toStdString();
|
2019-12-05 17:31:53 +03:00
|
|
|
file.file = encryptedFile;
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
auto model = models.value(roomid);
|
|
|
|
if (!model->reply().isEmpty()) {
|
|
|
|
file.relates_to.in_reply_to.event_id = model->reply().toStdString();
|
|
|
|
model->resetReply();
|
|
|
|
}
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
model->sendMessage(file);
|
2017-04-06 02:06:42 +03:00
|
|
|
}
|
2017-04-11 22:48:02 +03:00
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
void
|
|
|
|
TimelineViewManager::queueAudioMessage(const QString &roomid,
|
|
|
|
const QString &filename,
|
2019-12-14 19:08:36 +03:00
|
|
|
const std::optional<mtx::crypto::EncryptedFile> &file,
|
2019-11-09 05:06:10 +03:00
|
|
|
const QString &url,
|
|
|
|
const QString &mime,
|
2020-04-13 17:22:30 +03:00
|
|
|
uint64_t dsize)
|
2017-04-11 22:48:02 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::Audio audio;
|
|
|
|
audio.info.mimetype = mime.toStdString();
|
|
|
|
audio.info.size = dsize;
|
|
|
|
audio.body = filename.toStdString();
|
|
|
|
audio.url = url.toStdString();
|
2019-12-05 17:31:53 +03:00
|
|
|
audio.file = file;
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
auto model = models.value(roomid);
|
|
|
|
if (!model->reply().isEmpty()) {
|
|
|
|
audio.relates_to.in_reply_to.event_id = model->reply().toStdString();
|
|
|
|
model->resetReply();
|
|
|
|
}
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
model->sendMessage(audio);
|
2017-04-13 04:11:22 +03:00
|
|
|
}
|
2017-05-08 19:44:01 +03:00
|
|
|
|
2019-11-09 05:06:10 +03:00
|
|
|
void
|
|
|
|
TimelineViewManager::queueVideoMessage(const QString &roomid,
|
|
|
|
const QString &filename,
|
2019-12-14 19:08:36 +03:00
|
|
|
const std::optional<mtx::crypto::EncryptedFile> &file,
|
2019-11-09 05:06:10 +03:00
|
|
|
const QString &url,
|
|
|
|
const QString &mime,
|
2020-04-13 17:22:30 +03:00
|
|
|
uint64_t dsize)
|
2017-10-07 20:50:32 +03:00
|
|
|
{
|
2019-11-09 05:06:10 +03:00
|
|
|
mtx::events::msg::Video video;
|
|
|
|
video.info.mimetype = mime.toStdString();
|
|
|
|
video.info.size = dsize;
|
|
|
|
video.body = filename.toStdString();
|
|
|
|
video.url = url.toStdString();
|
2019-12-05 17:31:53 +03:00
|
|
|
video.file = file;
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
auto model = models.value(roomid);
|
|
|
|
if (!model->reply().isEmpty()) {
|
|
|
|
video.relates_to.in_reply_to.event_id = model->reply().toStdString();
|
|
|
|
model->resetReply();
|
|
|
|
}
|
2020-01-12 18:39:01 +03:00
|
|
|
|
2020-04-13 17:22:30 +03:00
|
|
|
model->sendMessage(video);
|
2017-10-07 20:50:32 +03:00
|
|
|
}
|