[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