Commit c8a7651b authored by Ronan Abhamon's avatar Ronan Abhamon

feat(components/contacts/ContactsListModel): supports `remove contact` action

parent e4d507ec
...@@ -45,10 +45,7 @@ class ContactModel : public QObject { ...@@ -45,10 +45,7 @@ class ContactModel : public QObject {
); );
public: public:
ContactModel ( ContactModel (std::shared_ptr<linphone::Friend> linphone_friend) {
QObject *parent,
std::shared_ptr<linphone::Friend> linphone_friend
) : QObject(parent) {
m_linphone_friend = linphone_friend; m_linphone_friend = linphone_friend;
} }
......
#include <QtDebug> #include <QtDebug>
#include "../../app/App.hpp"
#include "../core/CoreManager.hpp" #include "../core/CoreManager.hpp"
#include "ContactsListProxyModel.hpp" #include "ContactsListProxyModel.hpp"
...@@ -14,7 +15,11 @@ ContactsListModel::ContactsListModel (QObject *parent): QAbstractListModel(paren ...@@ -14,7 +15,11 @@ ContactsListModel::ContactsListModel (QObject *parent): QAbstractListModel(paren
// Init contacts with linphone friends list. // Init contacts with linphone friends list.
for (const auto &friend_ : m_linphone_friends->getFriends()) { for (const auto &friend_ : m_linphone_friends->getFriends()) {
ContactModel *contact = new ContactModel(this, friend_); ContactModel *contact = new ContactModel(friend_);
App::getInstance()->getEngine()->setObjectOwnership(
contact, QQmlEngine::CppOwnership
);
m_friend_to_contact[friend_.get()] = contact; m_friend_to_contact[friend_.get()] = contact;
m_list << contact; m_list << contact;
} }
...@@ -38,6 +43,30 @@ QVariant ContactsListModel::data (const QModelIndex &index, int role) const { ...@@ -38,6 +43,30 @@ QVariant ContactsListModel::data (const QModelIndex &index, int role) const {
return QVariant(); return QVariant();
} }
bool ContactsListModel::removeRow (int row, const QModelIndex &) {
return removeRows(row, 1);
}
bool ContactsListModel::removeRows (int row, int count, const QModelIndex &parent) {
int limit = row + count - 1;
if (row < 0 || count < 0 || limit >= m_list.count())
return false;
beginRemoveRows(parent, row, limit);
for (int i = 0; i < count; ++i) {
ContactModel *contact = m_list[row];
m_list.removeAt(row);
contact->deleteLater();
}
endRemoveRows();
return true;
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
ContactModel *ContactsListModel::mapSipAddressToContact (const QString &sipAddress) const { ContactModel *ContactsListModel::mapSipAddressToContact (const QString &sipAddress) const {
...@@ -52,3 +81,11 @@ ContactModel *ContactsListModel::mapSipAddressToContact (const QString &sipAddre ...@@ -52,3 +81,11 @@ ContactModel *ContactsListModel::mapSipAddressToContact (const QString &sipAddre
return contact; return contact;
} }
void ContactsListModel::removeContact (ContactModel *contact) {
qInfo() << "Removing contact:" << contact;
int index = m_list.indexOf(contact);
if (index == -1 || !removeRow(index))
qWarning() << "Unable to remove contact:" << index;
}
...@@ -15,16 +15,24 @@ class ContactsListModel : public QAbstractListModel { ...@@ -15,16 +15,24 @@ class ContactsListModel : public QAbstractListModel {
public: public:
ContactsListModel (QObject *parent = Q_NULLPTR); ContactsListModel (QObject *parent = Q_NULLPTR);
int rowCount (const QModelIndex &) const { int rowCount (const QModelIndex &index = QModelIndex()) const {
return m_list.count(); return m_list.count();
} }
QHash<int, QByteArray> roleNames () const; QHash<int, QByteArray> roleNames () const;
QVariant data (const QModelIndex &index, int role) const; QVariant data (const QModelIndex &index, int role) const;
bool removeRow (int row, const QModelIndex &parent = QModelIndex());
bool removeRows (int row, int count, const QModelIndex &parent = QModelIndex());
public slots: public slots:
// See: http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#data-ownership
// The returned value must have a explicit parent or a QQmlEngine::CppOwnership.
ContactModel *mapSipAddressToContact (const QString &sipAddress) const; ContactModel *mapSipAddressToContact (const QString &sipAddress) const;
void removeContact (ContactModel *contact);
private: private:
QList<ContactModel *> m_list; QList<ContactModel *> m_list;
QHash<const linphone::Friend *, ContactModel* > m_friend_to_contact; QHash<const linphone::Friend *, ContactModel* > m_friend_to_contact;
......
...@@ -29,8 +29,9 @@ ColumnLayout { ...@@ -29,8 +29,9 @@ ColumnLayout {
Utils.openConfirmDialog(window, { Utils.openConfirmDialog(window, {
descriptionText: qsTr('removeContactDescription'), descriptionText: qsTr('removeContactDescription'),
exitHandler: function (status) { exitHandler: function (status) {
// TODO if (status) {
console.log('remove contact', status) ContactsListModel.removeContact(contact)
}
}, },
title: qsTr('removeContactTitle') title: qsTr('removeContactTitle')
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment