[recipes/image-download: 10/11] Use the new api



commit 4ac0e68b976b78035901098d0ec66bb5cc73ee8b
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Mar 5 18:14:24 2017 -0500

    Use the new api
    
    Load images asynchronously, possibly from the net.

 src/gr-chef-dialog.c           |   46 +++++++++++++++++++++++++++-------------
 src/gr-chef-tile.c             |   19 ++++++++++++++--
 src/gr-cooking-view.c          |   30 +++++++++++++++++++++----
 src/gr-edit-page.c             |   14 ++++++++++-
 src/gr-image-page.c            |   14 ++++++++++-
 src/gr-image-viewer.c          |   32 +++++++++++++++++++++------
 src/gr-recipe-importer.c       |    4 ++-
 src/gr-recipe-printer.c        |    2 +-
 src/gr-recipe-small-tile.c     |   13 ++++++++--
 src/gr-recipe-store.c          |    3 +-
 src/gr-recipe-tile.c           |   21 ++++++++++++------
 src/gr-shell-search-provider.c |    4 +-
 12 files changed, 153 insertions(+), 49 deletions(-)
---
diff --git a/src/gr-chef-dialog.c b/src/gr-chef-dialog.c
index 6b32378..405e42f 100644
--- a/src/gr-chef-dialog.c
+++ b/src/gr-chef-dialog.c
@@ -33,6 +33,7 @@
 #include "gr-window.h"
 #include "gr-utils.h"
 #include "gr-chef-tile.h"
+#include "gr-image.h"
 
 
 struct _GrChefDialog
@@ -54,7 +55,8 @@ struct _GrChefDialog
         GPtrArray *additions;
         GPtrArray *removals;
 
-        char *image_path;
+        GrImage *ri;
+        GCancellable *cancellable;
 
         GrChef *chef;
 };
@@ -72,10 +74,13 @@ dismiss_error (GrChefDialog *self)
 static void
 update_image (GrChefDialog *self)
 {
-        if (self->image_path != NULL && self->image_path[0] != '\0') {
-                g_autoptr(GdkPixbuf) pixbuf = NULL;
-                pixbuf = load_pixbuf_fit_size (self->image_path, 64, 64, TRUE);
-                gtk_image_set_from_pixbuf (GTK_IMAGE (self->image), pixbuf);
+        g_cancellable_cancel (self->cancellable);
+        g_clear_object (&self->cancellable);
+
+        if (self->ri) {
+                self->cancellable = g_cancellable_new ();
+
+                gr_image_load (self->ri, 64, 64, TRUE, self->cancellable, gr_image_set_pixbuf, self->image);
                 gtk_style_context_remove_class (gtk_widget_get_style_context (self->image), "dim-label");
         }
         else {
@@ -126,14 +131,15 @@ file_chooser_response (GtkNativeDialog *self,
 
                 path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self));
 
-                if (prefs->image_path)
-                        g_ptr_array_add (prefs->removals, g_strdup (prefs->image_path));
+                if (prefs->ri)
+                        g_ptr_array_add (prefs->removals, g_strdup (gr_image_get_path (prefs->ri)));
 
-                g_free (prefs->image_path);
-                prefs->image_path = import_image (path);
+                g_clear_object (&prefs->ri);
+                prefs->ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default ())),
+import_image (path));
 
-                if (prefs->image_path)
-                        g_ptr_array_add (prefs->additions, g_strdup (prefs->image_path));
+                if (prefs->ri)
+                        g_ptr_array_add (prefs->additions, g_strdup (gr_image_get_path (prefs->ri)));
 
                 update_image (prefs);
                 field_changed (prefs);
@@ -172,10 +178,13 @@ gr_chef_dialog_finalize (GObject *object)
 {
         GrChefDialog *self = GR_CHEF_DIALOG (object);
 
+        g_cancellable_cancel (self->cancellable);
+        g_clear_object (&self->cancellable);
+        g_clear_object (&self->ri);
+
         revert_changes (self);
         g_clear_pointer (&self->removals, g_ptr_array_unref);
 
-        g_free (self->image_path);
         g_clear_object (&self->chef);
 
         G_OBJECT_CLASS (gr_chef_dialog_parent_class)->finalize (object);
@@ -189,6 +198,7 @@ save_chef_dialog (GrChefDialog  *self,
         const char *id;
         const char *name;
         const char *fullname;
+        const char *image_path;
         g_autofree char *description = NULL;
         GtkTextBuffer *buffer;
         GtkTextIter start, end;
@@ -203,6 +213,7 @@ save_chef_dialog (GrChefDialog  *self,
         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->description));
         gtk_text_buffer_get_bounds (buffer, &start, &end);
         description = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+        image_path = self->ri ? gr_image_get_path (self->ri) : NULL;
 
         store = gr_recipe_store_get ();
 
@@ -211,7 +222,7 @@ save_chef_dialog (GrChefDialog  *self,
                               "fullname", fullname,
                               "name", name,
                               "description", description,
-                              "image-path", self->image_path,
+                              "image-path", image_path,
                               NULL);
                 ret = gr_recipe_store_update_chef (store, self->chef, id, error);
         }
