[gtk/file-filter2: 1/5] filefilter: Drop GtkFileFilterInfo
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/file-filter2: 1/5] filefilter: Drop GtkFileFilterInfo
- Date: Sat, 4 Jul 2020 15:48:18 +0000 (UTC)
commit 4c2b63f48574ec05361dec8e12d946e9195308d0
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jul 3 23:58:07 2020 -0400
filefilter: Drop GtkFileFilterInfo
We can just make the filter operate on GFileInfo.
This is in preparation for making GtkFileFilter a
GtkFilter.
Update all users.
docs/reference/gtk/gtk4-sections.txt | 1 -
gtk/gtkfilechooserentry.c | 57 ++-------------
gtk/gtkfilefilter.c | 136 +++++++++++++++++++----------------
gtk/gtkfilefilter.h | 33 ++-------
gtk/gtkfilesystemmodel.c | 59 +--------------
tests/testfilechooser.c | 12 ++--
testsuite/gtk/builder.c | 10 ---
7 files changed, 95 insertions(+), 213 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 208151976c..1e57683eaa 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1409,7 +1409,6 @@ GtkFileChooserButtonPrivate
<SECTION>
<FILE>gtkfilefilter</FILE>
GtkFileFilter
-GtkFileFilterInfo
GtkFileFilterFlags
GtkFileFilterFunc
gtk_file_filter_new
diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c
index 60d6e3bff4..f4871344d3 100644
--- a/gtk/gtkfilechooserentry.c
+++ b/gtk/gtkfilechooserentry.c
@@ -194,65 +194,22 @@ match_func (GtkEntryCompletion *compl,
* current file filter (e.g. just jpg files) here. */
if (chooser_entry->current_filter != NULL)
{
- char *mime_type = NULL;
- gboolean matches;
GFile *file;
- GFileInfo *file_info;
- GtkFileFilterInfo filter_info;
- GtkFileFilterFlags needed_flags;
+ GFileInfo *info;
file = _gtk_file_system_model_get_file (GTK_FILE_SYSTEM_MODEL (chooser_entry->completion_store),
iter);
- file_info = _gtk_file_system_model_get_info (GTK_FILE_SYSTEM_MODEL (chooser_entry->completion_store),
- iter);
+ info = _gtk_file_system_model_get_info (GTK_FILE_SYSTEM_MODEL (chooser_entry->completion_store),
+ iter);
/* We always allow navigating into subfolders, so don't ever filter directories */
- if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_REGULAR)
+ if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR)
return TRUE;
- needed_flags = gtk_file_filter_get_needed (chooser_entry->current_filter);
-
- filter_info.display_name = g_file_info_get_display_name (file_info);
- filter_info.contains = GTK_FILE_FILTER_DISPLAY_NAME;
-
- if (needed_flags & GTK_FILE_FILTER_MIME_TYPE)
- {
- const char *s = g_file_info_get_content_type (file_info);
- if (s != NULL)
- {
- mime_type = g_content_type_get_mime_type (s);
- if (mime_type != NULL)
- {
- filter_info.mime_type = mime_type;
- filter_info.contains |= GTK_FILE_FILTER_MIME_TYPE;
- }
- }
- }
-
- if (needed_flags & GTK_FILE_FILTER_FILENAME)
- {
- const char *path = g_file_get_path (file);
- if (path != NULL)
- {
- filter_info.filename = path;
- filter_info.contains |= GTK_FILE_FILTER_FILENAME;
- }
- }
-
- if (needed_flags & GTK_FILE_FILTER_URI)
- {
- const char *uri = g_file_get_uri (file);
- if (uri)
- {
- filter_info.uri = uri;
- filter_info.contains |= GTK_FILE_FILTER_URI;
- }
- }
-
- matches = gtk_file_filter_filter (chooser_entry->current_filter, &filter_info);
+ if (!g_file_info_has_attribute (info, "standard::file"))
+ g_file_info_set_attribute_object (info, "standard::file", G_OBJECT (file));
- g_free (mime_type);
- return matches;
+ return gtk_file_filter_filter (chooser_entry->current_filter, info);
}
return TRUE;
diff --git a/gtk/gtkfilefilter.c b/gtk/gtkfilefilter.c
index 204fc6f5bc..c3ba18e2e9 100644
--- a/gtk/gtkfilefilter.c
+++ b/gtk/gtkfilefilter.c
@@ -73,6 +73,7 @@
#include "gtkbuilderprivate.h"
#include "gtkintl.h"
#include "gtkprivate.h"
+#include "gtkfilter.h"
typedef struct _GtkFileFilterClass GtkFileFilterClass;
typedef struct _FilterRule FilterRule;
@@ -107,7 +108,7 @@ struct _FilterRule
{
FilterRuleType type;
GtkFileFilterFlags needed;
-
+
union {
gchar *pattern;
gchar *mime_type;
@@ -156,6 +157,7 @@ static void gtk_file_filter_buildable_custom_tag_end (GtkBuildable
const gchar *tagname,
gpointer data);
+
G_DEFINE_TYPE_WITH_CODE (GtkFileFilter, gtk_file_filter, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
gtk_file_filter_buildable_init))
@@ -436,7 +438,6 @@ gtk_file_filter_buildable_custom_tag_end (GtkBuildable *buildable,
}
}
-
/**
* gtk_file_filter_new:
*
@@ -768,92 +769,101 @@ _gtk_file_filter_get_as_patterns (GtkFileFilter *filter)
/**
* gtk_file_filter_filter:
* @filter: a #GtkFileFilter
- * @filter_info: a #GtkFileFilterInfo containing information
- * about a file.
- *
+ * @info: the #GFileInfo to filter
+ *
* Tests whether a file should be displayed according to @filter.
- * The #GtkFileFilterInfo @filter_info should include
- * the fields returned from gtk_file_filter_get_needed().
*
* This function will not typically be used by applications; it
* is intended principally for use in the implementation of
* #GtkFileChooser.
- *
+ *
* Returns: %TRUE if the file should be displayed
**/
gboolean
-gtk_file_filter_filter (GtkFileFilter *filter,
- const GtkFileFilterInfo *filter_info)
+gtk_file_filter_filter (GtkFileFilter *filter,
+ GFileInfo *info)
{
GSList *tmp_list;
+ GtkFileFilterFlags contains = GTK_FILE_FILTER_DISPLAY_NAME;
+
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE))
+ contains |= GTK_FILE_FILTER_MIME_TYPE;
+ if (g_file_info_has_attribute (info, "standard::file"))
+ contains |= GTK_FILE_FILTER_FILENAME | GTK_FILE_FILTER_URI;
for (tmp_list = filter->rules; tmp_list; tmp_list = tmp_list->next)
{
FilterRule *rule = tmp_list->data;
- if ((filter_info->contains & rule->needed) != rule->needed)
- continue;
+ if ((contains & rule->needed) != rule->needed)
+ continue;
switch (rule->type)
- {
- case FILTER_RULE_MIME_TYPE:
- if (filter_info->mime_type != NULL)
- {
- gchar *filter_content_type, *rule_content_type;
- gboolean match;
-
- filter_content_type = g_content_type_from_mime_type (filter_info->mime_type);
- rule_content_type = g_content_type_from_mime_type (rule->u.mime_type);
- match = filter_content_type != NULL &&
- rule_content_type != NULL &&
- g_content_type_is_a (filter_content_type, rule_content_type);
- g_free (filter_content_type);
- g_free (rule_content_type);
-
- if (match)
- return TRUE;
- }
- break;
- case FILTER_RULE_PATTERN:
- if (filter_info->display_name != NULL &&
- _gtk_fnmatch (rule->u.pattern, filter_info->display_name, FALSE))
- return TRUE;
- break;
- case FILTER_RULE_PIXBUF_FORMATS:
- {
- GSList *list;
+ {
+ case FILTER_RULE_MIME_TYPE:
+ {
+ const char *filter_content_type;
+ char *rule_content_type;
+ gboolean match;
+
+ filter_content_type = g_file_info_get_content_type (info);
+ rule_content_type = g_content_type_from_mime_type (rule->u.mime_type);
+ match = filter_content_type != NULL &&
+ rule_content_type != NULL &&
+ g_content_type_is_a (filter_content_type, rule_content_type);
+ g_free (rule_content_type);
+
+ if (match)
+ return TRUE;
+ }
+ break;
+ case FILTER_RULE_PATTERN:
+ {
+ const char *display_name;
- if (!filter_info->mime_type)
- break;
+ display_name = g_file_info_get_display_name (info);
+ if (display_name != NULL &&
+ _gtk_fnmatch (rule->u.pattern, display_name, FALSE))
+ return TRUE;
+ }
+ break;
+ case FILTER_RULE_PIXBUF_FORMATS:
+ {
+ const char *filter_content_type;
+ GSList *list;
- for (list = rule->u.pixbuf_formats; list; list = list->next)
- {
- int i;
- gchar **mime_types;
+ filter_content_type = g_file_info_get_content_type (info);
+ if (!filter_content_type)
+ break;
- mime_types = gdk_pixbuf_format_get_mime_types (list->data);
+ for (list = rule->u.pixbuf_formats; list; list = list->next)
+ {
+ int i;
+ char **mime_types;
- for (i = 0; mime_types[i] != NULL; i++)
- {
- if (strcmp (mime_types[i], filter_info->mime_type) == 0)
- {
- g_strfreev (mime_types);
- return TRUE;
- }
- }
+ mime_types = gdk_pixbuf_format_get_mime_types (list->data);
- g_strfreev (mime_types);
- }
- break;
- }
- case FILTER_RULE_CUSTOM:
- if (rule->u.custom.func (filter_info, rule->u.custom.data))
- return TRUE;
- break;
+ for (i = 0; mime_types[i] != NULL; i++)
+ {
+ if (strcmp (mime_types[i], filter_content_type) == 0)
+ {
+ g_strfreev (mime_types);
+ return TRUE;
+ }
+ }
+
+ g_strfreev (mime_types);
+ }
+ }
+ break;
+ case FILTER_RULE_CUSTOM:
+ if (rule->u.custom.func (info, rule->u.custom.data))
+ return TRUE;
+ break;
default:
break;
- }
+ }
}
return FALSE;
diff --git a/gtk/gtkfilefilter.h b/gtk/gtkfilefilter.h
index c3ee9eb3f1..0c968e111b 100644
--- a/gtk/gtkfilefilter.h
+++ b/gtk/gtkfilefilter.h
@@ -33,7 +33,6 @@ G_BEGIN_DECLS
#define GTK_IS_FILE_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_FILTER))
typedef struct _GtkFileFilter GtkFileFilter;
-typedef struct _GtkFileFilterInfo GtkFileFilterInfo;
/**
* GtkFileFilterFlags:
@@ -55,8 +54,7 @@ typedef enum {
/**
* GtkFileFilterFunc:
- * @filter_info: a #GtkFileFilterInfo that is filled according
- * to the @needed flags passed to gtk_file_filter_add_custom()
+ * @info: a #GFileInfo
* @data: (closure): user data passed to gtk_file_filter_add_custom()
*
* The type of function that is used with custom filters, see
@@ -64,31 +62,8 @@ typedef enum {
*
* Returns: %TRUE if the file should be displayed
*/
-typedef gboolean (*GtkFileFilterFunc) (const GtkFileFilterInfo *filter_info,
- gpointer data);
-
-/**
- * GtkFileFilterInfo:
- * @contains: Flags indicating which of the following fields need
- * are filled
- * @filename: the filename of the file being tested
- * @uri: the URI for the file being tested
- * @display_name: the string that will be used to display the file
- * in the file chooser
- * @mime_type: the mime type of the file
- *
- * A #GtkFileFilterInfo is used to pass information about the
- * tested file to gtk_file_filter_filter().
- */
-struct _GtkFileFilterInfo
-{
- GtkFileFilterFlags contains;
-
- const gchar *filename;
- const gchar *uri;
- const gchar *display_name;
- const gchar *mime_type;
-};
+typedef gboolean (*GtkFileFilterFunc) (GFileInfo *info,
+ gpointer data);
GDK_AVAILABLE_IN_ALL
GType gtk_file_filter_get_type (void) G_GNUC_CONST;
@@ -120,7 +95,7 @@ GDK_AVAILABLE_IN_ALL
GtkFileFilterFlags gtk_file_filter_get_needed (GtkFileFilter *filter);
GDK_AVAILABLE_IN_ALL
gboolean gtk_file_filter_filter (GtkFileFilter *filter,
- const GtkFileFilterInfo *filter_info);
+ GFileInfo *info);
GDK_AVAILABLE_IN_ALL
GVariant *gtk_file_filter_to_gvariant (GtkFileFilter *filter);
diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c
index af9fce15d0..b816c464e9 100644
--- a/gtk/gtkfilesystemmodel.c
+++ b/gtk/gtkfilesystemmodel.c
@@ -375,12 +375,6 @@ static gboolean
node_should_be_filtered_out (GtkFileSystemModel *model, guint id)
{
FileModelNode *node = get_node (model, id);
- GtkFileFilterInfo filter_info = { 0, };
- GtkFileFilterFlags required;
- gboolean result;
- char *mime_type = NULL;
- char *filename = NULL;
- char *uri = NULL;
if (node->info == NULL)
return TRUE;
@@ -388,57 +382,10 @@ node_should_be_filtered_out (GtkFileSystemModel *model, guint id)
if (model->filter == NULL)
return FALSE;
- /* fill info */
- required = gtk_file_filter_get_needed (model->filter);
-
- filter_info.contains = GTK_FILE_FILTER_DISPLAY_NAME;
- filter_info.display_name = g_file_info_get_display_name (node->info);
-
- if (required & GTK_FILE_FILTER_MIME_TYPE)
- {
- const char *s = g_file_info_get_content_type (node->info);
-
- if (!s)
- s = g_file_info_get_attribute_string (node->info, G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE);
-
- if (s)
- {
- mime_type = g_content_type_get_mime_type (s);
- if (mime_type)
- {
- filter_info.mime_type = mime_type;
- filter_info.contains |= GTK_FILE_FILTER_MIME_TYPE;
- }
- }
- }
-
- if (required & GTK_FILE_FILTER_FILENAME)
- {
- filename = g_file_get_path (node->file);
- if (filename)
- {
- filter_info.filename = filename;
- filter_info.contains |= GTK_FILE_FILTER_FILENAME;
- }
- }
-
- if (required & GTK_FILE_FILTER_URI)
- {
- uri = g_file_get_uri (node->file);
- if (uri)
- {
- filter_info.uri = uri;
- filter_info.contains |= GTK_FILE_FILTER_URI;
- }
- }
-
- result = !gtk_file_filter_filter (model->filter, &filter_info);
+ if (!g_file_info_has_attribute (node->info, "standard::file"))
+ g_file_info_set_attribute_object (node->info, "standard::file", G_OBJECT (node->file));
- g_free (mime_type);
- g_free (filename);
- g_free (uri);
-
- return result;
+ return !gtk_file_filter_filter (model->filter, node->info);
}
static gboolean
diff --git a/tests/testfilechooser.c b/tests/testfilechooser.c
index 1dca027ecc..4ff2c8ca96 100644
--- a/tests/testfilechooser.c
+++ b/tests/testfilechooser.c
@@ -119,11 +119,15 @@ response_cb (GtkDialog *dialog,
}
static gboolean
-no_backup_files_filter (const GtkFileFilterInfo *filter_info,
- gpointer data)
+no_backup_files_filter (GFileInfo *info,
+ gpointer data)
{
- gsize len = filter_info->display_name ? strlen (filter_info->display_name) : 0;
- if (len > 0 && filter_info->display_name[len - 1] == '~')
+ const char *display_name;
+ gsize len;
+
+ display_name = g_file_info_get_display_name (info);
+ len = strlen (display_name);
+ if (len > 0 && display_name[len - 1] == '~')
return 0;
else
return 1;
diff --git a/testsuite/gtk/builder.c b/testsuite/gtk/builder.c
index db1eb2dd04..38537a10f3 100644
--- a/testsuite/gtk/builder.c
+++ b/testsuite/gtk/builder.c
@@ -2387,7 +2387,6 @@ test_file_filter (void)
GtkBuilder *builder;
GObject *obj;
GtkFileFilter *filter;
- GtkFileFilterInfo info;
const gchar buffer[] =
"<interface>"
@@ -2412,15 +2411,6 @@ test_file_filter (void)
g_assert (gtk_file_filter_get_needed (filter) & GTK_FILE_FILTER_MIME_TYPE);
g_assert (gtk_file_filter_get_needed (filter) & GTK_FILE_FILTER_DISPLAY_NAME);
- info.filename = "test1.txt";
- info.display_name = "test1.txt";
- info.contains = GTK_FILE_FILTER_FILENAME | GTK_FILE_FILTER_DISPLAY_NAME;
- g_assert (gtk_file_filter_filter (filter, &info));
-
- info.mime_type = "application/x-pdf";
- info.contains = GTK_FILE_FILTER_MIME_TYPE;
- g_assert (!gtk_file_filter_filter (filter, &info));
-
g_object_unref (builder);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]