summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/ReadReceiptsModel.cpp52
-rw-r--r--src/ReadReceiptsModel.h41
2 files changed, 19 insertions, 74 deletions
diff --git a/src/ReadReceiptsModel.cpp b/src/ReadReceiptsModel.cpp
index eadb4e74..8ee9cf45 100644
--- a/src/ReadReceiptsModel.cpp
+++ b/src/ReadReceiptsModel.cpp
@@ -26,12 +26,6 @@ ReadReceiptsModel::ReadReceiptsModel(QString event_id, QString room_id, QObject
         }
 }
 
-ReadReceiptsModel::~ReadReceiptsModel()
-{
-        for (const auto &item : readReceipts_)
-                item->deleteLater();
-}
-
 QHash<int, QByteArray>
 ReadReceiptsModel::roleNames() const
 {
@@ -49,13 +43,13 @@ ReadReceiptsModel::data(const QModelIndex &index, int role) const
 
         switch (role) {
         case Mxid:
-                return readReceipts_[index.row()]->mxid();
+                return readReceipts_[index.row()].first;
         case DisplayName:
-                return readReceipts_[index.row()]->displayName();
+                return cache::displayName(room_id_, readReceipts_[index.row()].first);
         case AvatarUrl:
-                return readReceipts_[index.row()]->avatarUrl();
+                return cache::avatarUrl(room_id_, readReceipts_[index.row()].first);
         case Timestamp:
-                return readReceipts_[index.row()]->timestamp();
+                return dateFormat(readReceipts_[index.row()].second);
         default:
                 return {};
         }
@@ -65,41 +59,25 @@ void
 ReadReceiptsModel::addUsers(
   const std::multimap<uint64_t, std::string, std::greater<uint64_t>> &users)
 {
-        std::multimap<uint64_t, std::string, std::greater<uint64_t>> unshown;
+        beginInsertRows(QModelIndex{}, readReceipts_.length(), users.size() - 1);
+
+        readReceipts_.clear();
         for (const auto &user : users) {
-                if (users_.find(user.first) == users_.end())
-                        unshown.emplace(user);
+                readReceipts_.push_back({QString::fromStdString(user.second),
+                                         QDateTime::fromMSecsSinceEpoch(user.first)});
         }
 
-        beginInsertRows(
-          QModelIndex{}, readReceipts_.length(), readReceipts_.length() + unshown.size() - 1);
-
-        for (const auto &user : unshown)
-                readReceipts_.push_back(
-                  new ReadReceipt{QString::fromStdString(user.second), room_id_, user.first, this});
-
-        users_.merge(unshown);
+        std::sort(readReceipts_.begin(),
+                  readReceipts_.end(),
+                  [](const QPair<QString, QDateTime> &a, const QPair<QString, QDateTime> &b) {
+                          return a.second > b.second;
+                  });
 
         endInsertRows();
 }
 
-ReadReceipt::ReadReceipt(QString mxid, QString room_id, uint64_t timestamp, QObject *parent)
-  : QObject{parent}
-  , mxid_{mxid}
-  , room_id_{room_id}
-  , displayName_{cache::displayName(room_id_, mxid_)}
-  , avatarUrl_{cache::avatarUrl(room_id_, mxid_)}
-  , timestamp_{timestamp}
-{}
-
-QString
-ReadReceipt::timestamp() const
-{
-        return dateFormat(QDateTime::fromMSecsSinceEpoch(timestamp_));
-}
-
 QString
-ReadReceipt::dateFormat(const QDateTime &then) const
+ReadReceiptsModel::dateFormat(const QDateTime &then) const
 {
         auto now  = QDateTime::currentDateTime();
         auto days = then.daysTo(now);
diff --git a/src/ReadReceiptsModel.h b/src/ReadReceiptsModel.h
index d90bf7c1..98e41f8f 100644
--- a/src/ReadReceiptsModel.h
+++ b/src/ReadReceiptsModel.h
@@ -8,40 +8,7 @@
 #include <QAbstractListModel>
 #include <QObject>
 #include <QString>
-
-class ReadReceipt : public QObject
-{
-        Q_OBJECT
-
-        Q_PROPERTY(QString mxid READ mxid CONSTANT)
-        Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
-        Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
-        Q_PROPERTY(QString timestamp READ timestamp CONSTANT)
-
-public:
-        explicit ReadReceipt(QString mxid,
-                             QString room_id,
-                             uint64_t timestamp,
-                             QObject *parent = nullptr);
-
-        QString mxid() const { return mxid_; }
-        QString displayName() const { return displayName_; }
-        QString avatarUrl() const { return avatarUrl_; }
-        QString timestamp() const;
-
-signals:
-        void displayNameChanged();
-        void avatarUrlChanged();
-
-private:
-        QString dateFormat(const QDateTime &then) const;
-
-        QString mxid_;
-        QString room_id_;
-        QString displayName_;
-        QString avatarUrl_;
-        uint64_t timestamp_;
-};
+#include <QDateTime>
 
 class ReadReceiptsModel : public QAbstractListModel
 {
@@ -60,7 +27,6 @@ public:
         };
 
         explicit ReadReceiptsModel(QString event_id, QString room_id, QObject *parent = nullptr);
-        ~ReadReceiptsModel() override;
 
         QString eventId() const { return event_id_; }
         QString roomId() const { return room_id_; }
@@ -77,10 +43,11 @@ public slots:
         void addUsers(const std::multimap<uint64_t, std::string, std::greater<uint64_t>> &users);
 
 private:
+        QString dateFormat(const QDateTime &then) const;
+
         QString event_id_;
         QString room_id_;
-        QVector<ReadReceipt *> readReceipts_;
-        std::multimap<uint64_t, std::string, std::greater<uint64_t>> users_;
+        QVector<QPair<QString, QDateTime>> readReceipts_;
 };
 
 #endif // READRECEIPTSMODEL_H