summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-12 19:04:14 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-22 18:55:55 -0400
commite153ba8046f52680b98a5fc209c2b4161b193d2d (patch)
tree8172089a1aa27e0fe6e3e58c390240ab3ddb4c84
parenteb8cab670df420a7a32101360cfc7648cdd38d46 (diff)
downloadnautilus-e153ba8046f52680b98a5fc209c2b4161b193d2d.tar.gz
search-directory: enable incremental directory load
Instead of emitting nautilus_directory_done_loading() from the "finished" callback, do it as soon as we receive the first batch of hits. The rest of the results will be added to the directory in background. https://bugzilla.gnome.org/show_bug.cgi?id=663242
-rw-r--r--libnautilus-private/nautilus-search-directory.c58
1 files changed, 25 insertions, 33 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 5da6f7a94..510d31965 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -46,7 +46,7 @@ struct NautilusSearchDirectoryDetails {
NautilusSearchEngine *engine;
gboolean search_running;
- gboolean search_finished;
+ gboolean search_loaded;
GList *files;
GHashTable *files_hash;
@@ -90,7 +90,6 @@ G_DEFINE_TYPE (NautilusSearchDirectory, nautilus_search_directory,
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
static void search_engine_hits_added (NautilusSearchEngine *engine, GList *hits, NautilusSearchDirectory *search);
-static void search_engine_finished (NautilusSearchEngine *engine, NautilusSearchDirectory *search);
static void search_engine_error (NautilusSearchEngine *engine, const char *error, NautilusSearchDirectory *search);
static void search_callback_file_ready_callback (NautilusFile *file, gpointer data);
static void file_changed (NautilusFile *file, NautilusSearchDirectory *search);
@@ -161,7 +160,7 @@ start_search (NautilusSearchDirectory *search)
/* We need to start the search engine */
search->details->search_running = TRUE;
- search->details->search_finished = FALSE;
+ search->details->search_loaded = FALSE;
set_hidden_files (search);
nautilus_search_provider_set_query (NAUTILUS_SEARCH_PROVIDER (search->details->engine),
@@ -436,7 +435,7 @@ search_call_when_ready (NautilusDirectory *directory,
search_callback->wait_for_attributes = file_attributes;
search_callback->wait_for_file_list = wait_for_file_list;
- if (wait_for_file_list && !search->details->search_finished) {
+ if (wait_for_file_list && !search->details->search_loaded) {
/* Add it to the pending callback list, which will be
* processed when the directory has finished loading
*/
@@ -494,6 +493,14 @@ search_cancel_callback (NautilusDirectory *directory,
}
}
+static void
+search_callback_add_pending_file_callbacks (SearchCallback *callback)
+{
+ callback->file_list = nautilus_file_list_copy (callback->search_directory->details->files);
+ callback->non_ready_hash = file_list_to_hash_table (callback->search_directory->details->files);
+
+ search_callback_add_file_callbacks (callback);
+}
static void
search_engine_hits_added (NautilusSearchEngine *engine, GList *hits,
@@ -542,15 +549,20 @@ search_engine_hits_added (NautilusSearchEngine *engine, GList *hits,
file = nautilus_directory_get_corresponding_file (NAUTILUS_DIRECTORY (search));
nautilus_file_emit_changed (file);
nautilus_file_unref (file);
-}
-static void
-search_callback_add_pending_file_callbacks (SearchCallback *callback)
-{
- callback->file_list = nautilus_file_list_copy (callback->search_directory->details->files);
- callback->non_ready_hash = file_list_to_hash_table (callback->search_directory->details->files);
+ if (!search->details->search_loaded) {
+ search->details->search_loaded = TRUE;
+ nautilus_directory_emit_done_loading (NAUTILUS_DIRECTORY (search));
- search_callback_add_file_callbacks (callback);
+ /* Add all file callbacks */
+ g_list_foreach (search->details->pending_callback_list,
+ (GFunc)search_callback_add_pending_file_callbacks, NULL);
+ search->details->callback_list = g_list_concat (search->details->callback_list,
+ search->details->pending_callback_list);
+
+ g_list_free (search->details->pending_callback_list);
+ search->details->pending_callback_list = NULL;
+ }
}
static void
@@ -566,23 +578,6 @@ search_engine_error (NautilusSearchEngine *engine, const char *error_message, Na
}
static void
-search_engine_finished (NautilusSearchEngine *engine, NautilusSearchDirectory *search)
-{
- search->details->search_finished = TRUE;
-
- nautilus_directory_emit_done_loading (NAUTILUS_DIRECTORY (search));
-
- /* Add all file callbacks */
- g_list_foreach (search->details->pending_callback_list,
- (GFunc)search_callback_add_pending_file_callbacks, NULL);
- search->details->callback_list = g_list_concat (search->details->callback_list,
- search->details->pending_callback_list);
-
- g_list_free (search->details->pending_callback_list);
- search->details->pending_callback_list = NULL;
-}
-
-static void
search_force_reload (NautilusDirectory *directory)
{
NautilusSearchDirectory *search;
@@ -593,7 +588,7 @@ search_force_reload (NautilusDirectory *directory)
return;
}
- search->details->search_finished = FALSE;
+ search->details->search_loaded = FALSE;
/* Remove file monitors */
reset_file_list (search);
@@ -608,7 +603,7 @@ search_are_all_files_seen (NautilusDirectory *directory)
search = NAUTILUS_SEARCH_DIRECTORY (directory);
return (!search->details->query ||
- search->details->search_finished);
+ search->details->search_loaded);
}
static gboolean
@@ -760,9 +755,6 @@ nautilus_search_directory_init (NautilusSearchDirectory *search)
g_signal_connect (search->details->engine, "hits-added",
G_CALLBACK (search_engine_hits_added),
search);
- g_signal_connect (search->details->engine, "finished",
- G_CALLBACK (search_engine_finished),
- search);
g_signal_connect (search->details->engine, "error",
G_CALLBACK (search_engine_error),
search);