diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2007-03-15 10:05:34 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@src.gnome.org> | 2007-03-15 10:05:34 +0000 |
commit | 4191ec6a027a48ff099d38bfcd6195b6cbc2fdaa (patch) | |
tree | a69fb4925d147a0f00483c1ba23ae2be77da63eb /gtk/gtkrecentchooserutils.c | |
parent | d953ce87750f5be9a851df22f2f21a100f964ec1 (diff) | |
download | gtk+-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.c | 115 |
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) { |