From f5f67823db5a629fa3ce618bc1d8b80d14f1fc59 Mon Sep 17 00:00:00 2001 From: Ondrej Holy Date: Fri, 3 May 2019 09:00:56 +0200 Subject: [PATCH] user-accounts: Present the default avatar in the avatar popover Currently, it is not possible to unset a custom avatar, respective it is not possible to set the default one. Let's present the default avatar in the avatar popover as suggested in the mockup: https://wiki.gnome.org/Design/OS/AvatarChooser Fixes: GNOME/gnome-control-center#62 --- panels/user-accounts/cc-avatar-chooser.c | 25 ++++++++++++++++++ panels/user-accounts/cc-avatar-chooser.ui | 18 ++++++++++--- panels/user-accounts/cc-user-panel.c | 2 +- panels/user-accounts/user-utils.c | 32 +++++++++++++++-------- panels/user-accounts/user-utils.h | 4 ++- 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/panels/user-accounts/cc-avatar-chooser.c b/panels/user-accounts/cc-avatar-chooser.c index 393276807..221e2d8c9 100644 --- a/panels/user-accounts/cc-avatar-chooser.c +++ b/panels/user-accounts/cc-avatar-chooser.c @@ -50,6 +50,7 @@ struct _CcAvatarChooser { GtkWidget *popup_button; GtkWidget *crop_area; + GtkWidget *user_flowbox; GtkWidget *flowbox; GtkWidget *take_picture_button; @@ -574,6 +575,7 @@ cc_avatar_chooser_class_init (CcAvatarChooserClass *klass) gtk_widget_class_set_template_from_resource (wclass, "/org/gnome/control-center/user-accounts/cc-avatar-chooser.ui"); + gtk_widget_class_bind_template_child (wclass, CcAvatarChooser, user_flowbox); gtk_widget_class_bind_template_child (wclass, CcAvatarChooser, flowbox); gtk_widget_class_bind_template_child (wclass, CcAvatarChooser, take_picture_button); @@ -585,16 +587,39 @@ cc_avatar_chooser_class_init (CcAvatarChooserClass *klass) oclass->dispose = cc_avatar_chooser_dispose; } +static void +user_flowbox_activated (GtkFlowBox *flowbox, + GtkFlowBoxChild *child, + CcAvatarChooser *self) +{ + set_default_avatar (self->user); + + gtk_popover_popdown (GTK_POPOVER (self)); +} + void cc_avatar_chooser_set_user (CcAvatarChooser *self, ActUser *user) { + g_autoptr(GdkPixbuf) source_pixbuf = NULL; + g_autoptr(GdkPixbuf) pixbuf = NULL; + GtkWidget *image; + g_return_if_fail (self != NULL); if (self->user) { + gtk_container_foreach (GTK_CONTAINER (self->user_flowbox), (GtkCallback) gtk_widget_destroy, NULL); g_object_unref (self->user); self->user = NULL; } self->user = g_object_ref (user); + + source_pixbuf = generate_default_avatar (user, AVATAR_CHOOSER_PIXEL_SIZE); + pixbuf = round_image (source_pixbuf); + image = gtk_image_new_from_pixbuf (pixbuf); + gtk_image_set_pixel_size (GTK_IMAGE (image), AVATAR_CHOOSER_PIXEL_SIZE); + gtk_widget_show (image); + gtk_container_add (GTK_CONTAINER (self->user_flowbox), image); + g_signal_connect (self->user_flowbox, "child-activated", G_CALLBACK (user_flowbox_activated), self); } diff --git a/panels/user-accounts/cc-avatar-chooser.ui b/panels/user-accounts/cc-avatar-chooser.ui index 0d3b22f05..45bcbabfc 100644 --- a/panels/user-accounts/cc-avatar-chooser.ui +++ b/panels/user-accounts/cc-avatar-chooser.ui @@ -2,17 +2,29 @@