[SCM] ktp-text-ui packaging branch, master, updated. debian/15.12.1-1-1918-gdf4b0ec

Maximiliano Curia maxy at moszumanska.debian.org
Sat May 28 00:19:08 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-text-ui.git;a=commitdiff;h=fb5d9f2

The following commit has been merged in the master branch:
commit fb5d9f201a9773864b89cf8dba47acc8b94116fa
Author: David Edmundson <kde at davidedmundson.co.uk>
Date:   Thu Mar 24 02:34:41 2011 +0000

    Turn the channel contact list into a model.
    Show channel users in a tree view.
---
 lib/channel-contact-list.cpp | 137 ++++++++++++++++++++++++++++++-------------
 lib/channel-contact-list.h   |  40 ++++++-------
 lib/chat-widget.cpp          |   2 +
 lib/chat-widget.ui           |  29 ++++-----
 4 files changed, 127 insertions(+), 81 deletions(-)

diff --git a/lib/channel-contact-list.cpp b/lib/channel-contact-list.cpp
index 2eccee0..980f4eb 100644
--- a/lib/channel-contact-list.cpp
+++ b/lib/channel-contact-list.cpp
@@ -18,66 +18,119 @@
  ***************************************************************************/
 
 #include "channel-contact-list.h"
-#include <TelepathyQt4/Contact>
+
 #include <KDebug>
+#include <KIcon>
+
+ChannelContactList::ChannelContactList(const Tp::TextChannelPtr & channel, QObject *parent)
+    : QAbstractListModel(parent)
+{
+
+    addContacts(channel->groupContacts());
+
+    connect(channel.data(),
+            SIGNAL(groupMembersChanged(Tp::Contacts,Tp::Contacts,Tp::Contacts,
+                                       Tp::Contacts,Tp::Channel::GroupMemberChangeDetails)),
+            SLOT(onGroupMembersChanged(Tp::Contacts,Tp::Contacts,Tp::Contacts,
+                                     Tp::Contacts,Tp::Channel::GroupMemberChangeDetails)));
+}
+
+void ChannelContactList::onGroupMembersChanged(const Tp::Contacts & groupMembersAdded,
+                                             const Tp::Contacts & groupLocalPendingMembersAdded,
+                                             const Tp::Contacts & groupRemotePendingMembersAdded,
+                                             const Tp::Contacts & groupMembersRemoved,
+                                             const Tp::Channel::GroupMemberChangeDetails & details)
+{
+    kDebug();
 
-/** reif This class provides an abstracted way of getting presence changes from a contact
-  * It was needed to be able to pair up a contact changing, with the name of the contact.
-  * It gives a single signal for the calling code to handle for every contact, and
-  * also safetly handles connect and disconnecting slots as contacts enter and leave a channel
-*/
+    Q_UNUSED(groupLocalPendingMembersAdded);
+    Q_UNUSED(groupRemotePendingMembersAdded);
+    Q_UNUSED(details);
 
-/** Internal private class*/
+    addContacts(groupMembersAdded);
+    removeContacts(groupMembersRemoved);
+}
+
+void ChannelContactList::onContactPresenceChanged(const Tp::Presence &presence)
+{
+    Tp::ContactPtr contact(qobject_cast<Tp::Contact*>(sender()));
 
-/*
- [23:50] <oggis_> if you want to show events just for the current members, then i'd maintain said list/set by connecting to
-groupMembersChanged and adding to it everybody in the groupMembersAdded set, and removing to it everybody in any of the
-other sets (taking set union of them is easiest)
- */
+    QModelIndex index = createIndex(m_contacts.lastIndexOf(contact), 0);
+    emit dataChanged(index, index);
 
+    emit contactPresenceChanged(contact, presence);}
 
-ChannelContactListContact::ChannelContactListContact(const Tp::ContactPtr & contact, QObject *parent)
-    : QObject(parent)
+void ChannelContactList::onContactAliasChanged(const QString &alias)
 {
-    m_contact = contact;
-    connect(m_contact.data(), SIGNAL(presenceChanged(Tp::Presence)),
-            SLOT(onPresenceChanged(Tp::Presence)));
-    connect(m_contact.data(), SIGNAL(aliasChanged(QString)), SLOT(onAliasChanged(QString)));
+    Tp::ContactPtr contact(qobject_cast<Tp::Contact*>(sender()));
+
+    QModelIndex index = createIndex(m_contacts.lastIndexOf(contact), 0);
+    emit dataChanged(index, index);
+
+    emit contactAliasChanged(contact, alias);
 }
 
