mirror of https://github.com/GNOME/gimp.git
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:
parent
276ceddec9
commit
ab607a0adc
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -164,18 +164,9 @@ 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;
|
||||
|
||||
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);
|
||||
GIcon *icon = gimp_imagefile_get_gicon (imagefile);
|
||||
|
||||
if (icon)
|
||||
{
|
||||
|
@ -186,21 +177,8 @@ gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile,
|
|||
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);
|
||||
}
|
||||
|
||||
g_object_unref (file);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (! pixbuf && thumbnail->image_mimetype)
|
||||
{
|
||||
pixbuf = get_icon_for_mime_type (thumbnail->image_mimetype,
|
||||
|
|
Loading…
Reference in New Issue