[PATCH] Open spatial folder window from browser window



Hi,

currently it's not possible to open a spatial folder window from a
browser window, while it's possible the other way round. Drilling down a
directory structure in a browser window and then opening a spatial
folder window does make sense, though, in my opinion.

The attached patch against svn trunk adds a "Open Folder Window" menu
item to the File menu and appropriate context menus, it also changes
"Open in New Window" to "Browse in New Window" to make the difference
between the two menu items more clear. These changes are only visible if
"Always open in browser windows" is disabled, as we never want to open
spatial folder windows when that option is enabled.

I'd also like to add a toolbar button to open a spatial window but that
might be too prominent, so I've omitted it from this patch. However it
would only be visible for people that already use both, spatial and
browser windows, and these users might actually be interested in that
feature.

If the patch looks essentially fine, I'll port it to the gio-branch.

Jürg
-- 
Jürg Billeter <j bitron ch>
Index: src/nautilus-navigation-window-ui.xml
===================================================================
--- src/nautilus-navigation-window-ui.xml	(revision 13402)
+++ src/nautilus-navigation-window-ui.xml	(working copy)
@@ -3,6 +3,7 @@
 	<menu action="File">
 		<placeholder name="New Items Placeholder">
 			<menuitem name="New Window" action="New Window"/>
+			<menuitem name="Folder Window" action="Folder Window"/>
 		</placeholder>
 		
 		<placeholder name="Close Items Placeholder">
Index: src/nautilus-window-private.h
===================================================================
--- src/nautilus-window-private.h	(revision 13402)
+++ src/nautilus-window-private.h	(working copy)
@@ -220,6 +220,7 @@
 
 void               nautilus_navigation_window_remove_bookmarks_menu_items           (NautilusNavigationWindow    *window);
 void               nautilus_navigation_window_update_show_hide_menu_items           (NautilusNavigationWindow     *window);
+void               nautilus_navigation_window_update_spatial_menu_item              (NautilusNavigationWindow     *window);
 void               nautilus_navigation_window_remove_go_menu_callback    (NautilusNavigationWindow    *window);
 void               nautilus_navigation_window_remove_go_menu_items       (NautilusNavigationWindow    *window);
 
Index: src/nautilus-navigation-window-menus.c
===================================================================
--- src/nautilus-navigation-window-menus.c	(revision 13402)
+++ src/nautilus-navigation-window-menus.c	(working copy)
@@ -56,6 +56,7 @@
 #include <libgnomevfs/gnome-vfs-utils.h>
 #include <libgnomevfs/gnome-vfs-ops.h>
 #include <libnautilus-private/nautilus-file-utilities.h>
+#include <libnautilus-private/nautilus-global-preferences.h>
 #include <libnautilus-private/nautilus-ui-utilities.h>
 #include <libnautilus-private/nautilus-icon-factory.h>
 #include <libnautilus-private/nautilus-undo-manager.h>
@@ -234,6 +235,19 @@
 				      nautilus_navigation_window_status_bar_showing (window));
 }
 
+void
+nautilus_navigation_window_update_spatial_menu_item (NautilusNavigationWindow *window) 
+{
+	GtkAction *action;
+
+	g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window));
+
+	action = gtk_action_group_get_action (window->details->navigation_action_group,
+					      NAUTILUS_ACTION_FOLDER_WINDOW);
+	gtk_action_set_visible (action,
+				!eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER));
+}
+
 static void
 action_add_bookmark_callback (GtkAction *action,
 			      gpointer user_data)
@@ -421,6 +435,24 @@
 }
 
 static void
