Akonadi Contacts

grantleecontactgroupformatter.cpp
1 /*
2  This file is part of KAddressBook.
3 
4  SPDX-FileCopyrightText: 2010 Tobias Koenig <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "grantleecontactgroupformatter.h"
10 
11 #include <GrantleeTheme/GrantleeTheme>
12 
13 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
14 #include <grantlee/context.h>
15 #include <grantlee/engine.h>
16 #include <grantlee/templateloader.h>
17 #else
18 #include <KTextTemplate/Context>
19 #include <KTextTemplate/Engine>
20 #include <KTextTemplate/TemplateLoader>
21 #endif
22 
23 #include <Akonadi/ContactGroupExpandJob>
24 #include <Akonadi/Item>
25 
26 #include <KColorScheme>
27 
28 using namespace KAddressBookGrantlee;
29 
30 class KAddressBookGrantlee::GrantleeContactGroupFormatterPrivate
31 {
32 public:
33  GrantleeContactGroupFormatterPrivate()
34 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
35  : mEngine(new Grantlee::Engine)
36 #else
37  : mEngine(new KTextTemplate::Engine)
38 #endif
39  {
40 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
41  mTemplateLoader = QSharedPointer<Grantlee::FileSystemTemplateLoader>(new Grantlee::FileSystemTemplateLoader);
42 #else
44 #endif
45  }
46 
47  ~GrantleeContactGroupFormatterPrivate()
48  {
49  delete mEngine;
50  mTemplateLoader.clear();
51  }
52 
53  void changeGrantleePath(const QString &path)
54  {
55  mTemplateLoader->setTemplateDirs(QStringList() << path);
56  mEngine->addTemplateLoader(mTemplateLoader);
57 
58  mSelfcontainedTemplate = mEngine->loadByName(QStringLiteral("contactgroup.html"));
59  if (mSelfcontainedTemplate->error()) {
60  mErrorMessage += mSelfcontainedTemplate->errorString() + QStringLiteral("<br>");
61  }
62 
63  mEmbeddableTemplate = mEngine->loadByName(QStringLiteral("contactgroup_embedded.html"));
64  if (mEmbeddableTemplate->error()) {
65  mErrorMessage += mEmbeddableTemplate->errorString() + QStringLiteral("<br>");
66  }
67  }
68 
69  QVector<QObject *> mObjects;
70 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
71  Grantlee::Engine *const mEngine;
73  Grantlee::Template mSelfcontainedTemplate;
74  Grantlee::Template mEmbeddableTemplate;
75 #else
76  KTextTemplate::Engine *const mEngine;
78  KTextTemplate::Template mSelfcontainedTemplate;
79  KTextTemplate::Template mEmbeddableTemplate;
80 #endif
81  QString mErrorMessage;
82 };
83 
85  : d(new GrantleeContactGroupFormatterPrivate)
86 {
87 }
88 
90 
91 void GrantleeContactGroupFormatter::setAbsoluteThemePath(const QString &path)
92 {
93  d->changeGrantleePath(path);
94 }
95 
96 void GrantleeContactGroupFormatter::setGrantleeTheme(const GrantleeTheme::Theme &theme)
97 {
98  d->changeGrantleePath(theme.absolutePath());
99 }
100 
101 inline static void setHashField(QVariantHash &hash, const QString &name, const QString &value)
102 {
103  if (!value.isEmpty()) {
104  hash.insert(name, value);
105  }
106 }
107 
108 static QVariantHash memberHash(const KContacts::ContactGroup::Data &data)
109 {
110  QVariantHash memberObject;
111 
112  setHashField(memberObject, QStringLiteral("name"), data.name());
113  setHashField(memberObject, QStringLiteral("email"), data.email());
114 
115  KContacts::Addressee contact;
116  contact.setFormattedName(data.name());
117  KContacts::Email email(data.email());
118  contact.addEmail(email);
119  const QString emailLink = QStringLiteral("<a href=\"mailto:") + QString::fromLatin1(QUrl::toPercentEncoding(contact.fullEmail()))
120  + QStringLiteral("\">%1</a>").arg(contact.preferredEmail());
121 
122  setHashField(memberObject, QStringLiteral("emailLink"), emailLink);
123 
124  return memberObject;
125 }
126 
128 {
129  if (!d->mErrorMessage.isEmpty()) {
130  return d->mErrorMessage;
131  }
132 
134  const Akonadi::Item localItem = item();
135  if (localItem.isValid() && localItem.hasPayload<KContacts::ContactGroup>()) {
136  group = localItem.payload<KContacts::ContactGroup>();
137  } else {
138  group = contactGroup();
139  }
140 
141  if (group.name().isEmpty() && group.count() == 0) { // empty group
142  return {};
143  }
144 
145  if (group.contactReferenceCount() != 0) {
146  // we got a contact group with unresolved references -> we have to resolve
147  // it ourself. this shouldn't be the normal case, actually the calling
148  // code should pass in an already resolved contact group
149  auto job = new Akonadi::ContactGroupExpandJob(group);
150  if (job->exec()) {
151  group.removeAllContactData();
152  const KContacts::Addressee::List lstContacts = job->contacts();
153  for (const KContacts::Addressee &contact : lstContacts) {
154  group.append(KContacts::ContactGroup::Data(contact.realName(), contact.preferredEmail()));
155  }
156  }
157  }
158 
159  QVariantHash contactGroupObject;
160 
161  setHashField(contactGroupObject, QStringLiteral("name"), group.name());
162 
163  // Group members
164  QVariantList members;
165  const int numberOfData(group.dataCount());
166  members.reserve(numberOfData);
167  for (int i = 0; i < numberOfData; ++i) {
168  members << memberHash(group.data(i));
169  }
170 
171  contactGroupObject.insert(QStringLiteral("members"), members);
172 
173  // Additional fields
174  QVariantList fields;
175  for (int i = 0; i < additionalFields().size(); ++i) {
176  const QVariantMap field = additionalFields().at(i);
177  QVariantHash fieldObject;
178  setHashField(fieldObject, QStringLiteral("key"), field.value(QStringLiteral("key")).toString());
179 
180  setHashField(fieldObject, QStringLiteral("title"), field.value(QStringLiteral("title")).toString());
181 
182  setHashField(fieldObject, QStringLiteral("value"), field.value(QStringLiteral("value")).toString());
183 
184  fields << fieldObject;
185  }
186 
187  contactGroupObject.insert(QStringLiteral("additionalFields"), fields);
188 
189  QVariantHash colorsObject;
190  colorsObject.insert(QStringLiteral("linkColor"), KColorScheme(QPalette::Active, KColorScheme::View).foreground().color().name());
191 
192  colorsObject.insert(QStringLiteral("textColor"), KColorScheme(QPalette::Active, KColorScheme::View).foreground().color().name());
193 
194  colorsObject.insert(QStringLiteral("backgroundColor"), KColorScheme(QPalette::Active, KColorScheme::View).background().color().name());
195 
196  QVariantHash mapping;
197  mapping.insert(QStringLiteral("contactGroup"), contactGroupObject);
198  mapping.insert(QStringLiteral("colors"), colorsObject);
199 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
200  Grantlee::Context context(mapping);
201 #else
202  KTextTemplate::Context context(mapping);
203 #endif
204 
205  if (form == SelfcontainedForm) {
206  return d->mSelfcontainedTemplate->render(&context);
207  } else if (form == EmbeddableForm) {
208  return d->mEmbeddableTemplate->render(&context);
209  } else {
210  return {};
211  }
212 }
bool isValid() const
HtmlForm
Describes the form of the HTML that is created.
QString toHtml(HtmlForm form=SelfcontainedForm) const override
Returns the contact group formatted as HTML.
int contactReferenceCount() const
KContacts::ContactGroup contactGroup() const
Returns the contact group that will be formatted.
QString preferredEmail() const
@ EmbeddableForm
Creates a div HTML element that can be embedded.
QString realName() const
GrantleeContactGroupFormatter()
Creates a new grantlee contact group formatter.
void setFormattedName(const QString &formattedName)
@ SelfcontainedForm
Creates a complete HTML document.
bool hasPayload() const
const T & at(int i) const const
bool isEmpty() const const
Akonadi::Item item() const
Returns the item who's payload will be formatted.
Data & data(int index)
QByteArray toPercentEncoding(const QString &input, const QByteArray &exclude, const QByteArray &include)
void append(const ContactGroupReference &reference)
Job that expands a ContactGroup to a list of contacts.
QString name() const
QVector< QVariantMap > additionalFields() const
Returns the additional fields that will be shown.
QString fullEmail(const QString &email=QString()) const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromLatin1(const char *str, int size)
~GrantleeContactGroupFormatter() override
Destroys the grantlee contact group formatter.
void addEmail(const Email &email)
int size() const const
AddresseeList List
T payload() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sat Apr 1 2023 04:09:05 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.