From f6fa494666b0cee5cb33706d9a33b5f9d20b206c Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 24 Jun 2020 14:50:11 +0200 Subject: Make connections across threads queued in any case --- src/timeline/TimelineModel.cpp | 134 ++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 55 deletions(-) (limited to 'src/timeline') diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 16e4f207..504c6dcf 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -144,72 +144,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>(&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>(&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 -- cgit 1.5.1 From 21a1f249f97defb45dbb04295d5c1a233eebb751 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 27 Jun 2020 03:15:36 +0200 Subject: Fix Qt 5.9 build --- src/timeline/TimelineViewManager.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/timeline') diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index a36cd0bf..64af8afb 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -107,7 +107,10 @@ TimelineViewManager::TimelineViewManager(QSharedPointer 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); -- cgit 1.5.1 From 8d3ab300b650dcef3d12fe1e5a4bb14855e8495a Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 9 Jul 2020 00:45:37 +0200 Subject: Open url using QDesktopServices from Qml This fixes some weirdness on some platforms, where Qt.openUrlExternally does weird stuff. --- resources/qml/MatrixText.qml | 2 +- src/timeline/TimelineViewManager.cpp | 7 +++++++ src/timeline/TimelineViewManager.h | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src/timeline') diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml index 9a4f7348..d56143dd 100644 --- a/resources/qml/MatrixText.qml +++ b/resources/qml/MatrixText.qml @@ -16,7 +16,7 @@ TextEdit { timelineManager.setHistoryView(match[1]) chat.positionViewAtIndex(chat.model.idToIndex(match[2]), ListView.Contain) } - else Qt.openUrlExternally(link) + else timelineManager.openLink(link) } MouseArea { diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 64af8afb..060f52fe 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -1,5 +1,6 @@ #include "TimelineViewManager.h" +#include #include #include #include @@ -219,6 +220,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 &event_ids) diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index ed095058..81a8b9b4 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -47,6 +47,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); -- cgit 1.5.1