From 4265f63f3f1c6d340d967bff7da5afc83c328f23 Mon Sep 17 00:00:00 2001
From: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
Date: Thu, 14 Jan 2016 11:58:52 -0500
Subject: [PATCH] TextRecording: add unread text messages filter

To be able to to easily fetch all the unread text messages or just
get their number.

Change-Id: I2e4e776b49be9367003fffe47aedd31e1feb637b
Tuleap: #203
---
 src/media/textrecording.cpp   | 43 ++++++++++++++++++++++++++++++-----
 src/media/textrecording.h     |  1 +
 src/private/textrecording_p.h |  3 ++-
 3 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/src/media/textrecording.cpp b/src/media/textrecording.cpp
index dee46bf0..abaf602b 100644
--- a/src/media/textrecording.cpp
+++ b/src/media/textrecording.cpp
@@ -212,10 +212,10 @@ void Media::TextRecording::setAllRead()
    be replaced by the new one, be it in KItemModels (the KDE abstract proxy
    library) or QtCore.
  */
-class BooleanProxyModel : public QSortFilterProxyModel
+class TextProxyModel : public QSortFilterProxyModel
 {
 public:
-   explicit BooleanProxyModel(QObject* parent) : QSortFilterProxyModel(parent){}
+   explicit TextProxyModel(QObject* parent) : QSortFilterProxyModel(parent){}
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
    {
       const QModelIndex srcIdx = sourceModel()->index(source_row, filterKeyColumn(), source_parent);
@@ -230,15 +230,46 @@ public:
  */
 QAbstractItemModel* Media::TextRecording::instantTextMessagingModel() const
 {
-   if (!d_ptr->m_pTextMessagesModels) {
-      auto p = new BooleanProxyModel(const_cast<TextRecording*>(this));
+   if (!d_ptr->m_pTextMessagesModel) {
+      auto p = new TextProxyModel(const_cast<TextRecording*>(this));
       p->setSourceModel(instantMessagingModel());
-      d_ptr->m_pTextMessagesModels = p;
+      d_ptr->m_pTextMessagesModel = p;
    }
 
-   return d_ptr->m_pTextMessagesModels;
+   return d_ptr->m_pTextMessagesModel;
 }
 
+/**
+ * Proxy model to get the unread text messages, as well as their number (rowCount)
+ */
+class UnreadProxyModel : public QSortFilterProxyModel
+{
+public:
+    explicit UnreadProxyModel(QObject* parent) : QSortFilterProxyModel(parent){}
+    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
+    {
+        const QModelIndex srcIdx = sourceModel()->index(source_row, filterKeyColumn(), source_parent);
+
+        return !srcIdx.data((int)Media::TextRecording::Role::IsRead).toBool();
+    }
+};
+
+/**
+ * Subset of the instantTextMessagingModel() with only unread plain text and HTML
+ * messages. This model can be used to get the number of unread messages.
+ */
+QAbstractItemModel* Media::TextRecording::unreadInstantTextMessagingModel() const
+{
+    if (!d_ptr->m_pUnreadTextMessagesModel) {
+       auto p = new UnreadProxyModel(instantTextMessagingModel());
+       p->setSourceModel(instantTextMessagingModel());
+       d_ptr->m_pUnreadTextMessagesModel = p;
+    }
+
+    return d_ptr->m_pUnreadTextMessagesModel;
+}
+
+
 bool Media::TextRecording::isEmpty() const
 {
    return !d_ptr->m_lNodes.size();
diff --git a/src/media/textrecording.h b/src/media/textrecording.h
index b038f864..1f37b509 100644
--- a/src/media/textrecording.h
+++ b/src/media/textrecording.h
@@ -69,6 +69,7 @@ public:
    //Getter
    QAbstractItemModel* instantMessagingModel    (                         ) const;
    QAbstractItemModel* instantTextMessagingModel(                         ) const;
+   QAbstractItemModel* unreadInstantTextMessagingModel(                   ) const;
    bool                isEmpty                  (                         ) const;
    bool                hasMimeType              ( const QString& mimeType ) const;
    QStringList         mimeTypes                (                         ) const;
diff --git a/src/private/textrecording_p.h b/src/private/textrecording_p.h
index 52372434..c2d55fc2 100644
--- a/src/private/textrecording_p.h
+++ b/src/private/textrecording_p.h
@@ -158,7 +158,8 @@ public:
    QList<Serializable::Peers*> m_lAssociatedPeers   ;
    QHash<QString,bool>         m_hMimeTypes         ;
    QStringList                 m_lMimeTypes         ;
-   QAbstractItemModel*         m_pTextMessagesModels {nullptr};
+   QAbstractItemModel*         m_pTextMessagesModel {nullptr};
+   QAbstractItemModel*         m_pUnreadTextMessagesModel {nullptr};
 
    //Helper
    void insertNewMessage(const QMap<QString,QString>& message, ContactMethod* cm, Media::Media::Direction direction);
-- 
GitLab