[gnome-control-center/wip/oholy/default-avatar: 2/2] user-accounts: Present the default avatar in the avatar popover
- From: Ondrej Holy <oholy src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/wip/oholy/default-avatar: 2/2] user-accounts: Present the default avatar in the avatar popover
- Date: Fri, 3 May 2019 07:32:59 +0000 (UTC)
commit 1097d8ba5c51cc5c49b524bce9447505c53d940f
Author: Ondrej Holy <oholy redhat com>
Date: Fri May 3 09:00:56 2019 +0200
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 @@
<interface>
<!-- interface-requires gtk+ 3.8 -->
<template class="CcAvatarChooser" parent="GtkPopover">
- <property name="height-request">360</property>
- <property name="width-request">480</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+ <property name="border-width">10</property>
+ <child>
+ <object class="GtkFlowBox" id="user_flowbox">
+ <property name="visible">True</property>
+ <property name="border-width">10</property>
+ <property name="selection-mode">none</property>
+ <property name="homogeneous">True</property>
+ <property name="max-children-per-line">5</property>
+ <property name="column-spacing">10</property>
+ </object>
+ </child>
<child>
<object class="GtkFlowBox" id="flowbox">
<property name="visible">True</property>
- <property name="border-width">20</property>
+ <property name="border-width">10</property>
<property name="selection-mode">none</property>
+ <property name="homogeneous">True</property>
+ <property name="max-children-per-line">5</property>
+ <property name="column-spacing">10</property>
</object>
</child>
<child>
diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
index 07a12dda9..3a1167b66 100644
--- a/panels/user-accounts/cc-user-panel.c
+++ b/panels/user-accounts/cc-user-panel.c
@@ -367,7 +367,7 @@ add_user (CcUserPanel *self)
user = cc_add_user_dialog_get_user (dialog);
if (user != NULL) {
- generate_user_avatar (user);
+ set_default_avatar (user);
reload_users (self, user);
}
diff --git a/panels/user-accounts/user-utils.c b/panels/user-accounts/user-utils.c
index d283435df..f5cf9ddf0 100644
--- a/panels/user-accounts/user-utils.c
+++ b/panels/user-accounts/user-utils.c
@@ -559,11 +559,11 @@ get_color_for_name (const gchar *name)
}
static cairo_surface_t *
-generate_user_picture (const gchar *name)
+generate_user_picture (const gchar *name, gint size)
{
PangoFontDescription *font_desc;
g_autofree gchar *initials = extract_initials_from_name (name);
- g_autofree gchar *font = g_strdup_printf ("Sans %d", (int)ceil (IMAGE_SIZE / 2.5));
+ g_autofree gchar *font = g_strdup_printf ("Sans %d", (int)ceil (size / 2.5));
PangoLayout *layout;
GdkRGBA color = get_color_for_name (name);
cairo_surface_t *surface;
@@ -571,10 +571,10 @@ generate_user_picture (const gchar *name)
cairo_t *cr;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- IMAGE_SIZE,
- IMAGE_SIZE);
+ size,
+ size);
cr = cairo_create (surface);
- cairo_rectangle (cr, 0, 0, IMAGE_SIZE, IMAGE_SIZE);
+ cairo_rectangle (cr, 0, 0, size, size);
cairo_set_source_rgb (cr, color.red/255.0, color.green/255.0, color.blue/255.0);
cairo_fill (cr);
@@ -587,7 +587,7 @@ generate_user_picture (const gchar *name)
pango_font_description_free (font_desc);
pango_layout_get_size (layout, &width, &height);
- cairo_translate (cr, IMAGE_SIZE/2, IMAGE_SIZE/2);
+ cairo_translate (cr, size/2, size/2);
cairo_move_to (cr, - ((double)width / PANGO_SCALE)/2, - ((double)height/PANGO_SCALE)/2);
pango_cairo_show_layout (cr, layout);
cairo_destroy (cr);
@@ -635,16 +635,26 @@ set_user_icon_data (ActUser *user,
g_free (path);
}
-void
-generate_user_avatar (ActUser *user)
+GdkPixbuf *
+generate_default_avatar (ActUser *user, gint size)
{
- g_autoptr(GdkPixbuf) pixbuf = NULL;
+ GdkPixbuf *pixbuf = NULL;
cairo_surface_t *surface;
- surface = generate_user_picture (act_user_get_real_name (user));
+ surface = generate_user_picture (act_user_get_real_name (user), size);
- pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, IMAGE_SIZE, IMAGE_SIZE);
+ pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, size, size);
cairo_surface_destroy (surface);
+ return pixbuf;
+}
+
+void
+set_default_avatar (ActUser *user)
+{
+ g_autoptr(GdkPixbuf) pixbuf = NULL;
+
+ pixbuf = generate_default_avatar (user, IMAGE_SIZE);
+
set_user_icon_data (user, pixbuf);
}
diff --git a/panels/user-accounts/user-utils.h b/panels/user-accounts/user-utils.h
index 91a1db805..385d26105 100644
--- a/panels/user-accounts/user-utils.h
+++ b/panels/user-accounts/user-utils.h
@@ -44,7 +44,9 @@ gboolean is_valid_name (const gchar *name);
gboolean is_valid_username (const gchar *name,
gchar **tip);
GdkPixbuf *round_image (GdkPixbuf *pixbuf);
-void generate_user_avatar (ActUser *user);
+GdkPixbuf *generate_default_avatar (ActUser *user,
+ gint size);
+void set_default_avatar (ActUser *user);
void set_user_icon_data (ActUser *user,
GdkPixbuf *pixbuf);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]