diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index cdbd36c5..aaaf7d4a 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -159,72 +159,96 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
, room_id_(room_id)
, manager_(manager)
{
+ connect(this,
+ &TimelineModel::oldMessagesRetrieved,
+ this,
+ &TimelineModel::addBackwardsEvents,
+ Qt::QueuedConnection);
connect(
- this, &TimelineModel::oldMessagesRetrieved, this, &TimelineModel::addBackwardsEvents);
- connect(this, &TimelineModel::messageFailed, this, [this](QString txn_id) {
- nhlog::ui()->error("Failed to send {}, retrying", txn_id.toStdString());
-
- QTimer::singleShot(5000, this, [this]() { emit nextPendingMessage(); });
- });
- connect(this, &TimelineModel::messageSent, this, [this](QString txn_id, QString event_id) {
- pending.removeOne(txn_id);
+ this,
+ &TimelineModel::messageFailed,
+ this,
+ [this](QString txn_id) {
+ nhlog::ui()->error("Failed to send {}, retrying", txn_id.toStdString());
- auto ev = events.value(txn_id);
-
- if (auto reaction =
- std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(&ev)) {
- QString reactedTo =
- QString::fromStdString(reaction->content.relates_to.event_id);
- auto &rModel = reactions[reactedTo];
- rModel.removeReaction(*reaction);
- auto rCopy = *reaction;
- rCopy.event_id = event_id.toStdString();
- rModel.addReaction(room_id_.toStdString(), rCopy);
- }
-
- int idx = idToIndex(txn_id);
- if (idx < 0) {
- // transaction already received via sync
- return;
- }
- eventOrder[idx] = event_id;
- ev = std::visit(
- [event_id](const auto &e) -> mtx::events::collections::TimelineEvents {
- auto eventCopy = e;
- eventCopy.event_id = event_id.toStdString();
- return eventCopy;
- },
- ev);
+ QTimer::singleShot(5000, this, [this]() { emit nextPendingMessage(); });
+ },
+ Qt::QueuedConnection);
+ connect(
+ this,
+ &TimelineModel::messageSent,
+ this,
+ [this](QString txn_id, QString event_id) {
+ pending.removeOne(txn_id);
+
+ auto ev = events.value(txn_id);
+
+ if (auto reaction =
+ std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(&ev)) {
+ QString reactedTo =
+ QString::fromStdString(reaction->content.relates_to.event_id);
+ auto &rModel = reactions[reactedTo];
+ rModel.removeReaction(*reaction);
+ auto rCopy = *reaction;
+ rCopy.event_id = event_id.toStdString();
+ rModel.addReaction(room_id_.toStdString(), rCopy);
+ }
- events.remove(txn_id);
- events.insert(event_id, ev);
+ int idx = idToIndex(txn_id);
+ if (idx < 0) {
+ // transaction already received via sync
+ return;
+ }
+ eventOrder[idx] = event_id;
+ ev = std::visit(
+ [event_id](const auto &e) -> mtx::events::collections::TimelineEvents {
+ auto eventCopy = e;
+ eventCopy.event_id = event_id.toStdString();
+ return eventCopy;
+ },
+ ev);
- // mark our messages as read
- readEvent(event_id.toStdString());
+ events.remove(txn_id);
+ events.insert(event_id, ev);
- emit dataChanged(index(idx, 0), index(idx, 0));
+ // mark our messages as read
+ readEvent(event_id.toStdString());
- if (pending.size() > 0)
- emit nextPendingMessage();
- });
- connect(this, &TimelineModel::redactionFailed, this, [](const QString &msg) {
- emit ChatPage::instance()->showNotification(msg);
- });
+ emit dataChanged(index(idx, 0), index(idx, 0));
+ if (pending.size() > 0)
+ emit nextPendingMessage();
+ },
+ Qt::QueuedConnection);
connect(
- this, &TimelineModel::nextPendingMessage, this, &TimelineModel::processOnePendingMessage);
- connect(this, &TimelineModel::newMessageToSend, this, &TimelineModel::addPendingMessage);
+ this,
+ &TimelineModel::redactionFailed,
+ this,
+ [](const QString &msg) { emit ChatPage::instance()->showNotification(msg); },
+ Qt::QueuedConnection);
connect(this,
- &TimelineModel::eventFetched,
+ &TimelineModel::nextPendingMessage,
this,
- [this](QString requestingEvent, mtx::events::collections::TimelineEvents event) {
- events.insert(QString::fromStdString(mtx::accessors::event_id(event)),
- event);
- auto idx = idToIndex(requestingEvent);
- if (idx >= 0)
- emit dataChanged(index(idx, 0), index(idx, 0));
- });
+ &TimelineModel::processOnePendingMessage,
+ Qt::QueuedConnection);
+ connect(this,
+ &TimelineModel::newMessageToSend,
+ this,
+ &TimelineModel::addPendingMessage,
+ Qt::QueuedConnection);
+
+ connect(
+ this,
+ &TimelineModel::eventFetched,
+ this,
+ [this](QString requestingEvent, mtx::events::collections::TimelineEvents event) {
+ events.insert(QString::fromStdString(mtx::accessors::event_id(event)), event);
+ auto idx = idToIndex(requestingEvent);
+ if (idx >= 0)
+ emit dataChanged(index(idx, 0), index(idx, 0));
+ },
+ Qt::QueuedConnection);
}
QHash<int, QByteArray>
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index b652b78e..84be895f 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -1,5 +1,6 @@
#include "TimelineViewManager.h"
+#include <QDesktopServices>
#include <QMetaType>
#include <QPalette>
#include <QQmlContext>
@@ -112,7 +113,10 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin
container = view;
view->setResizeMode(QQuickWidget::SizeRootObjectToView);
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
view->quickWindow()->setTextRenderType(QQuickWindow::NativeTextRendering);
+#endif
connect(view, &QQuickWidget::statusChanged, this, [](QQuickWidget::Status status) {
nhlog::ui()->debug("Status changed to {}", status);
@@ -232,6 +236,12 @@ TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
}
void
+TimelineViewManager::openLink(QString link) const
+{
+ QDesktopServices::openUrl(link);
+}
+
+void
TimelineViewManager::updateReadReceipts(const QString &room_id,
const std::vector<QString> &event_ids)
{
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 5224cd56..902dc047 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -50,6 +50,8 @@ public:
Q_INVOKABLE QString userPresence(QString id) const;
Q_INVOKABLE QString userStatus(QString id) const;
+ Q_INVOKABLE void openLink(QString link) const;
+
signals:
void clearRoomMessageCount(QString roomid);
void updateRoomsLastMessage(QString roomid, const DescInfo &info);
|