aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2010-09-03 00:29:50 +0800
committerPhilip Withnall <philip.withnall@collabora.co.uk>2010-09-03 19:03:39 +0800
commit56575f683db3c77fd1f2ecae170ad5f4d04ca1d1 (patch)
treeacbd2f5aa382e854773ac9691c7338620dbadc84
parent9a1557d2740bcb627033bb2cdd6593d31d081c19 (diff)
downloadgsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar.gz
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar.bz2
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar.lz
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar.xz
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.tar.zst
gsoc2013-empathy-56575f683db3c77fd1f2ecae170ad5f4d04ca1d1.zip
Update the Information dialogue on contact linking or unlinking
Ensure any open Information dialogues are: • closed, if they're showing the details for a meta-contact which is then unlinked; or • reloaded to show the details of the new meta-contact, if they're showing the details for a contact which is then linked.
-rw-r--r--libempathy-gtk/empathy-individual-information-dialog.c186
1 files changed, 111 insertions, 75 deletions
diff --git a/libempathy-gtk/empathy-individual-information-dialog.c b/libempathy-gtk/empathy-individual-information-dialog.c
index 486770684..438c0bb37 100644
--- a/libempathy-gtk/empathy-individual-information-dialog.c
+++ b/libempathy-gtk/empathy-individual-information-dialog.c
@@ -43,6 +43,8 @@
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualInformationDialog)
typedef struct {
FolksIndividual *individual;
+ GtkWidget *individual_widget; /* child widget */
+ GtkWidget *label; /* child widget */
} EmpathyIndividualInformationDialogPriv;
enum {
@@ -54,6 +56,10 @@ enum {
* Each dialog contains a referenced pointer to its Individual */
static GList *information_dialogs = NULL;
+static void individual_information_dialog_set_individual (
+ EmpathyIndividualInformationDialog *dialog,
+ FolksIndividual *individual);
+
G_DEFINE_TYPE (EmpathyIndividualInformationDialog,
empathy_individual_information_dialog, GTK_TYPE_DIALOG);
@@ -104,63 +110,81 @@ empathy_individual_information_dialog_show (FolksIndividual *individual,
}
static void
+individual_removed_cb (FolksIndividual *individual,
+ FolksIndividual *replacement_individual,
+ EmpathyIndividualInformationDialog *self)
+{
+ individual_information_dialog_set_individual (self,
+ replacement_individual);
+
+ /* Destroy the dialogue */
+ if (replacement_individual == NULL)
+ {
+ individual_dialogs_response_cb (GTK_DIALOG (self),
+ GTK_RESPONSE_DELETE_EVENT, &information_dialogs);
+ }
+}
+
+static void
+set_label_visibility (EmpathyIndividualInformationDialog *dialog)
+{
+ EmpathyIndividualInformationDialogPriv *priv = GET_PRIV (dialog);
+ GList *personas, *l;
+ guint num_personas = 0;
+
+ /* Count how many Telepathy personas we have, to see whether we can
+ * unlink */
+ if (priv->individual != NULL)
+ {
+ personas = folks_individual_get_personas (priv->individual);
+ for (l = personas; l != NULL; l = l->next)
+ {
+ if (TPF_IS_PERSONA (l->data))
+ num_personas++;
+ }
+ }
+
+ /* Only make the label visible if we have enough personas */
+ gtk_widget_set_visible (priv->label, (num_personas > 1) ? TRUE : FALSE);
+}
+
+static void
individual_information_dialog_set_individual (
EmpathyIndividualInformationDialog *dialog,
FolksIndividual *individual)
{
EmpathyIndividualInformationDialogPriv *priv;
- GtkWidget *individual_widget;
- GtkBox *content_area;
- GList *personas, *l;
- guint num_personas = 0;
g_return_if_fail (EMPATHY_INDIVIDUAL_INFORMATION_DIALOG (dialog));
- g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual));
+ g_return_if_fail (individual == NULL || FOLKS_IS_INDIVIDUAL (individual));
priv = GET_PRIV (dialog);
- gtk_window_set_title (GTK_WINDOW (dialog),
- folks_individual_get_alias (individual));
-
- content_area = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog)));
-
- /* Determine how many personas we have, because we only want to display the
- * label if we have more than one persona. */
- 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);
}
- /* Label */
- if (num_personas > 1)
- {
- gchar *label_string;
- GtkWidget *label;
-
- /* Translators: the heading at the top of the Information dialogue */
- label_string = g_strdup_printf ("<b>%s</b>", _("Linked Contacts"));
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), label_string);
- g_free (label_string);
-
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_misc_set_padding (GTK_MISC (label), 6, 6);
- gtk_box_pack_start (content_area, label, FALSE, TRUE, 0);
- gtk_widget_show (label);
- }
+ tp_clear_object (&priv->individual);
- /* Individual widget */
- individual_widget = empathy_individual_widget_new (individual,
- EMPATHY_INDIVIDUAL_WIDGET_SHOW_LOCATION |
- EMPATHY_INDIVIDUAL_WIDGET_SHOW_DETAILS |
- EMPATHY_INDIVIDUAL_WIDGET_SHOW_PERSONAS);
- gtk_container_set_border_width (GTK_CONTAINER (individual_widget), 6);
- gtk_box_pack_start (content_area, individual_widget, TRUE, TRUE, 0);
- gtk_widget_show (individual_widget);
+ /* Add the new Individual */
+ priv->individual = individual;
- priv->individual = g_object_ref (individual);
+ if (individual != NULL)
+ {
+ g_object_ref (individual);
+ g_signal_connect (individual, "removed",
+ (GCallback) individual_removed_cb, dialog);
+
+ /* Update the UI */
+ gtk_window_set_title (GTK_WINDOW (dialog),
+ folks_individual_get_alias (individual));
+ empathy_individual_widget_set_individual (
+ EMPATHY_INDIVIDUAL_WIDGET (priv->individual_widget), individual);
+ set_label_visibility (dialog);
+ }
}
static void
@@ -202,40 +226,13 @@ individual_information_dialog_set_property (GObject *object,
}
static void
-individual_information_dialog_constructed (GObject *object)
-{
- GtkDialog *dialog = GTK_DIALOG (object);
- GtkWidget *button;
-
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
-
- /* Close button */
- button = gtk_button_new_with_label (GTK_STOCK_CLOSE);
- gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
- GTK_RESPONSE_CLOSE);
- gtk_widget_set_can_default (button, TRUE);
- gtk_window_set_default (GTK_WINDOW (dialog), button);
- gtk_widget_show (button);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (individual_dialogs_response_cb), &information_dialogs);
-}
-
-static void
-individual_information_dialog_finalize (GObject *object)
+individual_information_dialog_dispose (GObject *object)
{
- EmpathyIndividualInformationDialog *dialog;
- EmpathyIndividualInformationDialogPriv *priv;
-
- dialog = EMPATHY_INDIVIDUAL_INFORMATION_DIALOG (object);
- priv = GET_PRIV (dialog);
-
- g_object_unref (priv->individual);
+ individual_information_dialog_set_individual (
+ EMPATHY_INDIVIDUAL_INFORMATION_DIALOG (object), NULL);
G_OBJECT_CLASS (
- empathy_individual_information_dialog_parent_class)->finalize (object);
+ empathy_individual_information_dialog_parent_class)->dispose (object);
}
static void
@@ -244,10 +241,9 @@ empathy_individual_information_dialog_class_init (
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = individual_information_dialog_finalize;
+ object_class->dispose = individual_information_dialog_dispose;
object_class->get_property = individual_information_dialog_get_property;
object_class->set_property = individual_information_dialog_set_property;
- object_class->constructed = individual_information_dialog_constructed;
g_object_class_install_property (object_class,
PROP_INDIVIDUAL,
@@ -267,10 +263,50 @@ static void
empathy_individual_information_dialog_init (
EmpathyIndividualInformationDialog *dialog)
{
+ GtkWidget *button;
+ GtkBox *content_area;
+ gchar *label_string;
EmpathyIndividualInformationDialogPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (
dialog, EMPATHY_TYPE_INDIVIDUAL_INFORMATION_DIALOG,
EmpathyIndividualInformationDialogPriv);
dialog->priv = priv;
priv->individual = NULL;
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
+
+ content_area = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog)));
+
+ /* Translators: the heading at the top of the Information dialogue */
+ label_string = g_strdup_printf ("<b>%s</b>", _("Linked Contacts"));
+ priv->label = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (priv->label), label_string);
+ g_free (label_string);
+
+ gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (priv->label), 6, 6);
+ gtk_box_pack_start (content_area, priv->label, FALSE, TRUE, 0);
+ gtk_widget_show (priv->label);
+
+ /* Individual widget */
+ priv->individual_widget = empathy_individual_widget_new (priv->individual,
+ EMPATHY_INDIVIDUAL_WIDGET_SHOW_LOCATION |
+ EMPATHY_INDIVIDUAL_WIDGET_SHOW_DETAILS |
+ EMPATHY_INDIVIDUAL_WIDGET_SHOW_PERSONAS);
+ gtk_container_set_border_width (GTK_CONTAINER (priv->individual_widget), 6);
+ gtk_box_pack_start (content_area, priv->individual_widget, TRUE, TRUE, 0);
+ gtk_widget_show (priv->individual_widget);
+
+ /* Close button */
+ button = gtk_button_new_with_label (GTK_STOCK_CLOSE);
+ gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
+ GTK_RESPONSE_CLOSE);
+ gtk_widget_set_can_default (button, TRUE);
+ gtk_window_set_default (GTK_WINDOW (dialog), button);
+ gtk_widget_show (button);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (individual_dialogs_response_cb), &information_dialogs);
}