Akonadi Contacts

contactgroupviewer.cpp
1 /*
2  This file is part of Akonadi Contact.
3 
4  SPDX-FileCopyrightText: 2009 Tobias Koenig <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "contactgroupviewer.h"
10 
11 #include "job/contactgroupexpandjob.h"
12 #include "standardcontactgroupformatter.h"
13 #include "textbrowser_p.h"
14 
15 #include <Akonadi/CollectionFetchJob>
16 #include <Akonadi/EntityDisplayAttribute>
17 #include <Akonadi/Item>
18 #include <Akonadi/ItemFetchScope>
19 #include <KContacts/Addressee>
20 #include <KContacts/ContactGroup>
21 
22 #include <KLocalizedString>
23 
24 #include <QIcon>
25 #include <QVBoxLayout>
26 
27 using namespace Akonadi;
28 
29 class Akonadi::ContactGroupViewerPrivate
30 {
31 public:
32  explicit ContactGroupViewerPrivate(ContactGroupViewer *parent)
33  : mParent(parent)
34  {
35  mBrowser = new TextBrowser;
36 
37  static QPixmap groupPixmap = QIcon::fromTheme(QStringLiteral("x-mail-distribution-list")).pixmap(QSize(100, 100));
38  mBrowser->document()->addResource(QTextDocument::ImageResource, QUrl(QStringLiteral("group_photo")), groupPixmap);
39 
40  mStandardContactGroupFormatter = new StandardContactGroupFormatter;
41  mContactGroupFormatter = mStandardContactGroupFormatter;
42  }
43 
44  ~ContactGroupViewerPrivate()
45  {
46  delete mStandardContactGroupFormatter;
47  }
48 
49  void updateView()
50  {
51  mParent->setWindowTitle(i18nc("@title:window", "Contact Group %1", mCurrentGroupName));
52 
54  group.setName(mCurrentGroupName);
55  for (const KContacts::Addressee &contact : std::as_const(mCurrentContacts)) {
56  group.append(KContacts::ContactGroup::Data(contact.realName(), contact.preferredEmail()));
57  }
58 
59  mContactGroupFormatter->setContactGroup(group);
60 
61  QVector<QVariantMap> additionalFields;
62 
63  if (!mCurrentAddressBookName.isEmpty()) {
64  QVariantMap addressBookName;
65  addressBookName.insert(QStringLiteral("title"), i18n("Address Book"));
66  addressBookName.insert(QStringLiteral("value"), mCurrentAddressBookName);
67 
68  additionalFields << addressBookName;
69  }
70 
71  mContactGroupFormatter->setAdditionalFields(additionalFields);
72 
73  mBrowser->setHtml(mContactGroupFormatter->toHtml());
74  }
75 
76  void slotMailClicked(const QUrl &email)
77  {
78  QString name;
80 
81  // remove the 'mailto:' and split into name and email address
82  KContacts::Addressee::parseEmailAddress(email.path(), name, address);
83 
84  Q_EMIT mParent->emailClicked(name, address);
85  }
86 
87  void _k_expandResult(KJob *job)
88  {
89  mExpandJob = nullptr;
90 
91  if (!job->error()) {
92  auto expandJob = qobject_cast<ContactGroupExpandJob *>(job);
93  mCurrentContacts = expandJob->contacts();
94  }
95 
96  // stop any running fetch job
97  if (mParentCollectionFetchJob) {
98  mParent->disconnect(mCollectionFetchJobConnection);
99  delete mParentCollectionFetchJob;
100  mParentCollectionFetchJob = nullptr;
101  }
102 
103  mParentCollectionFetchJob = new CollectionFetchJob(mCurrentItem.parentCollection(), CollectionFetchJob::Base, mParent);
104  mCollectionFetchJobConnection = mParent->connect(mParentCollectionFetchJob, &CollectionFetchJob::result, mParent, [this](KJob *job) {
105  slotParentCollectionFetched(job);
106  });
107  }
108 
109  void slotParentCollectionFetched(KJob *job)
110  {
111  mParentCollectionFetchJob = nullptr;
112  mCurrentAddressBookName.clear();
113 
114  if (!job->error()) {
115  auto fetchJob = qobject_cast<CollectionFetchJob *>(job);
116  if (!fetchJob->collections().isEmpty()) {
117  const Collection collection = fetchJob->collections().at(0);
118  mCurrentAddressBookName = collection.displayName();
119  }
120  }
121 
122  updateView();
123  }
124 
125  QMetaObject::Connection mCollectionFetchJobConnection;
126  QMetaObject::Connection mJobConnection;
127  ContactGroupViewer *const mParent;
128  TextBrowser *mBrowser = nullptr;
129  QString mCurrentGroupName;
130  KContacts::Addressee::List mCurrentContacts;
131  QString mCurrentAddressBookName;
132  Item mCurrentItem;
133  ContactGroupExpandJob *mExpandJob = nullptr;
134  CollectionFetchJob *mParentCollectionFetchJob = nullptr;
135  AbstractContactGroupFormatter *mStandardContactGroupFormatter = nullptr;
136  AbstractContactGroupFormatter *mContactGroupFormatter = nullptr;
137 };
138 
140  : QWidget(parent)
141  , d(new ContactGroupViewerPrivate(this))
142 {
143  auto layout = new QVBoxLayout(this);
145 
146  connect(d->mBrowser, &TextBrowser::anchorClicked, this, [this](const QUrl &url) {
147  d->slotMailClicked(url);
148  });
149 
150  layout->addWidget(d->mBrowser);
151 
152  // always fetch full payload for contact groups
155 }
156 
158 
160 {
161  return ItemMonitor::item();
162 }
163 
165 {
166  ItemMonitor::setItem(group);
167 }
168 
170 {
171  if (formatter == nullptr) {
172  d->mContactGroupFormatter = d->mStandardContactGroupFormatter;
173  } else {
174  d->mContactGroupFormatter = formatter;
175  }
176 }
177 
179 {
180  itemChanged(d->mCurrentItem);
181 }
182 
183 void ContactGroupViewer::itemChanged(const Item &item)
184 {
186  return;
187  }
188 
189  const auto group = item.payload<KContacts::ContactGroup>();
190  d->mCurrentGroupName = group.name();
191  d->mCurrentItem = item;
192 
193  if (d->mExpandJob) {
194  disconnect(d->mJobConnection);
195  d->mExpandJob->kill();
196  }
197 
198  d->mExpandJob = new ContactGroupExpandJob(group);
199  d->mJobConnection = connect(d->mExpandJob, &ContactGroupExpandJob::result, this, [this](KJob *job) {
200  d->_k_expandResult(job);
201  });
202  d->mExpandJob->start();
203 }
204 
205 void ContactGroupViewer::itemRemoved()
206 {
207  d->mBrowser->clear();
208 }
209 
210 #include "moc_contactgroupviewer.cpp"
A class that formats a contact group as HTML code.
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
The interface for all contact group formatters.
void result(KJob *job)
void insert(int i, T &&value)
QLayout * layout() const const
QString displayName() const
QIcon fromTheme(const QString &name)
Akonadi::Item contactGroup() const
Returns the contact group that is currently displayed.
void fetchFullPayload(bool fetch=true)
ContactGroupViewer(QWidget *parent=nullptr)
Creates a new contact group viewer.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
bool hasPayload() const
static void parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email)
QString i18n(const char *text, const TYPE &arg...)
~ContactGroupViewer() override
Destroys the contact group viewer.
void setItem(const Item &item)
PostalAddress address(const QVariant &location)
void append(const ContactGroupReference &reference)
Job that expands a ContactGroup to a list of contacts.
QString name() const
QString path(QUrl::ComponentFormattingOptions options) const const
QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) const const
void addWidget(QWidget *w)
const char * name(StandardAction id)
void setContactGroup(const Akonadi::Item &group)
Sets the contact group that shall be displayed in the viewer.
void setAncestorRetrieval(AncestorRetrieval ancestorDepth)
void setContentsMargins(int left, int top, int right, int bottom)
ItemFetchScope & fetchScope()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
AddresseeList List
void setName(const QString &name)
int error() const
T payload() const
A viewer component for contact groups in Akonadi.
void setContactGroupFormatter(AbstractContactGroupFormatter *formatter)
Sets the contact group formatter that should be used for formatting the contact group.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sat Apr 1 2023 04:09:04 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.