@@ -230,7 +241,7 @@ save_chef_dialog (GrChefDialog  *self,
                               "fullname", fullname,
                               "name", name,
                               "description", description,
-                              "image-path", self->image_path,
+                              "image-path", image_path,
                               NULL);
 
                 ret = gr_recipe_store_add_chef (store, self->chef, error);
@@ -291,6 +302,10 @@ gr_chef_dialog_set_chef (GrChefDialog *self,
         gboolean same_chef;
         GrRecipeStore *store;
 
+        g_cancellable_cancel (self->cancellable);
+        g_clear_object (&self->cancellable);
+        g_clear_object (&self->ri);
+
         revert_changes (self);
 
         store = gr_recipe_store_get ();
@@ -317,7 +332,8 @@ gr_chef_dialog_set_chef (GrChefDialog *self,
                 gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->description)),
                                           description ? description : "", -1);
 
-                self->image_path = g_strdup (image_path);
+                self->ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default ())), 
image_path);
+
 
                 if (gr_chef_is_readonly (chef)) {
                         gtk_widget_set_sensitive (self->fullname, FALSE);
diff --git a/src/gr-chef-tile.c b/src/gr-chef-tile.c
index de8fc02..c7bc688 100644
--- a/src/gr-chef-tile.c
+++ b/src/gr-chef-tile.c
@@ -26,6 +26,7 @@
 #include "gr-chef-tile.h"
 #include "gr-utils.h"
 #include "gr-window.h"
+#include "gr-image.h"
 
 
 struct _GrChefTile
@@ -36,6 +37,9 @@ struct _GrChefTile
 
         GtkWidget *label;
         GtkWidget *image;
+
+        GrImage *ri;
+        GCancellable *cancellable;
 };
 
 
@@ -46,7 +50,10 @@ chef_tile_finalize (GObject *object)
 {
         GrChefTile *tile = GR_CHEF_TILE (object);
 
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
         g_clear_object (&tile->chef);
+        g_clear_object (&tile->ri);
 
         G_OBJECT_CLASS (gr_chef_tile_parent_class)->finalize (object);
 }
@@ -76,6 +83,11 @@ void
 gr_chef_tile_set_chef (GrChefTile *tile,
                        GrChef     *chef)
 {
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
+
+        g_clear_object (&tile->ri);
+
         g_set_object (&tile->chef, chef);
 
         if (tile->chef) {
@@ -87,10 +99,11 @@ gr_chef_tile_set_chef (GrChefTile *tile,
 
                 path = gr_chef_get_image (chef);
                 if (path && path[0]) {
-                        g_autoptr(GdkPixbuf) pixbuf = NULL;
+                        tile->ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default 
())),
+                                                 path);
+                        tile->cancellable = g_cancellable_new ();
 
-                        pixbuf = load_pixbuf_fill_size (path, 64, 64);
-                        gtk_image_set_from_pixbuf (GTK_IMAGE (tile->image), pixbuf);
+                        gr_image_load (tile->ri, 64, 64, FALSE, tile->cancellable, gr_image_set_pixbuf, 
tile->image);
                 }
         }
 }
diff --git a/src/gr-cooking-view.c b/src/gr-cooking-view.c
index 15c5e0b..e6eb832 100644
--- a/src/gr-cooking-view.c
+++ b/src/gr-cooking-view.c
@@ -64,6 +64,8 @@ struct _GrCookingView
 #endif
 
         GList *timers;
+
+        GCancellable *cancellable;
 };
 
 typedef struct
