Akonadi Contacts

contacteditordialog.cpp
1 /*
2  This file is part of Akonadi Contact.
3 
4  SPDX-FileCopyrightText: 2007-2009 Tobias Koenig <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "contacteditordialog.h"
10 
11 #include "contacteditor.h"
12 #include <Akonadi/CollectionComboBox>
13 #include <Akonadi/Item>
14 
15 #include <KContacts/Addressee>
16 
17 #include <KConfig>
18 #include <KLocalizedString>
19 #include <KMessageBox>
20 
21 #include <KConfigGroup>
22 #include <QDialogButtonBox>
23 #include <QGridLayout>
24 #include <QLabel>
25 #include <QPushButton>
26 #include <QVBoxLayout>
27 
28 using namespace Akonadi;
29 namespace
30 {
31 static const char myContactEditorDialogDialogGroupName[] = "ContactEditor";
32 }
33 class Akonadi::ContactEditorDialogPrivate
34 {
35 public:
36  ContactEditorDialogPrivate(ContactEditorDialog::Mode mode,
37  ContactEditorDialog::DisplayMode displaymode,
38  ContactEditor::AbstractContactEditorWidget *editorWidget,
39  ContactEditorDialog *parent)
40  : q(parent)
41  , mMode(mode)
42  {
43  auto mainWidget = new QWidget(q);
44 
45  q->setWindowTitle(mode == ContactEditorDialog::CreateMode ? i18nc("@title:window", "New Contact") : i18nc("@title:window", "Edit Contact"));
46  auto mainLayout = new QVBoxLayout(q);
48  q->connect(buttonBox, &QDialogButtonBox::accepted, q, [this]() {
49  slotOkClicked();
50  });
51  q->connect(buttonBox, &QDialogButtonBox::rejected, q, [this]() {
52  slotCancelClicked();
53  });
54 
55  mainLayout->addWidget(mainWidget);
56  mainLayout->addWidget(buttonBox);
57 
58  auto layout = new QGridLayout(mainWidget);
59  layout->setContentsMargins({});
60 
61  if (editorWidget) {
63  editorWidget,
64  q);
65  } else {
67  displaymode == ContactEditorDialog::FullMode ? AkonadiContactEditor::FullMode : AkonadiContactEditor::VCardMode,
68  q);
69  }
70 
71  if (mode == ContactEditorDialog::CreateMode) {
72  auto label = new QLabel(i18n("Add to:"), mainWidget);
73 
74  mAddressBookBox = new CollectionComboBox(mainWidget);
75  mAddressBookBox->setMimeTypeFilter(QStringList() << KContacts::Addressee::mimeType());
76  mAddressBookBox->setAccessRightsFilter(Collection::CanCreateItem);
77 
78  layout->addWidget(label, 0, 0);
79  layout->addWidget(mAddressBookBox, 0, 1);
80  }
81 
82  layout->addWidget(mEditor, 1, 0, 1, 2);
83  layout->setColumnStretch(1, 1);
84 
86 
88 
89  QObject::connect(mEditor, &AkonadiContactEditor::finished, q, [this]() {
90  slotFinish();
91  });
92 
93  readConfig();
94  }
95 
96  void slotOkClicked()
97  {
98  q->accept();
99  }
100 
101  void slotFinish()
102  {
103  q->QDialog::accept();
104  }
105 
106  void slotCancelClicked()
107  {
108  q->reject();
109  }
110 
111  void readConfig()
112  {
113  KConfig config(QStringLiteral("akonadi_contactrc"));
114  KConfigGroup group(&config, myContactEditorDialogDialogGroupName);
115  const QSize size = group.readEntry("Size", QSize(800, 500));
116  if (size.isValid()) {
117  q->resize(size);
118  }
119  }
120 
121  void writeConfig()
122  {
123  KConfig config(QStringLiteral("akonadi_contactrc"));
124  KConfigGroup group(&config, myContactEditorDialogDialogGroupName);
125  group.writeEntry("Size", q->size());
126  group.sync();
127  }
128 
129  ContactEditorDialog *const q;
130  CollectionComboBox *mAddressBookBox = nullptr;
131  const ContactEditorDialog::Mode mMode;
132  AkonadiContactEditor *mEditor = nullptr;
133 };
134 
136  : QDialog(parent)
137  , d(new ContactEditorDialogPrivate(mode, FullMode, nullptr, this))
138 {
139 }
140 
141 ContactEditorDialog::ContactEditorDialog(Mode mode, ContactEditor::AbstractContactEditorWidget *editorWidget, QWidget *parent)
142  : QDialog(parent)
143  , d(new ContactEditorDialogPrivate(mode, FullMode, editorWidget, this))
144 {
145 }
146 
147 ContactEditorDialog::ContactEditorDialog(Mode mode, DisplayMode displayMode, QWidget *parent)
148  : QDialog(parent)
149  , d(new ContactEditorDialogPrivate(mode, displayMode, nullptr, this))
150 {
151 }
152 
154 {
155  d->writeConfig();
156 }
157 
159 {
160  d->mEditor->loadContact(contact);
161 }
162 
164 {
165  if (d->mMode == EditMode) {
166  return;
167  }
168 
169  d->mAddressBookBox->setDefaultCollection(addressbook);
170 }
171 
173 {
174  return d->mEditor;
175 }
176 
177 void ContactEditorDialog::accept()
178 {
179  if (d->mEditor->hasNoSavedData()) {
180  const int answer = KMessageBox::questionTwoActions(this,
181  i18nc("@info", "Location was not saved. Do you want to close editor?"),
182  i18nc("@title:window", "Confirmation"),
183  KGuiItem(i18nc("@action:button", "Close Editor"), QStringLiteral("dialog-close")),
184  KGuiItem(i18nc("@action:button", "Do Not Close"), QStringLiteral("dialog-cancel")));
185  if (answer == KMessageBox::ButtonCode::SecondaryAction) {
186  return;
187  }
188  }
189  if (d->mAddressBookBox) {
190  d->mEditor->setDefaultAddressBook(d->mAddressBookBox->currentCollection());
191  }
192  d->mEditor->saveContactInAddressBook();
193 }
194 
195 void ContactEditorDialog::reject()
196 {
197  const int answer = KMessageBox::questionTwoActions(this,
198  i18nc("@info", "Do you really want to cancel?"),
199  i18nc("@title:window", "Confirmation"),
200  KGuiItem(i18nc("@action:button", "Cancel Editing"), QStringLiteral("dialog-ok")),
201  KGuiItem(i18nc("@action:button", "Do Not Cancel"), QStringLiteral("dialog-cancel")));
202 
203  if (answer == KMessageBox::ButtonCode::PrimaryAction) {
204  QDialog::reject(); // Discard current changes
205  }
206 }
207 
208 #include "moc_contacteditordialog.cpp"
void error(const QString &errorMsg)
This signal is emitted when an error occurred during the save.
void contactStored(const Akonadi::Item &contact)
This signal is emitted when the contact has been saved back to the storage.
~ContactEditorDialog() override
Destroys the contact editor dialog.
bool isValid() const const
virtual void reject()
void error(const QString &errMsg)
This signal is emitted whenever a contact is not updated or stored.
AkonadiContactEditor * editor() const
Returns the ContactEditor that is used by this dialog.
void contactStored(const Akonadi::Item &contact)
This signal is emitted whenever a contact was updated or stored.
void readConfig()
@ VCardMode
Show just pages with elements stored in vcard.
Definition: contacteditor.h:87
Mode
Describes the mode of the editor dialog.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
@ CreateMode
Creates a new contact.
QString i18n(const char *text, const TYPE &arg...)
@ CreateMode
Creates a new contact.
Definition: contacteditor.h:81
ContactEditorDialog(Mode mode, QWidget *parent=nullptr)
Creates a new contact editor dialog with the standard editor widget.
KSharedConfigPtr config()
void setDefaultAddressBook(const Akonadi::Collection &addressbook)
Sets the addressbook that shall be selected as default in create mode.
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
A dialog for creating or editing a contact in Akonadi.
QString label(StandardShortcut id)
@ EditMode
Edits an existing contact.
void setContact(const Akonadi::Item &contact)
Sets the contact to edit when in EditMode.
@ EditMode
Edits an existing contact.
Definition: contacteditor.h:82
QString i18nc(const char *context, const char *text, const TYPE &arg...)
An widget to edit contacts in Akonadi.
Definition: contacteditor.h:72
static QString mimeType()
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.