]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-individual-edit-dialog.c
Updated Spanish Translation
[empathy.git] / libempathy-gtk / empathy-individual-edit-dialog.c
index 4b5e2dfd7bee42b4c26a71a8f8e79624d2599f21..dbd01c970d24d8205f97636c41992623cab3fe7a 100644 (file)
  *          Travis Reitter <travis.reitter@collabora.co.uk>
  */
 
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
+#include "config.h"
+#include "empathy-individual-edit-dialog.h"
 
-#include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 
-#include <telepathy-glib/util.h>
-#include <folks/folks.h>
-#include <folks/folks-telepathy.h>
-
-#include <libempathy/empathy-individual-manager.h>
-#include <libempathy/empathy-utils.h>
-
-#include "empathy-individual-edit-dialog.h"
 #include "empathy-individual-widget.h"
-#include "empathy-ui-utils.h"
+#include "empathy-utils.h"
 
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualEditDialog)
 
 typedef struct {
   FolksIndividual *individual; /* owned */
+  GtkWidget *individual_widget; /* child widget */
 } EmpathyIndividualEditDialogPriv;
 
 enum {
@@ -53,28 +43,18 @@ enum {
  * Each dialog contains a referenced pointer to its Individual */
 static GList *edit_dialogs = NULL;
 
+static void individual_edit_dialog_set_individual (
+    EmpathyIndividualEditDialog *dialog,
+    FolksIndividual *individual);
+
 G_DEFINE_TYPE (EmpathyIndividualEditDialog, empathy_individual_edit_dialog,
     GTK_TYPE_DIALOG);
 
-/* Fairly arbitrary response ID for the "Unlink" button */
-#define RESPONSE_UNLINK 5
-
 static void
 individual_dialogs_response_cb (GtkDialog *dialog,
     gint response,
     GList **dialogs)
 {
-  if (response == RESPONSE_UNLINK)
-    {
-      EmpathyIndividualEditDialogPriv *priv = GET_PRIV (dialog);
-      EmpathyIndividualManager *manager =
-          empathy_individual_manager_dup_singleton ();
-
-      empathy_individual_manager_unlink_individual (manager, priv->individual);
-
-      g_object_unref (manager);
-    }
-
   *dialogs = g_list_remove (*dialogs, dialog);
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
@@ -116,45 +96,57 @@ empathy_individual_edit_dialog_show (FolksIndividual *individual,
   gtk_widget_show (dialog);
 }
 
+static void
+individual_removed_cb (FolksIndividual *individual,
+    FolksIndividual *replacement_individual,
+    EmpathyIndividualEditDialog *self)
+{
+  /* Update to show the new Individual (this will close the dialogue if there
+   * is no new Individual). */
+  individual_edit_dialog_set_individual (self, replacement_individual);
+
+  /* Destroy the dialogue */
+  if (replacement_individual == NULL)
+    {
+      individual_dialogs_response_cb (GTK_DIALOG (self),
+          GTK_RESPONSE_DELETE_EVENT, &edit_dialogs);
+    }
+}
+
 static void
 individual_edit_dialog_set_individual (
     EmpathyIndividualEditDialog *dialog,
     FolksIndividual *individual)
 {
   EmpathyIndividualEditDialogPriv *priv;
-  GtkWidget *individual_widget;
-  GList *personas, *l;
-  guint num_personas = 0;
 
   g_return_if_fail (EMPATHY_INDIVIDUAL_EDIT_DIALOG (dialog));
-  g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual));
+  g_return_if_fail (individual == NULL || FOLKS_IS_INDIVIDUAL (individual));
 
   priv = GET_PRIV (dialog);
 
-  /* Individual info widget */
-  individual_widget = empathy_individual_widget_new (individual,
-      EMPATHY_INDIVIDUAL_WIDGET_EDIT_ALIAS |
-      EMPATHY_INDIVIDUAL_WIDGET_EDIT_GROUPS |
-      EMPATHY_INDIVIDUAL_WIDGET_EDIT_FAVOURITE);
-  gtk_container_set_border_width (GTK_CONTAINER (individual_widget), 8);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (
-      GTK_DIALOG (dialog))), individual_widget, TRUE, TRUE, 0);
-  gtk_widget_show (individual_widget);
-
-  /* Count how many Telepathy personas we have, to see whether we can
-   * unlink */
-  personas = folks_individual_get_personas (individual);
-  for (l = personas; l != NULL; l = l->next)
+  /* Remove the old Individual */
+  if (priv->individual != NULL)
     {
-      if (TPF_IS_PERSONA (l->data))
-        num_personas++;
+      g_signal_handlers_disconnect_by_func (priv->individual,
+          (GCallback) individual_removed_cb, dialog);
     }
 