@@ -240,6 +242,9 @@ gr_cooking_view_finalize (GObject *object)
 {
         GrCookingView *self = GR_COOKING_VIEW (object);
 
+        g_cancellable_cancel (self->cancellable);
+        g_clear_object (&self->cancellable);
+
         g_clear_pointer (&self->id, g_free);
         g_clear_pointer (&self->images, g_ptr_array_unref);
         g_clear_pointer (&self->instructions, g_free);
@@ -273,6 +278,14 @@ gr_cooking_view_init (GrCookingView *self)
 }
 
 static void
+set_pixbuf (GrImage   *ri,
+            GdkPixbuf *pixbuf,
+            gpointer   data)
+{
+        gtk_image_set_from_pixbuf (GTK_IMAGE (data), pixbuf);
+}
+
+static void
 setup_step (GrCookingView *view)
 {
         StepData *s;
@@ -280,6 +293,9 @@ setup_step (GrCookingView *view)
         if (!view->images)
                 return;
 
+        g_cancellable_cancel (view->cancellable);
+        g_clear_object (&view->cancellable);
+
         s = g_ptr_array_index (view->steps, view->step);
 
         if (s->heading && s->heading[0]) {
@@ -318,14 +334,18 @@ setup_step (GrCookingView *view)
                 GrImage *ri = NULL;
                 g_autoptr(GdkPixbuf) pixbuf = NULL;
 
+                view->cancellable = g_cancellable_new ();
+
                 gtk_widget_show (view->cooking_stack);
                 gtk_widget_set_halign (view->text_box, GTK_ALIGN_START);
                 ri = g_ptr_array_index (view->images, s->image);
-                if (view->wide)
-                        pixbuf = load_pixbuf_fill_size (gr_image_get_path (ri), 640, 480);
-                else
-                        pixbuf = load_pixbuf_fill_size (gr_image_get_path (ri), 320, 240);
-                gtk_image_set_from_pixbuf (GTK_IMAGE (view->cooking_image), pixbuf);
+                gr_image_load (ri,
+                               view->wide ? 640 : 320,
+                               view->wide ? 480 : 240,
+                               FALSE,
+                               view->cancellable,
+                               set_pixbuf,
+                               view->cooking_image);
                 gtk_stack_set_visible_child_name (GTK_STACK (view->cooking_stack), "image");
         }
         else {
diff --git a/src/gr-edit-page.c b/src/gr-edit-page.c
index 9f5b51e..0b47b79 100644
--- a/src/gr-edit-page.c
+++ b/src/gr-edit-page.c
@@ -138,6 +138,8 @@ struct _GrEditPage
 
         char *author;
         gboolean unsaved;
+
+        GCancellable *cancellable;
 };
 
 G_DEFINE_TYPE (GrEditPage, gr_edit_page, GTK_TYPE_BOX)
@@ -170,21 +172,26 @@ populate_image_flowbox (GrEditPage *page)
         GPtrArray *images;
         GtkWidget *button;
 
+        g_cancellable_cancel (page->cancellable);
+        g_clear_object (&page->cancellable);
+        page->cancellable = g_cancellable_new ();
+
         images = gr_image_viewer_get_images (GR_IMAGE_VIEWER (page->images));
 
         container_remove_all (GTK_CONTAINER (page->image_flowbox));
 
         for (i = 0; i < images->len; i++) {
                 GrImage *ri = g_ptr_array_index (images, i);
-                g_autoptr(GdkPixbuf) pb = load_pixbuf_fill_size (gr_image_get_path (ri), 60, 40);
                 GtkWidget *image;
                 GtkWidget *child;
 
-                image = gtk_image_new_from_pixbuf (pb);
+                image = gtk_image_new ();
                 gtk_widget_show (image);
                 gtk_container_add (GTK_CONTAINER (page->image_flowbox), image);
                 child = gtk_widget_get_parent (image);
                 g_object_set_data (G_OBJECT (child), "image-idx", GINT_TO_POINTER (i));
+
+                gr_image_load (ri, 60, 40, FALSE, page->cancellable, gr_image_set_pixbuf, image);
         }
 
         button = gtk_button_new ();
@@ -346,6 +353,9 @@ edit_page_finalize (GObject *object)
 {
         GrEditPage *self = GR_EDIT_PAGE (object);
 
+        g_cancellable_cancel (self->cancellable);
+        g_clear_object (&self->cancellable);
+
         if (self->index_handler_id)
                 g_signal_handler_disconnect (self->recipe, self->index_handler_id);
         g_clear_object (&self->recipe);
diff --git a/src/gr-image-page.c b/src/gr-image-page.c
index 94f28d8..84c285e 100644
--- a/src/gr-image-page.c
+++ b/src/gr-image-page.c
@@ -42,6 +42,7 @@ struct _GrImagePage
         int index;
 
         guint hide_timeout;
+        GCancellable *cancellable;
 };
 
 
@@ -74,6 +75,9 @@ gr_image_page_finalize (GObject *object)
 {
         GrImagePage *page = GR_IMAGE_PAGE (object);
 
+        g_cancellable_cancel (page->cancellable);
+        g_clear_object (&page->cancellable);
+
         remove_hide_timeout (page);
         g_clear_pointer (&page->images, g_ptr_array_unref);
 
@@ -91,14 +95,20 @@ set_current_image (GrImagePage *page)
                 GdkMonitor *monitor;
                 GdkRectangle geom;
 
+                g_cancellable_cancel (page->cancellable);
+                g_clear_object (&page->cancellable);
+                page->cancellable = g_cancellable_new ();
+
                 display = gtk_widget_get_display (GTK_WIDGET (page));
                 win = gtk_widget_get_window (gtk_widget_get_toplevel (GTK_WIDGET (page)));
                 monitor = gdk_display_get_monitor_at_window (display, win);
                 gdk_monitor_get_geometry (monitor, &geom);
 
                 ri = g_ptr_array_index (page->images, page->index);
-                pixbuf = load_pixbuf_fit_size (gr_image_get_path (ri), geom.width - 80, geom.height - 80, 
FALSE);
-                gtk_image_set_from_pixbuf (GTK_IMAGE (page->image), pixbuf);
+                gr_image_load (ri,
+                               geom.width - 80, geom.height - 80, TRUE,
+                               page->cancellable,
+                               gr_image_set_pixbuf, page->image);
         }
 }
 
