Pimcommon

annotationdialog.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Thomas McGuire <mcguire@kde.org>
3 SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
4
5 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
6*/
7
8#include "annotationdialog.h"
9#include <TextCustomEditor/PlainTextEditorWidget>
10
11#include <Akonadi/EntityAnnotationsAttribute>
12#include <Akonadi/Item>
13#include <Akonadi/ItemModifyJob>
14#include <KLocalizedString>
15#include <KMessageBox>
16#include <KSharedConfig>
17#include <KStandardGuiItem>
18
19#include <QComboBox>
20#include <QIcon>
21
22#include <KConfigGroup>
23#include <KWindowConfig>
24#include <QDialogButtonBox>
25#include <QLabel>
26#include <QPushButton>
27#include <QVBoxLayout>
28#include <QWindow>
29
30using namespace PimCommon;
31
32class Q_DECL_HIDDEN AnnotationEditDialog::AnnotationEditDialogPrivate
33{
34public:
35 AnnotationEditDialogPrivate() = default;
36
37 Akonadi::Item mItem;
38 TextCustomEditor::PlainTextEditorWidget *mTextEdit = nullptr;
39 QComboBox *mNoteType = nullptr;
40 bool mHasAnnotation = false;
41};
42
43namespace
44{
45static const char myConfigAnnotationEditDialog[] = "AnnotationEditDialog";
46}
47
49 : QDialog(parent)
50 , d(new AnnotationEditDialogPrivate)
51{
52 d->mItem = item;
53 // check for correct key?
54 d->mHasAnnotation = item.hasAttribute<Akonadi::EntityAnnotationsAttribute>();
56 auto mainWidget = new QWidget(this);
57 auto mainLayout = new QVBoxLayout(this);
58 mainLayout->addWidget(mainWidget);
59 QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
60 okButton->setDefault(true);
62 connect(buttonBox, &QDialogButtonBox::accepted, this, &AnnotationEditDialog::slotAccepted);
64
65 if (d->mHasAnnotation) {
66 setWindowTitle(i18nc("@title:window", "Edit Note"));
67 auto user1Button = new QPushButton;
68 buttonBox->addButton(user1Button, QDialogButtonBox::ActionRole);
69 user1Button->setText(i18nc("@action:button", "Delete Note"));
70 user1Button->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete")));
71 connect(user1Button, &QPushButton::clicked, this, &AnnotationEditDialog::slotDeleteNote);
72 } else {
73 setWindowTitle(i18nc("@title:window", "Add Note"));
74 }
75
76 buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
77
78 auto label = new QLabel(i18n("Enter the text that should be stored as a note to the mail:"), this);
79 auto vbox = new QVBoxLayout(mainWidget);
80 vbox->setContentsMargins({});
81 d->mTextEdit = new TextCustomEditor::PlainTextEditorWidget(this);
82 vbox->addWidget(label);
83 vbox->addWidget(d->mTextEdit);
84 d->mTextEdit->setFocus();
85
86 auto hbox = new QHBoxLayout;
87 hbox->addStretch();
88 label = new QLabel(i18nc("@label:listbox", "Note type:"), this);
89 hbox->addWidget(label);
90 d->mNoteType = new QComboBox;
91 hbox->addWidget(d->mNoteType);
92 d->mNoteType->addItem(i18nc("@item:inlistbox", "Private note"), QByteArrayLiteral("/private/comment"));
93 d->mNoteType->addItem(i18nc("@item:inlistbox", "Shared note"), QByteArrayLiteral("/shared/comment"));
94
95 vbox->addLayout(hbox);
96 if (d->mHasAnnotation && item.attribute<Akonadi::EntityAnnotationsAttribute>()) {
97 if (item.attribute<Akonadi::EntityAnnotationsAttribute>()->contains("/private/comment")) {
98 d->mNoteType->setCurrentIndex(d->mNoteType->findData(QStringLiteral("/private/comment")));
99 d->mTextEdit->setPlainText(item.attribute<Akonadi::EntityAnnotationsAttribute>()->value("/private/comment"));
100 } else {
101 d->mNoteType->setCurrentIndex(d->mNoteType->findData(QStringLiteral("/shared/comment")));
102 d->mTextEdit->setPlainText(item.attribute<Akonadi::EntityAnnotationsAttribute>()->value("/shared/comment"));
103 }
104 }
105 mainLayout->addWidget(buttonBox);
106 readConfig();
107}
108
110{
111 writeConfig();
112}
113
114void AnnotationEditDialog::slotAccepted()
115{
116 bool textIsEmpty = d->mTextEdit->isEmpty();
117 if (!textIsEmpty) {
118 d->mItem.removeAttribute<Akonadi::EntityAnnotationsAttribute>();
119 auto annotation = d->mItem.attribute<Akonadi::EntityAnnotationsAttribute>(Akonadi::Item::AddIfMissing);
121 map.insert(d->mNoteType->itemData(d->mNoteType->currentIndex()).toByteArray(), d->mTextEdit->toPlainText().toUtf8());
122 annotation->setAnnotations(map);
123 d->mItem.addAttribute(annotation);
124 } else if (d->mHasAnnotation) {
125 d->mItem.removeAttribute<Akonadi::EntityAnnotationsAttribute>();
126 }
127 new Akonadi::ItemModifyJob(d->mItem);
128 accept();
129}
130
131void AnnotationEditDialog::slotDeleteNote()
132{
133 const int answer = KMessageBox::warningContinueCancel(this,
134 i18n("Do you really want to delete this note?"),
135 i18nc("@title:window", "Delete Note"),
137 if (answer == KMessageBox::Continue) {
138 d->mItem.removeAttribute<Akonadi::EntityAnnotationsAttribute>();
139 new Akonadi::ItemModifyJob(d->mItem);
140 accept();
141 }
142}
143
144void AnnotationEditDialog::writeConfig()
145{
146 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(myConfigAnnotationEditDialog));
148}
149
150void AnnotationEditDialog::readConfig()
151{
152 create(); // ensure a window is created
153 windowHandle()->resize(QSize(400, 300));
154 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(myConfigAnnotationEditDialog));
156 resize(windowHandle()->size()); // workaround for QTBUG-40584
157}
158
159#include "moc_annotationdialog.cpp"
bool hasAttribute() const
const T * attribute() const
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
A dialog for editing annotations of an email.
AnnotationEditDialog(const Akonadi::Item &item, QWidget *parent=nullptr)
Creates a new annotation edit dialog.
~AnnotationEditDialog() override
Destroys the annotation edit dialog.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
ButtonCode warningContinueCancel(QWidget *parent, const QString &text, const QString &title=QString(), const KGuiItem &buttonContinue=KStandardGuiItem::cont(), const KGuiItem &buttonCancel=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Notify)
KGuiItem del()
KCONFIGGUI_EXPORT void saveWindowSize(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options=KConfigGroup::Normal)
KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config)
folderdialogacltab.h
void clicked(bool checked)
void setShortcut(const QKeySequence &key)
void addStretch(int stretch)
void addItem(const QIcon &icon, const QString &text, const QVariant &userData)
virtual void accept()
virtual void reject()
QIcon fromTheme(const QString &name)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void setDefault(bool)
Key_Return
QWidget(QWidget *parent, Qt::WindowFlags f)
void create(WId window, bool initializeWindow, bool destroyOldWindow)
void resize(const QSize &)
QWindow * windowHandle() const const
void setWindowTitle(const QString &)
void resize(const QSize &newSize)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.