Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Re #142: Load all images from Tweet
Browse files Browse the repository at this point in the history
Rather than wait until we display each one, start async
loading all images when the media dialog gets created
so that they're ready when the user clicks "Next"
  • Loading branch information
IBBoard committed Aug 27, 2020
1 parent 46b1638 commit b3fe517
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/CbMediaImageWidget.c
Expand Up @@ -103,7 +103,10 @@ cb_media_image_widget_init (CbMediaImageWidget *self)
}

void
hires_complete (GObject *source_object, GAsyncResult *res, gpointer user_data) {
hires_progress (CbMedia *_media, gpointer user_data) {
if (!_media->loaded_hires) {
return;
}
LoadingData *data = user_data;
CbMediaImageWidget *self = CB_MEDIA_IMAGE_WIDGET(data->widget);
CbMedia *media = data->media;
Expand Down Expand Up @@ -138,17 +141,21 @@ cb_media_image_widget_new (CbMedia *media, GdkRectangle *max_dimensions)
double scale_height = media->height * 1.0 / media->thumb_height;

if (scale_width != 1 || scale_height != 1) {
data = g_new0 (LoadingData, 1);
data->widget = g_object_ref (self);
data->media = g_object_ref (media);
g_signal_connect(media, "hires-progress", G_CALLBACK(hires_progress), data);
self->image_surface = cairo_image_surface_create(cairo_image_surface_get_format(media->surface), media->width, media->height);
cairo_t *ct = cairo_create(self->image_surface);
cairo_scale(ct, scale_width, scale_height);
cairo_set_source_surface (ct, media->surface, 0, 0);
cairo_paint(ct);
cairo_destroy(ct);
gtk_image_set_from_surface (GTK_IMAGE (self->image), self->image_surface);
data = g_new0 (LoadingData, 1);
data->widget = g_object_ref (self);
data->media = g_object_ref (media);
cb_media_downloader_load_hires_async (cb_media_downloader_get_default(), media, hires_complete, data);
if (!media->loading) {
// NULL callback because we should pick it up from the earlier g_signal_connect
cb_media_downloader_load_hires_async (cb_media_downloader_get_default(), media, NULL, NULL);
}
}
else {
gtk_image_set_from_surface (GTK_IMAGE (self->image), media->surface);
Expand Down
6 changes: 6 additions & 0 deletions src/window/MediaDialog.vala
Expand Up @@ -32,6 +32,12 @@ class MediaDialog : Gtk.Window {
int start_media_index,
Gdk.Rectangle max_dimensions) {
this.media = media;
var downloader = Cb.MediaDownloader.get_default();
foreach (Cb.Media m in media){
if (!m.loaded_hires && !m.loading_hires) {
downloader.load_hires_async.begin (m);
}
}
Cb.Media cur_media = media[start_media_index];
this.cur_index = start_media_index;
this.max_dimensions = max_dimensions;
Expand Down
1 change: 1 addition & 0 deletions vapi/cawbird-internal.vapi
Expand Up @@ -96,6 +96,7 @@ namespace Cb {
public class MediaDownloader : GLib.Object {
public static unowned MediaDownloader get_default ();
public async void load_async (Media media);
public async void load_hires_async (Media media);
public void disable ();
public void shutdown ();
}
Expand Down

0 comments on commit b3fe517

Please sign in to comment.