Utility function to extract folders from the recently-used list

This extracts the parent folders from the items in the recently-used
list.  We'll use it in the file chooser to present a list of
recently-used folders.

Signed-off-by: Federico Mena Quintero <federico@gnome.org>
This commit is contained in:
Federico Mena Quintero 2011-06-27 15:30:59 -05:00
parent 1b605ee84b
commit d3e822882a
2 changed files with 74 additions and 0 deletions

View File

@ -363,3 +363,75 @@ delegate_confirm_overwrite (GtkFileChooser *chooser,
g_signal_emit_by_name (data, "confirm-overwrite", &conf);
return conf;
}
static gint
recent_sort_mru (gconstpointer a,
gconstpointer b)
{
GtkRecentInfo *info_a = (GtkRecentInfo *) a;
GtkRecentInfo *info_b = (GtkRecentInfo *) b;
return (gtk_recent_info_get_modified (info_b) - gtk_recent_info_get_modified (info_a));
}
static GFile *
get_parent_for_uri (const char *uri)
{
GFile *file;
GFile *parent;
file = g_file_new_for_uri (uri);
parent = g_file_get_parent (file);
g_object_unref (file);
return parent;
}
/* Extracts the parent folders out of the recent items, and returns
* a list of GFile* for those parents in MRU-first order.
*/
GList *
_gtk_file_chooser_list_recent_folders (GtkRecentManager *manager)
{
GList *infos;
GList *l;
GList *result;
GHashTable *folders;
result = NULL;
infos = gtk_recent_manager_get_items (manager);
infos = g_list_sort (infos, recent_sort_mru);
folders = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
for (l = infos; l; l = l->next)
{
GtkRecentInfo *info = l->data;
const char *uri;
GFile *parent;
uri = gtk_recent_info_get_uri (info);
parent = get_parent_for_uri (uri);
if (parent)
{
if (!g_hash_table_lookup (folders, parent))
{
g_hash_table_insert (folders, parent, (gpointer) 1);
result = g_list_prepend (result, g_object_ref (parent));
}
g_object_unref (parent);
}
}
result = g_list_reverse (result);
g_hash_table_destroy (folders);
g_list_foreach (infos, (GFunc) gtk_recent_info_unref, NULL);
g_list_free (infos);
return result;
}

View File

@ -53,6 +53,8 @@ void _gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
GQuark _gtk_file_chooser_delegate_get_quark (void) G_GNUC_CONST;
GList *_gtk_file_chooser_list_recent_folders (GtkRecentManager *manager);
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_UTILS_H__ */