1 /*
2     SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "contactentry.h"
8 #include "actionlist.h"
9 
10 #include <QBitmap>
11 #include <QPainter>
12 
13 #include <KIconLoader>
14 #include <KLocalizedString>
15 
16 #include <KPeople/PersonData>
17 #include <KPeople/Widgets/Actions>
18 #include <KPeople/Widgets/PersonDetailsDialog>
19 
ContactEntry(AbstractModel * owner,const QString & id)20 ContactEntry::ContactEntry(AbstractModel *owner, const QString &id)
21     : AbstractEntry(owner)
22     , m_personData(nullptr)
23 {
24     if (!id.isEmpty()) {
25         m_personData = new KPeople::PersonData(id);
26 
27         QObject::connect(m_personData, &KPeople::PersonData::dataChanged, [this] {
28             if (m_owner) {
29                 m_owner->entryChanged(this);
30             }
31         });
32     }
33 }
34 
isValid() const35 bool ContactEntry::isValid() const
36 {
37     return m_personData;
38 }
39 
icon() const40 QIcon ContactEntry::icon() const
41 {
42     if (m_personData) {
43         QPixmap photo = m_personData->photo();
44         QBitmap mask(photo.size());
45         QPainter painter(&mask);
46         mask.fill(Qt::white);
47         painter.setBrush(Qt::black);
48         painter.drawEllipse(0, 0, mask.width(), mask.height());
49         photo.setMask(mask);
50 
51         photo = photo.scaled(m_owner->iconSize(), m_owner->iconSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
52 
53         KIconLoader::global()->drawOverlays(QStringList() << m_personData->presenceIconName(), photo, KIconLoader::Panel);
54 
55         return QIcon(photo);
56     }
57 
58     return QIcon::fromTheme(QStringLiteral("unknown"));
59 }
60 
name() const61 QString ContactEntry::name() const
62 {
63     if (m_personData) {
64         return m_personData->name();
65     }
66 
67     return QString();
68 }
69 
id() const70 QString ContactEntry::id() const
71 {
72     if (m_personData) {
73         const QString &id = m_personData->personUri();
74 
75         if (id.isEmpty()) {
76             const QStringList uris = m_personData->contactUris();
77 
78             if (!uris.isEmpty()) {
79                 return uris.at(0);
80             }
81         } else {
82             return id;
83         }
84     }
85 
86     return QString();
87 }
88 
url() const89 QUrl ContactEntry::url() const
90 {
91     if (m_personData) {
92         return QUrl(m_personData->personUri());
93     }
94 
95     return QUrl();
96 }
97 
hasActions() const98 bool ContactEntry::hasActions() const
99 {
100     return m_personData;
101 }
102 
actions() const103 QVariantList ContactEntry::actions() const
104 {
105     QVariantList actionList;
106 
107     actionList << Kicker::createActionItem(i18n("Show Contact Information…"), QStringLiteral("identity"), QStringLiteral("showContactInfo"));
108 
109     return actionList;
110 }
111 
run(const QString & actionId,const QVariant & argument)112 bool ContactEntry::run(const QString &actionId, const QVariant &argument)
113 {
114     Q_UNUSED(argument)
115 
116     if (!m_personData) {
117         return false;
118     }
119 
120     if (actionId == QLatin1String("showContactInfo")) {
121         showPersonDetailsDialog(m_personData->personUri());
122     }
123 
124     return false;
125 }
126 
showPersonDetailsDialog(const QString & id)127 void ContactEntry::showPersonDetailsDialog(const QString &id)
128 {
129     KPeople::PersonDetailsDialog *view = new KPeople::PersonDetailsDialog(nullptr);
130     KPeople::PersonData *data = new KPeople::PersonData(id, view);
131     view->setPerson(data);
132     view->setAttribute(Qt::WA_DeleteOnClose);
133     view->show();
134 }
135