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