app: add gimp_imagegile_get_gicon() which uses async API and can't block

and use it in gimp_view_renderer_imagefile_get_icon().
This commit is contained in:
Michael Natterer 2011-06-19 23:06:33 +02:00
parent 276ceddec9
commit ab607a0adc
3 changed files with 100 additions and 28 deletions

View File

@ -63,6 +63,8 @@ struct _GimpImagefilePrivate
Gimp *gimp; Gimp *gimp;
GimpThumbnail *thumbnail; GimpThumbnail *thumbnail;
GIcon *icon;
GCancellable *icon_cancellable;
gchar *description; gchar *description;
gboolean static_desc; gboolean static_desc;
@ -73,6 +75,7 @@ struct _GimpImagefilePrivate
GimpImagefilePrivate) GimpImagefilePrivate)
static void gimp_imagefile_dispose (GObject *object);
static void gimp_imagefile_finalize (GObject *object); static void gimp_imagefile_finalize (GObject *object);
static void gimp_imagefile_name_changed (GimpObject *object); static void gimp_imagefile_name_changed (GimpObject *object);
@ -97,6 +100,10 @@ static gboolean gimp_imagefile_save_thumb (GimpImagefile *imagefile,
static gchar * gimp_imagefile_get_description (GimpViewable *viewable, static gchar * gimp_imagefile_get_description (GimpViewable *viewable,
gchar **tooltip); gchar **tooltip);
static void gimp_imagefile_icon_callback (GObject *source_object,
GAsyncResult *result,
gpointer data);
static void gimp_thumbnail_set_info_from_image (GimpThumbnail *thumbnail, static void gimp_thumbnail_set_info_from_image (GimpThumbnail *thumbnail,
const gchar *mime_type, const gchar *mime_type,
GimpImage *image); GimpImage *image);
@ -132,6 +139,7 @@ gimp_imagefile_class_init (GimpImagefileClass *klass)
gimp_marshal_VOID__VOID, gimp_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
object_class->dispose = gimp_imagefile_dispose;
object_class->finalize = gimp_imagefile_finalize; object_class->finalize = gimp_imagefile_finalize;
gimp_object_class->name_changed = gimp_imagefile_name_changed; gimp_object_class->name_changed = gimp_imagefile_name_changed;
@ -164,6 +172,21 @@ gimp_imagefile_init (GimpImagefile *imagefile)
imagefile, G_CONNECT_SWAPPED); imagefile, G_CONNECT_SWAPPED);
} }
static void
gimp_imagefile_dispose (GObject *object)
{
GimpImagefilePrivate *private = GET_PRIVATE (object);
if (private->icon_cancellable)
{
g_cancellable_cancel (private->icon_cancellable);
g_object_unref (private->icon_cancellable);
private->icon_cancellable = NULL;
}
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void static void
gimp_imagefile_finalize (GObject *object) gimp_imagefile_finalize (GObject *object)
{ {
@ -183,6 +206,12 @@ gimp_imagefile_finalize (GObject *object)
private->thumbnail = NULL; private->thumbnail = NULL;
} }
if (private->icon)
{
g_object_unref (private->icon);
private->icon = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }
@ -212,6 +241,39 @@ gimp_imagefile_get_thumbnail (GimpImagefile *imagefile)
return GET_PRIVATE (imagefile)->thumbnail; return GET_PRIVATE (imagefile)->thumbnail;
} }
GIcon *
gimp_imagefile_get_gicon (GimpImagefile *imagefile)
{
GimpImagefilePrivate *private;
g_return_val_if_fail (GIMP_IS_IMAGEFILE (imagefile), NULL);
private = GET_PRIVATE (imagefile);
if (private->icon)
return private->icon;
if (! private->icon_cancellable)
{
GFile *file;
file = g_file_new_for_uri (gimp_object_get_name (imagefile));
private->icon_cancellable = g_cancellable_new ();
g_file_query_info_async (file, "standard::icon",
G_FILE_QUERY_INFO_NONE,
G_PRIORITY_DEFAULT,
private->icon_cancellable,
gimp_imagefile_icon_callback,
imagefile);
g_object_unref (file);
}
return NULL;
}
void void
gimp_imagefile_set_mime_type (GimpImagefile *imagefile, gimp_imagefile_set_mime_type (GimpImagefile *imagefile,
const gchar *mime_type) const gchar *mime_type)
@ -559,6 +621,37 @@ gimp_imagefile_get_description (GimpViewable *viewable,
return basename; return basename;
} }
static void
gimp_imagefile_icon_callback (GObject *source_object,
GAsyncResult *result,
gpointer data)
{
GimpImagefile *imagefile = GIMP_IMAGEFILE (data);
GimpImagefilePrivate *private = GET_PRIVATE (imagefile);
GFile *file = G_FILE (source_object);
GError *error = NULL;
GFileInfo *file_info;
file_info = g_file_query_info_finish (file, result, &error);
if (file_info)
{
private->icon = g_object_ref (g_file_info_get_icon (file_info));
g_object_unref (file_info);
}
g_clear_error (&error);
if (private->icon_cancellable)
{
g_object_unref (private->icon_cancellable);
private->icon_cancellable = NULL;
}
if (private->icon)
gimp_viewable_invalidate_preview (GIMP_VIEWABLE (imagefile));
}
const gchar * const gchar *
gimp_imagefile_get_desc_string (GimpImagefile *imagefile) gimp_imagefile_get_desc_string (GimpImagefile *imagefile)
{ {

View File

@ -59,6 +59,7 @@ GimpImagefile * gimp_imagefile_new (Gimp *gimp,
const gchar *uri); const gchar *uri);
GimpThumbnail * gimp_imagefile_get_thumbnail (GimpImagefile *imagefile); GimpThumbnail * gimp_imagefile_get_thumbnail (GimpImagefile *imagefile);
GIcon * gimp_imagefile_get_gicon (GimpImagefile *imagefile);
void gimp_imagefile_set_mime_type (GimpImagefile *imagefile, void gimp_imagefile_set_mime_type (GimpImagefile *imagefile,
const gchar *mime_type); const gchar *mime_type);

View File

@ -164,18 +164,9 @@ gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile,
if (! gimp_object_get_name (imagefile)) if (! gimp_object_get_name (imagefile))
return NULL; return NULL;
#if 0
if (! pixbuf) if (! pixbuf)
{ {
GFile *file; GIcon *icon = gimp_imagefile_get_gicon (imagefile);
GFileInfo *file_info;
file = g_file_new_for_uri (gimp_object_get_name (imagefile));
file_info = g_file_query_info (file, "standard::icon", 0, NULL, NULL);
if (file_info)
{
GIcon *icon = g_file_info_get_icon (file_info);
if (icon) if (icon)
{ {
@ -186,21 +177,8 @@ gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile,
if (info) if (info)
pixbuf = gtk_icon_info_load_icon (info, NULL); pixbuf = gtk_icon_info_load_icon (info, NULL);
} }
else
{
#ifdef GIMP_UNSTABLE
g_printerr ("no icon for: %s\n",
gimp_object_get_name (imagefile));
#endif
} }
g_object_unref (file_info);
}
g_object_unref (file);
}
#endif
if (! pixbuf && thumbnail->image_mimetype) if (! pixbuf && thumbnail->image_mimetype)
{ {
pixbuf = get_icon_for_mime_type (thumbnail->image_mimetype, pixbuf = get_icon_for_mime_type (thumbnail->image_mimetype,