From 54013e4a00b49721b79f141bca101523a1e82282 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 May 2020 13:14:54 +0200 Subject: Basic, broken reaction display --- src/timeline/ReactionsModel.cpp | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/timeline/ReactionsModel.cpp (limited to 'src/timeline/ReactionsModel.cpp') diff --git a/src/timeline/ReactionsModel.cpp b/src/timeline/ReactionsModel.cpp new file mode 100644 index 00000000..fd061b14 --- /dev/null +++ b/src/timeline/ReactionsModel.cpp @@ -0,0 +1,98 @@ +#include "ReactionsModel.h" + +#include + +#include "Logging.h" + +QHash +ReactionsModel::roleNames() const +{ + return { + {Key, "key"}, + {Count, "counter"}, + {Users, "users"}, + {SelfReacted, "selfReacted"}, + }; +} + +int +ReactionsModel::rowCount(const QModelIndex &) const +{ + return static_cast(reactions.size()); +} + +QVariant +ReactionsModel::data(const QModelIndex &index, int role) const +{ + const int i = index.row(); + if (i < 0 || i >= static_cast(reactions.size())) + return {}; + + switch (role) { + case Key: + return QString::fromStdString(reactions[i].key); + case Count: + return static_cast(reactions[i].reactions.size()); + case Users: { + QString users; + for (size_t r = 0; r < reactions[i].reactions.size(); r++) { + if (r != 0) + users += ", "; + users += QString::fromStdString(reactions[i].reactions[r].sender); + } + return users; + } + case SelfReacted: + for (const auto &reaction : reactions[i].reactions) + if (reaction.sender == http::client()->user_id().to_string()) + return true; + return false; + default: + return {}; + } +} + +void +ReactionsModel::addReaction(const mtx::events::RoomEvent &reaction) +{ + int idx = 0; + for (auto &storedReactions : reactions) { + if (storedReactions.key == reaction.content.relates_to.key) { + storedReactions.reactions.push_back(reaction); + emit dataChanged(index(idx, 0), index(idx, 0)); + return; + } + idx++; + } + + beginInsertRows(QModelIndex(), idx, idx); + reactions.push_back(KeyReaction{reaction.content.relates_to.key, {reaction}}); + endInsertRows(); +} + +void +ReactionsModel::removeReaction(const mtx::events::RoomEvent &reaction) +{ + int idx = 0; + for (auto &storedReactions : reactions) { + if (storedReactions.key == reaction.content.relates_to.key) { + for (auto it = begin(storedReactions.reactions); + it != end(storedReactions.reactions); + ++it) { + if (it->event_id == reaction.event_id) { + storedReactions.reactions.erase(it); + break; + } + } + + if (storedReactions.reactions.size() == 0) { + beginRemoveRows(QModelIndex(), idx, idx); + reactions.erase(reactions.begin() + idx); + endRemoveRows(); + } else + emit dataChanged(index(idx, 0), index(idx, 0)); + return; + } + idx++; + } +} -- cgit 1.5.1 From 8348a6c35dfd49e1711488e8972db841c8daa137 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 6 May 2020 11:15:45 +0200 Subject: Fix reaction count --- src/timeline/ReactionsModel.cpp | 25 +++++++++++-------------- src/timeline/ReactionsModel.h | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) (limited to 'src/timeline/ReactionsModel.cpp') diff --git a/src/timeline/ReactionsModel.cpp b/src/timeline/ReactionsModel.cpp index fd061b14..f21b1c53 100644 --- a/src/timeline/ReactionsModel.cpp +++ b/src/timeline/ReactionsModel.cpp @@ -35,16 +35,19 @@ ReactionsModel::data(const QModelIndex &index, int role) const return static_cast(reactions[i].reactions.size()); case Users: { QString users; - for (size_t r = 0; r < reactions[i].reactions.size(); r++) { - if (r != 0) + bool first = true; + for (const auto &[event_id, reaction] : reactions[i].reactions) { + if (!first) users += ", "; - users += QString::fromStdString(reactions[i].reactions[r].sender); + else + first = false; + users += QString::fromStdString(reaction.sender); } return users; } case SelfReacted: for (const auto &reaction : reactions[i].reactions) - if (reaction.sender == http::client()->user_id().to_string()) + if (reaction.second.sender == http::client()->user_id().to_string()) return true; return false; default: @@ -58,7 +61,7 @@ ReactionsModel::addReaction(const mtx::events::RoomEventevent_id == reaction.event_id) { - storedReactions.reactions.erase(it); - break; - } - } + storedReactions.reactions.erase(reaction.event_id); if (storedReactions.reactions.size() == 0) { beginRemoveRows(QModelIndex(), idx, idx); diff --git a/src/timeline/ReactionsModel.h b/src/timeline/ReactionsModel.h index ba71f2b7..a0a8580d 100644 --- a/src/timeline/ReactionsModel.h +++ b/src/timeline/ReactionsModel.h @@ -33,7 +33,7 @@ private: struct KeyReaction { std::string key; - std::vector> reactions; + std::map> reactions; }; std::vector reactions; }; -- cgit 1.5.1 From e045e3eb1cbb3785153ca7634f76ba80b9d16bb1 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 6 May 2020 11:28:24 +0200 Subject: Show displayname on reactions --- src/timeline/ReactionsModel.cpp | 11 +++++++---- src/timeline/ReactionsModel.h | 4 +++- src/timeline/TimelineModel.cpp | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src/timeline/ReactionsModel.cpp') diff --git a/src/timeline/ReactionsModel.cpp b/src/timeline/ReactionsModel.cpp index f21b1c53..b686c750 100644 --- a/src/timeline/ReactionsModel.cpp +++ b/src/timeline/ReactionsModel.cpp @@ -1,9 +1,8 @@ #include "ReactionsModel.h" +#include #include -#include "Logging.h" - QHash ReactionsModel::roleNames() const { @@ -41,7 +40,8 @@ ReactionsModel::data(const QModelIndex &index, int role) const users += ", "; else first = false; - users += QString::fromStdString(reaction.sender); + users += + QString::fromStdString(cache::displayName(room_id_, reaction.sender)); } return users; } @@ -56,8 +56,11 @@ ReactionsModel::data(const QModelIndex &index, int role) const } void -ReactionsModel::addReaction(const mtx::events::RoomEvent &reaction) +ReactionsModel::addReaction(const std::string &room_id, + const mtx::events::RoomEvent &reaction) { + room_id_ = room_id; + int idx = 0; for (auto &storedReactions : reactions) { if (storedReactions.key == reaction.content.relates_to.key) { diff --git a/src/timeline/ReactionsModel.h b/src/timeline/ReactionsModel.h index a0a8580d..5f61cd42 100644 --- a/src/timeline/ReactionsModel.h +++ b/src/timeline/ReactionsModel.h @@ -26,7 +26,8 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void addReaction(const mtx::events::RoomEvent &reaction); + void addReaction(const std::string &room_id, + const mtx::events::RoomEvent &reaction); void removeReaction(const mtx::events::RoomEvent &reaction); private: @@ -35,5 +36,6 @@ private: std::string key; std::map> reactions; }; + std::string room_id_; std::vector reactions; }; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 0555d2ba..5e57952a 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -619,7 +619,7 @@ TimelineModel::internalAddEvents( std::get_if>(&e)) { QString reactedTo = QString::fromStdString(reaction->content.relates_to.event_id); - reactions[reactedTo].addReaction(*reaction); + reactions[reactedTo].addReaction(room_id_.toStdString(), *reaction); int idx = idToIndex(reactedTo); if (idx >= 0) emit dataChanged(index(idx, 0), index(idx, 0)); -- cgit 1.5.1 From 0b1d3a40f4e19d4c0257bfdbe276f373414542d6 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 6 May 2020 13:45:38 +0200 Subject: Remove unused binding name --- src/timeline/ReactionsModel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/timeline/ReactionsModel.cpp') diff --git a/src/timeline/ReactionsModel.cpp b/src/timeline/ReactionsModel.cpp index b686c750..2e249819 100644 --- a/src/timeline/ReactionsModel.cpp +++ b/src/timeline/ReactionsModel.cpp @@ -35,13 +35,13 @@ ReactionsModel::data(const QModelIndex &index, int role) const case Users: { QString users; bool first = true; - for (const auto &[event_id, reaction] : reactions[i].reactions) { + for (const auto &reaction : reactions[i].reactions) { if (!first) users += ", "; else first = false; - users += - QString::fromStdString(cache::displayName(room_id_, reaction.sender)); + users += QString::fromStdString( + cache::displayName(room_id_, reaction.second.sender)); } return users; } -- cgit 1.5.1