diff --git a/src/gr-image-viewer.c b/src/gr-image-viewer.c
index e09fe47..4722e68 100644
--- a/src/gr-image-viewer.c
+++ b/src/gr-image-viewer.c
@@ -79,6 +79,9 @@ struct _GrImageViewer
         guint hide_timeout;
 
         GtkGesture *gesture;
+
+        GCancellable *cancellable;
+        GCancellable *preview_cancellable;
 };
 
 
@@ -113,6 +116,12 @@ gr_image_viewer_finalize (GObject *object)
 {
         GrImageViewer *viewer = GR_IMAGE_VIEWER (object);
 
+        g_cancellable_cancel (viewer->cancellable);
+        g_clear_object (&viewer->cancellable);
+
+        g_cancellable_cancel (viewer->preview_cancellable);
+        g_clear_object (&viewer->preview_cancellable);
+
         gr_image_viewer_revert_changes (viewer);
 
         g_clear_pointer (&viewer->additions, g_ptr_array_unref);
@@ -130,6 +139,9 @@ set_current_image (GrImageViewer *viewer)
 {
         GtkFlowBoxChild *child;
 
+        g_cancellable_cancel (viewer->cancellable);
+        g_clear_object (&viewer->cancellable);
+
         if (viewer->index >= viewer->images->len) {
                 gtk_stack_set_visible_child_name (GTK_STACK (viewer->stack), "placeholder");
                 return;
@@ -140,16 +152,17 @@ set_current_image (GrImageViewer *viewer)
                 g_autoptr(GdkPixbuf) pixbuf = NULL;
                 const char *vis;
 
+                viewer->cancellable = g_cancellable_new ();
+
                 ri = g_ptr_array_index (viewer->images, viewer->index);
-                pixbuf = load_pixbuf_fill_size (gr_image_get_path (ri), 360, 240);
 
                 vis = gtk_stack_get_visible_child_name (GTK_STACK (viewer->stack));
                 if (strcmp (vis, "image1") == 0) {
-                        gtk_image_set_from_pixbuf (GTK_IMAGE (viewer->image2), pixbuf);
+                        gr_image_load (ri, 360, 240, FALSE, viewer->cancellable, gr_image_set_pixbuf, 
viewer->image2);
                         gtk_stack_set_visible_child_name (GTK_STACK (viewer->stack), "image2");
                 }
                 else {
-                        gtk_image_set_from_pixbuf (GTK_IMAGE (viewer->image1), pixbuf);
+                        gr_image_load (ri, 360, 240, FALSE, viewer->cancellable, gr_image_set_pixbuf, 
viewer->image1);
                         gtk_stack_set_visible_child_name (GTK_STACK (viewer->stack), "image1");
                 }
         }
@@ -166,16 +179,21 @@ populate_preview (GrImageViewer *viewer)
 {
         int i;
 
+        g_cancellable_cancel (viewer->preview_cancellable);
+        g_clear_object (&viewer->preview_cancellable);
+        viewer->preview_cancellable = g_cancellable_new ();
+
         container_remove_all (GTK_CONTAINER (viewer->preview_list));
 
         for (i = 0; i < viewer->images->len; i++) {
                 GrImage *ri = g_ptr_array_index (viewer->images, i);
-                g_autoptr(GdkPixbuf) pb = load_pixbuf_fill_size (gr_image_get_path (ri), 60, 40);
                 GtkWidget *image;
 
-                image = gtk_image_new_from_pixbuf (pb);
+                image = gtk_image_new ();
                 gtk_widget_show (image);
                 gtk_container_add (GTK_CONTAINER (viewer->preview_list), image);
+
+                gr_image_load (ri, 60, 40, FALSE, viewer->preview_cancellable, gr_image_set_pixbuf, image);
         }
 }
 
@@ -386,7 +404,7 @@ image_received (GtkClipboard *clipboard,
                         return;
                 }
 
-                ri = gr_image_new (path);
+                ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default ())), path);
                 add_image (viewer, ri, TRUE);
         }
 }
