[nautilus] Select first item in search results by default



commit 50711e28ba4d4c971a812a0bdef0c30516141f4e
Author: William Jon McCann <jmccann redhat com>
Date:   Tue Aug 7 12:45:44 2012 -0400

    Select first item in search results by default

 libnautilus-private/nautilus-canvas-container.c |   25 +++++++++++++
 libnautilus-private/nautilus-canvas-container.h |    3 ++
 src/nautilus-canvas-view.c                      |   12 ++++++
 src/nautilus-list-view.c                        |   14 +++++++
 src/nautilus-query-editor.c                     |   17 ++++++---
 src/nautilus-query-editor.h                     |    9 +++--
 src/nautilus-view.c                             |   43 +++++++++++++++++-----
 src/nautilus-view.h                             |    5 +++
 src/nautilus-window-slot.c                      |   14 +++++++
 src/nautilus-window-slot.h                      |    1 +
 10 files changed, 123 insertions(+), 20 deletions(-)
---
diff --git a/libnautilus-private/nautilus-canvas-container.c b/libnautilus-private/nautilus-canvas-container.c
index 57918c3..1718379 100644
--- a/libnautilus-private/nautilus-canvas-container.c
+++ b/libnautilus-private/nautilus-canvas-container.c
@@ -6779,6 +6779,31 @@ nautilus_canvas_container_select_all (NautilusCanvasContainer *container)
 }
 
 /**
+ * nautilus_canvas_container_select_first:
+ * @container: An canvas container widget.
+ * 
+ * Select the first icon in @container.
+ **/
+void
+nautilus_canvas_container_select_first (NautilusCanvasContainer *container)
+{
+	gboolean selection_changed;
+	NautilusCanvasIcon *icon;
+
+	g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container));
+
+	selection_changed = FALSE;
+
+	icon = g_list_nth_data (container->details->icons, 0);
+	selection_changed |= icon_set_selected (container, icon, TRUE);
+
+	if (selection_changed) {
+		g_signal_emit (container,
+			       signals[SELECTION_CHANGED], 0);
+	}
+}
+
+/**
  * nautilus_canvas_container_set_selection:
  * @container: An canvas container widget.
  * @selection: A list of NautilusCanvasIconData *.
diff --git a/libnautilus-private/nautilus-canvas-container.h b/libnautilus-private/nautilus-canvas-container.h
index 5e553ea..ba2fe80 100644
--- a/libnautilus-private/nautilus-canvas-container.h
+++ b/libnautilus-private/nautilus-canvas-container.h
@@ -291,6 +291,9 @@ void              nautilus_canvas_container_unselect_all                  (Nauti
 void              nautilus_canvas_container_select_all                    (NautilusCanvasContainer  *view);
 
 
+void              nautilus_canvas_container_select_first                  (NautilusCanvasContainer  *view);
+
+
 /* operations on the selection */
 GList     *       nautilus_canvas_container_get_selection                 (NautilusCanvasContainer  *view);
 void			  nautilus_canvas_container_invert_selection				(NautilusCanvasContainer  *view);
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index 6698ba1..5da58a7 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -1443,6 +1443,17 @@ nautilus_canvas_view_select_all (NautilusView *view)
 }
 
 static void
+nautilus_canvas_view_select_first (NautilusView *view)
+{
+	NautilusCanvasContainer *canvas_container;
+
+	g_return_if_fail (NAUTILUS_IS_CANVAS_VIEW (view));
+
+	canvas_container = get_canvas_container (NAUTILUS_CANVAS_VIEW (view));
+        nautilus_canvas_container_select_first (canvas_container);
+}
+
+static void
 nautilus_canvas_view_reveal_selection (NautilusView *view)
 {
 	GList *selection;
@@ -2314,6 +2325,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass)
 	nautilus_view_class->restore_default_zoom_level = nautilus_canvas_view_restore_default_zoom_level;
 	nautilus_view_class->reveal_selection = nautilus_canvas_view_reveal_selection;
 	nautilus_view_class->select_all = nautilus_canvas_view_select_all;
+	nautilus_view_class->select_first = nautilus_canvas_view_select_first;
 	nautilus_view_class->set_selection = nautilus_canvas_view_set_selection;
 	nautilus_view_class->invert_selection = nautilus_canvas_view_invert_selection;
 	nautilus_view_class->compare_files = compare_files;
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index a0be4f9..cc4426a 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -2410,6 +2410,19 @@ nautilus_list_view_select_all (NautilusView *view)
 }
 
 static void
+nautilus_list_view_select_first (NautilusView *view)
+{
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+
+	if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (NAUTILUS_LIST_VIEW (view)->details->model), &iter)) {
+		return;
+	}
+	selection = gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view);
+	gtk_tree_selection_select_iter (selection, &iter);
+}
+
+static void
 column_editor_response_callback (GtkWidget *dialog, 
 				 int response_id,
 				 gpointer user_data)
