summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-29 14:54:37 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-29 15:16:45 -0400
commitbde82c2791a2fa7bac2f2384b033bebb4d9710a9 (patch)
tree5d573fe59f9cbf486c418a5fb94ee87bd1311fbb
parent9f0c145a2923647c6b88a9d0136287c85b618b1c (diff)
downloadnautilus-bde82c2791a2fa7bac2f2384b033bebb4d9710a9.tar.gz
slot: rework query editor visible state synchronization
Fix a case where entering a directory from the search results would not take the query editor down, and refactor some code around the state synchronization between the two objects.
-rw-r--r--src/nautilus-window-manage-views.c17
-rw-r--r--src/nautilus-window-private.h3
-rw-r--r--src/nautilus-window-slot.c44
-rw-r--r--src/nautilus-window-slot.h5
-rw-r--r--src/nautilus-window.c60
5 files changed, 58 insertions, 71 deletions
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index 80d367742..5cc81919e 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -1050,9 +1050,20 @@ create_content_view (NautilusWindowSlot *slot,
}
if (NAUTILUS_IS_SEARCH_DIRECTORY (old_directory) &&
- !NAUTILUS_IS_SEARCH_DIRECTORY (new_directory) &&
- slot->pending_selection == NULL) {
- slot->pending_selection = nautilus_view_get_selection (slot->content_view);
+ !NAUTILUS_IS_SEARCH_DIRECTORY (new_directory)) {
+ /* Reset the search_visible state when going out of a search directory,
+ * before nautilus_window_slot_sync_search_widgets() is called
+ * if we're not being loaded with search visible.
+ */
+ if (!slot->load_with_search) {
+ slot->search_visible = FALSE;
+ }
+
+ slot->load_with_search = FALSE;
+
+ if (slot->pending_selection == NULL) {
+ slot->pending_selection = nautilus_view_get_selection (slot->content_view);
+ }
}
/* Actually load the pending location and selection: */
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index 94d622055..b35db8af7 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -116,9 +116,6 @@ void nautilus_window_sync_zoom_widgets (NautilusWindow *window);
void nautilus_window_sync_up_button (NautilusWindow *window);
void nautilus_window_sync_view_as_menus (NautilusWindow *window);
-void nautilus_window_set_search_action_active (NautilusWindow *window,
- gboolean active);
-
void nautilus_window_set_search_visible (NautilusWindow *window,
gboolean visible);
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 44c758d00..ec8a4c4eb 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -97,8 +97,9 @@ sync_search_directory (NautilusWindowSlot *slot)
text = nautilus_query_get_text (query);
if (!strlen (text)) {
- location = nautilus_query_editor_get_location (slot->query_editor);
+ /* Prevent the location change from hiding the query editor in this case */
slot->load_with_search = TRUE;
+ location = nautilus_query_editor_get_location (slot->query_editor);
nautilus_window_slot_open_location (slot, location, 0);
g_object_unref (location);
} else {
@@ -141,7 +142,7 @@ static void
query_editor_cancel_callback (NautilusQueryEditor *editor,
NautilusWindowSlot *slot)
{
- nautilus_window_set_search_action_active (slot->details->window, FALSE);
+ nautilus_window_slot_set_search_visible (slot, FALSE);
}
static void
@@ -205,16 +206,10 @@ show_query_editor (NautilusWindowSlot *slot)
NautilusSearchDirectory *search_directory;
GFile *location;
- /* This might be called while we're still loading the location.
- * In such a case, just set slot->load_with_search to TRUE, to stop
- * nautilus_window_sync_search_widgets() from hiding it again when
- * loading has completed.
- */
if (slot->location) {
location = slot->location;
} else {
location = slot->pending_location;
- slot->load_with_search = TRUE;
}
directory = nautilus_directory_get (location);
@@ -252,14 +247,43 @@ show_query_editor (NautilusWindowSlot *slot)
}
void
-nautilus_window_slot_set_query_editor_visible (NautilusWindowSlot *slot,
- gboolean visible)
+nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
+ gboolean visible)
{
+ gboolean old_visible;
+ GFile *location;
+ GtkAction *action;
+
+ old_visible = slot->search_visible;
+ slot->search_visible = visible;
+
if (visible) {
show_query_editor (slot);
} else {
hide_query_editor (slot);
}
+
+ if (slot != nautilus_window_get_active_slot (slot->details->window)) {
+ return;
+ }
+
+ action = gtk_action_group_get_action (nautilus_window_get_main_action_group (slot->details->window),
+ NAUTILUS_ACTION_SEARCH);
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible);
+
+ if (!visible && old_visible) {
+ /* Use the location bar as the return location */
+ if (slot->query_editor != NULL) {
+ location = nautilus_query_editor_get_location (slot->query_editor);
+ /* Last try: use the home directory as the return location */
+ if (location == NULL) {
+ location = g_file_new_for_path (g_get_home_dir ());
+ }
+
+ nautilus_window_go_to (slot->details->window, location);
+ g_object_unref (location);
+ }
+ }
}
static void
diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h
index e0f787247..9d9643722 100644
--- a/src/nautilus-window-slot.h
+++ b/src/nautilus-window-slot.h
@@ -91,7 +91,7 @@ struct NautilusWindowSlot {
gulong qe_changed_id;
gulong qe_cancel_id;
gulong qe_activated_id;
- gboolean search_active;
+ gboolean search_visible;
/* New location. */
NautilusLocationChangeType location_change_type;
@@ -129,8 +129,9 @@ void nautilus_window_slot_set_window (NautilusWindowSlot *
NautilusWindow *window);
void nautilus_window_slot_update_title (NautilusWindowSlot *slot);
-void nautilus_window_slot_set_query_editor_visible (NautilusWindowSlot *slot,
+void nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
gboolean visible);
+
gboolean nautilus_window_slot_handle_event (NautilusWindowSlot *slot,
GdkEventKey *event);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 66145c603..74593429e 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -278,11 +278,11 @@ nautilus_window_set_search_visible (NautilusWindow *window,
if (visible) {
remember_focus_widget (window);
- nautilus_window_slot_set_query_editor_visible (slot, TRUE);
} else {
restore_focus_widget (window);
- nautilus_window_slot_set_query_editor_visible (slot, FALSE);
}
+
+ nautilus_window_slot_set_search_visible (slot, visible);
}
static void
@@ -656,68 +656,22 @@ nautilus_window_slot_close (NautilusWindow *window,
}
}
-static void
-toggle_toolbar_search_button (NautilusWindow *window,
- gboolean active)
-{
- GtkAction *action;
- NautilusWindowSlot *slot;
- gboolean old_active;
- GFile *location;
-
- slot = nautilus_window_get_active_slot (window);
- action = gtk_action_group_get_action (nautilus_window_get_main_action_group (window),
- NAUTILUS_ACTION_SEARCH);
-
- old_active = slot->search_active;
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
- slot->search_active = active;
-
- if (!active && old_active) {
- /* Use the location bar as the return location */
- if (slot->query_editor != NULL) {
- location = nautilus_query_editor_get_location (slot->query_editor);
- /* Last try: use the home directory as the return location */
- if (location == NULL) {
- location = g_file_new_for_path (g_get_home_dir ());
- }
-
- nautilus_window_go_to (window, location);
- g_object_unref (location);
- }
- }
-}
-
-void
-nautilus_window_set_search_action_active (NautilusWindow *window,
- gboolean active)
-{
- toggle_toolbar_search_button (window, active);
-}
-
void
nautilus_window_sync_search_widgets (NautilusWindow *window)
{
NautilusDirectory *directory;
- NautilusSearchDirectory *search_directory;
NautilusWindowSlot *slot;
+ gboolean visible;
- search_directory = NULL;
slot = window->details->active_slot;
+ visible = slot->search_visible;
directory = nautilus_directory_get (slot->location);
if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) {
- search_directory = NAUTILUS_SEARCH_DIRECTORY (directory);
- }
-
- if (search_directory != NULL || slot->load_with_search ||
- gtk_widget_get_visible (GTK_WIDGET (slot->query_editor))) {
- slot->load_with_search = FALSE;
- toggle_toolbar_search_button (window, TRUE);
- } else {
- toggle_toolbar_search_button (window, FALSE);
+ visible = TRUE;
}
+ nautilus_window_slot_set_search_visible (slot, visible);
nautilus_directory_unref (directory);
}
@@ -1564,7 +1518,7 @@ nautilus_window_key_press_event (GtkWidget *widget,
}
if (nautilus_window_slot_handle_event (window->details->active_slot, event)) {
- toggle_toolbar_search_button (window, TRUE);
+ nautilus_window_slot_set_search_visible (window->details->active_slot, TRUE);
return TRUE;
}