[gnome-contacts/wip/christopherdavis/hdy-avatar] avatar: Use HdyAvatar
- From: Christopher Davis <christopherdavis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-contacts/wip/christopherdavis/hdy-avatar] avatar: Use HdyAvatar
- Date: Sat, 3 Oct 2020 23:32:38 +0000 (UTC)
commit 906f3f948ee29f223182fea7cf2d9b0a8e5eeacc
Author: Christopher Davis <brainblasted disroot org>
Date: Sat Oct 3 15:30:13 2020 -0700
avatar: Use HdyAvatar
Makes Contacts.Avatar a wrapper around HdyAvatar.
This allows us to drop our custom fallback and
circular avatar code in favor of HdyAvatar.
Fixes https://gitlab.gnome.org/GNOME/gnome-contacts/-/issues/183
Related to https://gitlab.gnome.org/GNOME/Initiatives/-/issues/20
src/contacts-avatar-selector.vala | 3 +-
src/contacts-avatar-utils.vala | 183 --------------------------------------
src/contacts-avatar.vala | 106 +++++++---------------
src/meson.build | 1 -
4 files changed, 32 insertions(+), 261 deletions(-)
---
diff --git a/src/contacts-avatar-selector.vala b/src/contacts-avatar-selector.vala
index e2e9c1cf..5e6a1600 100644
--- a/src/contacts-avatar-selector.vala
+++ b/src/contacts-avatar-selector.vala
@@ -119,8 +119,7 @@ public class Contacts.AvatarSelector : Popover {
private FlowBoxChild create_thumbnail (Gdk.Pixbuf source_pixbuf) {
var avatar = new Avatar (ICONS_SIZE);
- var pixbuf = source_pixbuf.scale_simple (ICONS_SIZE, ICONS_SIZE, Gdk.InterpType.HYPER);
- avatar.set_pixbuf (pixbuf);
+ avatar.set_pixbuf (source_pixbuf);
var button = new Button ();
button.get_style_context ().add_class (AVATAR_BUTTON_CSS_NAME);
diff --git a/src/contacts-avatar.vala b/src/contacts-avatar.vala
index 9f542170..fb758dfb 100644
--- a/src/contacts-avatar.vala
+++ b/src/contacts-avatar.vala
@@ -23,29 +23,31 @@ using Gee;
* The Avatar of a Contact is responsible for showing an {@link Folks.Individual}'s
* avatar, or a fallback if it's not available.
*/
-public class Contacts.Avatar : DrawingArea {
- private int size;
- private Gdk.Pixbuf? pixbuf = null;
- private Gdk.Pixbuf? cache = null;
+public class Contacts.Avatar : Bin {
+ private Hdy.Avatar widget;
private Individual? individual = null;
- // We want to lazily load the Pixbuf to make sure we don't draw all contact avatars at once.
- // As long as there is no need for it to be drawn, keep this to false.
- private bool avatar_loaded = false;
public Avatar (int size, Individual? individual = null) {
this.individual = individual;
- if (individual != null) {
- individual.notify["avatar"].connect ( (s, p) => {
- load_avatar.begin ();
- });
+ string name = "";
+ bool show_initials = false;
+ if (this.individual != null) {
+ name = find_display_name ();
+ /* If we don't have a usable name use the display_name
+ * to generate the color but don't show any label
+ */
+ if (name == "") {
+ name = this.individual.display_name;
+ } else {
+ show_initials = true;
+ }
}
- this.size = size;
- set_size_request (size, size);
-
- // If we don't have an avatar, don't try to load it later
- this.avatar_loaded = (individual == null || individual.avatar == null);
+ this.widget = new Hdy.Avatar (size, name, show_initials);
+ this.widget.set_image_load_func (size => load_avatar (size));
+ this.widget.show ();
+ add(this.widget);
show ();
}
@@ -54,69 +56,23 @@ public class Contacts.Avatar : DrawingArea {
* Manually set the avatar to the given pixbuf, even if the contact has an avatar.
*/
public void set_pixbuf (Gdk.Pixbuf? a_pixbuf) {
- this.cache = null;
- this.pixbuf = a_pixbuf;
- queue_draw ();
- }
-
- private async void load_avatar () {
- assert (this.individual != null);
-
- this.avatar_loaded = true;
- try {
- var stream = yield this.individual.avatar.load_async (this.size);
- this.cache = null;
- this.pixbuf = yield new Gdk.Pixbuf.from_stream_at_scale_async (stream, this.size, this.size, true);
- queue_draw ();
- } catch (Error e) {
- debug ("Couldn't load avatar of contact %s. Reason: %s", this.individual.display_name, e.message);
- }
- }
-
- public override bool draw (Cairo.Context cr) {
- // This exists to implement lazy loading: i.e. only load the avatar on the first draw()
- if (!this.avatar_loaded)
- load_avatar.begin ();
-
- if (this.cache != null) {
- // Don't do anything if we have already a cached avatar
- } else if (this.pixbuf != null)
- this.cache = create_contact_avatar ();
- else // No avatar or cache available, create the fallback
- this.cache = create_fallback ();
-
- draw_cached_avatar (cr);
-
- return true;
- }
-
- private void draw_cached_avatar (Cairo.Context cr) {
- Gdk.cairo_set_source_pixbuf (cr, this.cache, 0, 0);
- cr.paint ();
+ this.widget.set_image_load_func (size => load_avatar (size, a_pixbuf));
}
- private Gdk.Pixbuf create_contact_avatar () {
- return AvatarUtils.round_image(this.pixbuf);
- }
-
- private Gdk.Pixbuf create_fallback () {
- string name = "";
- bool show_label = false;
- if (this.individual != null) {
- name = find_display_name ();
- /* If we don't have a usable name use the display_name
- * to generate the color but don't show any label
- */
- if (name == "") {
- name = this.individual.display_name;
- } else {
- show_label = true;
+ private Gdk.Pixbuf? load_avatar (int size, Gdk.Pixbuf? pixbuf = null) {
+ if (pixbuf != null) {
+ return pixbuf.scale_simple (size, size, Gdk.InterpType.HYPER);
+ } else {
+ if (this.individual != null && this.individual.avatar != null) {
+ try {
+ var stream = this.individual.avatar.load (size, null);
+ return new Gdk.Pixbuf.from_stream_at_scale (stream, size, size, true);
+ } catch (Error e) {
+ debug ("Couldn't load avatar of contact %s. Reason: %s", this.individual.display_name, e.message);
+ }
}
}
- var pixbuf = AvatarUtils.generate_user_picture(name, this.size, show_label);
- pixbuf = AvatarUtils.round_image(pixbuf);
-
- return pixbuf;
+ return null;
}
/* Find a nice name to generate the label and color for the fallback avatar
diff --git a/src/meson.build b/src/meson.build
index 63b28478..a38b2629 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -13,7 +13,6 @@ libcontacts_sources = files(
'contacts-typeset.vala',
'contacts-type-descriptor.vala',
'contacts-utils.vala',
- 'contacts-avatar-utils.vala',
'contacts-vcard-type-mapping.vala',
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]