+action_folder_window_callback (GtkAction *action,
+			       gpointer user_data)
+{
+	NautilusWindow *current_window;
+	char *current_location;
+
+	current_window = NAUTILUS_WINDOW (user_data);
+	current_location = nautilus_window_get_location (current_window);
+	nautilus_application_present_spatial_window (
+			current_window->application,
+			current_window,
+			NULL,
+			current_location,
+			gtk_window_get_screen (GTK_WINDOW (current_window)));
+	g_free (current_location);
+}
+
+static void
 action_go_to_location_callback (GtkAction *action,
 				gpointer user_data)
 {
@@ -445,9 +477,12 @@
 static const GtkActionEntry navigation_entries[] = {
   { "Go", NULL, N_("_Go") },               /* name, stock id, label */
   { "Bookmarks", NULL, N_("_Bookmarks") },               /* name, stock id, label */
-  { "New Window", "window-new", N_("Open New _Window"),               /* name, stock id, label */
+  { "New Window", "window-new", N_("New _Window"),               /* name, stock id, label */
     "<control>N", N_("Open another Nautilus window for the displayed location"),
     G_CALLBACK (action_new_window_callback) },
+  { "Folder Window", "folder", N_("Open Folder W_indow"),               /* name, stock id, label */
+    NULL, N_("Open a Nautilus folder window for the displayed location"),
+    G_CALLBACK (action_folder_window_callback) },
   { "Close All Windows", NULL, N_("Close _All Windows"),               /* name, stock id, label */
     "<control><shift>W", N_("Close all Navigation windows"),
     G_CALLBACK (action_close_all_windows_callback) },
@@ -572,6 +607,7 @@
 	gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, NULL);
 
 	nautilus_navigation_window_update_show_hide_menu_items (window);
+	nautilus_navigation_window_update_spatial_menu_item (window);
 
         nautilus_navigation_window_initialize_go_menu (window);
 }
Index: src/nautilus-navigation-window.c
===================================================================
--- src/nautilus-navigation-window.c	(revision 13402)
+++ src/nautilus-navigation-window.c	(working copy)
@@ -122,6 +122,7 @@
 						      const char               *uri,
 						      NautilusNavigationWindow *window);
 static void always_use_location_entry_changed        (gpointer                  callback_data);
+static void always_use_browser_changed               (gpointer                  callback_data);
 
 static void nautilus_navigation_window_set_bar_mode  (NautilusNavigationWindow *window, 
 						      NautilusBarMode           mode);
@@ -358,6 +359,10 @@
 	eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY,
 						  always_use_location_entry_changed,
 						  window, G_OBJECT (window));
+
+	eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER,
+						  always_use_browser_changed,
+						  window, G_OBJECT (window));
 }
 
 static void
@@ -385,6 +390,16 @@
 					   window);
 }
 
+static void
+always_use_browser_changed (gpointer callback_data)
+{
+	NautilusNavigationWindow *window;
+
+	window = NAUTILUS_NAVIGATION_WINDOW (callback_data);
+
+	nautilus_navigation_window_update_spatial_menu_item (window);
+}
+
 static int
 bookmark_list_get_uri_index (GList *list,
 			     const char *uri)
Index: src/file-manager/nautilus-directory-view-ui.xml
===================================================================
--- src/file-manager/nautilus-directory-view-ui.xml	(revision 13402)
+++ src/file-manager/nautilus-directory-view-ui.xml	(working copy)
@@ -116,6 +116,7 @@
 	<placeholder name="Open Placeholder">
 		<menuitem name="Open" action="Open"/>
 		<menuitem name="OpenAlternate" action="OpenAlternate"/>
+		<menuitem name="OpenFolderWindow" action="OpenFolderWindow"/>
 		<separator name="applications separator"/>
 		<placeholder name="Applications Placeholder"/>
 		<menu action="Open With">
@@ -167,6 +168,7 @@
 <popup name="location">
 	<placeholder name="Open Placeholder">
 		<menuitem name="LocationOpenAlternate" action="LocationOpenAlternate"/>
+		<menuitem name="LocationOpenFolderWindow" action="LocationOpenFolderWindow"/>
 	</placeholder>
 	<separator/>
 	<placeholder name="Clipboard Actions">
Index: src/file-manager/fm-actions.h
===================================================================
--- src/file-manager/fm-actions.h	(revision 13402)
+++ src/file-manager/fm-actions.h	(working copy)
@@ -27,7 +27,9 @@
 
 #define FM_ACTION_OPEN "Open"
 #define FM_ACTION_OPEN_ALTERNATE "OpenAlternate"
+#define FM_ACTION_OPEN_FOLDER_WINDOW "OpenFolderWindow"
 #define FM_ACTION_LOCATION_OPEN_ALTERNATE "LocationOpenAlternate"
+#define FM_ACTION_LOCATION_OPEN_FOLDER_WINDOW "LocationOpenFolderWindow"
 #define FM_ACTION_OTHER_APPLICATION1 "OtherApplication1"
 #define FM_ACTION_OTHER_APPLICATION2 "OtherApplication2"
 #define FM_ACTION_NEW_FOLDER "New Folder"