-void ChannelContactListContact::onPresenceChanged(const Tp::Presence & presence)
+int ChannelContactList::rowCount(const QModelIndex &parent) const
 {
-    Q_EMIT contactPresenceChanged(m_contact, presence);
+    if (! parent.isValid()) {
+        return m_contacts.size();
+    }
+    return 0;
 }
 
-void ChannelContactListContact::onAliasChanged(const QString &alias)
+QVariant ChannelContactList::data(const QModelIndex &index, int role) const
 {
-    Q_EMIT contactAliasChanged(m_contact, alias);
+    if(!index.isValid()) {
+        return QVariant();
+    }
+
+    int row = index.row();
+
+    switch (role) {
+    case Qt::DisplayRole:
+        return QVariant(m_contacts[row]->alias());
+    case Qt::DecorationRole:
+        switch(m_contacts[row]->presence().type()) {
+        case Tp::ConnectionPresenceTypeAvailable:
+            return QVariant(KIcon("im-user"));
+        case Tp::ConnectionPresenceTypeAway:
+        case Tp::ConnectionPresenceTypeExtendedAway:
+            return QVariant(KIcon("im-user-away"));
+        case Tp::ConnectionPresenceTypeBusy:
+            return QVariant(KIcon("im-user-busy"));
+        case Tp::ConnectionPresenceTypeOffline:
+        case Tp::ConnectionPresenceTypeHidden:
+            return QVariant(KIcon("im-user-offline"));
+        default:
+            return QVariant(KIcon("im-user"));
+        }
+         //icon for presence stuff here? im-user-away etc.
+    default:
+        return QVariant();
+    }
 }
 
