diff options
author | Hiers <47784553+Hiers@users.noreply.github.com> | 2022-09-11 23:05:20 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-11 23:05:20 +0000 |
commit | 8071b192b8cecf0b0f422d74678038dd3afbe3bc (patch) | |
tree | e5340dccf4ad742a86199e82758a9de5eff038fb /src/timeline/TimelineModel.cpp | |
parent | Merge pull request #1163 from foresto/log-options (diff) | |
download | nheko-8071b192b8cecf0b0f422d74678038dd3afbe3bc.tar.xz |
Line to indicate first unread message (#1147)
* First draft of unread line feature. * Minor visual fix. * Removed unnecessary ternary operator. * Extended unread line functionality to work on minimised window or focusing another window. * Fix for unread line not showing when last read message is hidden. * Minor performance improvement. Fix for misbehaving event2order DB at application start. * Fix for possible performance issues when user has joined a large number of rooms. * Fix for breaking macos and clazy builds. * Changed on windows focus function to refresh unread line if room is unread. * Unread line is removed when user sends a message. * Linting. * Fixed unread line to work in standalone room windows. * Switch isRoomUnread for index 0. * Merged try/catch blocks. * Fix for crash on opening a room invite. * Call fullyReadEventId function when used instead of storing it and passing it through. * Function that was meant to sync the unread line was relying on an async function, oops. * Linting again. * More linting... * Minor changes.
Diffstat (limited to 'src/timeline/TimelineModel.cpp')
-rw-r--r-- | src/timeline/TimelineModel.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index b7122db1..eaf85b2a 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -427,6 +427,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj setPaginationInProgress(false); updateLastMessage(); }); + connect(&events, &EventStore::fetchedMore, this, &TimelineModel::checkAfterFetch); connect(&events, &EventStore::startDMVerification, this, @@ -977,6 +978,7 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline) emit encryptionChanged(); } } + updateLastMessage(); } @@ -1370,6 +1372,48 @@ TimelineModel::markEventsAsRead(const std::vector<QString> &event_ids) } } +void +TimelineModel::updateLastReadId(QString currentRoomId) +{ + if (currentRoomId == room_id_) { + last_event_id = cache::getFullyReadEventId(room_id_.toStdString()); + auto lastVisibleEventIndexAndId = + cache::lastVisibleEvent(room_id_.toStdString(), last_event_id); + if (lastVisibleEventIndexAndId) { + fullyReadEventId_ = lastVisibleEventIndexAndId->second; + emit fullyReadEventIdChanged(); + } + } +} + +void +TimelineModel::lastReadIdOnWindowFocus() +{ + /* this stops it from removing the line when focusing another window + * and from removing the line when refocusing nheko */ + if (ChatPage::instance()->isRoomActive(room_id_) && + cache::calculateRoomReadStatus(room_id_.toStdString())) { + updateLastReadId(room_id_); + } +} + +/* + * if the event2order db didn't have the messages we needed when the room was opened + * try again after these new messages were fetched + */ +void +TimelineModel::checkAfterFetch() +{ + if (fullyReadEventId_.empty()) { + auto lastVisibleEventIndexAndId = + cache::lastVisibleEvent(room_id_.toStdString(), last_event_id); + if (lastVisibleEventIndexAndId) { + fullyReadEventId_ = lastVisibleEventIndexAndId->second; + emit fullyReadEventIdChanged(); + } + } +} + template<typename T> void TimelineModel::sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events::EventType eventType) @@ -1550,6 +1594,9 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event) event); std::visit(SendMessageVisitor{this}, event); + + fullyReadEventId_ = this->EventId; + emit fullyReadEventIdChanged(); } void |