Index: src/file-manager/fm-directory-view.c
===================================================================
--- src/file-manager/fm-directory-view.c	(revision 13402)
+++ src/file-manager/fm-directory-view.c	(working copy)
@@ -354,6 +354,8 @@
 								FMDirectoryView      *view);
 static void     open_one_in_new_window                         (gpointer              data,
 								gpointer              callback_data);
+static void     open_one_in_folder_window                      (gpointer              data,
+								gpointer              callback_data);
 static void     schedule_update_menus                          (FMDirectoryView      *view);
 static void     schedule_update_menus_callback                 (gpointer              callback_data);
 static void     remove_update_menus_timeout_callback           (FMDirectoryView      *view);
@@ -423,6 +425,8 @@
 
 static void action_location_open_alternate_callback (GtkAction *action,
 						     gpointer   callback_data);
+static void action_location_open_folder_window_callback (GtkAction *action,
+							 gpointer   callback_data);
 
 static void action_location_cut_callback            (GtkAction *action,
 						     gpointer   callback_data);
@@ -767,6 +771,23 @@
 }
 
 static void
+action_open_folder_window_callback (GtkAction *action,
+				    gpointer callback_data)
+{
+	FMDirectoryView *view;
+	GList *selection;
+
+	view = FM_DIRECTORY_VIEW (callback_data);
+	selection = fm_directory_view_get_selection (view);
+
+	if (fm_directory_view_confirm_multiple_windows (view, g_list_length (selection))) {
+		g_list_foreach (selection, open_one_in_folder_window, view);
+	}
+
+	nautilus_file_list_free (selection);
+}
+
+static void
 fm_directory_view_launch_application (GnomeVFSMimeApplication *application,
 				      GList *files,
 				      FMDirectoryView *directory_view)
@@ -4338,6 +4359,18 @@
 					 0);
 }
 
+static void
+open_one_in_folder_window (gpointer data, gpointer callback_data)
+{
+	g_assert (NAUTILUS_IS_FILE (data));
+	g_assert (FM_IS_DIRECTORY_VIEW (callback_data));
+
+	fm_directory_view_activate_file (FM_DIRECTORY_VIEW (callback_data),
+					 NAUTILUS_FILE (data),
+					 NAUTILUS_WINDOW_OPEN_IN_SPATIAL,
+					 0);
+}
+
 NautilusFile *
 fm_directory_view_get_directory_as_file (FMDirectoryView *view)
 {
@@ -6763,6 +6796,24 @@
 }
 
 static void
+action_location_open_folder_window_callback (GtkAction *action,
+					     gpointer   callback_data)
+{
+	FMDirectoryView *view;
+	NautilusFile *file;
+
+	view = FM_DIRECTORY_VIEW (callback_data);
+
+	file = view->details->directory_as_file;
+	g_return_if_fail (file != NULL);
+
+	fm_directory_view_activate_file (view,
+					 file,
+					 NAUTILUS_WINDOW_OPEN_IN_SPATIAL,
+					 0);
+}
+
+static void
 action_location_cut_callback (GtkAction *action,
 			      gpointer   callback_data)
 {
@@ -6929,6 +6980,10 @@
     N_("Open in Navigation Window"), "<control><shift>o",                /* label, accelerator */
     N_("Open each selected item in a navigation window"),                   /* tooltip */ 
     G_CALLBACK (action_open_alternate_callback) },
+  { "OpenFolderWindow", NULL,                  /* name, stock id */
+    N_("Open in Folder Window"), NULL,                /* label, accelerator */
+    N_("Open each selected item in a folder window"),                   /* tooltip */ 
+    G_CALLBACK (action_open_folder_window_callback) },
   { "OtherApplication1", NULL,                  /* name, stock id */
     N_("Open with Other _Application..."), NULL,                /* label, accelerator */
     N_("Choose another application with which to open the selected item"),                   /* tooltip */ 
@@ -7054,6 +7109,11 @@
     N_("Open this folder in a navigation window"),                   /* tooltip */ 
     G_CALLBACK (action_location_open_alternate_callback) },
 
