diff options
author | DeepBlueV7.X <nicolas.werner@hotmail.de> | 2021-01-05 22:45:40 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-05 22:45:40 +0100 |
commit | 133302d33467f60111ed5f299298fc1a0d8f9cb0 (patch) | |
tree | 7dbd7972db923abb964aaedf6d31d7bca238f216 | |
parent | lint (diff) | |
parent | Fix typing notifications flickering sometimes (diff) | |
download | nheko-133302d33467f60111ed5f299298fc1a0d8f9cb0.tar.xz |
Merge pull request #365 from Nheko-Reborn/typing
Typing flickering fixes
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | io.github.NhekoReborn.Nheko.json | 2 | ||||
-rw-r--r-- | resources/qml/MessageView.qml | 9 | ||||
-rw-r--r-- | src/Cache.cpp | 77 | ||||
-rw-r--r-- | src/timeline/TimelineViewManager.cpp | 19 |
5 files changed, 75 insertions, 34 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index ead1c32b..6ba411ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,7 +356,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG ce8bc9c3dd6bba432e716f55136133111b0186e7 + GIT_TAG cad81d1677a4845366b93112f8f2e267ee8c9ae0 ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json index 352ca648..49e92311 100644 --- a/io.github.NhekoReborn.Nheko.json +++ b/io.github.NhekoReborn.Nheko.json @@ -162,7 +162,7 @@ "name": "mtxclient", "sources": [ { - "commit": "ce8bc9c3dd6bba432e716f55136133111b0186e7", + "commit": "cad81d1677a4845366b93112f8f2e267ee8c9ae0", "type": "git", "url": "https://github.com/Nheko-Reborn/mtxclient.git" } diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index 679c1f50..aa222ac5 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -140,6 +140,15 @@ ListView { } + Label { + color: colors.buttonText + text: TimelineManager.userStatus(modelData.userId) + textFormat: Text.PlainText + elide: Text.ElideRight + width: chat.delegateMaxWidth - parent.spacing * 2 - userName.implicitWidth - avatarSize + font.italic: true + } + } } diff --git a/src/Cache.cpp b/src/Cache.cpp index dac0b23a..04046346 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -124,17 +124,15 @@ Cache::isHiddenEvent(lmdb::txn &txn, EventType::Reaction, EventType::CallCandidates, EventType::Unsupported}; if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, "")) - hiddenEvents = std::move( - std::get< - mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>( - *temp) - .content); + hiddenEvents = + std::move(std::get<mtx::events::AccountDataEvent< + mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp) + .content); if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, room_id)) - hiddenEvents = std::move( - std::get< - mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>( - *temp) - .content); + hiddenEvents = + std::move(std::get<mtx::events::AccountDataEvent< + mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp) + .content); return std::visit( [hiddenEvents](const auto &ev) { @@ -1197,7 +1195,7 @@ void Cache::saveState(const mtx::responses::Sync &res) { using namespace mtx::events; - auto user_id = this->localUserId_.toStdString(); + auto local_user_id = this->localUserId_.toStdString(); auto currentBatchToken = nextBatchToken(); @@ -1252,13 +1250,19 @@ Cache::saveState(const mtx::responses::Sync &res) evt); // for tag events - if (std::holds_alternative<Event<account_data::Tags>>(evt)) { - auto tags_evt = std::get<Event<account_data::Tags>>(evt); - has_new_tags = true; + if (std::holds_alternative<AccountDataEvent<account_data::Tags>>( + evt)) { + auto tags_evt = + std::get<AccountDataEvent<account_data::Tags>>(evt); + has_new_tags = true; for (const auto &tag : tags_evt.content.tags) { updatedInfo.tags.push_back(tag.first); } } + if (auto fr = std::get_if<mtx::events::AccountDataEvent< + mtx::events::account_data::FullyRead>>(&evt)) { + nhlog::db()->debug("Fully read: {}", fr->content.event_id); + } } if (!has_new_tags) { // retrieve the old tags, they haven't changed @@ -1282,7 +1286,20 @@ Cache::saveState(const mtx::responses::Sync &res) lmdb::dbi_put( txn, roomsDb_, lmdb::val(room.first), lmdb::val(json(updatedInfo).dump())); - updateReadReceipt(txn, room.first, room.second.ephemeral.receipts); + for (const auto &e : room.second.ephemeral.events) { + if (auto receiptsEv = std::get_if< + mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) { + Receipts receipts; + + for (const auto &[event_id, userReceipts] : + receiptsEv->content.receipts) { + for (const auto &[user_id, receipt] : userReceipts.users) { + receipts[event_id][user_id] = receipt.ts; + } + } + updateReadReceipt(txn, room.first, receipts); + } + } // Clean up non-valid invites. removeInvite(txn, room.first); @@ -1302,19 +1319,27 @@ Cache::saveState(const mtx::responses::Sync &res) std::map<QString, bool> readStatus; for (const auto &room : res.rooms.join) { - if (!room.second.ephemeral.receipts.empty()) { - std::vector<QString> receipts; - for (const auto &receipt : room.second.ephemeral.receipts) { - for (const auto &receiptUsersTs : receipt.second) { - if (receiptUsersTs.first != user_id) { - receipts.push_back( - QString::fromStdString(receipt.first)); - break; + for (const auto &e : room.second.ephemeral.events) { + if (auto receiptsEv = std::get_if< + mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) { + std::vector<QString> receipts; + + for (const auto &[event_id, userReceipts] : + receiptsEv->content.receipts) { + for (const auto &[user_id, receipt] : userReceipts.users) { + (void)receipt; + + if (user_id != local_user_id) { + receipts.push_back( + QString::fromStdString(event_id)); + break; + } } } + if (!receipts.empty()) + emit newReadReceipts(QString::fromStdString(room.first), + receipts); } - if (!receipts.empty()) - emit newReadReceipts(QString::fromStdString(room.first), receipts); } readStatus.emplace(QString::fromStdString(room.first), calculateRoomReadStatus(room.first)); @@ -1440,7 +1465,7 @@ Cache::roomsWithTagUpdates(const mtx::responses::Sync &res) for (const auto &room : res.rooms.join) { bool hasUpdates = false; for (const auto &evt : room.second.account_data.events) { - if (std::holds_alternative<Event<account_data::Tags>>(evt)) { + if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(evt)) { hasUpdates = true; } } diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 03eb53fc..f31b5ea5 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -297,13 +297,20 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms) &CallManager::syncEvent); if (ChatPage::instance()->userSettings()->typingNotifications()) { - std::vector<QString> typing; - typing.reserve(room.ephemeral.typing.size()); - for (const auto &user : room.ephemeral.typing) { - if (user != http::client()->user_id().to_string()) - typing.push_back(QString::fromStdString(user)); + for (const auto &ev : room.ephemeral.events) { + if (auto t = std::get_if< + mtx::events::EphemeralEvent<mtx::events::ephemeral::Typing>>( + &ev)) { + std::vector<QString> typing; + typing.reserve(t->content.user_ids.size()); + for (const auto &user : t->content.user_ids) { + if (user != http::client()->user_id().to_string()) + typing.push_back( + QString::fromStdString(user)); + } + room_model->updateTypingUsers(typing); + } } - room_model->updateTypingUsers(typing); } } |