@@ -579,7 +597,7 @@ file_chooser_response (GtkNativeDialog *self,
                         g_autofree char *path = NULL;
 
                         path = import_image (l->data);
-                        ri = gr_image_new (path);
+                        ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default ())), 
path);
                         add_image (viewer, ri, TRUE);
 
                         g_ptr_array_add (viewer->additions, g_strdup (path));
diff --git a/src/gr-recipe-importer.c b/src/gr-recipe-importer.c
index af3a0b1..a79066d 100644
--- a/src/gr-recipe-importer.c
+++ b/src/gr-recipe-importer.c
@@ -28,6 +28,7 @@
 #endif
 
 #include "gr-recipe-importer.h"
+#include "gr-app.h"
 #include "gr-image.h"
 #include "gr-chef.h"
 #include "gr-recipe.h"
@@ -300,7 +301,8 @@ import_recipe (GrRecipeImporter *importer)
                                 return FALSE;
                         }
 
-                        ri = gr_image_new (new_path);
+                        ri = gr_image_new (gr_app_get_soup_session (GR_APP (g_application_get_default ())), 
new_path);
+
                         g_ptr_array_add (images, ri);
                 }
         }
diff --git a/src/gr-recipe-printer.c b/src/gr-recipe-printer.c
index 253ded1..bc9a834 100644
--- a/src/gr-recipe-printer.c
+++ b/src/gr-recipe-printer.c
@@ -131,7 +131,7 @@ begin_print (GtkPrintOperation *operation,
         if (images && images->len > 0) {
                 int def_index = gr_recipe_get_default_image (printer->recipe);
                 GrImage *ri = g_ptr_array_index (images, def_index);
-                printer->image = load_pixbuf_fit_size (gr_image_get_path (ri), width / 2, height / 4, FALSE);
+                printer->image = gr_image_load_sync (ri, width / 2, height / 4, TRUE);
         }
 
         title_font = pango_font_description_from_string ("Cantarell Bold 18");
diff --git a/src/gr-recipe-small-tile.c b/src/gr-recipe-small-tile.c
index 4d5968c..127d2e7 100644
--- a/src/gr-recipe-small-tile.c
+++ b/src/gr-recipe-small-tile.c
@@ -46,6 +46,8 @@ struct _GrRecipeSmallTile
         GtkWidget *serves_spin;
         GtkWidget *remove_button;
 
+        GCancellable *cancellable;
+
         int serves;
 };
 
