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;
GimpThumbnail *thumbnail;
GIcon *icon;
GCancellable *icon_cancellable;
gchar *description;
gboolean static_desc;
@ -73,6 +75,7 @@ struct _GimpImagefilePrivate
GimpImagefilePrivate)
static void gimp_imagefile_dispose (GObject *object);
static void gimp_imagefile_finalize (GObject *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,
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,
const gchar *mime_type,
GimpImage *image);
@ -132,6 +139,7 @@ gimp_imagefile_class_init (GimpImagefileClass *klass)
gimp_marshal_VOID__VOID,
G_TYPE_NONE, 0);
object_class->dispose = gimp_imagefile_dispose;
object_class->finalize = gimp_imagefile_finalize;
gimp_object_class->name_changed = gimp_imagefile_name_changed;
@ -164,6 +172,21 @@ gimp_imagefile_init (GimpImagefile *imagefile)
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
gimp_imagefile_finalize (GObject *object)
{
@ -183,6 +206,12 @@ gimp_imagefile_finalize (GObject *object)
private->thumbnail = NULL;
}
if (private->icon)
{
g_object_unref (private->icon);
private->icon = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -212,6 +241,39 @@ gimp_imagefile_get_thumbnail (GimpImagefile *imagefile)
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
gimp_imagefile_set_mime_type (GimpImagefile *imagefile,
const gchar *mime_type)
@ -559,6 +621,37 @@ gimp_imagefile_get_description (GimpViewable *viewable,
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 *
gimp_imagefile_get_desc_string (GimpImagefile *imagefile)
{

View File

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

View File

@ -164,42 +164,20 @@ gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile,
if (! gimp_object_get_name (imagefile))
return NULL;
#if 0
if (! pixbuf)
{
GFile *file;
GFileInfo *file_info;
GIcon *icon = gimp_imagefile_get_gicon (imagefile);
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)
if (icon)
{
GIcon *icon = g_file_info_get_icon (file_info);
GtkIconInfo *info;
if (icon)
{
GtkIconInfo *info;
info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, size, 0);
info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, size, 0);
if (info)
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);
if (info)
pixbuf = gtk_icon_info_load_icon (info, NULL);
}
g_object_unref (file);
}
#endif
if (! pixbuf && thumbnail->image_mimetype)
{