From 5fa1ad22e9ad7eec2ddac09e56b2b5de2cac80ba Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> Date: Thu, 11 Sep 2014 22:49:41 +0200 Subject: [PATCH] [ #54559 ] Improve Contact view filtering --- src/contact.cpp | 32 ++++++++++++++++++++++++++++++++ src/contact.h | 3 +++ src/contactproxymodel.cpp | 12 ++---------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/contact.cpp b/src/contact.cpp index d3a7fa59..8a8513bf 100644 --- a/src/contact.cpp +++ b/src/contact.cpp @@ -49,6 +49,11 @@ public: AbstractContactBackend* m_pBackend ; bool m_isPlaceHolder ; + //Cache + QString m_CachedFilterString; + + QString filterString(); + //Helper code to help handle multiple parents QList<Contact*> m_lParents; @@ -61,8 +66,29 @@ public: void phoneNumberCountAboutToChange(int,int); }; +QString ContactPrivate::filterString() +{ + if (m_CachedFilterString.size()) + return m_CachedFilterString; + + //Also filter by phone numbers, accents are negligible + foreach(const PhoneNumber* n , m_Numbers) { + m_CachedFilterString += n->uri(); + } + + //Strip non essential characters like accents from the filter string + foreach(const QChar& char2,QString(m_FormattedName+'\n'+m_Organization+'\n'+m_Group+'\n'+ + m_Department+'\n'+m_PreferredEmail).toLower().normalized(QString::NormalizationForm_KD) ) { + if (!char2.combiningClass()) + m_CachedFilterString += char2; + } + + return m_CachedFilterString; +} + void ContactPrivate::changed() { + m_CachedFilterString.clear(); foreach (Contact* c,m_lParents) { emit c->changed(); } @@ -352,6 +378,12 @@ time_t Contact::PhoneNumbers::lastUsedTimeStamp() const return t; } +///Recomputing the filter string is heavy, cache it +QString Contact::filterString() const +{ + return d->filterString(); +} + ///Callback when one of the phone number presence change void Contact::slotPresenceChanged() { diff --git a/src/contact.h b/src/contact.h index a42a982e..ff72c500 100644 --- a/src/contact.h +++ b/src/contact.h @@ -107,6 +107,9 @@ public: const QString& department () const; bool isActive () const; + //Cache + QString filterString () const; + //Number related getters (proxies) bool isPresent () const; bool isTracked () const; diff --git a/src/contactproxymodel.cpp b/src/contactproxymodel.cpp index 2099aa06..09c059b9 100644 --- a/src/contactproxymodel.cpp +++ b/src/contactproxymodel.cpp @@ -275,16 +275,8 @@ QVariant ContactProxyModel::data( const QModelIndex& index, int role) const return c->isActive(); case ContactModel::Role::DatedLastUsed: return QVariant(QDateTime::fromTime_t( c->phoneNumbers().lastUsedTimeStamp())); - case ContactModel::Role::Filter: { - //Strip non essential characters like accents from the filter string - QString normStripppedC; - foreach(QChar char2,QString(c->formattedName()+'\n'+c->organization()+'\n'+c->group()+'\n'+ - c->department()+'\n'+c->preferredEmail()).toLower().normalized(QString::NormalizationForm_KD) ) { - if (!char2.combiningClass()) - normStripppedC += char2; - } - return normStripppedC; - } + case ContactModel::Role::Filter: + return c->filterString(); default: break; } -- GitLab