[SCM] ktp-contact-list packaging branch, master, updated. debian/15.12.1-2-1070-g6c56f91

Maximiliano Curia maxy at moszumanska.debian.org
Sat May 28 00:04:42 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-contact-list.git;a=commitdiff;h=9b87b01

The following commit has been merged in the master branch:
commit 9b87b01c369cdf50fbef3f3d179445f9a0083721
Author: Dario Freddi <drf at kde.org>
Date:   Sat Mar 27 13:21:10 2010 +0000

    Adding support for avatars into the contactlist (MR #3408)
    
    svn path=/trunk/playground/network/telepathy-contactlist/; revision=1107996
---
 contact-item.cpp        | 51 ++++++++++++++++++++++++++++++++++++-
 contact-item.h          |  2 ++
 contacts-list-model.cpp |  6 +++++
 contacts-list-model.h   |  3 ++-
 main-widget.cpp         | 68 +++++++++++++++++++++++++++++++++++++++++++++++++
 main-widget.h           | 14 +++++++++-
 meta-contact-item.cpp   | 16 ++++++++++++
 meta-contact-item.h     |  3 +++
 8 files changed, 160 insertions(+), 3 deletions(-)

diff --git a/contact-item.cpp b/contact-item.cpp
index 5db6999..d9d2fd0 100644
--- a/contact-item.cpp
+++ b/contact-item.cpp
@@ -24,6 +24,9 @@
 #include "contactgroup.h"
 
 #include <KDebug>
+#include <dataobject.h>
+#include <QPainter>
+#include <kiconloader.h>
 
 ContactItem::ContactItem(Nepomuk::PersonContact personContact,
                          Nepomuk::IMAccount imAccount,
@@ -98,6 +101,49 @@ void ContactItem::updatePresenceIcon()
     }
 
     m_presenceIcon = new KIcon(iconName);
+
+    kDebug() << "Attempt to build the avatar" << m_personContact.resourceUri();
+    // Ok, now build the avatar
+    m_pixmap = QPixmap();
+    if (!m_personContact.avatarTokens().isEmpty()) {
+        // Load the image then
+        if (!m_personContact.photos().isEmpty()) {
+            if (!m_personContact.photos().first().interpretedAses().isEmpty()) {
+                QByteArray imgdata =
+                QByteArray::fromBase64(
+                                m_personContact.photos().first().interpretedAses().first().plainTextContents().first().toUtf8());
+                QImage image = QImage::fromData(imgdata);
+                m_pixmap = QPixmap::fromImage(image);
+                m_pixmap = m_pixmap.scaled(32,32);
+            }
+        }
+    }
+
+    if (m_pixmap.isNull()) {
+        // try to load the action icon
+        m_pixmap = KIconLoader::global()->loadIcon("im-user",
+                                                   KIconLoader::NoGroup,
+                                                   32,
+                                                   KIconLoader::DefaultState,
+                                                   QStringList(),
+                                                   0,
+                                                   true);
+    }
+
+    // create a painter to paint the action icon over the key icon
+    QPainter painter(&m_pixmap);
+    // the the emblem icon to size 12
+    int overlaySize = 12;
+    // try to load the action icon
+    const QPixmap iconPixmap = m_presenceIcon->pixmap(overlaySize);
+    // if we're able to load the action icon paint it over
+    if (!m_pixmap.isNull()) {
+        QPoint startPoint;
+        // bottom right corner
+        startPoint = QPoint(32 - overlaySize - 1,
+                            32 - overlaySize - 1);
+        painter.drawPixmap(startPoint, iconPixmap);
+    }
 }
 
 const KIcon& ContactItem::presenceIcon() const
@@ -143,7 +189,10 @@ void ContactItem::onStatementAdded(const Soprano::Statement &statement)
     updatePresenceIcon();
     Q_EMIT dirty();
 }
-
+const QPixmap& ContactItem::avatar() const
+{
+    return m_pixmap;
+}
 
 #include "contact-item.moc"
 