@@ -3223,6 +3236,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class)
 	nautilus_view_class->restore_default_zoom_level = nautilus_list_view_restore_default_zoom_level;
 	nautilus_view_class->reveal_selection = nautilus_list_view_reveal_selection;
 	nautilus_view_class->select_all = nautilus_list_view_select_all;
+	nautilus_view_class->select_first = nautilus_list_view_select_first;
 	nautilus_view_class->set_selection = nautilus_list_view_set_selection;
 	nautilus_view_class->invert_selection = nautilus_list_view_invert_selection;
 	nautilus_view_class->compare_files = nautilus_list_view_compare_files;
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c
index 1570279..60ce749 100644
--- a/src/nautilus-query-editor.c
+++ b/src/nautilus-query-editor.c
@@ -78,6 +78,7 @@ struct NautilusQueryEditorDetails {
 };
 
 enum {
+	ACTIVATED,
 	CHANGED,
 	CANCEL,
 	LAST_SIGNAL
@@ -297,6 +298,15 @@ nautilus_query_editor_class_init (NautilusQueryEditorClass *class)
 		              g_cclosure_marshal_VOID__VOID,
 		              G_TYPE_NONE, 0);
 
+	signals[ACTIVATED] =
+		g_signal_new ("activated",
+		              G_TYPE_FROM_CLASS (class),
+		              G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+		              G_STRUCT_OFFSET (NautilusQueryEditorClass, activated),
+		              NULL, NULL,
+		              g_cclosure_marshal_VOID__VOID,
+		              G_TYPE_NONE, 0);
+
 	binding_set = gtk_binding_set_by_class (class);
 	gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "cancel", 0);
 
@@ -315,12 +325,7 @@ nautilus_query_editor_get_location (NautilusQueryEditor *editor)
 static void
 entry_activate_cb (GtkWidget *entry, NautilusQueryEditor *editor)
 {
-	if (editor->details->typing_timeout_id > 0) {
-		g_source_remove (editor->details->typing_timeout_id);
-		editor->details->typing_timeout_id = 0;
-	}
-
-	nautilus_query_editor_changed_force (editor, TRUE);
+	g_signal_emit (editor, signals[ACTIVATED], 0);
 }
 
 static gboolean
diff --git a/src/nautilus-query-editor.h b/src/nautilus-query-editor.h
index d2e30f3..f394143 100644
--- a/src/nautilus-query-editor.h
+++ b/src/nautilus-query-editor.h
@@ -50,10 +50,11 @@ typedef struct NautilusQueryEditor {
 typedef struct {
 	GtkBoxClass parent_class;
 
-	void (* changed) (NautilusQueryEditor  *editor,
-			  NautilusQuery        *query,
-			  gboolean              reload);
-	void (* cancel)   (NautilusQueryEditor *editor);
+	void (* changed)   (NautilusQueryEditor  *editor,
+			    NautilusQuery        *query,
+			    gboolean              reload);
+	void (* cancel)    (NautilusQueryEditor *editor);
+	void (* activated) (NautilusQueryEditor *editor);
 } NautilusQueryEditorClass;
 
 #include "nautilus-window-slot.h"
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 47c6a7a..1a7f091 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -399,6 +399,14 @@ nautilus_view_select_all (NautilusView *view)
 }
 
 static void
