[gnome-contacts] Avatar: load asynchronously.



commit 5101ab54f1cadb94132f5241cb6b5df9f02d115c
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Sat Jan 20 16:24:24 2018 +0100

    Avatar: load asynchronously.
    
    This fixes [bug 657962](https://bugzilla.gnome.org/show_bug.cgi?id=657962).

 src/contacts-avatar-selector.vala        |    4 ++--
 src/contacts-avatar.vala                 |   14 ++++++--------
 src/contacts-contact-editor.vala         |    4 ++--
 src/contacts-contact-list.vala           |    2 +-
 src/contacts-contact-sheet.vala          |    4 ++--
 src/contacts-link-suggestion-grid.vala   |    2 +-
 src/contacts-linked-accounts-dialog.vala |    2 +-
 7 files changed, 15 insertions(+), 17 deletions(-)
---
diff --git a/src/contacts-avatar-selector.vala b/src/contacts-avatar-selector.vala
index 8967ce9..7c147dd 100644
--- a/src/contacts-avatar-selector.vala
+++ b/src/contacts-avatar-selector.vala
@@ -85,10 +85,10 @@ public class Contacts.AvatarSelector : Dialog {
     this.current_avatar = new Avatar (MAIN_SIZE);
     if (contact != null) {
       contact.keep_widget_uptodate (this.current_avatar, (w) => {
-          (w as Avatar).set_image (contact.individual, contact);
+          (w as Avatar).set_image.begin (contact.individual, contact);
         });
     } else {
-      this.current_avatar.set_image (null, null);
+      this.current_avatar.set_image.begin (null, null);
     }
     this.current_avatar.set_hexpand (false);
     this.current_avatar.show ();
diff --git a/src/contacts-avatar.vala b/src/contacts-avatar.vala
index 2b6b623..3d62747 100644
--- a/src/contacts-avatar.vala
+++ b/src/contacts-avatar.vala
@@ -25,8 +25,8 @@ using Gee;
  */
 public class Contacts.Avatar : DrawingArea {
   private int size;
-  private Gdk.Pixbuf? pixbuf;
-  private Contact? contact;
+  private Gdk.Pixbuf? pixbuf = null;
+  private Contact? contact = null;
 
   // The background color used in case of a fallback avatar
   private Gdk.RGBA? bg_color = null;
@@ -47,21 +47,19 @@ public class Contacts.Avatar : DrawingArea {
     queue_draw ();
   }
 
-  public void set_image (AvatarDetails? details, Contact? contact = null) {
+  public async void set_image (AvatarDetails? details, Contact? contact = null) {
     this.contact = contact;
 
     // FIXME listen for changes in the Individual's avatar
 
-    Gdk.Pixbuf? a_pixbuf = null;
     if (details != null && details.avatar != null) {
       try {
-        var stream = details.avatar.load (size, null);
-        a_pixbuf = new Gdk.Pixbuf.from_stream_at_scale (stream, size, size, true);
+        var stream = yield details.avatar.load_async (size, null);
+        this.pixbuf = yield new Gdk.Pixbuf.from_stream_at_scale_async (stream, size, size, true);
+        queue_draw ();
       } catch {
       }
     }
-
-    set_pixbuf (a_pixbuf);
   }
 
   public override bool draw (Cairo.Context cr) {
diff --git a/src/contacts-contact-editor.vala b/src/contacts-contact-editor.vala
index 78bf5fc..0deb238 100644
--- a/src/contacts-contact-editor.vala
+++ b/src/contacts-contact-editor.vala
@@ -951,10 +951,10 @@ public class Contacts.ContactEditor : Grid {
 
     if (this.contact != null) {
       this.contact.keep_widget_uptodate (this.avatar,  (w) => {
-          this.avatar.set_image (this.contact.individual, this.contact);
+          this.avatar.set_image.begin (this.contact.individual, this.contact);
         });
     } else {
-      this.avatar.set_image (null, null);
+      this.avatar.set_image.begin (null, null);
     }
 
     this.container_grid.attach (button, 0, 0, 1, 3);
diff --git a/src/contacts-contact-list.vala b/src/contacts-contact-list.vala
index 6bc2a25..d692b2c 100644
--- a/src/contacts-contact-list.vala
+++ b/src/contacts-contact-list.vala
@@ -67,7 +67,7 @@ public class Contacts.ContactList : ListBox {
 
       // Update widgets
       this.label.set_text (this.contact.display_name);
-      this.avatar.set_image (this.contact.individual, this.contact);
+      this.avatar.set_image.begin (this.contact.individual, this.contact);
     }
   }
 
diff --git a/src/contacts-contact-sheet.vala b/src/contacts-contact-sheet.vala
index ed8934e..961005a 100644
--- a/src/contacts-contact-sheet.vala
+++ b/src/contacts-contact-sheet.vala
@@ -100,8 +100,8 @@ public class Contacts.ContactSheet : Grid {
     image_frame.set_vexpand (false);
     image_frame.set_valign (Align.START);
     c.keep_widget_uptodate (image_frame,  (w) => {
-        (w as Avatar).set_image (c.individual, c);
-          });
+        (w as Avatar).set_image.begin (c.individual, c);
+      });
     attach (image_frame,  0, 0, 1, 3);
 
     var name_label = new Label (null);
diff --git a/src/contacts-link-suggestion-grid.vala b/src/contacts-link-suggestion-grid.vala
index 88cc551..54f619e 100644
--- a/src/contacts-link-suggestion-grid.vala
+++ b/src/contacts-link-suggestion-grid.vala
@@ -47,7 +47,7 @@ public class Contacts.LinkSuggestionGrid : Grid {
     image_frame.hexpand = false;
     image_frame.margin = 12;
     contact.keep_widget_uptodate (image_frame,  (w) => {
-        (w as Avatar).set_image (contact.individual, contact);
+        (w as Avatar).set_image.begin (contact.individual, contact);
       });
     image_frame.show ();
     attach (image_frame, 0, 0, 1, 2);
diff --git a/src/contacts-linked-accounts-dialog.vala b/src/contacts-linked-accounts-dialog.vala
index b6b377f..931ec33 100644
--- a/src/contacts-linked-accounts-dialog.vala
+++ b/src/contacts-linked-accounts-dialog.vala
@@ -85,7 +85,7 @@ public class Contacts.LinkedAccountsDialog : Dialog {
       image_frame.margin = 6;
       image_frame.margin_end = 12;
       contact.keep_widget_uptodate (image_frame, (w) => {
-          (w as Avatar).set_image (contact.individual, contact);
+          (w as Avatar).set_image.begin (contact.individual, contact);
         });
       row_grid.attach (image_frame, 0, 0, 1, 2);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]