From b2ceadb057011a120ff271c74bff5d2cbd6572bd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 18 Jun 2015 12:19:06 -0400 Subject: [PATCH] file system model: Add batched insertion Add a batched version of gtk_file_system_model_add_and_query_file that takes a list of files and avoids resorting the model for each individual insertion. The querying is still done one-file-at-a-time, so more optimization is certainly possible. --- gtk/gtkfilesystemmodel.c | 36 ++++++++++++++++++++++++++++++++++++ gtk/gtkfilesystemmodel.h | 9 ++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c index a92be1f5b1..096836bb64 100644 --- a/gtk/gtkfilesystemmodel.c +++ b/gtk/gtkfilesystemmodel.c @@ -2129,3 +2129,39 @@ _gtk_file_system_model_add_and_query_file (GtkFileSystemModel *model, gtk_file_system_model_query_done, model); } + +static void +gtk_file_system_model_one_query_done (GObject * object, + GAsyncResult *res, + gpointer data) +{ + GtkFileSystemModel *model = data; /* only a valid pointer if not cancelled */ + + gtk_file_system_model_query_done (object, res, data); + thaw_updates (model); +} + +void +_gtk_file_system_model_add_and_query_files (GtkFileSystemModel *model, + GList *list, + const char *attributes) +{ + GList *l; + GFile *file; + + g_return_if_fail (GTK_IS_FILE_SYSTEM_MODEL (model)); + g_return_if_fail (attributes != NULL); + + for (l = list; l; l = l->next) + { + file = (GFile *)l->data; + freeze_updates (model); + g_file_query_info_async (file, + attributes, + G_FILE_QUERY_INFO_NONE, + IO_PRIORITY, + model->cancellable, + gtk_file_system_model_one_query_done, + model); + } +} diff --git a/gtk/gtkfilesystemmodel.h b/gtk/gtkfilesystemmodel.h index 6c6a051aac..5a2c8b1eb3 100644 --- a/gtk/gtkfilesystemmodel.h +++ b/gtk/gtkfilesystemmodel.h @@ -66,9 +66,12 @@ const GValue * _gtk_file_system_model_get_value (GtkFileSystemModel GtkTreeIter * iter, int column); -void _gtk_file_system_model_add_and_query_file (GtkFileSystemModel *model, - GFile *file, - const char *attributes); +void _gtk_file_system_model_add_and_query_file (GtkFileSystemModel *model, + GFile *file, + const char *attributes); +void _gtk_file_system_model_add_and_query_files (GtkFileSystemModel *model, + GList *files, + const char *attributes); void _gtk_file_system_model_update_file (GtkFileSystemModel *model, GFile *file, GFileInfo *info);