'Remove contact' option in contactsview
Tuleap: #298
Change-Id: I69c933829416a6dc77096ea504cef95a54af9aa4
diff --git a/src/backends/edscontactbackend.cpp b/src/backends/edscontactbackend.cpp
index c099aed..39a2d96 100644
--- a/src/backends/edscontactbackend.cpp
+++ b/src/backends/edscontactbackend.cpp
@@ -114,8 +114,11 @@
bool EdsContactEditor::remove(const Person* item)
{
- mediator()->removeItem(item);
- return true;
+ bool ret = collection_->removePerson(item);
+ if (ret) {
+ mediator()->removeItem(item);
+ }
+ return ret;
}
bool EdsContactEditor::edit( Person* item)
@@ -380,7 +383,7 @@
if (p) {
g_debug("removing: %s", p->formattedName().toUtf8().constData());
deactivate(p);
- editor<Person>()->remove(p);
+ mediator_->removeItem(p);
} else {
g_warning("person with given UID doesn't exist: %s", uid);
}
@@ -429,6 +432,7 @@
return (CollectionInterface::SupportedFeatures::NONE |
CollectionInterface::SupportedFeatures::LOAD |
CollectionInterface::SupportedFeatures::ADD |
+ CollectionInterface::SupportedFeatures::REMOVE |
CollectionInterface::SupportedFeatures::SAVE );
}
@@ -479,6 +483,34 @@
return ret;
}
+bool EdsContactBackend::removePerson(const Person *item)
+{
+ g_return_val_if_fail(client_.get(), false);
+
+ g_debug("removing person");
+
+ GError *error = NULL;
+
+ bool ret = e_book_client_remove_contact_by_uid_sync(
+ E_BOOK_CLIENT(client_.get()),
+ item->uid(),
+ cancellable_.get(),
+ &error
+ );
+
+ if(!ret) {
+ if(error) {
+ g_warning("could not delete contact: %s", error->message);
+ g_clear_error(&error);
+ }
+ else {
+ g_warning("could not delete contact");
+ }
+ }
+
+ return ret;
+}
+
bool EdsContactBackend::savePerson(const Person *item)
{
g_return_val_if_fail(client_.get(), false);
diff --git a/src/backends/edscontactbackend.h b/src/backends/edscontactbackend.h
index f67d38d..bbeb0fb 100644
--- a/src/backends/edscontactbackend.h
+++ b/src/backends/edscontactbackend.h
@@ -80,6 +80,7 @@
void parseContact(EContact *contact);
void lastContactAdded();
bool addNewPerson(Person *item);
+ bool removePerson(const Person *item);
bool savePerson(const Person *item);
private:
diff --git a/src/contactsview.cpp b/src/contactsview.cpp
index 26067e0..62031a7 100644
--- a/src/contactsview.cpp
+++ b/src/contactsview.cpp
@@ -249,6 +249,52 @@
gtk_clipboard_set_text(clip, text, -1);
}
+
+static gboolean
+remove_contact_dialog(GtkWidget *widget, Person *person)
+{
+ gboolean response = FALSE;
+ GtkWidget *dialog = gtk_message_dialog_new(NULL,
+ (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
+ _("Are you sure you want to delete contact \"%s\"?"
+ " It will be removed from your system's addressbook."),
+ person->formattedName().toUtf8().constData());
+
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
+
+ /* get parent window so we can center on it */
+ GtkWidget *parent = gtk_widget_get_toplevel(GTK_WIDGET(widget));
+ if (gtk_widget_is_toplevel(parent)) {
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+ }
+
+ switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
+ case GTK_RESPONSE_OK:
+ response = TRUE;
+ break;
+ default:
+ response = FALSE;
+ break;
+ }
+
+ gtk_widget_destroy(dialog);
+
+ return response;
+}
+
+static void
+remove_contact(GtkWidget *item, G_GNUC_UNUSED gpointer user_data)
+{
+ gpointer data = g_object_get_data(G_OBJECT(item), COPY_DATA_KEY);
+ g_return_if_fail(data);
+ Person* person = (Person *)data;
+ if (remove_contact_dialog(item, person)) {
+ person->remove();
+ }
+}
+
static gboolean
contacts_popup_menu(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event, GtkTreeView *treeview)
{
@@ -291,10 +337,10 @@
/* copy name */
gchar *name = g_strdup_printf("%s", c->formattedName().toUtf8().constData());
- GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- g_object_set_data_full(G_OBJECT(item), COPY_DATA_KEY, name, (GDestroyNotify)g_free);
- g_signal_connect(item,
+ GtkWidget *copy_name_item = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), copy_name_item);
+ g_object_set_data_full(G_OBJECT(copy_name_item), COPY_DATA_KEY, name, (GDestroyNotify)g_free);
+ g_signal_connect(copy_name_item,
"activate",
G_CALLBACK(copy_contact_info),
NULL);
@@ -310,6 +356,16 @@
G_CALLBACK(copy_contact_info),
NULL);
}
+
+ /* delete contact */
+ GtkWidget *remove_contact_item = gtk_menu_item_new_with_mnemonic(_("_Remove contact"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), remove_contact_item);
+ g_object_set_data_full(G_OBJECT(remove_contact_item), COPY_DATA_KEY, c, (GDestroyNotify)g_free);
+ g_signal_connect(remove_contact_item,
+ "activate",
+ G_CALLBACK(remove_contact),
+ NULL);
+
}
} else if (depth > 2) {
/* copy number */