-  priv->individual = g_object_ref (individual);
+  tp_clear_object (&priv->individual);
 
-  /* Only make the "Unlink" button sensitive if we have enough personas */
-  gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), RESPONSE_UNLINK,
-      (num_personas > 1) ? TRUE : FALSE);
+  /* Add the new Individual */
+  priv->individual = individual;
+
+  if (individual != NULL)
+    {
+      g_object_ref (individual);
+      g_signal_connect (individual, "removed",
+          (GCallback) individual_removed_cb, dialog);
+
+      /* Update the UI */
+      empathy_individual_widget_set_individual (
+          EMPATHY_INDIVIDUAL_WIDGET (priv->individual_widget), individual);
+    }
 }
 
 static void
@@ -198,11 +190,8 @@ individual_edit_dialog_set_property (GObject *object,
 static void
 individual_edit_dialog_dispose (GObject *object)
 {
-  EmpathyIndividualEditDialogPriv *priv = GET_PRIV (object);
-
-  if (priv->individual != NULL)
-    g_object_unref (priv->individual);
-  priv->individual = NULL;
+  individual_edit_dialog_set_individual (
+      EMPATHY_INDIVIDUAL_EDIT_DIALOG (object), NULL);
 
   G_OBJECT_CLASS (
       empathy_individual_edit_dialog_parent_class)->dispose (object);
@@ -236,7 +225,7 @@ static void
 empathy_individual_edit_dialog_init (
     EmpathyIndividualEditDialog *dialog)
 {
-  GtkWidget *button, *action_area;
+  GtkWidget *button;
   EmpathyIndividualEditDialogPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (
       dialog, EMPATHY_TYPE_INDIVIDUAL_EDIT_DIALOG,
       EmpathyIndividualEditDialogPriv);
@@ -244,20 +233,18 @@ empathy_individual_edit_dialog_init (
   dialog->priv = priv;
   priv->individual = NULL;
 
-  gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
   gtk_window_set_title (GTK_WINDOW (dialog), _("Edit Contact Information"));
 
-  /* Unlink button */
-  button = gtk_button_new_with_mnemonic (
-      C_("Unlink individual (button)", "_Unlink"));
-  gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, RESPONSE_UNLINK);
-
-  action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
-  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area), button,
-      TRUE);
-
-  gtk_widget_show (button);
+  /* Individual widget */
+  priv->individual_widget = empathy_individual_widget_new (priv->individual,
+      EMPATHY_INDIVIDUAL_WIDGET_EDIT_ALIAS |
+      EMPATHY_INDIVIDUAL_WIDGET_EDIT_GROUPS |
+      EMPATHY_INDIVIDUAL_WIDGET_EDIT_FAVOURITE);
+  gtk_container_set_border_width (GTK_CONTAINER (priv->individual_widget), 8);
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (
+      GTK_DIALOG (dialog))), priv->individual_widget, TRUE, TRUE, 0);
+  gtk_widget_show (priv->individual_widget);
 
   /* Close button */
   button = gtk_button_new_with_label (GTK_STOCK_CLOSE);