Incidenceeditor

incidencecategories.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Bertjan Broeksema <broeksema@kde.org>
3 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "incidencecategories.h"
9
10#include "incidenceeditor_debug.h"
11#include "ui_dialogdesktop.h"
12
13#include <Akonadi/CalendarUtils>
14#include <Akonadi/TagAttribute>
15#include <Akonadi/TagCreateJob>
16#include <Akonadi/TagFetchJob>
17#include <Akonadi/TagFetchScope>
18
19using namespace IncidenceEditorNG;
20
21IncidenceCategories::IncidenceCategories(Ui::EventOrTodoDesktop *ui)
22 : mUi(ui)
23{
24 setObjectName(QLatin1StringView("IncidenceCategories"));
25
26 connect(mUi->mTagWidget, &Akonadi::TagWidget::selectionChanged, this, &IncidenceCategories::onSelectionChanged);
27}
28
29void IncidenceCategories::onSelectionChanged(const Akonadi::Tag::List &list)
30{
31 Q_UNUSED(list)
32 mDirty = true;
34}
35
36void IncidenceCategories::load(const KCalendarCore::Incidence::Ptr &incidence)
37{
39 mDirty = false;
40 mWasDirty = false;
41}
42
43void IncidenceCategories::load(const Akonadi::Item &item)
44{
45 mLoadedIncidence = Akonadi::CalendarUtils::incidence(item);
46 mDirty = false;
47 mWasDirty = false;
48
49 Q_ASSERT(mLoadedIncidence);
50 if (mLoadedIncidence) {
51 mMissingCategories = mLoadedIncidence->categories();
52 const auto tags = item.tags();
53 Akonadi::Tag::List selectedTags;
54 selectedTags.reserve(mMissingCategories.count());
55 for (const auto &tag : tags) {
56 if (mMissingCategories.removeAll(tag.name()) > 0) {
57 selectedTags << tag;
58 }
59 }
60 createMissingCategories();
61 mUi->mTagWidget->blockSignals(true);
62 mUi->mTagWidget->setSelection(selectedTags);
63 mUi->mTagWidget->blockSignals(false);
64 }
65}
66
67void IncidenceCategories::save(const KCalendarCore::Incidence::Ptr &incidence)
68{
70 if (mDirty) {
71 incidence->setCategories(categories());
72 }
73}
74
75void IncidenceCategories::save(Akonadi::Item &item)
76{
77 const auto &selectedTags = mUi->mTagWidget->selection();
78 if (mDirty) {
79 item.setTags(selectedTags);
80 }
81}
82
83QStringList IncidenceCategories::categories() const
84{
86 const auto &selectedTags = mUi->mTagWidget->selection();
87 list.reserve(selectedTags.count() + mMissingCategories.count());
88 for (const Akonadi::Tag &tag : selectedTags) {
89 list << tag.name();
90 }
91 list << mMissingCategories;
92 return list;
93}
94
95void IncidenceCategories::createMissingCategories()
96{
97 for (const QString &category : std::as_const(mMissingCategories)) {
98 // Either the tag doesn't exist, or Akonadi doesn't have a tag <-> item
99 // relation for this category and instance. Try to create a PLAIN tag.
101 auto createJob = new Akonadi::TagCreateJob(missingTag, this);
102 createJob->setMergeIfExisting(true);
103 connect(createJob, &Akonadi::TagCreateJob::result, this, &IncidenceCategories::onMissingTagCreated);
104 }
105}
106
107bool IncidenceCategories::isDirty() const
108{
109 return mDirty;
110}
111
112void IncidenceCategories::printDebugInfo() const
113{
114 qCDebug(INCIDENCEEDITOR_LOG) << "selected categories = " << categories();
115 qCDebug(INCIDENCEEDITOR_LOG) << "mMissingCategories = " << mMissingCategories;
116 qCDebug(INCIDENCEEDITOR_LOG) << "mLoadedIncidence->categories() = " << mLoadedIncidence->categories();
117}
118
119void IncidenceCategories::onMissingTagCreated(KJob *job)
120{
121 if (job->error()) {
122 qCWarning(INCIDENCEEDITOR_LOG) << "Failed to create tag " << job->errorString();
123 return;
124 }
125 auto createJob = static_cast<Akonadi::TagCreateJob *>(job);
126 int count = mMissingCategories.removeAll(createJob->tag().name());
127
128 auto selectedTags{mUi->mTagWidget->selection()};
129 selectedTags += createJob->tag();
130
131 // If the created tag was one of the instance's missing categories,
132 // adding it to the widget doesn't make it dirty.
133 mUi->mTagWidget->blockSignals(count > 0);
134 mUi->mTagWidget->setSelection(selectedTags);
135 mUi->mTagWidget->blockSignals(false);
136}
137
138#include "moc_incidencecategories.cpp"
void checkDirtyStatus()
Checks if the dirty status has changed until last check and emits the dirtyStatusChanged signal if ne...
QSharedPointer< IncidenceT > incidence() const
Convenience method to get a pointer for a specific const Incidence Type.
virtual QString errorString() const
int error() const
void result(KJob *job)
AKONADI_CALENDAR_EXPORT KCalendarCore::Incidence::Ptr incidence(const Akonadi::Item &item)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
qsizetype count() const const
qsizetype removeAll(const AT &t)
void reserve(qsizetype size)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:19:37 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.