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
This commit is contained in:
committed by
Emmanuele Bassi
parent
d953ce8775
commit
4191ec6a02
@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user