File indexing completed on 2023-11-26 08:16:44

0001 /*
0002  * Provide some filters on the account model
0003  *
0004  * Copyright (C) 2011,2012 David Edmundson <kde@davidedmundson.co.uk>
0005  * Copyright (C) 2012 Daniele E. Domenichelli <daniele.domenichelli@gmail.com>
0006  *
0007  * This library is free software; you can redistribute it and/or
0008  * modify it under the terms of the GNU Lesser General Public
0009  * License as published by the Free Software Foundation; either
0010  * version 2.1 of the License, or (at your option) any later version.
0011  *
0012  * This library is distributed in the hope that it will be useful,
0013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015  * Lesser General Public License for more details.
0016  *
0017  * You should have received a copy of the GNU Lesser General Public
0018  * License along with this library; if not, write to the Free Software
0019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
0020  */
0021 
0022 #ifndef CONTACTSFILTERMODEL_H
0023 #define CONTACTSFILTERMODEL_H
0024 
0025 #include <QSortFilterProxyModel>
0026 
0027 #include <KTp/types.h>
0028 #include <KTp/Models/ktpmodels_export.h>
0029 
0030 namespace KTp
0031 
0032 {
0033 
0034 /**
0035   * \brief Class used to sort and filter the contacts.
0036   */
0037 class KTPMODELS_EXPORT ContactsFilterModel : public QSortFilterProxyModel
0038 {
0039     Q_OBJECT
0040     Q_DISABLE_COPY(ContactsFilterModel)
0041 
0042     Q_ENUMS(PresenceFilterFlag
0043             CapabilityFilterFlag
0044             SubscriptionStateFilterFlag)
0045 
0046     Q_FLAGS(PresenceTypeFilterFlags
0047             CapabilityFilterFlags
0048             SubscriptionStateFilterFlags)
0049 
0050     Q_PROPERTY(PresenceTypeFilterFlags presenceTypeFilterFlags
0051                READ presenceTypeFilterFlags
0052                RESET clearPresenceTypeFilterFlags
0053                WRITE setPresenceTypeFilterFlags
0054                NOTIFY presenceTypeFilterFlagsChanged)
0055 
0056     Q_PROPERTY(CapabilityFilterFlags capabilityFilterFlags
0057                READ capabilityFilterFlags
0058                RESET clearCapabilityFilterFlags
0059                WRITE setCapabilityFilterFlags
0060                NOTIFY capabilityFilterFlagsChanged)
0061 
0062     // FIXME This resumes Subscription state, Publish state and blocking state, perhaps we should find a better name
0063     Q_PROPERTY(SubscriptionStateFilterFlags subscriptionStateFilterFlags
0064                READ subscriptionStateFilterFlags
0065                RESET clearSubscriptionStateFilterFlags
0066                WRITE setSubscriptionStateFilterFlags
0067                NOTIFY subscriptionStateFilterFlagsChanged)
0068 
0069     // Filters on all fields
0070     Q_PROPERTY(QString globalFilterString
0071                READ globalFilterString
0072                RESET clearGlobalFilterString
0073                WRITE setGlobalFilterString
0074                NOTIFY globalFilterStringChanged)
0075     Q_PROPERTY(Qt::MatchFlags globalFilterMatchFlags
0076                READ globalFilterMatchFlags
0077                RESET resetGlobalFilterMatchFlags
0078                WRITE setGlobalFilterMatchFlags
0079                NOTIFY globalFilterMatchFlagsChanged)
0080 
0081     Q_PROPERTY(QString displayNameFilterString
0082                READ displayNameFilterString
0083                RESET clearDisplayNameFilterString
0084                WRITE setDisplayNameFilterString
0085                NOTIFY displayNameFilterStringChanged)
0086     Q_PROPERTY(QString nicknameFilterString
0087                READ nicknameFilterString
0088                RESET clearNicknameFilterString
0089                WRITE setNicknameFilterString
0090                NOTIFY nicknameFilterStringChanged)
0091     Q_PROPERTY(QString aliasFilterString
0092                READ aliasFilterString
0093                RESET clearAliasFilterString
0094                WRITE setAliasFilterString
0095                NOTIFY aliasFilterStringChanged)
0096     Q_PROPERTY(QString groupsFilterString
0097                READ groupsFilterString
0098                RESET clearGroupsFilterString
0099                WRITE setGroupsFilterString
0100                NOTIFY groupsFilterStringChanged)
0101     Q_PROPERTY(QString idFilterString
0102                READ idFilterString
0103                RESET clearIdFilterString
0104                WRITE setIdFilterString
0105                NOTIFY idFilterStringChanged)
0106     Q_PROPERTY(QStringList tubesFilterStrings
0107                READ tubesFilterStrings
0108                RESET clearTubesFilterStrings
0109                WRITE setTubesFilterStrings
0110                NOTIFY tubesFilterStringsChanged)
0111     Q_PROPERTY(Qt::MatchFlags displayNameFilterMatchFlags
0112                READ displayNameFilterMatchFlags
0113                RESET resetDisplayNameFilterMatchFlags
0114                WRITE setDisplayNameFilterMatchFlags
0115                NOTIFY displayNameFilterMatchFlagsChanged)
0116     Q_PROPERTY(Qt::MatchFlags nicknameFilterMatchFlags
0117                READ nicknameFilterMatchFlags
0118                RESET resetNicknameFilterMatchFlags
0119                WRITE setNicknameFilterMatchFlags
0120                NOTIFY nicknameFilterMatchFlagsChanged)
0121     Q_PROPERTY(Qt::MatchFlags aliasFilterMatchFlags
0122                READ aliasFilterMatchFlags
0123                RESET resetAliasFilterMatchFlags
0124                WRITE setAliasFilterMatchFlags
0125                NOTIFY aliasFilterMatchFlagsChanged)
0126     Q_PROPERTY(Qt::MatchFlags groupsFilterMatchFlags
0127                READ groupsFilterMatchFlags
0128                RESET resetGroupsFilterMatchFlags
0129                WRITE setGroupsFilterMatchFlags
0130                NOTIFY groupsFilterMatchFlagsChanged)
0131     Q_PROPERTY(Qt::MatchFlags idFilterMatchFlags
0132                READ idFilterMatchFlags
0133                RESET resetIdFilterMatchFlags
0134                WRITE setIdFilterMatchFlags
0135                NOTIFY idFilterMatchFlagsChanged)
0136 
0137     Q_PROPERTY(Tp::AccountPtr accountFilter
0138                READ accountFilter
0139                RESET clearAccountFilter
0140                WRITE setAccountFilter
0141                NOTIFY accountFilterChanged)
0142 
0143     Q_PROPERTY(QString sortRoleString
0144                READ sortRoleString
0145                WRITE setSortRoleString)
0146 
0147 public:
0148 
0149     enum PresenceTypeFilterFlag {
0150         DoNotFilterByPresence                  = 0x0000,
0151         HidePresenceTypeUnset                  = 0x0001,
0152         HidePresenceTypeOffline                = 0x0002,
0153         HidePresenceTypeAvailable              = 0x0004,
0154         HidePresenceTypeAway                   = 0x0008,
0155         HidePresenceTypeExtendedAway           = 0x0010,
0156         HidePresenceTypeHidden                 = 0x0020,
0157         HidePresenceTypeBusy                   = 0x0040,
0158         HidePresenceTypeUnknown                = 0x0080,
0159         HidePresenceTypeError                  = 0x0100,
0160         HideAllOffline = HidePresenceTypeUnset |
0161                          HidePresenceTypeOffline |
0162                          HidePresenceTypeUnknown |
0163                          HidePresenceTypeError,
0164         HideAllOnline = HidePresenceTypeAvailable |
0165                         HidePresenceTypeAway |
0166                         HidePresenceTypeExtendedAway |
0167                         HidePresenceTypeHidden |
0168                         HidePresenceTypeBusy,
0169         HideAllUnavailable = HideAllOffline |
0170                              HidePresenceTypeAway |
0171                              HidePresenceTypeExtendedAway |
0172                              HidePresenceTypeBusy,
0173         ShowOnlyConnected = HideAllOffline,
0174         ShowOnlyDisconnected = HideAllOnline,
0175         ShowAll = DoNotFilterByPresence
0176     };
0177     Q_DECLARE_FLAGS(PresenceTypeFilterFlags, PresenceTypeFilterFlag)
0178 
0179     enum CapabilityFilterFlag {
0180         DoNotFilterByCapability                = 0x0000,
0181         FilterByTextChatCapability             = 0x0001,
0182         FilterByAudioCallCapability            = 0x0002,
0183         FilterByVideoCallCapability            = 0x0004,
0184         FilterByFileTransferCapability         = 0x0008,
0185         FilterByTubes                          = 0x0010,
0186 
0187         CustomFilterCapability                 = 0x10000 // a placemark for custom capabilities in inherited classes
0188     };
0189     Q_DECLARE_FLAGS(CapabilityFilterFlags, CapabilityFilterFlag)
0190 
0191     enum SubscriptionStateFilterFlag {
0192         DoNotFilterBySubscription              = 0x0000,
0193         HideSubscriptionStateNo                = 0x0001,
0194         HideSubscriptionStateAsk               = 0x0002,
0195         HideSubscriptionStateYes               = 0x0004,
0196         HidePublishStateNo                     = 0x0010,
0197         HidePublishStateAsk                    = 0x0020,
0198         HidePublishStateYes                    = 0x0040,
0199         HideBlocked                            = 0x0100,
0200         HideNonBlocked                         = 0x0200,
0201         ShowOnlyBlocked = HideNonBlocked
0202     };
0203     Q_DECLARE_FLAGS(SubscriptionStateFilterFlags, SubscriptionStateFilterFlag)
0204 
0205     ContactsFilterModel(QObject *parent = nullptr);
0206     ~ContactsFilterModel() override;
0207 
0208     QVariant data(const QModelIndex &index, int role) const override;
0209     void setSourceModel(QAbstractItemModel *sourceModel) override;
0210     void invalidateFilter();
0211 
0212     PresenceTypeFilterFlags presenceTypeFilterFlags() const;
0213     Q_SLOT void clearPresenceTypeFilterFlags();
0214     Q_SLOT void setPresenceTypeFilterFlags(PresenceTypeFilterFlags presenceTypeFilterFlags);
0215     Q_SIGNAL void presenceTypeFilterFlagsChanged(PresenceTypeFilterFlags presenceTypeFilterFlags);
0216 
0217     CapabilityFilterFlags capabilityFilterFlags() const;
0218     Q_SLOT void clearCapabilityFilterFlags();
0219     Q_SLOT void setCapabilityFilterFlags(CapabilityFilterFlags capabilityFilterFlags);
0220     Q_SIGNAL void capabilityFilterFlagsChanged(CapabilityFilterFlags capabilityFilterFlags);
0221 
0222     SubscriptionStateFilterFlags subscriptionStateFilterFlags() const;
0223     Q_SLOT void clearSubscriptionStateFilterFlags();
0224     Q_SLOT void setSubscriptionStateFilterFlags(SubscriptionStateFilterFlags subscriptionStateFilterFlags);
0225     Q_SIGNAL void subscriptionStateFilterFlagsChanged(SubscriptionStateFilterFlags subscriptionStateFilterFlags);
0226 
0227     QString globalFilterString() const;
0228     Q_SLOT void clearGlobalFilterString();
0229     Q_SLOT void setGlobalFilterString(const QString &globalFilterString);
0230     Q_SIGNAL void globalFilterStringChanged(const QString &globalFilterString);
0231     Qt::MatchFlags globalFilterMatchFlags() const;
0232     Q_SLOT void resetGlobalFilterMatchFlags();
0233     Q_SLOT void setGlobalFilterMatchFlags(Qt::MatchFlags globalStringMatchFlags);
0234     Q_SIGNAL void globalFilterMatchFlagsChanged(Qt::MatchFlags globalStringMatchFlags);
0235 
0236     QString displayNameFilterString() const;
0237     Q_SLOT void clearDisplayNameFilterString();
0238     Q_SLOT void setDisplayNameFilterString(const QString &displayNameFilterString);
0239     Q_SIGNAL void displayNameFilterStringChanged(const QString &displayNameFilterString);
0240     Qt::MatchFlags displayNameFilterMatchFlags() const;
0241     Q_SLOT void resetDisplayNameFilterMatchFlags();
0242     Q_SLOT void setDisplayNameFilterMatchFlags(Qt::MatchFlags displayNameFilterMatchFlags);
0243     Q_SIGNAL void displayNameFilterMatchFlagsChanged(Qt::MatchFlags displayNameFilterMatchFlags);
0244 
0245     QString nicknameFilterString() const;
0246     Q_SLOT void clearNicknameFilterString();
0247     Q_SLOT void setNicknameFilterString(const QString &nicknameFilterString);
0248     Q_SIGNAL void nicknameFilterStringChanged(const QString &nicknameFilterString);
0249     Qt::MatchFlags nicknameFilterMatchFlags() const;
0250     Q_SLOT void resetNicknameFilterMatchFlags();
0251     Q_SLOT void setNicknameFilterMatchFlags(Qt::MatchFlags nicknameFilterMatchFlags);
0252     Q_SIGNAL void nicknameFilterMatchFlagsChanged(Qt::MatchFlags nicknameFilterMatchFlags);
0253 
0254     QString aliasFilterString() const;
0255     Q_SLOT void clearAliasFilterString();
0256     Q_SLOT void setAliasFilterString(const QString &aliasFilterString);
0257     Q_SIGNAL void aliasFilterStringChanged(const QString &aliasFilterString);
0258     Qt::MatchFlags aliasFilterMatchFlags() const;
0259     Q_SLOT void resetAliasFilterMatchFlags();
0260     Q_SLOT void setAliasFilterMatchFlags(Qt::MatchFlags aliasFilterMatchFlags);
0261     Q_SIGNAL void aliasFilterMatchFlagsChanged(Qt::MatchFlags aliasFilterMatchFlags);
0262 
0263     QString groupsFilterString() const;
0264     Q_SLOT void clearGroupsFilterString();
0265     Q_SLOT void setGroupsFilterString(const QString &groupsFilterString);
0266     Q_SIGNAL void groupsFilterStringChanged(const QString &groupsFilterString);
0267     Qt::MatchFlags groupsFilterMatchFlags() const;
0268     Q_SLOT void resetGroupsFilterMatchFlags();
0269     Q_SLOT void setGroupsFilterMatchFlags(Qt::MatchFlags groupsFilterMatchFlags);
0270     Q_SIGNAL void groupsFilterMatchFlagsChanged(Qt::MatchFlags groupsFilterMatchFlags);
0271 
0272     QString idFilterString() const;
0273     Q_SLOT void clearIdFilterString();
0274     Q_SLOT void setIdFilterString(const QString &idFilterString);
0275     Q_SIGNAL void idFilterStringChanged(const QString &idFilterString);
0276     Qt::MatchFlags idFilterMatchFlags() const;
0277     Q_SLOT void resetIdFilterMatchFlags();
0278     Q_SLOT void setIdFilterMatchFlags(Qt::MatchFlags idFilterMatchFlags);
0279     Q_SIGNAL void idFilterMatchFlagsChanged(Qt::MatchFlags idFilterMatchFlags);
0280 
0281     Tp::AccountPtr accountFilter() const;
0282     Q_SLOT void clearAccountFilter();
0283     Q_SLOT void setAccountFilter(const Tp::AccountPtr &accountFilter);
0284     Q_SIGNAL void accountFilterChanged(const Tp::AccountPtr &accountFilter);
0285 
0286     QStringList tubesFilterStrings() const;
0287     Q_SLOT void clearTubesFilterStrings();
0288     Q_SLOT void setTubesFilterStrings(const QStringList &tubesFilterStrings);
0289     Q_SIGNAL void tubesFilterStringsChanged(const QStringList &tubesFilterStrings);
0290 
0291     QString sortRoleString() const;
0292     Q_SLOT void setSortRoleString(const QString &role);
0293 
0294 protected:
0295     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
0296     bool lessThan (const QModelIndex &left, const QModelIndex &right) const override;
0297     QModelIndexList match(const QModelIndex &start, int role,
0298                           const QVariant &value, int hits,
0299                           Qt::MatchFlags flags) const override;
0300 
0301 private:
0302     class Private;
0303     Private * const d;
0304 
0305     Q_PRIVATE_SLOT(d, void sourceModelParentIndexChanged(const QModelIndex &sourceIndex))
0306     Q_PRIVATE_SLOT(d, void sourceModelIndexChanged(const QModelIndex &sourceIndex))
0307 };
0308 } //namespace
0309 
0310 #endif // CONTACTSFILTERMODEL_H