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