[nautilus] Search requires that a reload be forced despite a load in effect



commit eccc2046979be5a8073376f4611e0aa7ca89bc4a
Author: William Jon McCann <jmccann redhat com>
Date:   Wed Sep 5 16:45:40 2012 -0400

    Search requires that a reload be forced despite a load in effect
    
    Add api to preempt the current load and force a reload.

 src/nautilus-view.c                |    2 +-
 src/nautilus-window-manage-views.c |   29 +++++++++++++++++++++--------
 src/nautilus-window-menus.c        |    2 +-
 src/nautilus-window-slot.c         |   17 ++++++++++++++++-
 src/nautilus-window-slot.h         |    5 ++++-
 5 files changed, 43 insertions(+), 12 deletions(-)
---
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 801dce8..13b289f 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -3094,9 +3094,9 @@ done_loading (NautilusView *view,
 		nautilus_view_display_selection_info (view);
 	}
 
+	view->details->loading = FALSE;
 	g_signal_emit (view, signals[END_LOADING], 0, all_files_seen);
 
-	view->details->loading = FALSE;
 	nautilus_profile_end (NULL);
 }
 
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index 623e626..9be4df0 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -1811,7 +1811,7 @@ nautilus_window_back_or_forward (NautilusWindow *window,
 
 /* reload the contents of the window */
 void
-nautilus_window_slot_reload (NautilusWindowSlot *slot)
+nautilus_window_slot_force_reload (NautilusWindowSlot *slot)
 {
 	GFile *location;
         char *current_pos;
@@ -1823,13 +1823,6 @@ nautilus_window_slot_reload (NautilusWindowSlot *slot)
 		return;
 	}
 
-	if (slot->pending_location != NULL
-	    || slot->content_view == NULL
-	    || nautilus_view_get_loading (slot->content_view)) {
-		/* there is a reload in flight */
-		return;
-	}
-
 	/* peek_slot_field (window, location) can be free'd during the processing
 	 * of begin_location_change, so make a copy
 	 */
@@ -1848,3 +1841,23 @@ nautilus_window_slot_reload (NautilusWindowSlot *slot)
 	g_object_unref (location);
 	g_list_free_full (selection, g_object_unref);
 }
+
+void
+nautilus_window_slot_queue_reload (NautilusWindowSlot *slot)
+{
+	g_assert (NAUTILUS_IS_WINDOW_SLOT (slot));
+
+	if (slot->location == NULL) {
+		return;
+	}
+
+	if (slot->pending_location != NULL
+	    || slot->content_view == NULL
+	    || nautilus_view_get_loading (slot->content_view)) {
+		/* there is a reload in flight */
+		slot->needs_reload = TRUE;
+		return;
+	}
+
+	nautilus_window_slot_force_reload (slot);
+}
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index d6cb25d..a4b70ca 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -129,7 +129,7 @@ action_reload_callback (GtkAction *action,
 	NautilusWindowSlot *slot;
 
 	slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (user_data));
-	nautilus_window_slot_reload (slot);
+	nautilus_window_slot_queue_reload (slot);
 }
 
 static void
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 9187338..9370f14 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -98,7 +98,7 @@ sync_search_directory (NautilusWindowSlot *slot)
 	} else {
 		nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory),
 						     query);
-		nautilus_window_slot_reload (slot);
+		nautilus_window_slot_force_reload (slot);
 	}
 
 	g_free (text);
@@ -380,6 +380,17 @@ nautilus_window_slot_init (NautilusWindowSlot *slot)
 }
 
 static void
+view_end_loading_cb (NautilusView       *view,
+		     gboolean            all_files_seen,
+		     NautilusWindowSlot *slot)
+{
+	if (slot->needs_reload) {
+		nautilus_window_slot_queue_reload (slot);
+		slot->needs_reload = FALSE;
+	}
+}
+
+static void
 nautilus_window_slot_dispose (GObject *object)
 {
 	NautilusWindowSlot *slot;
@@ -588,6 +599,8 @@ nautilus_window_slot_set_content_view_widget (NautilusWindowSlot *slot,
 
 	if (slot->content_view != NULL) {
 		/* disconnect old view */
+		g_signal_handlers_disconnect_by_func (slot->content_view, G_CALLBACK (view_end_loading_cb), slot);
+
 		nautilus_window_disconnect_content_view (window, slot->content_view);
 
 		widget = GTK_WIDGET (slot->content_view);
@@ -604,6 +617,8 @@ nautilus_window_slot_set_content_view_widget (NautilusWindowSlot *slot,
 		slot->content_view = new_view;
 		g_object_ref (slot->content_view);
 
+		g_signal_connect (new_view, "end_loading", G_CALLBACK (view_end_loading_cb), slot);
+
 		/* connect new view */
 		nautilus_window_connect_content_view (window, new_view);
 	}
diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h
index 89a8559..f4a7e90 100644
--- a/src/nautilus-window-slot.h
+++ b/src/nautilus-window-slot.h
@@ -109,6 +109,8 @@ struct NautilusWindowSlot {
 	gpointer open_callback_user_data;
 	gboolean load_with_search;
 
+	gboolean needs_reload;
+
 	GCancellable *find_mount_cancellable;
 
 	gboolean visible;
@@ -136,7 +138,8 @@ gboolean nautilus_window_slot_handle_event       	   (NautilusWindowSlot *slot,
 GFile * nautilus_window_slot_get_location		   (NautilusWindowSlot *slot);
 char *  nautilus_window_slot_get_location_uri		   (NautilusWindowSlot *slot);
 
-void    nautilus_window_slot_reload			   (NautilusWindowSlot *slot);
+void    nautilus_window_slot_queue_reload		   (NautilusWindowSlot *slot);
+void    nautilus_window_slot_force_reload		   (NautilusWindowSlot *slot);
 
 /* convenience wrapper without selection and callback/user_data */
 #define nautilus_window_slot_open_location(slot, location, flags)\



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]