]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-linking-dialog.c
factor out start_gnome_contacts()
[empathy.git] / libempathy-gtk / empathy-linking-dialog.c
index d323e84f4a837cccdda754bead9c128969953ca9..350bfdc22622f51543e76b33d6a99520265fc717 100644 (file)
 #include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 
+#include <folks/folks.h>
+#include <folks/folks-telepathy.h>
+
 #include <libempathy/empathy-individual-manager.h>
 #include <libempathy/empathy-utils.h>
 
 #include "empathy-linking-dialog.h"
 #include "empathy-individual-linker.h"
+#include "empathy-ui-utils.h"
 
 /**
  * SECTION:empathy-individual-widget
 
 static GtkWidget *linking_dialog = NULL;
 
+/* Fairly arbitrary response ID for the "Unlink" button */
+#define RESPONSE_UNLINK 5
+
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLinkingDialog)
 
 typedef struct {
   EmpathyIndividualLinker *linker; /* child widget */
+  GtkWidget *link_button; /* child widget */
 } EmpathyLinkingDialogPriv;
 
 G_DEFINE_TYPE (EmpathyLinkingDialog, empathy_linking_dialog,
     GTK_TYPE_DIALOG);
 
+static void
+linker_notify_has_changed_cb (EmpathyIndividualLinker *linker,
+    GParamSpec *pspec,
+    EmpathyLinkingDialog *self)
+{
+  EmpathyLinkingDialogPriv *priv = GET_PRIV (self);
+
+  /* Only make the "Link" button sensitive if the linked Individual has been
+   * changed. */
+  gtk_widget_set_sensitive (priv->link_button,
+      empathy_individual_linker_get_has_changed (linker));
+}
+
 static void
 empathy_linking_dialog_class_init (EmpathyLinkingDialogClass *klass)
 {
@@ -87,7 +108,6 @@ empathy_linking_dialog_init (EmpathyLinkingDialog *self)
   dialog = GTK_DIALOG (self);
 
   /* Set up dialog */
-  gtk_dialog_set_has_separator (dialog, FALSE);
   gtk_window_set_resizable (GTK_WINDOW (self), TRUE);
   /* Translators: this is the title of the linking dialogue (reached by
    * right-clicking on a contact and selecting "Link…"). "Link" in this title
@@ -95,6 +115,14 @@ empathy_linking_dialog_init (EmpathyLinkingDialog *self)
   gtk_window_set_title (GTK_WINDOW (self), _("Link Contacts"));
   gtk_widget_set_size_request (GTK_WIDGET (self), 600, 500);
 
+  /* Unlink button */
+  button = gtk_button_new_with_mnemonic (
+      C_("Unlink individual (button)", "_Unlink…"));
+  gtk_widget_set_tooltip_text (button, _("Completely split the displayed "
+      "linked contacts into the separate contacts."));
+  gtk_dialog_add_action_widget (dialog, button, RESPONSE_UNLINK);
+  gtk_widget_show (button);
+
   /* Cancel button */
   button = gtk_button_new_with_label (GTK_STOCK_CANCEL);
   gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
@@ -105,13 +133,16 @@ empathy_linking_dialog_init (EmpathyLinkingDialog *self)
   /* Translators: this is an action button in the linking dialogue. "Link" is
    * used here as a verb meaning "to connect two contacts to form a
    * meta-contact". */
-  button = gtk_button_new_with_mnemonic (_("_Link"));
-  gtk_dialog_add_action_widget (dialog, button, GTK_RESPONSE_OK);
-  gtk_widget_show (button);
+  priv->link_button = gtk_button_new_with_mnemonic (_("_Link"));
+  gtk_dialog_add_action_widget (dialog, priv->link_button, GTK_RESPONSE_OK);
+  gtk_widget_show (priv->link_button);
 
   /* Linker widget */
   priv->linker =
       EMPATHY_INDIVIDUAL_LINKER (empathy_individual_linker_new (NULL));
+  g_signal_connect (priv->linker, "notify::has-changed",
+      (GCallback) linker_notify_has_changed_cb, self);
+
   gtk_container_set_border_width (GTK_CONTAINER (priv->linker), 8);
   content_area = GTK_BOX (gtk_dialog_get_content_area (dialog));
   gtk_box_pack_start (content_area, GTK_WIDGET (priv->linker), TRUE, TRUE, 0);
@@ -125,17 +156,52 @@ linking_response_cb (EmpathyLinkingDialog *self,
 {
   EmpathyLinkingDialogPriv *priv = GET_PRIV (self);
 
-  if (response == GTK_RESPONSE_OK) {
-    EmpathyIndividualManager *manager;
-    GList *personas;
+  if (response == GTK_RESPONSE_OK)
+    {
+      EmpathyIndividualManager *manager;
+      GeeSet *personas;
 
-    manager = empathy_individual_manager_dup_singleton ();
+      manager = empathy_individual_manager_dup_singleton ();
 
-    personas = empathy_individual_linker_get_linked_personas (priv->linker);
-    empathy_individual_manager_link_personas (manager, personas);
+      personas = empathy_individual_linker_get_linked_personas (priv->linker);
+      empathy_individual_manager_link_personas (manager, personas);
 
-    g_object_unref (manager);
-  }
+      g_object_unref (manager);
+    }
+  else if (response == RESPONSE_UNLINK)
+    {
+      EmpathyIndividualManager *manager;
+      FolksIndividual *individual;
+      GtkWidget *dialog;
+
+      individual =
+          empathy_individual_linker_get_start_individual (priv->linker);
+
+      /* Show a confirmation dialogue first */
+      dialog = gtk_message_dialog_new (GTK_WINDOW (self), GTK_DIALOG_MODAL,
+          GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE,
+          _("Unlink linked contacts '%s'?"),
+          folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
+      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+          _("Are you sure you want to unlink these linked contacts? This will "
+            "completely split the linked contacts into separate contacts."));
+      gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+          C_("Unlink individual (button)", "_Unlink"), GTK_RESPONSE_OK,
+          NULL);
+
+      if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
+        {
+          gtk_widget_destroy (dialog);
+          return;
+        }
+
+      gtk_widget_destroy (dialog);
+
+      manager = empathy_individual_manager_dup_singleton ();
+      empathy_individual_manager_unlink_individual (manager, individual);
+      g_object_unref (manager);
+    }
 
   linking_dialog = NULL;
   gtk_widget_destroy (GTK_WIDGET (self));
@@ -157,6 +223,9 @@ empathy_linking_dialog_show (FolksIndividual *individual,
     GtkWindow *parent)
 {
   EmpathyLinkingDialogPriv *priv;
+  GeeSet *personas;
+  GeeIterator *iter;
+  guint num_personas = 0;
 
   /* Create the dialogue if it doesn't exist */
   if (linking_dialog == NULL)
@@ -175,7 +244,33 @@ empathy_linking_dialog_show (FolksIndividual *individual,
 
   empathy_individual_linker_set_start_individual (priv->linker, individual);
 
+  /* Count how many Telepathy personas we have, to see whether we can
+   * unlink */
+  personas = folks_individual_get_personas (individual);
+  iter = gee_iterable_iterator (GEE_ITERABLE (personas));
+  while (gee_iterator_next (iter))
+    {
+      FolksPersona *persona = gee_iterator_get (iter);
+      if (empathy_folks_persona_is_interesting (persona))
+        num_personas++;
+
+      g_clear_object (&persona);
+    }
+  g_clear_object (&iter);
+
+  /* Only make the "Unlink" button sensitive if we have enough personas */
+  gtk_dialog_set_response_sensitive (GTK_DIALOG (linking_dialog),
+      RESPONSE_UNLINK, (num_personas > 1) ? TRUE : FALSE);
+
   gtk_window_present (GTK_WINDOW (linking_dialog));
 
   return linking_dialog;
 }
+
+EmpathyIndividualLinker *
+empathy_linking_dialog_get_individual_linker (EmpathyLinkingDialog *self)
+{
+  g_return_val_if_fail (EMPATHY_IS_LINKING_DIALOG (self), NULL);
+
+  return GET_PRIV (self)->linker;
+}