diff --git a/contact-item.h b/contact-item.h
index 7a40fd5..6a498e9 100644
--- a/contact-item.h
+++ b/contact-item.h
@@ -48,6 +48,7 @@ public:
     QString displayName() const;
     QString accountIdentifier() const;
     const KIcon& presenceIcon() const;
+    const QPixmap& avatar() const;
     qint64 presenceType() const;
     QStringList groups() const;
 
@@ -66,6 +67,7 @@ private:
     Nepomuk::IMAccount m_imAccount;
 
     KIcon *m_presenceIcon;
+    QPixmap m_pixmap;
 };
 
 
diff --git a/contacts-list-model.cpp b/contacts-list-model.cpp
index fe53457..1acf855 100644
--- a/contacts-list-model.cpp
+++ b/contacts-list-model.cpp
@@ -150,6 +150,9 @@ QVariant ContactsListModel::data(const QModelIndex &index, int role) const
         case ContactsListModel::GroupsRole:
             data.setValue<QStringList>(contactItem->groups());
             break;
+        case ContactsListModel::AvatarRole:
+            data.setValue<QPixmap>(contactItem->avatar());
+            break;
         default:
             break;
         }
@@ -176,6 +179,9 @@ QVariant ContactsListModel::data(const QModelIndex &index, int role) const
         case ContactsListModel::GroupsRole:
             data.setValue<QStringList>(metaContactItem->groups());
             break;
+        case ContactsListModel::AvatarRole:
+            data.setValue<QPixmap>(metaContactItem->avatar());
+            break;
         default:
             break;
         }
diff --git a/contacts-list-model.h b/contacts-list-model.h
index 5d608fa..1cb1050 100644
--- a/contacts-list-model.h
+++ b/contacts-list-model.h
@@ -33,7 +33,8 @@ class ContactsListModel : public QAbstractItemModel
 public:
     enum {
         PresenceTypeRole = Qt::UserRole,
-        GroupsRole
+        GroupsRole,
+        AvatarRole
     };
 
     explicit ContactsListModel(QObject *parent = 0);
diff --git a/main-widget.cpp b/main-widget.cpp
index 19567f8..1489e03 100644
--- a/main-widget.cpp
+++ b/main-widget.cpp
@@ -26,6 +26,73 @@
 
 #include <KDebug>
 #include <QtGui/QSortFilterProxyModel>
+#include <QtGui/QPainter>
+
+const int SPACING = 4;
+const int AVATAR_SIZE = 32;
+
+ContactDelegate::ContactDelegate(QObject * parent)
+  : QStyledItemDelegate(parent)
+{
+}
+
+ContactDelegate::~ContactDelegate()
+{
+}
+
+void ContactDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & idx) const
+{
+    QStyleOptionViewItemV4 optV4 = option;
+    initStyleOption(&optV4, idx);
+
+    painter->save();
+
+    painter->setClipRect(optV4.rect);
+
+    QStyle *style = QApplication::style();
+    style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter);
+
+    QRect iconRect = optV4.rect;
+    iconRect.setSize(QSize(32, 32));
+    iconRect.moveTo(QPoint(iconRect.x() + SPACING, iconRect.y() + SPACING));
+
+    const QPixmap pixmap = idx.data(ContactsListModel::AvatarRole).value<QPixmap>();
+    if (!pixmap.isNull()) {
+        painter->drawPixmap(iconRect, idx.data(ContactsListModel::AvatarRole).value<QPixmap>());
+    }
+
+    painter->save();
+
+    QFont nameFont = painter->font();
+    nameFont.setWeight(QFont::Bold);
+    painter->setFont(nameFont);
+
+    QRect textRect = optV4.rect;
+    textRect.setX(iconRect.x() + iconRect.width() + SPACING);
+    textRect = painter->boundingRect(textRect, Qt::AlignLeft | Qt::AlignTop, optV4.text);
+    //textRect.setWidth(optV4.rect.width() / 2);
+
+    painter->drawText(textRect, optV4.text);
+
+    painter->restore();
+
+//     QRect typeRect;
+// 
+//     typeRect = painter->boundingRect(optV4.rect, Qt::AlignLeft | Qt::AlignBottom, idx.data(51).toString());
+//     typeRect.moveTo(QPoint(typeRect.x() + iconRect.x() + iconRect.width() + SPACING, typeRect.y() - SPACING));
+//     painter->drawText(typeRect, idx.data(51).toString());
+// 
+//     QRect sizeRect = painter->boundingRect(optV4.rect, Qt::AlignRight | Qt::AlignTop, idx.data(50).toString());
+//     sizeRect.moveTo(QPoint(sizeRect.x() - SPACING, sizeRect.y() + SPACING));
+//     painter->drawText(sizeRect, idx.data(50).toString());
+
+    painter->restore();
+}
+
+QSize ContactDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
+{
+    return QSize(0, 32 + 2 * SPACING);
+}
 
 MainWidget::MainWidget(QWidget *parent)
  : QWidget(parent),
