Akonadi Contacts

contactgroupeditordialog.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 "contactgroupeditordialog.h"
10 
11 #include "contactgroupeditor.h"
12 #include "contactgroupeditor_p.h"
13 #include <Akonadi/CollectionComboBox>
14 #include <Akonadi/Item>
15 #include <KContacts/ContactGroup>
16 #include <KLocalizedString>
17 
18 #include <KConfig>
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 
30 namespace
31 {
32 static const char myContactGroupEditorDialogGroupName[] = "ContactGroupEditorDialog";
33 }
34 class Akonadi::ContactGroupEditorDialogPrivate
35 {
36 public:
37  ContactGroupEditorDialogPrivate(ContactGroupEditorDialog *qq, ContactGroupEditorDialog::Mode mode)
38  : q(qq)
39  , mMode(mode)
40  {
41  }
42 
43  void slotGroupNameChanged(const QString &name)
44  {
45  bool isValid = !(name.contains(QLatin1Char('@')) || name.contains(QLatin1Char('.')));
46  okButton->setEnabled(!name.trimmed().isEmpty() && isValid);
47  mEditor->groupNameIsValid(isValid);
48  }
49 
50  void readConfig()
51  {
52  KConfig config(QStringLiteral("akonadi_contactrc"));
53  KConfigGroup group(&config, myContactGroupEditorDialogGroupName);
54  const QSize size = group.readEntry("Size", QSize(470, 400));
55  if (size.isValid()) {
56  q->resize(size);
57  }
58  }
59 
60  void writeConfig()
61  {
62  KConfig config(QStringLiteral("akonadi_contactrc"));
63  KConfigGroup group(&config, myContactGroupEditorDialogGroupName);
64  group.writeEntry("Size", q->size());
65  group.sync();
66  }
67 
68  ContactGroupEditorDialog *const q;
69  Akonadi::CollectionComboBox *mAddressBookBox = nullptr;
70  ContactGroupEditor *mEditor = nullptr;
72  QPushButton *okButton = nullptr;
73 };
74 
76  : QDialog(parent)
77  , d(new ContactGroupEditorDialogPrivate(this, mode))
78 {
79  setWindowTitle(mode == CreateMode ? i18nc("@title:window", "New Contact Group") : i18nc("@title:window", "Edit Contact Group"));
80  auto mainLayout = new QVBoxLayout(this);
81 
83  d->okButton = buttonBox->button(QDialogButtonBox::Ok);
84  d->okButton->setDefault(true);
85  d->okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
86  connect(buttonBox, &QDialogButtonBox::accepted, this, &ContactGroupEditorDialog::slotAccepted);
87  connect(buttonBox, &QDialogButtonBox::rejected, this, &ContactGroupEditorDialog::reject);
88 
89  // Disable default button, so that finish editing of
90  // a member with the Enter key does not close the dialog
91  d->okButton->setAutoDefault(false);
92  buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false);
93 
94  auto mainWidget = new QWidget(this);
95 
96  auto layout = new QGridLayout(mainWidget);
98 
100 
101  if (mode == CreateMode) {
102  auto label = new QLabel(i18n("Add to:"), mainWidget);
103 
104  d->mAddressBookBox = new Akonadi::CollectionComboBox(mainWidget);
105  d->mAddressBookBox->setMimeTypeFilter(QStringList() << KContacts::ContactGroup::mimeType());
106  d->mAddressBookBox->setAccessRightsFilter(Akonadi::Collection::CanCreateItem);
107 
108  layout->addWidget(label, 0, 0);
109  layout->addWidget(d->mAddressBookBox, 0, 1);
110  }
111 
112  layout->addWidget(d->mEditor, 1, 0, 1, 2);
113  layout->setColumnStretch(1, 1);
114 
116  connect(d->mEditor->d->mGui.groupName, &QLineEdit::textChanged, this, [this](const QString &str) {
117  d->slotGroupNameChanged(str);
118  });
119 
120  d->okButton->setEnabled(!d->mEditor->d->mGui.groupName->text().trimmed().isEmpty());
121  mainLayout->addWidget(mainWidget);
122  mainLayout->addWidget(buttonBox);
123  d->readConfig();
124 }
125 
127 {
128  d->writeConfig();
129 }
130 
132 {
133  d->mEditor->loadContactGroup(group);
134 }
135 
137 {
138  if (d->mMode == EditMode) {
139  return;
140  }
141 
142  d->mAddressBookBox->setDefaultCollection(addressbook);
143 }
144 
146 {
147  return d->mEditor;
148 }
149 
150 void ContactGroupEditorDialog::slotAccepted()
151 {
152  if (d->mAddressBookBox) {
153  d->mEditor->setDefaultAddressBook(d->mAddressBookBox->currentCollection());
154  }
155 
156  if (d->mEditor->saveContactGroup()) {
157  accept();
158  }
159 }
160 
161 void ContactGroupEditorDialog::reject()
162 {
163  const int answer = KMessageBox::questionTwoActions(this,
164  i18nc("@info", "Do you really want to cancel?"),
165  i18nc("@title:window", "Confirmation"),
166  KGuiItem(i18nc("@action:button", "Cancel Editing"), QStringLiteral("dialog-ok")),
167  KGuiItem(i18nc("@action:button", "Do Not Cancel"), QStringLiteral("dialog-cancel")));
168 
169  if (answer == KMessageBox::ButtonCode::PrimaryAction) {
170  QDialog::reject(); // Discard current changes
171  }
172 }
173 
174 #include "moc_contactgroupeditordialog.cpp"
QWidget(QWidget *parent, Qt::WindowFlags f)
bool isValid() const const
virtual void reject()
~ContactGroupEditorDialog() override
Destroys the contact group editor dialog.
QLayout * layout() const const
ContactGroupEditorDialog(Mode mode, QWidget *parent=nullptr)
Creates a new contact group editor dialog.
QString trimmed() const const
void readConfig()
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setContactGroup(const Akonadi::Item &group)
Sets the contact group to edit when in EditMode.
@ CreateMode
Creates a new contact group.
@ CreateMode
Creates a new contact group.
ContactGroupEditor * editor() const
Returns the ContactGroupEditor that is used by the dialog.
QString i18n(const char *text, const TYPE &arg...)
void contactGroupStored(const Akonadi::Item &group)
This signal is emitted when the contact group has been saved back to the storage.
void textChanged(const QString &text)
bool isEmpty() const const
void setWindowTitle(const QString &)
An widget to edit contact groups in Akonadi.
virtual void accept()
@ EditMode
Edits an existing contact group.
static QString mimeType()
void setDefaultAddressBook(const Akonadi::Collection &addressbook)
Sets the addressbook that shall be selected as default for storage in create mode.
Key_Return
KSharedConfigPtr config()
A dialog for creating or editing a contact group in Akonadi.
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
@ EditMode
Edits an existing contact group.
bool isValid(QStringView ifopt)
QString name(StandardShortcut id)
void addWidget(QWidget *w)
void setContentsMargins(int left, int top, int right, int bottom)
void contactGroupStored(const Akonadi::Item &group)
This signal is emitted whenever a contact group was updated or stored.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
Mode
Describes the mode of the contact group editor.
void setDefaultAddressBook(const Akonadi::Collection &addressbook)
Sets the addressbook which shall be used to store new contact groups.
A widget for editing the display name of a contact.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Sep 26 2023 03:49:21 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.