[SCM] ktp-common-internals packaging branch, master, updated. debian/15.12.1-2-1839-gf0635e9

Maximiliano Curia maxy at moszumanska.debian.org
Mon May 9 09:06:31 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=10e1a5f

The following commit has been merged in the master branch:
commit 10e1a5f8c87c357d4fcdc6a5a2d2a5f38f8d99a8
Author: David Edmundson <kde at davidedmundson.co.uk>
Date:   Sun Mar 3 19:54:55 2013 +0000

    Make PinnedContactModel use PersistentContact
    
    This fixes a bug in which contact pointers would be invalid after reconnections
    Hopefully also simplifies code
---
 KTp/Declarative/pinned-contacts-model.cpp | 247 ++++++++++++++----------------
 KTp/Declarative/pinned-contacts-model.h   |  18 ++-
 2 files changed, 127 insertions(+), 138 deletions(-)

diff --git a/KTp/Declarative/pinned-contacts-model.cpp b/KTp/Declarative/pinned-contacts-model.cpp
index e5febfa..8563251 100644
--- a/KTp/Declarative/pinned-contacts-model.cpp
+++ b/KTp/Declarative/pinned-contacts-model.cpp
@@ -38,39 +38,30 @@
 
 #include <KTp/presence.h>
 #include <KTp/contact.h>
+#include "KTp/global-contact-manager.h"
 
