Skip to content
Snippets Groups Projects
Commit aeae319b authored by AmarOk's avatar AmarOk Committed by Nicolas Jager
Browse files

fix incorrect contact deletion


When a contact is removed we need to remove it from personmodel and update
recentmodel & categorizedcontactmodel.

Change-Id: I09694a901278cdd01f771ea83498613159180e8d
Tuleap: #1050
Reviewed-by: default avatarNicolas Jäger <nicolas.jager@savoirfairelinux.com>
parent 02f0db14
Branches
No related tags found
No related merge requests found
...@@ -113,6 +113,7 @@ private: ...@@ -113,6 +113,7 @@ private:
public Q_SLOTS: public Q_SLOTS:
void reloadCategories(); void reloadCategories();
void slotContactAdded(const Person* c); void slotContactAdded(const Person* c);
void slotContactRemoved(const Person* c);
}; };
ContactTreeNode::ContactTreeNode(const Person* ct, CategorizedContactModel* parent) : ContactTreeNode::ContactTreeNode(const Person* ct, CategorizedContactModel* parent) :
...@@ -247,6 +248,7 @@ CategorizedContactModel::CategorizedContactModel(int role) : QAbstractItemModel( ...@@ -247,6 +248,7 @@ CategorizedContactModel::CategorizedContactModel(int role) : QAbstractItemModel(
d_ptr->m_lMimes << RingMimes::PLAIN_TEXT << RingMimes::PHONENUMBER; d_ptr->m_lMimes << RingMimes::PLAIN_TEXT << RingMimes::PHONENUMBER;
connect(&PersonModel::instance(),&PersonModel::newPersonAdded,d_ptr.data(),&CategorizedContactModelPrivate::slotContactAdded); connect(&PersonModel::instance(),&PersonModel::newPersonAdded,d_ptr.data(),&CategorizedContactModelPrivate::slotContactAdded);
connect(&PersonModel::instance(),&PersonModel::personRemoved,d_ptr.data(),&CategorizedContactModelPrivate::slotContactRemoved);
for(int i=0; i < PersonModel::instance().rowCount();i++) { for(int i=0; i < PersonModel::instance().rowCount();i++) {
Person* p = qvariant_cast<Person*>(PersonModel::instance().index(i,0).data((int)Person::Role::Object)); Person* p = qvariant_cast<Person*>(PersonModel::instance().index(i,0).data((int)Person::Role::Object));
...@@ -323,6 +325,12 @@ void CategorizedContactModelPrivate::reloadCategories() ...@@ -323,6 +325,12 @@ void CategorizedContactModelPrivate::reloadCategories()
emit q_ptr->layoutChanged(); emit q_ptr->layoutChanged();
} }
void CategorizedContactModelPrivate::slotContactRemoved(const Person* c) {
Q_UNUSED(c)
reloadCategories();
}
void CategorizedContactModelPrivate::slotContactAdded(const Person* c) void CategorizedContactModelPrivate::slotContactAdded(const Person* c)
{ {
if (!c) return; if (!c) return;
......
...@@ -226,6 +226,7 @@ void ContactMethod::setPerson(Person* contact) ...@@ -226,6 +226,7 @@ void ContactMethod::setPerson(Person* contact)
contact->d_ptr->registerContactMethod(this); contact->d_ptr->registerContactMethod(this);
if (contact && d_ptr->m_Type != ContactMethod::Type::TEMPORARY) { if (contact && d_ptr->m_Type != ContactMethod::Type::TEMPORARY) {
contact->d_ptr->registerContactMethod(this);
PhoneDirectoryModel::instance().d_ptr->indexNumber(this,d_ptr->m_hNames.keys()+QStringList(contact->formattedName())); PhoneDirectoryModel::instance().d_ptr->indexNumber(this,d_ptr->m_hNames.keys()+QStringList(contact->formattedName()));
d_ptr->m_PrimaryName_cache = contact->formattedName(); d_ptr->m_PrimaryName_cache = contact->formattedName();
d_ptr->primaryNameChanged(d_ptr->m_PrimaryName_cache); d_ptr->primaryNameChanged(d_ptr->m_PrimaryName_cache);
......
...@@ -304,8 +304,38 @@ bool PersonModel::addItemCallback(const Person* c) ...@@ -304,8 +304,38 @@ bool PersonModel::addItemCallback(const Person* c)
bool PersonModel::removeItemCallback(const Person* item) bool PersonModel::removeItemCallback(const Person* item)
{ {
if (item) for (unsigned int nodeIdx = 0; nodeIdx < d_ptr->m_lPersons.size(); ++nodeIdx) {
emit const_cast<Person*>(item)->changed(); auto person = d_ptr->m_lPersons[nodeIdx]->m_pPerson.get();
if (person == item) {
for ( const auto cm : person->phoneNumbers() )
// cm is not linked to any person anymore
cm->setPerson(nullptr);
// Remove contact
beginRemoveRows(QModelIndex(), nodeIdx, nodeIdx);
d_ptr->m_lPersons[nodeIdx].release();
d_ptr->m_lPersons.erase(d_ptr->m_lPersons.begin() + nodeIdx);
// update indexes
for (unsigned int i = 0; i < d_ptr->m_lPersons.size(); ++i) {
d_ptr->m_lPersons[i]->m_Index = i;
for (unsigned int j = 0; j < d_ptr->m_lPersons[i]->m_lChildren.size(); ++j)
d_ptr->m_lPersons[i]->m_lChildren[j]->m_Index = j;
}
endRemoveRows();
//Deprecate the placeholder
if (d_ptr->m_hPlaceholders.contains(item->uid())) {
PersonPlaceHolder* placeholder = d_ptr->m_hPlaceholders[item->uid()];
if (placeholder)
d_ptr->m_hPlaceholders[item->uid()] = nullptr;
}
break;
}
}
emit personRemoved(item);
return item; return item;
} }
......
...@@ -87,9 +87,9 @@ public Q_SLOTS: ...@@ -87,9 +87,9 @@ public Q_SLOTS:
bool addNewPerson(Person* c, CollectionInterface* backend = nullptr); bool addNewPerson(Person* c, CollectionInterface* backend = nullptr);
Q_SIGNALS: Q_SIGNALS:
void personRemoved(const Person* c);
void newPersonAdded(const Person* c); void newPersonAdded(const Person* c);
void newBackendAdded(CollectionInterface* backend); void newBackendAdded(CollectionInterface* backend);
///The last time there was an interaction with this person changed ///The last time there was an interaction with this person changed
void lastUsedTimeChanged(Person* p, long long) const; void lastUsedTimeChanged(Person* p, long long) const;
}; };
...@@ -139,6 +139,7 @@ private: ...@@ -139,6 +139,7 @@ private:
public Q_SLOTS: public Q_SLOTS:
void slotLastUsedTimeChanged(const Person* p , time_t t ); void slotLastUsedTimeChanged(const Person* p , time_t t );
void slotPersonAdded (const Person* p ); void slotPersonAdded (const Person* p );
void slotPersonRemoved (const Person* p );
void slotLastUsedChanged (ContactMethod* cm, time_t t ); void slotLastUsedChanged (ContactMethod* cm, time_t t );
void slotContactChanged (ContactMethod* cm, Person* np, Person* op); void slotContactChanged (ContactMethod* cm, Person* np, Person* op);
void slotCallAdded (Call* call , Call* parent ); void slotCallAdded (Call* call , Call* parent );
...@@ -205,6 +206,7 @@ RecentModel::RecentModel(QObject* parent) : QAbstractItemModel(parent), d_ptr(ne ...@@ -205,6 +206,7 @@ RecentModel::RecentModel(QObject* parent) : QAbstractItemModel(parent), d_ptr(ne
{ {
connect(&PersonModel::instance() , &PersonModel::lastUsedTimeChanged , d_ptr, &RecentModelPrivate::slotLastUsedTimeChanged); connect(&PersonModel::instance() , &PersonModel::lastUsedTimeChanged , d_ptr, &RecentModelPrivate::slotLastUsedTimeChanged);
connect(&PersonModel::instance() , &PersonModel::newPersonAdded , d_ptr, &RecentModelPrivate::slotPersonAdded ); connect(&PersonModel::instance() , &PersonModel::newPersonAdded , d_ptr, &RecentModelPrivate::slotPersonAdded );
connect(&PersonModel::instance() , &PersonModel::personRemoved , d_ptr, &RecentModelPrivate::slotPersonRemoved );
connect(&PhoneDirectoryModel::instance(), &PhoneDirectoryModel::lastUsedChanged, d_ptr, &RecentModelPrivate::slotLastUsedChanged ); connect(&PhoneDirectoryModel::instance(), &PhoneDirectoryModel::lastUsedChanged, d_ptr, &RecentModelPrivate::slotLastUsedChanged );
connect(&PhoneDirectoryModel::instance(), &PhoneDirectoryModel::contactChanged , d_ptr, &RecentModelPrivate::slotContactChanged ); connect(&PhoneDirectoryModel::instance(), &PhoneDirectoryModel::contactChanged , d_ptr, &RecentModelPrivate::slotContactChanged );
connect(&CallModel::instance() , &CallModel::callAdded , d_ptr, &RecentModelPrivate::slotCallAdded ); connect(&CallModel::instance() , &CallModel::callAdded , d_ptr, &RecentModelPrivate::slotCallAdded );
...@@ -739,6 +741,26 @@ void RecentModelPrivate::slotPersonAdded(const Person* p) ...@@ -739,6 +741,26 @@ void RecentModelPrivate::slotPersonAdded(const Person* p)
} }
} }
void RecentModelPrivate::slotPersonRemoved(const Person* p)
{
// delete p from contacts
RecentViewNode* n = m_hPersonsToNodes.value(p);
const bool isNewContact = !n;
if ( isNewContact )
return;
removeNode(n);
// but keep the conversation
for ( const auto cmToAdd : p->phoneNumbers() ) {
const bool isNewCm = !m_hCMsToNodes.value(cmToAdd);
n = new RecentViewNode(cmToAdd, this);
m_hCMsToNodes[cmToAdd] = n;
insertNode(n, cmToAdd->lastUsed(), isNewCm);
}
}
void RecentModelPrivate::slotLastUsedTimeChanged(const Person* p, time_t t) void RecentModelPrivate::slotLastUsedTimeChanged(const Person* p, time_t t)
{ {
RecentViewNode* n = m_hPersonsToNodes.value(p); RecentViewNode* n = m_hPersonsToNodes.value(p);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment