From 7a08ab25a676c665455d5f4c3a74872aa5be31d4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 7 Nov 2004 05:42:01 +0000 Subject: New convenience function to add a filter for image files which can be 2004-11-07 Matthias Clasen * gtk/gtkfilefilter.h: * gtk/gtkfilefilter.c (gtk_file_filter_add_pixbuf_formats): New convenience function to add a filter for image files which can be loaded by GdkPixbuf. (#145388, Anders Carlsson) * tests/testfilechooser.c: Test the image filter. --- ChangeLog | 7 +++++ ChangeLog.pre-2-10 | 7 +++++ ChangeLog.pre-2-6 | 7 +++++ ChangeLog.pre-2-8 | 7 +++++ docs/reference/ChangeLog | 4 +++ docs/reference/gtk/gtk-sections.txt | 1 + gtk/gtkfilefilter.c | 53 +++++++++++++++++++++++++++++++++++++ gtk/gtkfilefilter.h | 19 ++++++------- tests/testfilechooser.c | 21 ++++++++++++++- 9 files changed, 116 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b3868756..193db9100 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2004-11-07 Matthias Clasen + * gtk/gtkfilefilter.h: + * gtk/gtkfilefilter.c (gtk_file_filter_add_pixbuf_formats): + New convenience function to add a filter for image files + which can be loaded by GdkPixbuf. (#145388, Anders Carlsson) + + * tests/testfilechooser.c: Test the image filter. + * gtk/gtkmenu.c (menu_change_screen): Remove some warnings. Show files in folder modes. (#157013, Nickolay V. Shmyrev) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0b3868756..193db9100 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,12 @@ 2004-11-07 Matthias Clasen + * gtk/gtkfilefilter.h: + * gtk/gtkfilefilter.c (gtk_file_filter_add_pixbuf_formats): + New convenience function to add a filter for image files + which can be loaded by GdkPixbuf. (#145388, Anders Carlsson) + + * tests/testfilechooser.c: Test the image filter. + * gtk/gtkmenu.c (menu_change_screen): Remove some warnings. Show files in folder modes. (#157013, Nickolay V. Shmyrev) diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 0b3868756..193db9100 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,5 +1,12 @@ 2004-11-07 Matthias Clasen + * gtk/gtkfilefilter.h: + * gtk/gtkfilefilter.c (gtk_file_filter_add_pixbuf_formats): + New convenience function to add a filter for image files + which can be loaded by GdkPixbuf. (#145388, Anders Carlsson) + + * tests/testfilechooser.c: Test the image filter. + * gtk/gtkmenu.c (menu_change_screen): Remove some warnings. Show files in folder modes. (#157013, Nickolay V. Shmyrev) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 0b3868756..193db9100 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,12 @@ 2004-11-07 Matthias Clasen + * gtk/gtkfilefilter.h: + * gtk/gtkfilefilter.c (gtk_file_filter_add_pixbuf_formats): + New convenience function to add a filter for image files + which can be loaded by GdkPixbuf. (#145388, Anders Carlsson) + + * tests/testfilechooser.c: Test the image filter. + * gtk/gtkmenu.c (menu_change_screen): Remove some warnings. Show files in folder modes. (#157013, Nickolay V. Shmyrev) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 9c573ffea..e3458eaae 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2004-11-07 Matthias Clasen + + * gtk/gtk-sections.txt: Add gtk_file_filter_add_pixbuf_formats. + 2004-11-04 Matthias Clasen * gtk/tmpl/gtkaboutdialog.sgml: diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index 7b6cebc5d..27dfa12c6 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -1311,6 +1311,7 @@ gtk_file_filter_set_name gtk_file_filter_get_name gtk_file_filter_add_mime_type gtk_file_filter_add_pattern +gtk_file_filter_add_pixbuf_formats gtk_file_filter_add_custom gtk_file_filter_get_needed gtk_file_filter_filter diff --git a/gtk/gtkfilefilter.c b/gtk/gtkfilefilter.c index 10549e2f9..b248c78ca 100644 --- a/gtk/gtkfilefilter.c +++ b/gtk/gtkfilefilter.c @@ -36,6 +36,7 @@ typedef struct _FilterRule FilterRule; typedef enum { FILTER_RULE_PATTERN, FILTER_RULE_MIME_TYPE, + FILTER_RULE_PIXBUF_FORMATS, FILTER_RULE_CUSTOM } FilterRuleType; @@ -62,6 +63,7 @@ struct _FilterRule union { gchar *pattern; gchar *mime_type; + GSList *pixbuf_formats; struct { GtkFileFilterFunc func; gpointer data; @@ -127,6 +129,9 @@ filter_rule_free (FilterRule *rule) if (rule->u.custom.notify) rule->u.custom.notify (rule->u.custom.data); break; + case FILTER_RULE_PIXBUF_FORMATS: + g_slist_free (rule->u.pixbuf_formats); + break; default: g_assert_not_reached (); } @@ -277,6 +282,30 @@ gtk_file_filter_add_pattern (GtkFileFilter *filter, file_filter_add_rule (filter, rule); } +/** + * gtk_file_filter_add_pixbuf_formats: + * @filter: a #GtkFileFilter + * + * Adds a rule allowing image files in the formats supported + * by GdkPixbuf. + * + * Since: 2.6 + **/ +void +gtk_file_filter_add_pixbuf_formats (GtkFileFilter *filter) +{ + FilterRule *rule; + + g_return_if_fail (GTK_IS_FILE_FILTER (filter)); + + rule = g_new (FilterRule, 1); + rule->type = FILTER_RULE_PIXBUF_FORMATS; + rule->needed = GTK_FILE_FILTER_MIME_TYPE; + rule->u.pixbuf_formats = gdk_pixbuf_get_formats (); + file_filter_add_rule (filter, rule); +} + + /** * gtk_file_filter_add_custom: * @filter: a #GtkFileFilter @@ -382,6 +411,30 @@ gtk_file_filter_filter (GtkFileFilter *filter, _gtk_fnmatch (rule->u.pattern, filter_info->display_name, FALSE)) return TRUE; break; + case FILTER_RULE_PIXBUF_FORMATS: + { + GSList *list; + + for (list = rule->u.pixbuf_formats; list; list = list->next) + { + int i; + gchar **mime_types; + + mime_types = gdk_pixbuf_format_get_mime_types (list->data); + + for (i = 0; mime_types[i] != NULL; i++) + { + if (strcmp (mime_types[i], filter_info->mime_type) == 0) + { + g_strfreev (mime_types); + return TRUE; + } + } + + g_strfreev (mime_types); + } + break; + } case FILTER_RULE_CUSTOM: if (rule->u.custom.func (filter_info, rule->u.custom.data)) return TRUE; diff --git a/gtk/gtkfilefilter.h b/gtk/gtkfilefilter.h index 01b70b3ba..a4b909b0a 100644 --- a/gtk/gtkfilefilter.h +++ b/gtk/gtkfilefilter.h @@ -59,15 +59,16 @@ void gtk_file_filter_set_name (GtkFileFilter *filter, const gchar *name); G_CONST_RETURN gchar *gtk_file_filter_get_name (GtkFileFilter *filter); -void gtk_file_filter_add_mime_type (GtkFileFilter *filter, - const gchar *mime_type); -void gtk_file_filter_add_pattern (GtkFileFilter *filter, - const gchar *pattern); -void gtk_file_filter_add_custom (GtkFileFilter *filter, - GtkFileFilterFlags needed, - GtkFileFilterFunc func, - gpointer data, - GDestroyNotify notify); +void gtk_file_filter_add_mime_type (GtkFileFilter *filter, + const gchar *mime_type); +void gtk_file_filter_add_pattern (GtkFileFilter *filter, + const gchar *pattern); +void gtk_file_filter_add_pixbuf_formats (GtkFileFilter *filter); +void gtk_file_filter_add_custom (GtkFileFilter *filter, + GtkFileFilterFlags needed, + GtkFileFilterFunc func, + gpointer data, + GDestroyNotify notify); GtkFileFilterFlags gtk_file_filter_get_needed (GtkFileFilter *filter); gboolean gtk_file_filter_filter (GtkFileFilter *filter, diff --git a/tests/testfilechooser.c b/tests/testfilechooser.c index b6df9aced..7910c61a8 100644 --- a/tests/testfilechooser.c +++ b/tests/testfilechooser.c @@ -95,6 +95,13 @@ no_backup_files_filter (const GtkFileFilterInfo *filter_info, return 1; } +static void +filter_changed (GtkFileChooserDialog *dialog, + gpointer data) +{ + g_print ("file filter changed\n"); +} + static char * format_time (time_t t) { @@ -403,6 +410,10 @@ main (int argc, char **argv) gtk_init (&argc, &argv); + /* to test rtl layout, set RTL=1 in the environment */ + if (g_getenv ("RTL")) + gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL); + action = GTK_FILE_CHOOSER_ACTION_OPEN; /* lame-o arg parsing */ @@ -466,6 +477,9 @@ main (int argc, char **argv) gtk_file_filter_add_mime_type (filter, "image/png"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + g_signal_connect (dialog, "notify::filter", + G_CALLBACK (filter_changed), NULL); + /* Make this filter the default */ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter); @@ -475,11 +489,16 @@ main (int argc, char **argv) gtk_file_filter_add_mime_type (filter, "image/png"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, "Images"); + gtk_file_filter_add_pixbuf_formats (filter); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + /* Preview widget */ /* THIS IS A TERRIBLE PREVIEW WIDGET, AND SHOULD NOT BE COPIED AT ALL. */ preview_vbox = gtk_vbox_new (0, FALSE); - /* gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (dialog), preview_vbox);*/ + /*gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (dialog), preview_vbox);*/ preview_label = gtk_label_new (NULL); gtk_box_pack_start (GTK_BOX (preview_vbox), preview_label, TRUE, TRUE, 0); -- cgit v1.2.1