@@ -83,6 +85,9 @@ recipe_small_tile_set_recipe (GrRecipeSmallTile *tile,
 
         store = gr_recipe_store_get ();
 
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
+
         g_set_object (&tile->recipe, recipe);
 
         if (tile->recipe) {
@@ -104,15 +109,15 @@ recipe_small_tile_set_recipe (GrRecipeSmallTile *tile,
                 if (images->len > 0) {
                         int index;
                         GrImage *ri;
-                        g_autoptr(GdkPixbuf) pixbuf = NULL;
+
+                        tile->cancellable = g_cancellable_new ();
 
                         index = gr_recipe_get_default_image (recipe);
                         if (index < 0 || index >= images->len)
                                 index = 0;
 
                         ri = g_ptr_array_index (images, index);
-                        pixbuf = load_pixbuf_fill_size (gr_image_get_path (ri), 64, 64);
-                        gtk_image_set_from_pixbuf (GTK_IMAGE (tile->image), pixbuf);
+                        gr_image_load (ri, 64, 64, FALSE, tile->cancellable, gr_image_set_pixbuf, 
tile->image);
                 }
 
         }
@@ -148,6 +153,8 @@ recipe_small_tile_finalize (GObject *object)
 {
         GrRecipeSmallTile *tile = GR_RECIPE_SMALL_TILE (object);
 
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
         g_clear_object (&tile->recipe);
 
         G_OBJECT_CLASS (gr_recipe_small_tile_parent_class)->finalize (object);
diff --git a/src/gr-recipe-store.c b/src/gr-recipe-store.c
index 46ad805..098f2fb 100644
--- a/src/gr-recipe-store.c
+++ b/src/gr-recipe-store.c
@@ -360,7 +360,8 @@ load_recipes (GrRecipeStore *self,
                 if (paths) {
                         for (j = 0; paths[j]; j++) {
                                 GrImage *ri;
-                                ri = gr_image_new (paths[j]);
+                                ri = gr_image_new (gr_app_get_soup_session (GR_APP 
(g_application_get_default ())), paths[j]);
+
                                 g_ptr_array_add (images, ri);
                         }
                 }
diff --git a/src/gr-recipe-tile.c b/src/gr-recipe-tile.c
index d142072..72875c8 100644
--- a/src/gr-recipe-tile.c
+++ b/src/gr-recipe-tile.c
@@ -43,6 +43,8 @@ struct _GrRecipeTile
         GtkWidget *author;
         GtkWidget *image;
         GtkWidget *box;
+
+        GCancellable *cancellable;
 };
 
 G_DEFINE_TYPE (GrRecipeTile, gr_recipe_tile, GTK_TYPE_BUTTON)
@@ -64,6 +66,9 @@ recipe_tile_set_recipe (GrRecipeTile *tile,
 
         store = gr_recipe_store_get ();
 
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
+
         g_set_object (&tile->recipe, recipe);
 
         if (tile->recipe) {
@@ -85,20 +90,20 @@ recipe_tile_set_recipe (GrRecipeTile *tile,
                 if (images->len > 0) {
                         int index;
                         GrImage *ri;
-                        g_autoptr(GdkPixbuf) pixbuf = NULL;
-                        int width;
-                        int height;
 
-                        width = tile->wide ? 538 : 258;
-                        height = 200;
+                        tile->cancellable = g_cancellable_new ();
 
                         index = gr_recipe_get_default_image (recipe);
                         if (index < 0 || index >= images->len)
                                 index = 0;
 
                         ri = g_ptr_array_index (images, index);
-                        pixbuf = load_pixbuf_fill_size (gr_image_get_path (ri), width, height);
-                        gtk_image_set_from_pixbuf (GTK_IMAGE (tile->image), pixbuf);
+
+                        gr_image_load (ri,
+                                       tile->wide ? 538 : 258, 200, FALSE,
+                                       tile->cancellable,
+                                       gr_image_set_pixbuf,
+                                       tile->image);
                 }
         }
 }
@@ -108,6 +113,8 @@ recipe_tile_finalize (GObject *object)
 {
         GrRecipeTile *tile = GR_RECIPE_TILE (object);
 
+        g_cancellable_cancel (tile->cancellable);
+        g_clear_object (&tile->cancellable);
         g_clear_object (&tile->recipe);
 
         G_OBJECT_CLASS (gr_recipe_tile_parent_class)->finalize (object);
diff --git a/src/gr-shell-search-provider.c b/src/gr-shell-search-provider.c
index bb05394..f19a19a 100644
--- a/src/gr-shell-search-provider.c
+++ b/src/gr-shell-search-provider.c
@@ -171,8 +171,8 @@ gr_recipe_get_pixbuf (GrRecipe *recipe)
         images = gr_recipe_get_images (recipe);
         if (images->len > 0) {
                 int index = gr_recipe_get_default_image (recipe);
-                GrImage *ri = &g_array_index (images, GrImage, index);
-                return load_pixbuf_fill_size (gr_image_get_path (ri), 64, 64);
+                GrImage *ri = g_ptr_array_index (images, index);
+                return gr_image_load_sync (ri, 64, 64, FALSE);
         }
 
         return NULL;


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