filefilter: Add properties for the criteria
authorMatthias Clasen <mclasen@redhat.com>
Tue, 22 Nov 2022 03:44:03 +0000 (22:44 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 22 Nov 2022 03:44:03 +0000 (22:44 -0500)
Add construct-only properties for patterns,
suffixes and mime-types. This provides an
alternative way to specify these in ui files.

Related: #5350

gtk/gtkfilefilter.c
testsuite/gtk/filefilter.c

index 9e3a11dea6af85644e420fbb9410a42df20eb47e..767c89b6296dc66fa5a1cda6f6a7108256e593a8 100644 (file)
@@ -120,6 +120,9 @@ struct _FilterRule
 enum {
   PROP_0,
   PROP_NAME,
+  PROP_PATTERNS,
+  PROP_MIME_TYPES,
+  PROP_SUFFIXES,
   NUM_PROPERTIES
 };
 
@@ -149,12 +152,35 @@ gtk_file_filter_set_property (GObject      *object,
                               GParamSpec   *pspec)
 {
   GtkFileFilter *filter = GTK_FILE_FILTER (object);
+  const char * const *strv;
 
   switch (prop_id)
     {
     case PROP_NAME:
       gtk_file_filter_set_name (filter, g_value_get_string (value));
       break;
+
+    case PROP_PATTERNS:
+      strv = (const char * const *) g_value_get_boxed (value);
+      if (strv)
+        for (int i = 0; strv[i]; i++)
+          gtk_file_filter_add_pattern (filter, strv[i]);
+      break;
+
+    case PROP_MIME_TYPES:
+      strv = (const char * const *) g_value_get_boxed (value);
+      if (strv)
+        for (int i = 0; strv[i]; i++)
+          gtk_file_filter_add_mime_type (filter, strv[i]);
+      break;
+
+    case PROP_SUFFIXES:
+      strv = (const char * const *) g_value_get_boxed (value);
+      if (strv)
+        for (int i = 0; strv[i]; i++)
+          gtk_file_filter_add_suffix (filter, strv[i]);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -174,6 +200,7 @@ gtk_file_filter_get_property (GObject    *object,
     case PROP_NAME:
       g_value_set_string (value, filter->name);
       break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -238,6 +265,42 @@ gtk_file_filter_class_init (GtkFileFilterClass *class)
                            NULL,
                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkFileFilter:patterns:
+   *
+   * The patterns that this filter matches.
+   *
+   * Since: 4.10
+   */
+  props[PROP_PATTERNS] =
+      g_param_spec_boxed ("patterns", NULL, NULL,
+                          G_TYPE_STRV,
+                          G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * GtkFileFilter:mime-types:
+   *
+   * The MIME types that this filter matches.
+   *
+   * Since: 4.10
+   */
+  props[PROP_MIME_TYPES] =
+      g_param_spec_boxed ("mime-types", NULL, NULL,
+                          G_TYPE_STRV,
+                          G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * GtkFileFilter:suffixes:
+   *
+   * The suffixes that this filter matches.
+   *
+   * Since: 4.10
+   */
+  props[PROP_SUFFIXES] =
+      g_param_spec_boxed ("suffixes", NULL, NULL,
+                          G_TYPE_STRV,
+                          G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (gobject_class, NUM_PROPERTIES, props);
 }
 
index f32801bde4838523651a8776fb03f7af93cee24b..b9f6c6f8626e872f8f4ea27d41159071274487f6 100644 (file)
@@ -154,6 +154,44 @@ test_buildable (void)
   g_object_unref (builder);
 }
 
+static void
+test_builder (void)
+{
+  GtkBuilder *builder;
+  const char *buffer =
+  "<interface>\n"
+  "  <object class=\"GtkFileFilter\" id=\"filter\">\n"
+  "    <property name=\"name\">Audio Files</property>\n"
+  "    <property name=\"mime-types\">audio/*</property>\n"
+  "    <property name=\"suffixes\">blah</property>\n"
+  "    <property name=\"patterns\">*.x\n*.y</property>\n"
+  "  </object>\n"
+  "</interface>";
+  GtkFileFilter *filter;
+  GVariant *v1, *v2;
+  char *s1, *s2;
+
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer, strlen (buffer), NULL);
+  filter = GTK_FILE_FILTER (gtk_builder_get_object (builder, "filter"));
+
+  v1 = gtk_file_filter_to_gvariant (filter);
+  v2 = g_variant_parse (NULL, "('Audio Files', [(0, '*.x'), (0, '*.y'), (1, 'audio/*'), (0, '*.[bB][lL][aA][hH]')])", NULL, NULL, NULL);
+
+  s1 = g_variant_print (v1, FALSE);
+  s2 = g_variant_print (v2, FALSE);
+
+  g_assert_cmpstr (s1, ==, s2);
+
+  g_free (s1);
+  g_free (s2);
+
+  g_variant_unref (v1);
+  g_variant_unref (v2);
+
+  g_object_unref (builder);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -165,6 +203,7 @@ main (int argc, char *argv[])
   g_test_add_func ("/filefilter/suffix", test_suffix);
   g_test_add_func ("/filefilter/mimetype", test_mime_type);
   g_test_add_func ("/filefilter/buildable", test_buildable);
+  g_test_add_func ("/filefilter/builder", test_builder);
 
   return g_test_run ();
 }