From 10de86b4bf55d1b624adbb867854bb61df04fb19 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 10 Mar 2010 10:05:50 +0100 Subject: add 'favorite' checkbox to the edit dialog --- libempathy-gtk/empathy-contact-dialogs.c | 3 +- libempathy-gtk/empathy-contact-widget.c | 84 ++++++++++++++++++++++++++++++-- libempathy-gtk/empathy-contact-widget.h | 1 + 3 files changed, 82 insertions(+), 6 deletions(-) (limited to 'libempathy-gtk') diff --git a/libempathy-gtk/empathy-contact-dialogs.c b/libempathy-gtk/empathy-contact-dialogs.c index 52e43e163..fed8d04cb 100644 --- a/libempathy-gtk/empathy-contact-dialogs.c +++ b/libempathy-gtk/empathy-contact-dialogs.c @@ -261,7 +261,8 @@ empathy_contact_edit_dialog_show (EmpathyContact *contact, /* Contact info widget */ contact_widget = empathy_contact_widget_new (contact, EMPATHY_CONTACT_WIDGET_EDIT_ALIAS | - EMPATHY_CONTACT_WIDGET_EDIT_GROUPS); + EMPATHY_CONTACT_WIDGET_EDIT_GROUPS | + EMPATHY_CONTACT_WIDGET_EDIT_FAVOURITE); gtk_container_set_border_width (GTK_CONTAINER (contact_widget), 8); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), contact_widget, diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c index 696a8cda4..63ea10ebd 100644 --- a/libempathy-gtk/empathy-contact-widget.c +++ b/libempathy-gtk/empathy-contact-widget.c @@ -82,6 +82,7 @@ typedef struct EmpathyContact *contact; EmpathyContactWidgetFlags flags; guint widget_id_timeout; + gulong fav_sig_id; GtkWidget *vbox_contact_widget; @@ -100,6 +101,7 @@ typedef struct GtkWidget *label_status; GtkWidget *table_contact; GtkWidget *vbox_avatar; + GtkWidget *favourite_checkbox; /* Location */ GtkWidget *vbox_location; @@ -448,7 +450,6 @@ contact_widget_groups_setup (EmpathyContactWidget *information) { if (information->flags & EMPATHY_CONTACT_WIDGET_EDIT_GROUPS) { - information->manager = empathy_contact_manager_dup_singleton (); contact_widget_model_setup (information); } } @@ -964,6 +965,21 @@ contact_widget_presence_notify_cb (EmpathyContactWidget *information) gtk_widget_show (information->image_state); } +#if HAVE_FAVOURITE_CONTACTS +static void +contact_widget_favourites_changed_cb (EmpathyContactManager *manager, + EmpathyContact *contact, + gboolean is_favourite, + EmpathyContactWidget *information) +{ + if (contact != information->contact) + return; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON ( + information->favourite_checkbox), is_favourite); +} +#endif + static void contact_widget_remove_contact (EmpathyContactWidget *information) { @@ -1052,6 +1068,18 @@ contact_widget_contact_update (EmpathyContactWidget *information) contact_widget_presence_notify_cb (information); contact_widget_avatar_notify_cb (information); + if (information->flags & EMPATHY_CONTACT_WIDGET_EDIT_FAVOURITE) + { + gboolean is_favourite; + + is_favourite = empathy_contact_list_is_favourite ( + EMPATHY_CONTACT_LIST (information->manager), + information->contact); + + contact_widget_favourites_changed_cb (information->manager, + information->contact, is_favourite, information); + } + gtk_widget_show (information->label_alias); gtk_widget_show (information->widget_alias); gtk_widget_show (information->hbox_presence); @@ -1181,6 +1209,28 @@ contact_widget_id_focus_out_cb (GtkWidget *widget, return FALSE; } +#if HAVE_FAVOURITE_CONTACTS +static void +favourite_toggled_cb (GtkToggleButton *button, + EmpathyContactWidget *information) +{ + gboolean active; + + active = gtk_toggle_button_get_active (button); + + if (active) + { + empathy_contact_list_add_to_favourites ( + EMPATHY_CONTACT_LIST (information->manager), information->contact); + } + else + { + empathy_contact_list_remove_from_favourites ( + EMPATHY_CONTACT_LIST (information->manager), information->contact); + } +} +#endif + static void contact_widget_contact_setup (EmpathyContactWidget *information) { @@ -1318,6 +1368,27 @@ contact_widget_contact_setup (EmpathyContactWidget *information) gtk_label_set_selectable (GTK_LABEL (information->label_status), FALSE); } gtk_widget_show (information->widget_alias); + +#if HAVE_FAVOURITE_CONTACTS + /* Favorite */ + if (information->flags & EMPATHY_CONTACT_WIDGET_EDIT_FAVOURITE) + { + information->favourite_checkbox = gtk_check_button_new_with_label ( + _("Favorite")); + + g_signal_connect (information->favourite_checkbox, "toggled", + G_CALLBACK (favourite_toggled_cb), information); + + gtk_table_attach_defaults (GTK_TABLE (information->table_contact), + information->favourite_checkbox, 0, 2, 3, 4); + + information->fav_sig_id = g_signal_connect (information->manager, + "favourites-changed", + G_CALLBACK (contact_widget_favourites_changed_cb), information); + + gtk_widget_show (information->favourite_checkbox); + } +#endif } static void @@ -1330,10 +1401,11 @@ contact_widget_destroy_cb (GtkWidget *widget, { g_source_remove (information->widget_id_timeout); } - if (information->manager) - { - g_object_unref (information->manager); - } + + if (information->fav_sig_id != 0) + g_signal_handler_disconnect (information->manager, information->fav_sig_id); + + g_object_unref (information->manager); g_slice_free (EmpathyContactWidget, information); } @@ -1401,6 +1473,8 @@ empathy_contact_widget_new (EmpathyContact *contact, "EmpathyContactWidget", information); + information->manager = empathy_contact_manager_dup_singleton (); + /* Create widgets */ contact_widget_contact_setup (information); contact_widget_groups_setup (information); diff --git a/libempathy-gtk/empathy-contact-widget.h b/libempathy-gtk/empathy-contact-widget.h index 04b567f4d..af669477e 100644 --- a/libempathy-gtk/empathy-contact-widget.h +++ b/libempathy-gtk/empathy-contact-widget.h @@ -61,6 +61,7 @@ typedef enum EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP = 1 << 5, EMPATHY_CONTACT_WIDGET_SHOW_LOCATION = 1 << 6, EMPATHY_CONTACT_WIDGET_NO_SET_ALIAS = 1 << 7, + EMPATHY_CONTACT_WIDGET_EDIT_FAVOURITE = 1 << 8, } EmpathyContactWidgetFlags; GtkWidget * empathy_contact_widget_new (EmpathyContact *contact, -- cgit v1.2.3