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