Akonadi Contacts

akonadi-contacts/plugins/categorieseditwidget.cpp
1 /*
2  This file is part of Contact Editor.
3 
4  SPDX-FileCopyrightText: 2009 Tobias Koenig <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "categorieseditwidget.h"
10 
11 #include <Akonadi/Item>
12 #include <Akonadi/Tag>
13 #include <Akonadi/TagWidget>
14 #include <KPluginFactory>
15 #include <QHBoxLayout>
16 #include <akonadi/tagcreatejob.h>
17 
18 K_PLUGIN_CLASS_WITH_JSON(CategoriesEditWidget, "categorieseditwidgetplugin.json")
19 
21  : ContactEditor::CategoriesEditAbstractWidget(parent)
22  , mTagWidget(new Akonadi::TagWidget(this))
23 {
24  auto layout = new QHBoxLayout(this);
25  layout->setContentsMargins({});
26  layout->addWidget(mTagWidget);
27 }
28 
29 CategoriesEditWidget::~CategoriesEditWidget() = default;
30 
31 void CategoriesEditWidget::setReadOnly(bool readOnly)
32 {
33  mTagWidget->setReadOnly(readOnly);
34 }
35 
36 void CategoriesEditWidget::loadContact(const KContacts::Addressee &contact)
37 {
38  Akonadi::Tag::List tags;
39 
40  const QStringList categories = contact.categories();
41  tags.reserve(categories.count());
42  for (const QString &category : categories) {
43  if (category.startsWith(QLatin1String("akonadi:"))) {
44  tags.append(Akonadi::Tag::fromUrl(QUrl(category)));
45  } else {
46  Akonadi::Tag missingTag = Akonadi::Tag(category);
47  auto createJob = new Akonadi::TagCreateJob(missingTag, this);
48  createJob->setMergeIfExisting(true);
49  connect(createJob, &Akonadi::TagCreateJob::result, this, &CategoriesEditWidget::onMissingTagCreated);
50  }
51  }
52 
53  mTagWidget->setSelection(tags);
54 }
55 
56 void CategoriesEditWidget::onMissingTagCreated(KJob *job)
57 {
58  if (job->error()) {
59  return;
60  }
61  auto createJob = static_cast<Akonadi::TagCreateJob *>(job);
62 
63  auto selectedTags{mTagWidget->selection()};
64  selectedTags += createJob->tag();
65  mTagWidget->setSelection(selectedTags);
66 }
67 
68 void CategoriesEditWidget::storeContact(KContacts::Addressee &contact) const
69 {
70  QStringList categories;
71 
72  const Akonadi::Tag::List tags = mTagWidget->selection();
73  categories.reserve(tags.count());
74  for (const Akonadi::Tag &tag : tags) {
75  categories.append(tag.name());
76  }
77 
78  contact.setCategories(categories);
79 }
80 
81 #include "categorieseditwidget.moc"
void append(const T &value)
void result(KJob *job)
int count(const T &value) const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setCategories(const QStringList &category)
void reserve(int alloc)
QStringList categories() const
A widget for editing the categories of a contact.
int error() const
#define K_PLUGIN_CLASS_WITH_JSON(classname, jsonFile)
Category category(StandardShortcut id)
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.