summaryrefslogtreecommitdiff
path: root/gtk/gtkrecentchooserutils.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2007-03-15 10:05:34 +0000
committerEmmanuele Bassi <ebassi@src.gnome.org>2007-03-15 10:05:34 +0000
commit4191ec6a027a48ff099d38bfcd6195b6cbc2fdaa (patch)
treea69fb4925d147a0f00483c1ba23ae2be77da63eb /gtk/gtkrecentchooserutils.c
parentd953ce87750f5be9a851df22f2f21a100f964ec1 (diff)
downloadgtk+-4191ec6a027a48ff099d38bfcd6195b6cbc2fdaa.tar.gz
Move filtering of the recent files list into the shared implementation; do
2007-03-15 Emmanuele Bassi <ebassi@gnome.org> * gtk/gtkrecentchooserprivate.h: * gtk/gtkrecentchooserutils.c: Move filtering of the recent files list into the shared implementation; do the filtering before the sorting, so that we always clamp on the desired size. (#418219) * gtk/gtkrecentchoosermenu.c: Remove the filtering of the list, as it's already been done. * gtk/gtkrecentchooserdefault.c: Ditto; also remove the GtkTreeModelFilter: just reload the view if the sorting and filtering properties change. * gtk/testrecentchoosermenu.c: Exercise the limit property. svn path=/trunk/; revision=17516
Diffstat (limited to 'gtk/gtkrecentchooserutils.c')
-rw-r--r--gtk/gtkrecentchooserutils.c115
1 files changed, 111 insertions, 4 deletions
diff --git a/gtk/gtkrecentchooserutils.c b/gtk/gtkrecentchooserutils.c
index 64fc81e331..102e2fdfd6 100644
--- a/gtk/gtkrecentchooserutils.c
+++ b/gtk/gtkrecentchooserutils.c
@@ -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)
{