From c7112dae12bd9536f8729c27eab3f0b6c5a1a6b5 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Wed, 3 Jul 2019 17:10:06 +1000 Subject: [PATCH] [libcontacts] Update section bucket index cache after deletions. Contributes to JB#46496 When a contact is deleted, we need to recalculate the section bucket index cache as that contact may have been the only contact in a given section bucket (display label group). However, since updating the section bucket index cache is an expensive operation, we should only do this once per bulk deletion, so this commit also adds support for bulk deletion operations. --- src/seasidecache.cpp | 43 +++++++++++++++++++++++++++---------------- src/seasidecache.h | 1 + 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/seasidecache.cpp b/src/seasidecache.cpp index 2a3d13d..44913c3 100644 --- a/src/seasidecache.cpp +++ b/src/seasidecache.cpp @@ -1024,19 +1024,35 @@ void SeasideCache::contactDataChanged(quint32 iid, FilterType filter) bool SeasideCache::removeContact(const QContact &contact) { - QContactId id = apiId(contact); - if (!validId(id)) - return false; + return removeContacts(QList() << contact); +} + +bool SeasideCache::removeContacts(const QList &contacts) +{ + bool allSucceeded = true; + QSet modifiedDisplayLabelGroups; + for (const QContact &contact : contacts) { + const QContactId id = apiId(contact); + if (!validId(id)) { + allSucceeded = false; + continue; + } - instancePtr->m_contactsToRemove.append(id); + instancePtr->m_contactsToRemove.append(id); - quint32 iid = internalId(id); - instancePtr->removeContactData(iid, FilterFavorites); - instancePtr->removeContactData(iid, FilterOnline); - instancePtr->removeContactData(iid, FilterAll); + quint32 iid = internalId(id); + instancePtr->removeContactData(iid, FilterFavorites); + instancePtr->removeContactData(iid, FilterOnline); + instancePtr->removeContactData(iid, FilterAll); + const QString group(displayLabelGroup(existingItem(iid))); + instancePtr->removeFromContactDisplayLabelGroup(iid, group, &modifiedDisplayLabelGroups); + } + + instancePtr->notifyDisplayLabelGroupsChanged(modifiedDisplayLabelGroups); + instancePtr->updateSectionBucketIndexCaches(); instancePtr->requestUpdate(); - return true; + return allSucceeded; } void SeasideCache::removeContactData(quint32 iid, FilterType filter) @@ -1051,13 +1067,6 @@ void SeasideCache::removeContactData(quint32 iid, FilterType filter) m_contacts[filter].removeAt(row); - if (filter == FilterAll) { - const QString group(displayLabelGroup(existingItem(iid))); - QSet modifiedDisplayLabelGroups; - removeFromContactDisplayLabelGroup(iid, group, &modifiedDisplayLabelGroups); - notifyDisplayLabelGroupsChanged(modifiedDisplayLabelGroups); - } - for (int i = 0; i < models.count(); ++i) models.at(i)->sourceItemsRemoved(); } @@ -1913,6 +1922,8 @@ bool SeasideCache::event(QEvent *event) m_people.erase(cacheItem); } } + + updateSectionBucketIndexCaches(); } } return true; diff --git a/src/seasidecache.h b/src/seasidecache.h index 4eb8d37..9329d67 100644 --- a/src/seasidecache.h +++ b/src/seasidecache.h @@ -308,6 +308,7 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject static bool saveContact(const QContact &contact); static bool removeContact(const QContact &contact); + static bool removeContacts(const QList &contacts); static void aggregateContacts(const QContact &contact1, const QContact &contact2); static void disaggregateContacts(const QContact &contact1, const QContact &contact2);