-struct Pin {
-    KTp::ContactPtr contact;
-    Tp::AccountPtr account;
-};
+#include "KTp/persistent-contact.h"
 
 class PinnedContactsModelPrivate {
 public:
-    QVector<Pin> m_pins;
+    PinnedContactsModelPrivate() {
+        conversations = 0;
+    }
+
+    QList<KTp::PersistentContactPtr> m_pins;
     Tp::AccountManagerPtr accountManager;
-    ConversationsModel *convesations;
+    ConversationsModel *conversations;
 
     QStringList pinsToString() const {
         QStringList ret;
-        Q_FOREACH(const Pin &p, m_pins) {
-            ret += p.account->uniqueIdentifier();
-            ret += p.contact->id();
+        Q_FOREACH(const KTp::PersistentContactPtr &p, m_pins) {
+            ret += p->accountId();
+            ret += p->contactId();
         }
         return ret;
     }
 };
 
-static Tp::AccountPtr findAccountByUniqueId(Tp::AccountManagerPtr manager, const QString &id)
-{
-    QList<Tp::AccountPtr> accounts = manager->allAccounts();
-    Q_FOREACH(const Tp::AccountPtr &account, accounts) {
-        if (account->uniqueIdentifier() == id) {
-            return account;
-        }
-    }
-    return Tp::AccountPtr();
-}
-
 PinnedContactsModel::PinnedContactsModel(QObject *parent)
     : QAbstractListModel(parent)
     , d(new PinnedContactsModelPrivate)
@@ -99,49 +90,19 @@ QStringList PinnedContactsModel::state() const
 
 void PinnedContactsModel::setState(const QStringList &pins)
 {
-    Q_ASSERT(pins.size() % 2 == 0 && "the state should be a pair number of account id and contact name");
-    if (!d->accountManager->isReady()) {
-        Tp::PendingReady *r = d->accountManager->becomeReady();
-        r->setProperty("newState", pins);
-        connect(r, SIGNAL(finished(Tp::PendingOperation*)), SLOT(initializeState(Tp::PendingOperation*)));
-    } else {
-        kDebug() << "loading pinned...." << pins;
-        for (int i = 0; i < pins.count(); i += 2) {
-            Tp::AccountPtr account = findAccountByUniqueId(d->accountManager, pins[i]);
-            if (account && account->connection()) {
-                Tp::PendingContacts *pending = account->connection()->contactManager()->contactsForIdentifiers(QStringList(pins[i+1]));
-                pending->setProperty("account", qVariantFromValue<Tp::AccountPtr>(account));
-                connect(pending, SIGNAL(finished(Tp::PendingOperation*)), SLOT(pinPendingContacts(Tp::PendingOperation*)));
-            }
-        }
+    for (int i = 0; i < pins.count(); i += 2) {
+        appendContactPin(KTp::PersistentContact::create(pins[0], pins[1]));
     }
 }
 
-void PinnedContactsModel::pinPendingContacts(Tp::PendingOperation* j)
-{
-    if (j->isValid()) {
-        Tp::PendingContacts *job = qobject_cast<Tp::PendingContacts*>(j);
-        Tp::AccountPtr account = job->property("account").value<Tp::AccountPtr>();
-        KTp::ContactPtr contact = KTp::ContactPtr::qObjectCast(job->contacts().first());
-        setPinning(account, contact, true);
-    } else
-        kDebug() << "error:" << j->errorName() << j->errorMessage();
-}
-
 QModelIndex PinnedContactsModel::indexForContact(const KTp::ContactPtr &contact) const
 {
-    int i = 0;
-    Q_FOREACH (const Pin &p, d->m_pins) {
-        if (p.contact == contact) {
-            break;
+    for (int i=0; i<d->m_pins.size();i++) {
+        if (d->m_pins[i]->contact() == contact) {
+            return index(i);
         }
-        i++;
-    }
-    if (i < d->m_pins.count()) {
-        return index(i);
-    } else {
-        return QModelIndex();
     }
+    return QModelIndex();
 }
 
 void PinnedContactsModel::setPinning(const Tp::AccountPtr &account, const KTp::ContactPtr &contact, bool newState)
@@ -149,10 +110,8 @@ void PinnedContactsModel::setPinning(const Tp::AccountPtr &account, const KTp::C
     QModelIndex idx = indexForContact(contact);
     bool found = idx.isValid();
     if (newState && !found) {
-        Pin p;
-        p.account = account;
-        p.contact = contact;
-        appendContact(p);
+        KTp::PersistentContactPtr p = KTp::PersistentContact::create(account->uniqueIdentifier(), contact->id());
+        appendContactPin(p);
     } else if (!newState && found) {
         removeRow(idx.row());
     }
@@ -161,43 +120,59 @@ void PinnedContactsModel::setPinning(const Tp::AccountPtr &account, const KTp::C
 QVariant PinnedContactsModel::data(const QModelIndex &index, int role) const
 {
     if (index.isValid()) {
-        const Pin &p = d->m_pins[index.row()];
+        KTp::PersistentContactPtr p = d->m_pins[index.row()];
         switch(role) {
-            case Qt::DisplayRole:
-                return p.contact->alias();
-            case PresenceIconRole:
-                return KTp::Presence(p.contact->presence()).icon();
-            case AvailabilityRole:
-                return p.contact->presence().type()!=Tp::ConnectionPresenceTypeOffline
-                    && p.contact->presence().type()!=Tp::ConnectionPresenceTypeError
-                    && p.contact->presence().type()!=Tp::ConnectionPresenceTypeUnset
-                    && p.contact->presence().type()!=Tp::ConnectionPresenceTypeUnknown;
-            case ContactRole:
-                return QVariant::fromValue<KTp::ContactPtr>(p.contact);
-            case AccountRole:
-                return QVariant::fromValue<Tp::AccountPtr>(p.account);
-            case AlreadyChattingRole: {
-                bool found = false;
-                for (int i = 0; !found && i < d->convesations->rowCount(); i++) {
-                    QModelIndex idx = d->convesations->index(i, 0);
-                    KTp::ContactPtr contact = idx.data(ConversationsModel::ConversationRole).value<Conversation*>()->target()->contact();
-                    found |= contact->id() == p.contact->id();
-                }
-                return found;
+        case Qt::DisplayRole:
+            if (p->contact()) {
+                return p->contact()->alias();
             }
-            case Qt::DecorationRole: {
-                KIcon icon;
-                if (p.contact) {
-                    QString file = p.contact->avatarData().fileName;
-                    if (!file.isEmpty()) {
-                        icon = KIcon(file);
-                    }
-                }
-                if (icon.isNull()) {
-                    icon = KIcon(QLatin1String("im-user"));
+            break;
+        case PresenceIconRole:
+            if (p->contact()) {
+                return KTp::Presence(p->contact()->presence()).icon();
+            } else {
+                return KTp::Presence(Tp::Presence::offline()).icon();
+            }
+            break;
+        case AvailabilityRole:
+            if (!p->contact()) {
+                return false;
+            }
+            else {
+                return p->contact()->presence().type()!=Tp::ConnectionPresenceTypeOffline
+                        && p->contact()->presence().type()!=Tp::ConnectionPresenceTypeError
+                        && p->contact()->presence().type()!=Tp::ConnectionPresenceTypeUnset
+                        && p->contact()->presence().type()!=Tp::ConnectionPresenceTypeUnknown;
+            }
+        case ContactRole:
+            return QVariant::fromValue<KTp::ContactPtr>(p->contact());
+        case AccountRole:
+            return QVariant::fromValue<Tp::AccountPtr>(p->account());
+        case AlreadyChattingRole: {
+            if (!p->contact()) {
+                return false;
+            }
+            bool found = false;
+            for (int i = 0; !found && i < d->conversations->rowCount(); i++) {
+                QModelIndex idx = d->conversations->index(i, 0);
+                KTp::ContactPtr contact = idx.data(ConversationsModel::ConversationRole).value<Conversation*>()->target()->contact();
+                found |= contact->id() == p->contact()->id();
+            }
+            return found;
+        }
+        case Qt::DecorationRole: {
+            KIcon icon;
+            if (p->contact()) {
+                QString file = p->contact()->avatarData().fileName;
+                if (!file.isEmpty()) {
+                    icon = KIcon(file);
                 }
-                return icon;
             }
+            if (icon.isNull()) {
+                icon = KIcon(QLatin1String("im-user"));
+            }
+            return icon;
+        }
         }
     }
     return QVariant();
@@ -211,67 +186,74 @@ int PinnedContactsModel::rowCount(const QModelIndex &parent) const
     return d->m_pins.count();
 }
 
-bool PinnedContactsModel::removeRows(int row, int count, const QModelIndex &parent)
+void PinnedContactsModel::removeContactPin(const KTp::PersistentContactPtr &pin)
 {
-    if (parent.isValid() || (row + count) > d->m_pins.count()) {
-        return false;
-    }
-    beginRemoveRows(parent, row, row + count - 1);
-    d->m_pins.remove(row, count);
+    int row = d->m_pins.indexOf(pin);
+    beginRemoveRows(QModelIndex(), row, row);
+    d->m_pins.removeAt(row);
     endRemoveRows();
-    return true;
 }
 
-void PinnedContactsModel::appendContact(const Pin &p)
+void PinnedContactsModel::appendContactPin(const KTp::PersistentContactPtr &pin)
 {
     int s = d->m_pins.size();
     beginInsertRows(QModelIndex(), s, s);
-    d->m_pins += p;
+    d->m_pins += pin;
     endInsertRows();
 
-    connect(p.contact.data(),
-            SIGNAL(avatarDataChanged(Tp::AvatarData)),
-            SLOT(contactDataChanged()));
-    connect(p.contact.data(),
-            SIGNAL(aliasChanged(QString)),
-            SLOT(contactDataChanged()));
-    connect(p.contact.data(),
-            SIGNAL(presenceChanged(Tp::Presence)),
-            SLOT(contactDataChanged()));
+    if (d->accountManager && d->accountManager->isReady()) {
+        pin->setAccountManager(d->accountManager);
+    }
+
+    if (pin->contact()) {
+        contactChanged(pin->contact());
+    }
+    connect(pin.data(), SIGNAL(contactChanged(KTp::ContactPtr)), SLOT(contactChanged(KTp::ContactPtr)));
+}
+
+void PinnedContactsModel::contactChanged(const KTp::ContactPtr &contact)
+{
+    if (contact) {
+        connect(contact.data(),
+                SIGNAL(avatarDataChanged(Tp::AvatarData)),
+                SLOT(contactDataChanged()));
+        connect(contact.data(),
+                SIGNAL(aliasChanged(QString)),
+                SLOT(contactDataChanged()));
+        connect(contact.data(),
+                SIGNAL(presenceChanged(Tp::Presence)),
+                SLOT(contactDataChanged()));
+    }
+
+    QModelIndex index = indexForContact(contact);
+    Q_EMIT dataChanged(index, index);
 }
 
 void PinnedContactsModel::contactDataChanged()
 {
     KTp::Contact *c = qobject_cast<KTp::Contact*>(sender());
-    int i = 0;
-    Q_FOREACH(const Pin &p, d->m_pins) {
-        if (p.contact == c) {
-            QModelIndex idx = index(i);
-            Q_EMIT dataChanged(idx, idx);
-            return;
-        }
-        i++;
-    }
+    QModelIndex index = indexForContact(KTp::ContactPtr(c));
+    Q_EMIT dataChanged(index, index);
 }
 
 void PinnedContactsModel::setConversationsModel(ConversationsModel *model)
 {
     beginResetModel();
-    d->convesations = model;
-    connect(d->convesations, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(conversationsStateChanged(QModelIndex, int, int)));
-    connect(d->convesations, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(conversationsStateChanged(QModelIndex, int, int)));
+    d->conversations = model;
+    connect(d->conversations, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), SLOT(conversationsStateChanged(QModelIndex, int, int)));
+    connect(d->conversations, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(conversationsStateChanged(QModelIndex, int, int)));
     endResetModel();
 }
 
 void PinnedContactsModel::conversationsStateChanged(const QModelIndex &parent, int start, int end)
 {
     for (int i = start; i <= end; i++) {
-        QModelIndex idx = d->convesations->index(i, 0, parent);
+        QModelIndex idx = d->conversations->index(i, 0, parent);
         Conversation* conv = idx.data(ConversationsModel::ConversationRole).value<Conversation*>();
         KTp::ContactPtr contact = conv->target()->contact();
-        Q_FOREACH(const Pin &p, d->m_pins) {
-            if (p.contact == contact) {
-                QModelIndex contactIdx = indexForContact(p.contact);
+        Q_FOREACH(const KTp::PersistentContactPtr &p, d->m_pins) {
+            if (p->contact() == contact) {
+                QModelIndex contactIdx = indexForContact(p->contact());
                 //We need to delay the dataChanged until the next event loop, when endRowsRemoved has been called
                 QMetaObject::invokeMethod(this, "dataChanged", Qt::QueuedConnection, Q_ARG(QModelIndex, contactIdx), Q_ARG(QModelIndex, contactIdx));
             }
@@ -281,7 +263,7 @@ void PinnedContactsModel::conversationsStateChanged(const QModelIndex &parent, i
 
 ConversationsModel* PinnedContactsModel::conversationsModel() const
 {
-    return d->convesations;
+    return d->conversations;
 }
 
 Tp::AccountManagerPtr PinnedContactsModel::accountManager() const
@@ -291,11 +273,14 @@ Tp::AccountManagerPtr PinnedContactsModel::accountManager() const
 
 void PinnedContactsModel::setAccountManager(const Tp::AccountManagerPtr &accounts)
 {
-    accounts->becomeReady();
     d->accountManager = accounts;
+
+    connect(d->accountManager->becomeReady(), SIGNAL(finished(Tp::PendingOperation*)), SLOT(onAccountManagerReady()));
 }
 
-void PinnedContactsModel::initializeState(Tp::PendingOperation *op)
+void PinnedContactsModel::onAccountManagerReady()
 {
-    setState(op->property("newState").toStringList());
+    Q_FOREACH(const KTp::PersistentContactPtr &p, d->m_pins) {
+        p->setAccountManager(d->accountManager);
+    }
 }
diff --git a/KTp/Declarative/pinned-contacts-model.h b/KTp/Declarative/pinned-contacts-model.h
index 2b7658c..5d10760 100644
--- a/KTp/Declarative/pinned-contacts-model.h
+++ b/KTp/Declarative/pinned-contacts-model.h
@@ -21,19 +21,22 @@
 
 #include <QModelIndex>
 #include <QVector>
-#include "KTp/types.h"
 
-struct Pin;
+#include "types.h"
+#include "persistent-contact.h"
+
 class ConversationsModel;
 class PinnedContactsModelPrivate;
 
 class PinnedContactsModel : public QAbstractListModel
 {
     Q_OBJECT
+
     Q_PROPERTY(ConversationsModel *conversations READ conversationsModel WRITE setConversationsModel)
     Q_PROPERTY(Tp::AccountManagerPtr accountManager READ accountManager WRITE setAccountManager)
     Q_PROPERTY(QStringList state READ state WRITE setState)
-    Q_PROPERTY(int count READ rowCount NOTIFY countChanged);
+    Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
+
   public:
     explicit PinnedContactsModel(QObject *parent = 0);
     virtual ~PinnedContactsModel();
@@ -48,9 +51,9 @@ class PinnedContactsModel : public QAbstractListModel
 
     virtual QVariant data(const QModelIndex &index, int role) const;
     virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
-    virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
 
     Q_SLOT void setPinning(const Tp::AccountPtr &account, const KTp::ContactPtr &contact, bool newState);
+
     QModelIndex indexForContact(const KTp::ContactPtr &contact) const;
 
     ConversationsModel* conversationsModel() const;
@@ -64,15 +67,16 @@ class PinnedContactsModel : public QAbstractListModel
 
   private Q_SLOTS:
     void contactDataChanged();
-    void pinPendingContacts(Tp::PendingOperation *job);
-    void initializeState(Tp::PendingOperation *op);
+    void contactChanged(const KTp::ContactPtr &contact);
     void conversationsStateChanged(const QModelIndex &parent, int start, int end);
+    void onAccountManagerReady();
 
   Q_SIGNALS:
     void countChanged();
 
   private:
-    void appendContact(const Pin &p);
+    void appendContactPin(const KTp::PersistentContactPtr &pin);
+    void removeContactPin(const KTp::PersistentContactPtr &pin);
     PinnedContactsModelPrivate * const d;
 };
 

-- 
ktp-common-internals packaging



More information about the pkg-kde-commits mailing list