diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2021-04-29 19:09:16 +0200 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2021-04-29 19:09:16 +0200 |
commit | 82fa8ab292dc6e3a5a891f3b17c53236911374d1 (patch) | |
tree | 5fa4bdff6818190d93dc3cc33a2998e91c798122 /src | |
parent | Fix some encoding issues when translating matrix.to to matrix: (diff) | |
download | nheko-82fa8ab292dc6e3a5a891f3b17c53236911374d1.tar.xz |
Highlight navigated to message
Diffstat (limited to 'src')
-rw-r--r-- | src/ChatPage.cpp | 7 | ||||
-rw-r--r-- | src/timeline/TimelineModel.cpp | 38 | ||||
-rw-r--r-- | src/timeline/TimelineModel.h | 14 | ||||
-rw-r--r-- | src/timeline/TimelineViewManager.cpp | 16 | ||||
-rw-r--r-- | src/timeline/TimelineViewManager.h | 1 |
5 files changed, 75 insertions, 1 deletions
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) { |