File indexing completed on 2024-04-21 04:56:56

0001 /**
0002  * SPDX-FileCopyrightText: 2018 Aleix Pol Gonzalez <aleixpol@kde.org>
0003  * SPDX-FileCopyrightText: 2018 Simon Redman <simon@ergotech.com>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 #ifndef CONVERSATIONSSORTFILTERPROXYMODEL_H
0009 #define CONVERSATIONSSORTFILTERPROXYMODEL_H
0010 
0011 #include <QLoggingCategory>
0012 #include <QQmlParserStatus>
0013 #include <QSortFilterProxyModel>
0014 
0015 Q_DECLARE_LOGGING_CATEGORY(KDECONNECT_SMS_CONVERSATIONS_SORT_FILTER_PROXY_MODEL)
0016 
0017 class ConversationsSortFilterProxyModel : public QSortFilterProxyModel, public QQmlParserStatus
0018 {
0019     Q_OBJECT
0020     Q_INTERFACES(QQmlParserStatus)
0021     Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder)
0022 public:
0023     Qt::SortOrder sortOrder() const
0024     {
0025         return m_sortOrder;
0026     }
0027     void setSortOrder(Qt::SortOrder sortOrder)
0028     {
0029         if (m_sortOrder != sortOrder) {
0030             m_sortOrder = sortOrder;
0031             sortNow();
0032         }
0033     }
0034     void classBegin() override
0035     {
0036     }
0037     void componentComplete() override
0038     {
0039         m_completed = true;
0040         sortNow();
0041     }
0042 
0043     Q_INVOKABLE void setConversationsFilterRole(int role);
0044 
0045     /**
0046      * This method gets name of conversations or contact if it find any matching address
0047      * Needed to check if the conversation or contact already exist or no before adding an arbitrary contact
0048      */
0049     Q_INVOKABLE bool doesAddressExists(const QString &address);
0050 
0051     ConversationsSortFilterProxyModel();
0052     ~ConversationsSortFilterProxyModel() override;
0053 
0054 protected:
0055     bool lessThan(const QModelIndex &leftIndex, const QModelIndex &rightIndex) const override;
0056     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
0057 
0058 private:
0059     void sortNow()
0060     {
0061         if (m_completed && dynamicSortFilter())
0062             sort(0, m_sortOrder);
0063     }
0064 
0065     bool m_completed = false;
0066     Qt::SortOrder m_sortOrder = Qt::AscendingOrder;
0067 };
0068 
0069 #endif // CONVERSATIONSSORTFILTERPROXYMODEL_H