-ChannelContactList::ChannelContactList(const Tp::TextChannelPtr & channel, QObject *parent)
-    : QObject(parent)
+void ChannelContactList::addContacts(const Tp::Contacts &contacts)
 {
-    foreach(Tp::ContactPtr contact, channel->groupContacts()) {
-        //FIXME move this to a slot called "addContact" - also call this when chat gains a person.
-        ChannelContactListContact*  contactProxy = new ChannelContactListContact(contact, this);
-        connect(contactProxy, SIGNAL(contactPresenceChanged(Tp::ContactPtr,Tp::Presence)),
-                SIGNAL(contactPresenceChanged(Tp::ContactPtr,Tp::Presence)));
-        connect(contactProxy, SIGNAL(contactAliasChanged(Tp::ContactPtr,QString)),
-                SIGNAL(contactAliasChanged(Tp::ContactPtr,QString)));
+    QList<Tp::ContactPtr> newContacts = contacts.toList();
+
+    foreach(Tp::ContactPtr contact, newContacts) {
+        connect(contact.data(), SIGNAL(aliasChanged(QString)), SLOT(onContactAliasChanged(QString)));
+        connect(contact.data(), SIGNAL(presenceChanged(Tp::Presence)), SLOT(onContactPresenceChanged(Tp::Presence)));
     }
-    connect(channel.data(),
-            SIGNAL(groupMembersChanged(Tp::Contacts,Tp::Contacts,Tp::Contacts,
-                                       Tp::Contacts,Tp::Channel::GroupMemberChangeDetails)),
-            SLOT(groupMembersChanged(Tp::Contacts,Tp::Contacts,Tp::Contacts,
-                                     Tp::Contacts,Tp::Channel::GroupMemberChangeDetails)));
+
+    beginInsertRows(QModelIndex(), m_contacts.size(), m_contacts.size() + newContacts.size());
+    m_contacts << newContacts;
+    endInsertRows();
 }
 
-void ChannelContactList::groupMembersChanged(const Tp::Contacts & groupMembersAdded,
-                                             const Tp::Contacts & groupLocalPendingMembersAdded,
-                                             const Tp::Contacts & groupRemotePendingMembersAdded,
-                                             const Tp::Contacts & groupMembersRemoved,
-                                             const Tp::Channel::GroupMemberChangeDetails & details)
+void ChannelContactList::removeContacts(const Tp::Contacts &contacts)
 {
-    kDebug() << "members changed.";
+    foreach(Tp::ContactPtr contact, contacts) {
+        //does it make sense to disconnect the signals here too? as technically the contact itself hasn't actually been deleted yet...
+        beginRemoveRows(QModelIndex(), m_contacts.indexOf(contact), m_contacts.indexOf(contact));
+        m_contacts.removeAll(contact);
+        endRemoveRows();
+    }
 }
+
diff --git a/lib/channel-contact-list.h b/lib/channel-contact-list.h
index 37f29e6..fe1db06 100644
--- a/lib/channel-contact-list.h
+++ b/lib/channel-contact-list.h
@@ -20,33 +20,18 @@
 #ifndef CHANNELCONTACTLIST_H
 #define CHANNELCONTACTLIST_H
 
-#include <QtCore/QObject>
+#include <QtCore/QAbstractListModel>
+
 #include <TelepathyQt4/TextChannel>
 #include <TelepathyQt4/Contact>
 #include <TelepathyQt4/Types>
 #include <TelepathyQt4/Channel>
 #include <TelepathyQt4/Presence>
 
-class ChannelContactListContact: public QObject
-{
-    Q_OBJECT
-public:
-    explicit ChannelContactListContact(const Tp::ContactPtr & contact, QObject *parent);
+/** A model of all users in the channel.
+  Also acts as a proxy for emiting presence and alias changes of any contacts in the channel for displaying as notifications*/
 
-signals:
-    void contactPresenceChanged(const Tp::ContactPtr & contact, const Tp::Presence & presence);
-    void contactAliasChanged(const Tp::ContactPtr & contact, const QString & alias);
-
-private slots:
-    void onPresenceChanged(const Tp::Presence & newPresence);
-    void onAliasChanged(const QString &alias);
-
-private:
-    Tp::ContactPtr m_contact;
-};
-
-
-class ChannelContactList : public QObject
+class ChannelContactList : public QAbstractListModel
 {
     Q_OBJECT
 public:
@@ -56,15 +41,24 @@ signals:
     void contactPresenceChanged(const Tp::ContactPtr & contact, const Tp::Presence & presence);
     void contactAliasChanged(const Tp::ContactPtr & contact, const QString & alias);
 
-public slots:
-    void groupMembersChanged(const Tp::Contacts &groupMembersAdded,
+protected:
+    int rowCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+
+private slots:
+    void onGroupMembersChanged(const Tp::Contacts &groupMembersAdded,
                              const Tp::Contacts &groupLocalPendingMembersAdded,
                              const Tp::Contacts &groupRemotePendingMembersAdded,
                              const Tp::Contacts &groupMembersRemoved,
                              const Tp::Channel::GroupMemberChangeDetails &details);
+    void onContactPresenceChanged(const Tp::Presence& presence);
+    void onContactAliasChanged(const QString &alias);
+
 
 private:
-    QSet<ChannelContactListContact> contacts;
+    void addContacts(const Tp::Contacts &contacts);
+    void removeContacts(const Tp::Contacts &contacts);
+    QList<Tp::ContactPtr> m_contacts;
 };
 
 #endif // CHANNELCONTACTLIST_H
diff --git a/lib/chat-widget.cpp b/lib/chat-widget.cpp
index 148deb3..cb50fe7 100644
--- a/lib/chat-widget.cpp
+++ b/lib/chat-widget.cpp
@@ -153,6 +153,8 @@ ChatWidget::ChatWidget(const Tp::TextChannelPtr & channel, QWidget *parent)
     connect(contactList, SIGNAL(contactAliasChanged(Tp::ContactPtr,QString)),
             SLOT(onContactAliasChanged(Tp::ContactPtr,QString)));
 
+    d->ui.contactsView->setModel(contactList);
+
     AdiumThemeHeaderInfo info;
     Tp::Contacts allContacts = d->channel->groupContacts();
     //normal chat - self and one other person.
diff --git a/lib/chat-widget.ui b/lib/chat-widget.ui
index 173e115..2dce82f 100644
--- a/lib/chat-widget.ui
+++ b/lib/chat-widget.ui
@@ -6,28 +6,25 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>429</width>
+    <width>512</width>
     <height>347</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>4</number>
-   </property>
    <item>
-    <widget class="AdiumThemeView" name="chatArea" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+    <widget class="QSplitter" name="splitter">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
      </property>
+     <widget class="AdiumThemeView" name="chatArea" native="true">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+     </widget>
+     <widget class="QListView" name="contactsView"/>
     </widget>
    </item>
    <item>

-- 
ktp-text-ui packaging



More information about the pkg-kde-commits mailing list