22#include "contactsfilterproxymodel.h"
24#include "contactstreemodel.h"
26#include <akonadi/entitytreemodel.h>
27#include <kabc/addressee.h>
28#include <kabc/contactgroup.h>
30static bool contactMatchesFilter(
const KABC::Addressee &contact,
const QString &filterString );
31static bool contactGroupMatchesFilter(
const KABC::ContactGroup &group,
const QString &filterString );
33using namespace Akonadi;
35class ContactsFilterProxyModel::Private
40 mExcludeVirtualCollections( false )
44 ContactsFilterProxyModel::FilterFlags flags;
45 bool mExcludeVirtualCollections;
49 : QSortFilterProxyModel( parent ), d( new Private )
52 setSortLocaleAware(
true );
53 setDynamicSortFilter(
true );
67bool ContactsFilterProxyModel::filterAcceptsRow(
int row,
const QModelIndex &parent )
const
69 const QModelIndex index = sourceModel()->index( row, 0, parent );
70 if ( d->mExcludeVirtualCollections ) {
71 const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
72 if ( collection.isValid() && collection.isVirtual() ) {
77 if ( ( d->mFilter.isEmpty() ) && ( !( d->flags & ContactsFilterProxyModel::HasEmail ) ) ) {
81 const Akonadi::Item item = index.data( Akonadi::EntityTreeModel::ItemRole ).value<Akonadi::Item>();
83 if ( item.hasPayload<KABC::Addressee>() ) {
84 const KABC::Addressee contact = item.payload<KABC::Addressee>();
85 if ( d->flags & ContactsFilterProxyModel::HasEmail ) {
86 if ( contact.emails().isEmpty() ) {
90 if ( !d->mFilter.isEmpty() ) {
91 return contactMatchesFilter( contact, d->mFilter );
94 if ( !d->mFilter.isEmpty() ) {
95 if ( item.hasPayload<KABC::ContactGroup>() ) {
96 const KABC::ContactGroup group = item.payload<KABC::ContactGroup>();
97 return contactGroupMatchesFilter( group, d->mFilter );
105bool ContactsFilterProxyModel::lessThan(
const QModelIndex &leftIndex,
const QModelIndex &rightIndex )
const
109 if ( leftDate.isValid() && rightDate.isValid() ) {
110 if ( leftDate.month() < rightDate.month() ) {
112 }
else if ( leftDate.month() == rightDate.month() ) {
113 if ( leftDate.day() < rightDate.day() ) {
121 return QSortFilterProxyModel::lessThan( leftIndex, rightIndex );
131 if ( exclude != d->mExcludeVirtualCollections ) {
132 d->mExcludeVirtualCollections = exclude;
137Qt::ItemFlags ContactsFilterProxyModel::flags(
const QModelIndex& index )
const
139 if ( !index.isValid() ) {
143 const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
144 if ( collection.isValid() ) {
145 return QSortFilterProxyModel::flags( index ) & ~( Qt::ItemIsSelectable );
147 return QSortFilterProxyModel::flags( index );
150static bool addressMatchesFilter(
const KABC::Address &address,
const QString &filterString )
152 if ( address.street().contains( filterString, Qt::CaseInsensitive ) ) {
156 if ( address.locality().contains( filterString, Qt::CaseInsensitive ) ) {
160 if ( address.region().contains( filterString, Qt::CaseInsensitive ) ) {
164 if ( address.postalCode().contains( filterString, Qt::CaseInsensitive ) ) {
168 if ( address.country().contains( filterString, Qt::CaseInsensitive ) ) {
172 if ( address.label().contains( filterString, Qt::CaseInsensitive ) ) {
176 if ( address.postOfficeBox().contains( filterString, Qt::CaseInsensitive ) ) {
183static bool contactMatchesFilter(
const KABC::Addressee &contact,
const QString &filterString )
185 if ( contact.assembledName().contains( filterString, Qt::CaseInsensitive ) ) {
189 if ( contact.formattedName().contains( filterString, Qt::CaseInsensitive ) ) {
193 if ( contact.nickName().contains( filterString, Qt::CaseInsensitive ) ) {
197 if ( contact.birthday().toString().contains( filterString, Qt::CaseInsensitive ) ) {
201 const KABC::Address::List addresses = contact.addresses();
202 int count = addresses.count();
203 for (
int i = 0; i < count; ++i ) {
204 if ( addressMatchesFilter( addresses.at( i ), filterString ) ) {
209 const KABC::PhoneNumber::List phoneNumbers = contact.phoneNumbers();
210 count = phoneNumbers.count();
211 for (
int i = 0; i < count; ++i ) {
212 if ( phoneNumbers.at( i ).number().contains( filterString, Qt::CaseInsensitive ) ) {
217 const QStringList emails = contact.emails();
218 count = emails.count();
219 for (
int i = 0; i < count; ++i ) {
220 if ( emails.at( i ).contains( filterString, Qt::CaseInsensitive ) ) {
225 const QStringList categories = contact.categories();
226 count = categories.count();
227 for (
int i = 0; i < count; ++i ) {
228 if ( categories.at( i ).contains( filterString, Qt::CaseInsensitive ) ) {
233 if ( contact.mailer().contains( filterString, Qt::CaseInsensitive ) ) {
237 if ( contact.title().contains( filterString, Qt::CaseInsensitive ) ) {
241 if ( contact.role().contains( filterString, Qt::CaseInsensitive ) ) {
245 if ( contact.organization().contains( filterString, Qt::CaseInsensitive ) ) {
249 if ( contact.department().contains( filterString, Qt::CaseInsensitive ) ) {
253 if ( contact.note().contains( filterString, Qt::CaseInsensitive ) ) {
257 if ( contact.url().url().contains( filterString, Qt::CaseInsensitive ) ) {
261 const QStringList customs = contact.customs();
262 count = customs.count();
263 for (
int i = 0; i < count; ++i ) {
264 if ( customs.at( i ).contains( filterString, Qt::CaseInsensitive ) ) {
272bool contactGroupMatchesFilter(
const KABC::ContactGroup &group,
const QString &filterString )
274 if ( group.name().contains( filterString, Qt::CaseInsensitive ) ) {
278 const uint count = group.dataCount();
279 for ( uint i = 0; i < count; ++i ) {
280 if ( group.data( i ).name().contains( filterString, Qt::CaseInsensitive ) ) {
283 if ( group.data( i ).email().contains( filterString, Qt::CaseInsensitive ) ) {