@@ -46,6 +113,7 @@ MainWidget::MainWidget(QWidget *parent)
 
     m_contactsListView->setSortingEnabled(true);
     m_contactsListView->setModel(m_groupedContactsProxyModel);
+    m_contactsListView->setItemDelegate(new ContactDelegate(this));
 }
 
 MainWidget::~MainWidget()
diff --git a/main-widget.h b/main-widget.h
index d11901e..46a6919 100644
--- a/main-widget.h
+++ b/main-widget.h
@@ -25,15 +25,27 @@
 #include "ui_main-widget.h"
 
 #include <QtGui/QWidget>
+#include <QtGui/QStyledItemDelegate>
 
 class ContactsListModel;
 class GroupedContactsProxyModel;
 class QSortFilterProxyModel;
 
+class ContactDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+    public:
+        ContactDelegate(QObject * parent = 0);
+        ~ContactDelegate();
+
+        virtual void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
+        virtual QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const;
+};
+
 class MainWidget : public QWidget, Ui::MainWidget
 {
     Q_OBJECT
-    
+
 public:
     MainWidget(QWidget *parent = 0);
     ~MainWidget();
diff --git a/meta-contact-item.cpp b/meta-contact-item.cpp
index 276bdf4..77ad08b 100644
--- a/meta-contact-item.cpp
+++ b/meta-contact-item.cpp
@@ -112,6 +112,22 @@ QStringList MetaContactItem::groups() const
     return item->groups();
 }
 
+const QPixmap& MetaContactItem::avatar() const
+{
+    // FIXME: What should we actually return here?
+    if (childItems().isEmpty()) {
+        return m_invalidPixmap;
+    }
+
+    ContactItem *item = dynamic_cast<ContactItem*>(childItems().first());
+
+    if (!item) {
+        return m_invalidPixmap;
+    }
+
+    return item->avatar();
+}
+
 
 #include "meta-contact-item.moc"
 
diff --git a/meta-contact-item.h b/meta-contact-item.h
index 5ef0ef0..6e1557e 100644
--- a/meta-contact-item.h
+++ b/meta-contact-item.h
@@ -29,6 +29,7 @@
 #include "personcontact.h"
 
 #include <QObject>
+#include <QPixmap>
 
 class KIcon;
 
@@ -50,6 +51,7 @@ public:
 
     QString displayName() const;
     const KIcon &presenceIcon() const;
+    const QPixmap& avatar() const;
     QStringList groups() const;
 
     void setPimoPerson(const Nepomuk::Person &pimoPerson);
@@ -68,6 +70,7 @@ private:
     MetaContactType m_type;
     Nepomuk::Person m_pimoPerson;
     KIcon *m_invalidPresenceIcon;
+    QPixmap m_invalidPixmap;
 };
 
 

-- 
ktp-contact-list packaging



More information about the pkg-kde-commits mailing list