]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkrecentchooserutils.c
Move filtering of the recent files list into the shared implementation; do
[~andy/gtk] / gtk / gtkrecentchooserutils.c
index 64fc81e331489269aa7d5f62c4e9b0e4c00b0ae1..102e2fdfd696552d7d1f710d38295d1bf82a54bc 100644 (file)
@@ -340,21 +340,84 @@ sort_recent_items_proxy (gpointer *a,
   return 0;
 }
 
+static gboolean
+get_is_recent_filtered (GtkRecentFilter *filter,
+                       GtkRecentInfo   *info)
+{
+  GtkRecentFilterInfo filter_info;
+  GtkRecentFilterFlags needed;
+  gboolean retval;
+
+  g_assert (info != NULL);
+  
+  needed = gtk_recent_filter_get_needed (filter);
+  
+  filter_info.contains = GTK_RECENT_FILTER_URI | GTK_RECENT_FILTER_MIME_TYPE;
+  
+  filter_info.uri = gtk_recent_info_get_uri (info);
+  filter_info.mime_type = gtk_recent_info_get_mime_type (info);
+  
+  if (needed & GTK_RECENT_FILTER_DISPLAY_NAME)
+    {
+      filter_info.display_name = gtk_recent_info_get_display_name (info);
+      filter_info.contains |= GTK_RECENT_FILTER_DISPLAY_NAME;
+    }
+  else
+    filter_info.uri = NULL;
+  
+  if (needed & GTK_RECENT_FILTER_APPLICATION)
+    {
+      filter_info.applications = (const gchar **) gtk_recent_info_get_applications (info, NULL);
+      filter_info.contains |= GTK_RECENT_FILTER_APPLICATION;
+    }
+  else
+    filter_info.applications = NULL;
+
+  if (needed & GTK_RECENT_FILTER_GROUP)
+    {
+      filter_info.groups = (const gchar **) gtk_recent_info_get_groups (info, NULL);
+      filter_info.contains |= GTK_RECENT_FILTER_GROUP;
+    }
+  else
+    filter_info.groups = NULL;
+
+  if (needed & GTK_RECENT_FILTER_AGE)
+    {
+      filter_info.age = gtk_recent_info_get_age (info);
+      filter_info.contains |= GTK_RECENT_FILTER_AGE;
+    }
+  else
+    filter_info.age = -1;
+  
+  retval = gtk_recent_filter_filter (filter, &filter_info);
+  
+  /* these we own */
+  if (filter_info.applications)
+    g_strfreev ((gchar **) filter_info.applications);
+  if (filter_info.groups)
+    g_strfreev ((gchar **) filter_info.groups);
+  
+  return !retval;
+}
+
 /*
  * _gtk_recent_chooser_get_items:
  * @chooser: a #GtkRecentChooser
+ * @filter: a #GtkRecentFilter
  * @sort_func: sorting function, or %NULL
  * @sort_data: sorting function data, or %NULL
  *
- * Default implementation for getting the (sorted and clamped) list
- * of recently used resources from a #GtkRecentChooser. This function
- * should be used by implementations of the #GtkRecentChooser
- * interface inside the GtkRecentChooser::get_items vfunc.
+ * Default implementation for getting the filtered, sorted and
+ * clamped list of recently used resources from a #GtkRecentChooser.
+ * This function should be used by implementations of the
+ * #GtkRecentChooser interface inside the GtkRecentChooser::get_items
+ * vfunc.
  *
  * Return value: a list of #GtkRecentInfo objects
  */
 GList *
 _gtk_recent_chooser_get_items (GtkRecentChooser  *chooser,
+                               GtkRecentFilter   *filter,
                                GtkRecentSortFunc  sort_func,
                                gpointer           sort_data)
 {
@@ -379,6 +442,50 @@ _gtk_recent_chooser_get_items (GtkRecentChooser  *chooser,
   if (limit == 0)
     return NULL;
 
+  if (filter)
+    {
+      GList *filter_items, *l;
+      gboolean local_only = FALSE;
+      gboolean show_private = FALSE;
+      gboolean show_not_found = FALSE;
+
+      g_object_get (G_OBJECT (chooser),
+                    "local-only", &local_only,
+                    "show-private", &show_private,
+                    "show-not-found", &show_not_found,
+                    NULL);
+
+      filter_items = NULL;
+      for (l = items; l != NULL; l = l->next)
+        {
+          GtkRecentInfo *info = l->data;
+          gboolean remove_item = FALSE;
+
+          if (get_is_recent_filtered (filter, info))
+            remove_item = TRUE;
+          
+          if (local_only && !gtk_recent_info_is_local (info))
+            remove_item = TRUE;
+
+          if (!show_private && gtk_recent_info_get_private_hint (info))
+            remove_item = TRUE;
+
+          if (!show_not_found && !gtk_recent_info_exists (info))
+            remove_item = TRUE;
+          
+          if (!remove_item)
+            filter_items = g_list_prepend (filter_items, info);
+          else
+            gtk_recent_info_unref (info);
+        }
+      
+      g_list_free (items);
+      items = filter_items;
+    }
+
+  if (!items)
+    return NULL;
+
   sort_type = gtk_recent_chooser_get_sort_type (chooser);
   switch (sort_type)
     {