diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2007-10-09 00:44:44 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2007-10-09 00:44:44 +0800 |
commit | 0d4e81432f5ace47ac86991aa239e4a55686de00 (patch) | |
tree | 22cc64055c78370d4a973af8e85a36740f60f930 /libempathy-gtk/empathy-contact-widget.c | |
parent | 311dbc21826654538e098a8d838153d5b075f6c7 (diff) | |
download | gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar.gz gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar.bz2 gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar.lz gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar.xz gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.tar.zst gsoc2013-empathy-0d4e81432f5ace47ac86991aa239e4a55686de00.zip |
Implement EmpathyAvatarChooser and EmpathyAvatarImage and make use of them
2007-10-08 Xavier Claessens <xclaesse@gmail.com>
* libempathy-gtk/empathy-ui-utils.c:
* libempathy-gtk/empathy-ui-utils.h:
* libempathy-gtk/empathy-contact-widget.c:
* libempathy-gtk/empathy-contact-widget.h:
* libempathy-gtk/empathy-avatar-chooser.c:
* libempathy-gtk/empathy-avatar-chooser.h:
* libempathy-gtk/empathy-avatar-image.c:
* libempathy-gtk/empathy-avatar-image.h:
* libempathy-gtk/Makefile.am:
* src/empathy.c: Implement EmpathyAvatarChooser and EmpathyAvatarImage
and make use of them in contact information windows. That means we can
now enlarge avatars when clicking on it and we can set our own avatar if
we edit our own contact.
svn path=/trunk/; revision=363
Diffstat (limited to 'libempathy-gtk/empathy-contact-widget.c')
-rw-r--r-- | libempathy-gtk/empathy-contact-widget.c | 64 |
1 files changed, 46 insertions, 18 deletions
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c index b3081b130..b6fd4937d 100644 --- a/libempathy-gtk/empathy-contact-widget.c +++ b/libempathy-gtk/empathy-contact-widget.c @@ -38,6 +38,8 @@ #include "empathy-contact-widget.h" #include "empathy-account-chooser.h" +#include "empathy-avatar-chooser.h" +#include "empathy-avatar-image.h" #include "empathy-ui-utils.h" /* Delay before updating the widget when the id entry changed (ms) */ @@ -47,7 +49,6 @@ typedef struct { EmpathyContactFactory *factory; EmpathyContactManager *manager; EmpathyContact *contact; - gboolean is_user; EmpathyContactWidgetType type; GtkCellRenderer *renderer; guint widget_id_timeout; @@ -100,6 +101,8 @@ static void contact_widget_set_contact (EmpathyContactWidget static void contact_widget_contact_setup (EmpathyContactWidget *information); static void contact_widget_contact_update (EmpathyContactWidget *information); static gboolean contact_widget_update_contact (EmpathyContactWidget *information); +static void contact_widget_avatar_changed_cb (EmpathyAvatarChooser *chooser, + EmpathyContactWidget *information); static void contact_widget_account_changed_cb (GtkComboBox *widget, EmpathyContactWidget *information); static gboolean contact_widget_id_focus_out_cb (GtkWidget *widget, @@ -153,13 +156,11 @@ empathy_contact_widget_new (EmpathyContact *contact, GladeXML *glade; information = g_slice_new0 (EmpathyContactWidget); + if (type == CONTACT_WIDGET_TYPE_EDIT && empathy_contact_is_user (contact)) { + type = CONTACT_WIDGET_TYPE_EDIT_USER; + } information->type = type; information->factory = empathy_contact_factory_new (); - if (contact) { - information->is_user = empathy_contact_is_user (contact); - } else { - information->is_user = FALSE; - } glade = empathy_glade_get_file ("empathy-contact-widget.glade", "vbox_contact_widget", @@ -339,12 +340,19 @@ contact_widget_id_changed_cb (GtkEntry *entry, static void contact_widget_contact_setup (EmpathyContactWidget *information) { - /* FIXME: Use EmpathyAvatarImage if (editable && is_user) */ - information->widget_avatar = gtk_image_new (); + if (information->type == CONTACT_WIDGET_TYPE_EDIT_USER) { + information->widget_avatar = empathy_avatar_chooser_new (); + g_signal_connect (information->widget_avatar, "changed", + G_CALLBACK (contact_widget_avatar_changed_cb), + information); + } else { + information->widget_avatar = empathy_avatar_image_new (); + } gtk_box_pack_end (GTK_BOX (information->hbox_contact), information->widget_avatar, FALSE, FALSE, 6); + gtk_widget_show (information->widget_avatar); /* Setup account label/chooser */ if (information->type == CONTACT_WIDGET_TYPE_ADD) { @@ -459,6 +467,7 @@ contact_widget_contact_update (EmpathyContactWidget *information) gtk_widget_show (information->label_alias); gtk_widget_show (information->widget_alias); gtk_widget_show (information->hbox_presence); + gtk_widget_show (information->widget_avatar); } else { gtk_widget_hide (information->label_alias); gtk_widget_hide (information->widget_alias); @@ -492,6 +501,20 @@ contact_widget_update_contact (EmpathyContactWidget *information) } static void +contact_widget_avatar_changed_cb (EmpathyAvatarChooser *chooser, + EmpathyContactWidget *information) +{ + McAccount *account; + gchar *data; + gsize size; + + account = empathy_contact_get_account (information->contact); + empathy_avatar_chooser_get_image_data (EMPATHY_AVATAR_CHOOSER (information->widget_avatar), + &data, &size); + mc_account_set_avatar_from_data (account, data, size, "png"); +} + +static void contact_widget_account_changed_cb (GtkComboBox *widget, EmpathyContactWidget *information) { @@ -550,18 +573,23 @@ contact_widget_presence_notify_cb (EmpathyContactWidget *information) static void contact_widget_avatar_notify_cb (EmpathyContactWidget *information) { - GdkPixbuf *avatar_pixbuf; - - avatar_pixbuf = empathy_pixbuf_avatar_from_contact_scaled (information->contact, - 48, 48); + EmpathyAvatar *avatar = NULL; - if (avatar_pixbuf) { - gtk_image_set_from_pixbuf (GTK_IMAGE (information->widget_avatar), - avatar_pixbuf); - gtk_widget_show (information->widget_avatar); - g_object_unref (avatar_pixbuf); + if (information->contact) { + avatar = empathy_contact_get_avatar (information->contact); + } + if (information->type == CONTACT_WIDGET_TYPE_EDIT_USER) { + g_signal_handlers_block_by_func (information->widget_avatar, + contact_widget_avatar_changed_cb, + information); + empathy_avatar_chooser_set (EMPATHY_AVATAR_CHOOSER (information->widget_avatar), + avatar); + g_signal_handlers_unblock_by_func (information->widget_avatar, + contact_widget_avatar_changed_cb, + information); } else { - gtk_widget_hide (information->widget_avatar); + empathy_avatar_image_set (EMPATHY_AVATAR_IMAGE (information->widget_avatar), + avatar); } } |