+  { FM_ACTION_LOCATION_OPEN_FOLDER_WINDOW, NULL,                  /* name, stock id */
+    N_("Open in Folder Window"), "",                /* label, accelerator */
+    N_("Open this folder in a folder window"),                   /* tooltip */ 
+    G_CALLBACK (action_location_open_folder_window_callback) },
+
   { FM_ACTION_LOCATION_CUT, GTK_STOCK_CUT,                  /* name, stock id */
     NULL, "",                /* label, accelerator */
     N_("Prepare this folder to be moved with a Paste command"),                   /* tooltip */ 
@@ -7619,11 +7679,18 @@
 	gboolean is_read_only;
 	gboolean can_delete_file;
 	gboolean show_separate_delete_command;
+	gboolean show_open_folder_window;
 	char *label;
 	char *tip;
 
+	show_open_folder_window = FALSE;
 	if (nautilus_window_info_get_window_type (view->details->window) == NAUTILUS_WINDOW_NAVIGATION) {
-		label = _("Open in New Window");
+		if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER)) {
+			label = _("Open in New Window");
+		} else {
+			label = _("Browse in New Window");
+			show_open_folder_window = TRUE;
+		}
 	} else {
 		label = g_strdup (ngettext ("_Browse Folder",
 					    "_Browse Folders", 1));
@@ -7634,6 +7701,10 @@
 		      "label", label,
 		      NULL);
 
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_OPEN_FOLDER_WINDOW);
+	gtk_action_set_visible (action, show_open_folder_window);
+
 	file = view->details->directory_as_file;
 	is_special_link = NAUTILUS_IS_DESKTOP_ICON_FILE (file);
 	is_desktop_or_home_dir = nautilus_file_is_home (file)
@@ -7716,6 +7787,7 @@
 	gboolean show_save_search;
 	gboolean save_search_sensitive;
 	gboolean show_save_search_as;
+	gboolean show_open_folder_window;
 	ActivationAction activation_action;
 	GtkAction *action;
 	GnomeVFSMimeApplication *app;
@@ -7804,14 +7876,28 @@
 	g_free (label_with_underscore);
 
 	show_open_alternate = file_list_all_are_folders (selection);
+	show_open_folder_window = FALSE;
 	if (nautilus_window_info_get_window_type (view->details->window) == NAUTILUS_WINDOW_NAVIGATION) {
-		if (selection_count == 0 || selection_count == 1) {
-			label_with_underscore = g_strdup (_("Open in New Window"));
+		if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER)) {
+			if (selection_count == 0 || selection_count == 1) {
+				label_with_underscore = g_strdup (_("Open in New Window"));
+			} else {
+				label_with_underscore = g_strdup_printf (ngettext("Open in %d New Window",
+										  "Open in %d New Windows",
+										  selection_count), 
+									 selection_count);
+			}
+			gtk_action_set_visible (action, FALSE);
 		} else {
-			label_with_underscore = g_strdup_printf (ngettext("Open in %d New Window",
-									  "Open in %d New Windows",
-									  selection_count), 
-								 selection_count);
+			if (selection_count == 0 || selection_count == 1) {
+				label_with_underscore = g_strdup (_("Browse in New Window"));
+			} else {
+				label_with_underscore = g_strdup_printf (ngettext("Browse in %d New Window",
+										  "Browse in %d New Windows",
+										  selection_count), 
+									 selection_count);
+			}
+			show_open_folder_window = show_open_alternate;
 		}
 	} else {
 		label_with_underscore = g_strdup (ngettext ("_Browse Folder",
@@ -7825,6 +7911,10 @@
 		      label_with_underscore,
 		      NULL);
 	g_free (label_with_underscore);
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_OPEN_FOLDER_WINDOW);
+	gtk_action_set_visible (action, show_open_folder_window);
 	
 	gtk_action_set_sensitive (action,  selection_count != 0);
 	gtk_action_set_visible (action, show_open_alternate);
Index: src/nautilus-actions.h
===================================================================
--- src/nautilus-actions.h	(revision 13402)
+++ src/nautilus-actions.h	(working copy)
@@ -48,5 +48,6 @@
 #define NAUTILUS_ACTION_ZOOM_NORMAL "Zoom Normal"
 #define NAUTILUS_ACTION_CLOSE "Close"
 #define NAUTILUS_ACTION_SEARCH "Search"
+#define NAUTILUS_ACTION_FOLDER_WINDOW "Folder Window"
 
 #endif /* NAUTILUS_ACTIONS_H */


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