+nautilus_view_select_first (NautilusView *view)
+{
+	g_return_if_fail (NAUTILUS_IS_VIEW (view));
+
+	NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->select_first (view);
+}
+
+static void
 nautilus_view_call_set_selection (NautilusView *view, GList *selection)
 {
 	g_return_if_fail (NAUTILUS_IS_VIEW (view));
@@ -1044,6 +1052,19 @@ nautilus_view_preview_files (NautilusView *view,
 }
 
 void
+nautilus_view_activate_selection (NautilusView *view)
+{
+	GList *selection;
+
+	selection = nautilus_view_get_selection (view);
+	nautilus_view_activate_files (view,
+				      selection,
+				      0,
+				      TRUE);
+	nautilus_file_list_free (selection);
+}
+
+void
 nautilus_view_activate_files (NautilusView *view,
 			      GList *files,
 			      NautilusWindowOpenFlags flags,
@@ -1083,17 +1104,10 @@ static void
 action_open_callback (GtkAction *action,
 		      gpointer callback_data)
 {
-	GList *selection;
 	NautilusView *view;
 
 	view = NAUTILUS_VIEW (callback_data);
-
-	selection = nautilus_view_get_selection (view);
-	nautilus_view_activate_files (view,
-				      selection,
-				      0,
-				      TRUE);
-	nautilus_file_list_free (selection);
+	nautilus_view_activate_selection (view);
 }
 
 static void
@@ -3114,6 +3128,7 @@ done_loading (NautilusView *view,
 	      gboolean all_files_seen)
 {
 	GList *selection;
+	gboolean do_reveal = FALSE;
 
 	if (!view->details->loading) {
 		return;
@@ -3132,13 +3147,22 @@ done_loading (NautilusView *view,
 		reset_update_interval (view);
 
 		selection = view->details->pending_selection;
-		if (selection != NULL && all_files_seen) {
+
+		if (NAUTILUS_IS_SEARCH_DIRECTORY (view->details->model)
+		    && all_files_seen) {
+			nautilus_view_select_first (view);
+			do_reveal = TRUE;
+		} else if (selection != NULL && all_files_seen) {
 			view->details->pending_selection = NULL;
 
 			view->details->selection_change_is_due_to_shell = TRUE;
 			nautilus_view_call_set_selection (view, selection);
 			view->details->selection_change_is_due_to_shell = FALSE;
+			g_list_free_full (selection, g_object_unref);
+			do_reveal = TRUE;
+		}
 
+		if (do_reveal) {
 			if (NAUTILUS_IS_LIST_VIEW (view)) {
 				/* HACK: We should be able to directly call reveal_selection here,
 				 * but at this point the GtkTreeView hasn't allocated the new nodes
@@ -3156,7 +3180,6 @@ done_loading (NautilusView *view,
 				nautilus_view_reveal_selection (view);
 			}
 		}
-		g_list_free_full (selection, g_object_unref);
 		nautilus_view_display_selection_info (view);
 	}
 
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 9ba3f96..ccb9821 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -169,6 +169,10 @@ struct NautilusViewClass {
          * select all of the items in the view */
         void     (* select_all)	         	(NautilusView *view);
 
+        /* select_first is a function pointer that subclasses must override to
+         * select the first item in the view */
+        void     (* select_first)	      	(NautilusView *view);
+
         /* set_selection is a function pointer that subclasses must
          * override to select the specified items (and unselect all
          * others). The argument is a list of NautilusFiles. */
@@ -379,6 +383,7 @@ void              nautilus_view_new_file_with_initial_contents (NautilusView *vi
 								GdkPoint *pos);
 
 /* selection handling */
+void              nautilus_view_activate_selection         (NautilusView      *view);
 int               nautilus_view_get_selection_count        (NautilusView      *view);
 GList *           nautilus_view_get_selection              (NautilusView      *view);
 void              nautilus_view_set_selection              (NautilusView      *view,
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index f054e3e..8cd1495 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -141,6 +141,15 @@ query_editor_cancel_callback (NautilusQueryEditor *editor,
 }
 
 static void
+query_editor_activated_callback (NautilusQueryEditor *editor,
+				 NautilusWindowSlot *slot)
+{
+	if (slot->content_view != NULL) {
+		nautilus_view_activate_selection (slot->content_view);
+	}
+}
+
+static void
 query_editor_changed_callback (NautilusQueryEditor *editor,
 			       NautilusQuery *query,
 			       gboolean reload,
@@ -212,6 +221,9 @@ nautilus_window_slot_set_query_editor_visible (NautilusWindowSlot *slot,
 		if (slot->qe_cancel_id == 0)
 			slot->qe_cancel_id = g_signal_connect (slot->query_editor, "cancel",
 							       G_CALLBACK (query_editor_cancel_callback), slot);
+		if (slot->qe_activated_id == 0)
+			slot->qe_activated_id = g_signal_connect (slot->query_editor, "activated",
+							       G_CALLBACK (query_editor_activated_callback), slot);
 
 	} else {
 		gtk_widget_hide (GTK_WIDGET (slot->query_editor));
@@ -219,6 +231,8 @@ nautilus_window_slot_set_query_editor_visible (NautilusWindowSlot *slot,
 		slot->qe_changed_id = 0;
 		g_signal_handler_disconnect (slot->query_editor, slot->qe_cancel_id);
 		slot->qe_cancel_id = 0;
+		g_signal_handler_disconnect (slot->query_editor, slot->qe_activated_id);
+		slot->qe_activated_id = 0;
 		nautilus_query_editor_set_query (slot->query_editor, NULL);
 	}
 }
diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h
index b72f812..8be2f8c 100644
--- a/src/nautilus-window-slot.h
+++ b/src/nautilus-window-slot.h
@@ -92,6 +92,7 @@ struct NautilusWindowSlot {
 	NautilusQueryEditor *query_editor;
 	gulong qe_changed_id;
 	gulong qe_cancel_id;
+	gulong qe_activated_id;
 
 	/* New location. */
 	NautilusLocationChangeType location_change_type;



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