diff --git a/ChangeLog b/ChangeLog index 55af63d138..ec33e342d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-03-24 Sven Neumann + + * libgimpthumb/gimpthumbnail.c: don't reset the mime-type info + when we can't load a thumbnail. + + * app/core/gimpimagefile.c (gimp_imagefile_get_new_pixbuf): don't + set a stock-id depending on the state. + + * app/widgets/gimpviewrendererimagefile.[ch]: removed commented + out hack that used to access semi-private API from GtkFilesystem. + Instead lifted some code from GtkRecentManager that looks up icons + by mime-type. + 2008-03-24 Michael Natterer Renamed folders in plug-ins/. Unfortunately it's impossible to diff --git a/app/core/gimpimagefile.c b/app/core/gimpimagefile.c index 011598951a..5a64e8dea3 100644 --- a/app/core/gimpimagefile.c +++ b/app/core/gimpimagefile.c @@ -417,8 +417,6 @@ gimp_imagefile_name_changed (GimpObject *object) if (GIMP_OBJECT_CLASS (parent_class)->name_changed) GIMP_OBJECT_CLASS (parent_class)->name_changed (object); - gimp_viewable_set_stock_id (GIMP_VIEWABLE (imagefile), NULL); - gimp_thumbnail_set_uri (imagefile->thumbnail, gimp_object_get_name (object)); } @@ -454,39 +452,11 @@ gimp_imagefile_get_new_pixbuf (GimpViewable *viewable, gint height) { GimpImagefile *imagefile = GIMP_IMAGEFILE (viewable); - GdkPixbuf *pixbuf; - const gchar *stock_id = NULL; - if (! GIMP_OBJECT (imagefile)->name) + if (! gimp_object_get_name (GIMP_OBJECT (imagefile))) return NULL; - pixbuf = gimp_imagefile_load_thumb (imagefile, width, height); - - switch (imagefile->thumbnail->image_state) - { - case GIMP_THUMB_STATE_REMOTE: - stock_id = "gtk-network"; - break; - - case GIMP_THUMB_STATE_FOLDER: - stock_id = "gtk-directory"; - break; - - case GIMP_THUMB_STATE_SPECIAL: - stock_id = "gtk-harddisk"; - break; - - case GIMP_THUMB_STATE_NOT_FOUND: - stock_id = "gtk-dialog-question"; - break; - - default: - break; - } - - gimp_viewable_set_stock_id (GIMP_VIEWABLE (imagefile), stock_id); - - return pixbuf; + return gimp_imagefile_load_thumb (imagefile, width, height); } static gchar * diff --git a/app/widgets/gimpviewrendererimagefile.c b/app/widgets/gimpviewrendererimagefile.c index 103598f9e9..754ff6d3b6 100644 --- a/app/widgets/gimpviewrendererimagefile.c +++ b/app/widgets/gimpviewrendererimagefile.c @@ -35,14 +35,12 @@ #include "gimpviewrendererimagefile.h" #include "gimpviewrenderer-frame.h" -#ifdef ENABLE_FILE_SYSTEM_ICONS -#define GTK_FILE_SYSTEM_ENABLE_UNSUPPORTED -#include -#endif +static void gimp_view_renderer_imagefile_render (GimpViewRenderer *renderer, + GtkWidget *widget); -static void gimp_view_renderer_imagefile_render (GimpViewRenderer *renderer, - GtkWidget *widget); +static GdkPixbuf * gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile, + gint size); G_DEFINE_TYPE (GimpViewRendererImagefile, gimp_view_renderer_imagefile, @@ -62,9 +60,6 @@ gimp_view_renderer_imagefile_class_init (GimpViewRendererImagefileClass *klass) static void gimp_view_renderer_imagefile_init (GimpViewRendererImagefile *renderer) { -#ifdef ENABLE_FILE_SYSTEM_ICONS - renderer->file_system = NULL; -#endif } static void @@ -75,30 +70,14 @@ gimp_view_renderer_imagefile_render (GimpViewRenderer *renderer, renderer->width, renderer->height); -#ifdef ENABLE_FILE_SYSTEM_ICONS - if (! pixbuf && - GIMP_VIEW_RENDERER_IMAGEFILE (renderer)->file_system) + if (! pixbuf) { - const gchar *uri; + GimpImagefile *imagefile = GIMP_IMAGEFILE (renderer->viewable); - uri = gimp_object_get_name (GIMP_OBJECT (renderer->viewable)); - if (uri) - { - GtkFileSystem *file_system; - GtkFilePath *path; - - file_system = GIMP_VIEW_RENDERER_IMAGEFILE (renderer)->file_system; - - path = gtk_file_system_uri_to_path (file_system, uri); - - pixbuf = gtk_file_system_render_icon (file_system, path, widget, - MIN (renderer->width, - renderer->height), - NULL); - gtk_file_path_free (path); - } + pixbuf = gimp_view_renderer_imagefile_get_icon (imagefile, + MIN (renderer->width, + renderer->height)); } -#endif /* ENABLE_FILE_SYSTEM_ICONS */ if (pixbuf) { @@ -112,3 +91,102 @@ gimp_view_renderer_imagefile_render (GimpViewRenderer *renderer, gimp_view_renderer_default_render_stock (renderer, widget, stock_id); } } + + +/* The code to get an icon for a mime-type is lifted from GtkRecentManager. */ + +static GdkPixbuf * +get_icon_for_mime_type (const char *mime_type, + gint pixel_size) +{ + GtkIconTheme *icon_theme; + const gchar *separator; + GString *icon_name; + GdkPixbuf *pixbuf; + + separator = strchr (mime_type, '/'); + if (! separator) + return NULL; + + icon_theme = gtk_icon_theme_get_default (); + + /* try with the three icon name variants for MIME types */ + + /* canonicalize MIME type: foo/x-bar -> foo-x-bar */ + icon_name = g_string_new (NULL); + g_string_append_len (icon_name, mime_type, separator - mime_type); + g_string_append_c (icon_name, '-'); + g_string_append (icon_name, separator + 1); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); + g_string_free (icon_name, TRUE); + if (pixbuf) + return pixbuf; + + /* canonicalize MIME type, and prepend "gnome-mime-" */ + icon_name = g_string_new ("gnome-mime-"); + g_string_append_len (icon_name, mime_type, separator - mime_type); + g_string_append_c (icon_name, '-'); + g_string_append (icon_name, separator + 1); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); + g_string_free (icon_name, TRUE); + if (pixbuf) + return pixbuf; + + /* try the MIME family icon */ + icon_name = g_string_new ("gnome-mime-"); + g_string_append_len (icon_name, mime_type, separator - mime_type); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); + g_string_free (icon_name, TRUE); + + return pixbuf; +} + +static GdkPixbuf * +get_icon_fallback (const gchar *icon_name, + gint size) +{ + return gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), icon_name, + size, + GTK_ICON_LOOKUP_USE_BUILTIN, + NULL); +} + +static GdkPixbuf * +gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile, + gint size) +{ + GdkPixbuf *retval = NULL; + + if (! gimp_object_get_name (GIMP_OBJECT (imagefile))) + return NULL; + + if (imagefile->thumbnail->image_mimetype) + { + retval = get_icon_for_mime_type (imagefile->thumbnail->image_mimetype, + size); + } + + if (! retval) + { + const gchar *icon_name = GTK_STOCK_FILE; + + if (imagefile->thumbnail->image_state == GIMP_THUMB_STATE_FOLDER) + icon_name = GTK_STOCK_DIRECTORY; + + retval = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + icon_name, size, + GTK_ICON_LOOKUP_USE_BUILTIN, + NULL); + } + + return retval; +} diff --git a/app/widgets/gimpviewrendererimagefile.h b/app/widgets/gimpviewrendererimagefile.h index 9336a88156..ee21fedd29 100644 --- a/app/widgets/gimpviewrendererimagefile.h +++ b/app/widgets/gimpviewrendererimagefile.h @@ -25,8 +25,6 @@ #include "gimpviewrenderer.h" -/* #define ENABLE_FILE_SYSTEM_ICONS 1 */ - #define GIMP_TYPE_VIEW_RENDERER_IMAGEFILE (gimp_view_renderer_imagefile_get_type ()) #define GIMP_VIEW_RENDERER_IMAGEFILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_VIEW_RENDERER_IMAGEFILE, GimpViewRendererImagefile)) @@ -41,10 +39,6 @@ typedef struct _GimpViewRendererImagefileClass GimpViewRendererImagefileClass; struct _GimpViewRendererImagefile { GimpViewRenderer parent_instance; - -#ifdef ENABLE_FILE_SYSTEM_ICONS - gpointer file_system; -#endif }; struct _GimpViewRendererImagefileClass