diff --git a/src/akonadi-contacts/contacteditordialog.cpp b/src/akonadi-contacts/contacteditordialog.cpp index 55bd3e57..25841465 100644 --- a/src/akonadi-contacts/contacteditordialog.cpp +++ b/src/akonadi-contacts/contacteditordialog.cpp @@ -1,193 +1,204 @@ /* This file is part of Akonadi Contact. Copyright (c) 2007-2009 Tobias Koenig This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "contacteditordialog.h" #include "contacteditor.h" #include #include #include #include #include +#include #include #include #include #include #include #include using namespace Akonadi; class Q_DECL_HIDDEN ContactEditorDialog::Private { public: Private(ContactEditorDialog::Mode mode, ContactEditorDialog::DisplayMode displaymode, ContactEditor::AbstractContactEditorWidget *editorWidget, ContactEditorDialog *parent) : q(parent) , mAddressBookBox(nullptr) , mMode(mode) { QWidget *mainWidget = new QWidget(q); q->setWindowTitle(mode == ContactEditorDialog::CreateMode ? i18n("New Contact") : i18n("Edit Contact")); QVBoxLayout *mainLayout = new QVBoxLayout(q); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, q); q->connect(buttonBox, &QDialogButtonBox::accepted, q, [this]() { slotOkClicked(); }); q->connect(buttonBox, &QDialogButtonBox::rejected, q, [this]() { slotCancelClicked(); }); mainLayout->addWidget(mainWidget); mainLayout->addWidget(buttonBox); QGridLayout *layout = new QGridLayout(mainWidget); layout->setContentsMargins(0, 0, 0, 0); if (editorWidget) { mEditor = new AkonadiContactEditor(mode == ContactEditorDialog::CreateMode ? AkonadiContactEditor::CreateMode : AkonadiContactEditor::EditMode, editorWidget, q); } else { mEditor = new AkonadiContactEditor(mode == ContactEditorDialog::CreateMode ? AkonadiContactEditor::CreateMode : AkonadiContactEditor::EditMode, displaymode == ContactEditorDialog::FullMode ? AkonadiContactEditor::FullMode : AkonadiContactEditor::VCardMode, q); } if (mode == ContactEditorDialog::CreateMode) { QLabel *label = new QLabel(i18n("Add to:"), mainWidget); mAddressBookBox = new CollectionComboBox(mainWidget); mAddressBookBox->setMimeTypeFilter(QStringList() << KContacts::Addressee::mimeType()); mAddressBookBox->setAccessRightsFilter(Collection::CanCreateItem); layout->addWidget(label, 0, 0); layout->addWidget(mAddressBookBox, 0, 1); } layout->addWidget(mEditor, 1, 0, 1, 2); layout->setColumnStretch(1, 1); connect(mEditor, &AkonadiContactEditor::contactStored, q, &ContactEditorDialog::contactStored); connect(mEditor, &AkonadiContactEditor::error, q, &ContactEditorDialog::error); connect(mEditor, &AkonadiContactEditor::finished, q, [this]() { slotFinish(); }); readConfig(); } void slotOkClicked() { if (mAddressBookBox) { mEditor->setDefaultAddressBook(mAddressBookBox->currentCollection()); } mEditor->saveContactInAddressBook(); } void slotFinish() { q->QDialog::accept(); } void slotCancelClicked() { q->reject(); } void readConfig() { KConfig config(QStringLiteral("akonadi_contactrc")); KConfigGroup group(&config, QStringLiteral("ContactEditor")); const QSize size = group.readEntry("Size", QSize(800, 500)); if (size.isValid()) { q->resize(size); } } void writeConfig() { KConfig config(QStringLiteral("akonadi_contactrc")); KConfigGroup group(&config, QStringLiteral("ContactEditor")); group.writeEntry("Size", q->size()); group.sync(); } ContactEditorDialog *q; CollectionComboBox *mAddressBookBox = nullptr; ContactEditorDialog::Mode mMode; AkonadiContactEditor *mEditor = nullptr; }; ContactEditorDialog::ContactEditorDialog(Mode mode, QWidget *parent) : QDialog(parent) , d(new Private(mode, FullMode, nullptr, this)) { } ContactEditorDialog::ContactEditorDialog(Mode mode, ContactEditor::AbstractContactEditorWidget *editorWidget, QWidget *parent) : QDialog(parent) , d(new Private(mode, FullMode, editorWidget, this)) { } ContactEditorDialog::ContactEditorDialog(Mode mode, DisplayMode displayMode, QWidget *parent) : QDialog(parent) , d(new Private(mode, displayMode, nullptr, this)) { } ContactEditorDialog::~ContactEditorDialog() { d->writeConfig(); delete d; } void ContactEditorDialog::setContact(const Akonadi::Item &contact) { d->mEditor->loadContact(contact); } void ContactEditorDialog::setDefaultAddressBook(const Akonadi::Collection &addressbook) { if (d->mMode == EditMode) { return; } d->mAddressBookBox->setDefaultCollection(addressbook); } AkonadiContactEditor *ContactEditorDialog::editor() const { return d->mEditor; } void ContactEditorDialog::accept() { //Nothing } +void ContactEditorDialog::reject() +{ + if (KMessageBox::questionYesNo( + this, + i18nc("@info", "Do you really want to cancel?"), + i18nc("@title:window", "Confirmation")) == KMessageBox::Yes) { + QDialog::reject(); // Discard current changes + } +} + #include "moc_contacteditordialog.cpp" diff --git a/src/akonadi-contacts/contacteditordialog.h b/src/akonadi-contacts/contacteditordialog.h index 3bb698e7..a93650ee 100644 --- a/src/akonadi-contacts/contacteditordialog.h +++ b/src/akonadi-contacts/contacteditordialog.h @@ -1,170 +1,172 @@ /* This file is part of Akonadi Contact. Copyright (c) 2007-2009 Tobias Koenig This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef AKONADI_CONTACTEDITORDIALOG_H #define AKONADI_CONTACTEDITORDIALOG_H #include "akonadi-contact_export.h" #include namespace ContactEditor { class AbstractContactEditorWidget; } namespace Akonadi { class AkonadiContactEditor; class Collection; class Item; /** * @short A dialog for creating or editing a contact in Akonadi. * * This dialog provides a way to create a new contact or edit * an existing contact in Akonadi. * * Example for creating a new contact: * * @code * * using namespace Akonadi; * * ContactEditorDialog *dlg = new ContactEditorDialog( ContactEditorDialog::CreateMode, this ); * connect( dlg, SIGNAL(contactStored(Akonadi::Item)), * this, SLOT(contactStored(Akonadi::Item)) ); * dlg->show(); * * * @endcode * * Example for editing an existing contact: * * @code * * using namespace Akonadi; * * const Item contact = ...; * * ContactEditorDialog *dlg = new ContactEditorDialog( ContactEditorDialog::EditMode, this ); * connect( dlg, SIGNAL(contactStored(Akonadi::Item)), * this, SLOT(contactStored(Akonadi::Item)) ); * dlg->setContact( contact ); * dlg->show(); * * @endcode * * @author Tobias Koenig * @since 4.4 */ class AKONADI_CONTACT_EXPORT ContactEditorDialog : public QDialog { Q_OBJECT public: /** * Describes the mode of the editor dialog. */ enum Mode { CreateMode, ///< Creates a new contact EditMode ///< Edits an existing contact }; enum DisplayMode { FullMode, //Show all pages VCardMode //Show just pages with elements stored in vcard. }; /** * Creates a new contact editor dialog with the standard editor widget. * * @param mode The mode of the dialog. * @param parent The parent widget of the dialog. */ explicit ContactEditorDialog(Mode mode, QWidget *parent = nullptr); /** * Creates a new contact editor dialog with a custom editor widget. * * @param mode The mode of the dialog. * @param editorWidget The contact editor widget that shall be used for editing. * @param parent The parent widget of the dialog. */ ContactEditorDialog(Mode mode, ContactEditor::AbstractContactEditorWidget *editorWidget, QWidget *parent = nullptr); /** * Creates a new contact editor dialog with a custom editor widget. * * @param mode The mode of the dialog. * @param displayMode The mode of displaying: full or vcard * @param parent The parent widget of the dialog. * @since 4.10 */ ContactEditorDialog(Mode mode, DisplayMode displayMode, QWidget *parent = nullptr); /** * Destroys the contact editor dialog. */ ~ContactEditorDialog() override; /** * Sets the @p contact to edit when in EditMode. * @param contact the contact to edit * @note The contact item just must have a uid set, all * other data are fetched by the dialog automatically. */ void setContact(const Akonadi::Item &contact); /** * Sets the @p addressbook that shall be selected as default in create mode. */ void setDefaultAddressBook(const Akonadi::Collection &addressbook); /** * Returns the ContactEditor that is used by this dialog. */ Q_REQUIRED_RESULT AkonadiContactEditor *editor() const; + void reject() override; + Q_SIGNALS: /** * This signal is emitted whenever a contact was updated or stored. * * @param contact The data reference of the contact. */ void contactStored(const Akonadi::Item &contact); /** * This signal is emitted whenever a contact is not updated or stored. * * @param errMsg The error during updating or storing contact. */ void error(const QString &errMsg); public Q_SLOTS: void accept() override; private: //@cond PRIVATE class Private; Private *const d; //@endcond }; } #endif