diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index e1f631d7..2d7c75d1 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -1376,7 +1376,7 @@ ChatPage::handleMatrixUri(const QByteArray &uri)
return;
QString mxid2;
- if (segments.size() == 4 && segments[2] == "event") {
+ if (segments.size() == 4 && segments[2] == "e") {
if (segments[3].isEmpty())
return;
else
@@ -1410,6 +1410,8 @@ ChatPage::handleMatrixUri(const QByteArray &uri)
for (auto roomid : joined_rooms) {
if (roomid == targetRoomId) {
room_list_->highlightSelectedRoom(mxid1);
+ if (!mxid2.isEmpty())
+ view_manager_->showEvent(mxid1, mxid2);
return;
}
}
@@ -1427,6 +1429,9 @@ ChatPage::handleMatrixUri(const QByteArray &uri)
if (aliases->alias == targetRoomAlias) {
room_list_->highlightSelectedRoom(
QString::fromStdString(roomid));
+ if (!mxid2.isEmpty())
+ view_manager_->showEvent(
+ QString::fromStdString(roomid), mxid2);
return;
}
}
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 30ce176e..5a0f9bad 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -265,6 +265,8 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
connect(&events, &EventStore::updateFlowEventId, this, [this](std::string event_id) {
this->updateFlowEventId(event_id);
});
+
+ showEventTimer.callOnTimeout(this, &TimelineModel::scrollTimerEvent);
}
QHash<int, QByteArray>
@@ -1298,6 +1300,42 @@ TimelineModel::cacheMedia(QString eventId)
cacheMedia(eventId, NULL);
}
+void
+TimelineModel::showEvent(QString eventId)
+{
+ using namespace std::chrono_literals;
+ if (idToIndex(eventId) != -1) {
+ eventIdToShow = eventId;
+ emit scrollTargetChanged();
+ showEventTimer.start(50ms);
+ }
+}
+
+void
+TimelineModel::eventShown()
+{
+ eventIdToShow.clear();
+ emit scrollTargetChanged();
+}
+
+QString
+TimelineModel::scrollTarget() const
+{
+ return eventIdToShow;
+}
+
+void
+TimelineModel::scrollTimerEvent()
+{
+ if (eventIdToShow.isEmpty() || showEventTimerCounter > 3) {
+ showEventTimer.stop();
+ showEventTimerCounter = 0;
+ } else {
+ emit scrollToIndex(idToIndex(eventIdToShow));
+ showEventTimerCounter++;
+ }
+}
+
QString
TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
{
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index fbe963d2..f46409b3 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -9,6 +9,7 @@
#include <QDate>
#include <QHash>
#include <QSet>
+#include <QTimer>
#include <mtxclient/http/errors.hpp>
@@ -149,6 +150,7 @@ class TimelineModel : public QAbstractListModel
int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
Q_PROPERTY(std::vector<QString> typingUsers READ typingUsers WRITE updateTypingUsers NOTIFY
typingUsersChanged)
+ Q_PROPERTY(QString scrollTarget READ scrollTarget NOTIFY scrollTargetChanged)
Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply)
Q_PROPERTY(QString edit READ edit WRITE setEdit NOTIFY editChanged RESET resetEdit)
Q_PROPERTY(
@@ -232,6 +234,7 @@ public:
Q_INVOKABLE void openMedia(QString eventId);
Q_INVOKABLE void cacheMedia(QString eventId);
Q_INVOKABLE bool saveMedia(QString eventId) const;
+ Q_INVOKABLE void showEvent(QString eventId);
void cacheMedia(QString eventId, std::function<void(const QString filename)> callback);
std::vector<::Reaction> reactions(const std::string &event_id)
@@ -253,6 +256,7 @@ public:
public slots:
void setCurrentIndex(int index);
int currentIndex() const { return idToIndex(currentId); }
+ void eventShown();
void markEventsAsRead(const std::vector<QString> &event_ids);
QVariantMap getDump(QString eventId, QString relatedTo) const;
void updateTypingUsers(const std::vector<QString> &users)
@@ -298,8 +302,11 @@ public slots:
QString roomAvatarUrl() const;
QString roomId() const { return room_id_; }
+ QString scrollTarget() const;
+
private slots:
void addPendingMessage(mtx::events::collections::TimelineEvents event);
+ void scrollTimerEvent();
signals:
void currentIndexChanged(int index);
@@ -312,6 +319,7 @@ signals:
void editChanged(QString reply);
void paginationInProgressChanged(const bool);
void newCallEvent(const mtx::events::collections::TimelineEvents &event);
+ void scrollToIndex(int index);
void openProfile(UserProfile *profile);
void openRoomSettingsDialog(RoomSettings *settings);
@@ -325,6 +333,8 @@ signals:
void roomAvatarUrlChanged();
void forwardToRoom(mtx::events::collections::TimelineEvents *e, QString roomId);
+ void scrollTargetChanged();
+
private:
template<typename T>
void sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events::EventType eventType);
@@ -350,6 +360,10 @@ private:
InputBar input_{this};
+ QTimer showEventTimer{this};
+ QString eventIdToShow;
+ int showEventTimerCounter = 0;
+
friend struct SendMessageVisitor;
};
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 648b499d..99f0b86e 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -404,6 +404,22 @@ TimelineViewManager::highlightRoom(const QString &room_id)
ChatPage::instance()->highlightRoom(room_id);
}
+void
+TimelineViewManager::showEvent(const QString &room_id, const QString &event_id)
+{
+ auto room = models.find(room_id);
+ if (room != models.end()) {
+ if (timeline_ != room.value().data()) {
+ timeline_ = room.value().data();
+ emit activeTimelineChanged(timeline_);
+ container->setFocus();
+ nhlog::ui()->info("Activated room {}", room_id.toStdString());
+ }
+
+ timeline_->showEvent(event_id);
+ }
+}
+
QString
TimelineViewManager::escapeEmoji(QString str) const
{
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 9703ee56..aa24b220 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -106,6 +106,7 @@ public slots:
void setHistoryView(const QString &room_id);
void highlightRoom(const QString &room_id);
+ void showEvent(const QString &room_id, const QString &event_id);
void focusTimeline();
TimelineModel *getHistoryView(const QString &room_id)
{
|