[nautilus] Add view options directly to the toolbar



commit 37a2fc4fc0080578cb318bb1918c293064911c11
Author: William Jon McCann <jmccann redhat com>
Date:   Wed Aug 8 08:14:06 2012 -0400

    Add view options directly to the toolbar
    
    Instead of having them buried in the menus.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=680985

 src/nautilus-actions.h             |    2 +
 src/nautilus-shell-ui.xml          |    4 -
 src/nautilus-toolbar.c             |   21 +++-
 src/nautilus-window-manage-views.c |    4 +-
 src/nautilus-window-menus.c        |   25 +++
 src/nautilus-window-private.h      |   10 +-
 src/nautilus-window-slot.c         |    2 +-
 src/nautilus-window.c              |  299 +++++++-----------------------------
 8 files changed, 107 insertions(+), 260 deletions(-)
---
diff --git a/src/nautilus-actions.h b/src/nautilus-actions.h
index 9e49a27..4ef389a 100644
--- a/src/nautilus-actions.h
+++ b/src/nautilus-actions.h
@@ -48,6 +48,8 @@
 #define NAUTILUS_ACTION_CLOSE "Close"
 #define NAUTILUS_ACTION_CLOSE_ALL_WINDOWS "Close All Windows"
 #define NAUTILUS_ACTION_SEARCH "Search"
+#define NAUTILUS_ACTION_VIEW_LIST "View List"
+#define NAUTILUS_ACTION_VIEW_GRID "View Grid"
 #define NAUTILUS_ACTION_FOLDER_WINDOW "Folder Window"
 #define NAUTILUS_ACTION_NEW_TAB "New Tab"
 #define NAUTILUS_ACTION_NEW_WINDOW "New Window"
diff --git a/src/nautilus-shell-ui.xml b/src/nautilus-shell-ui.xml
index 8c469eb..803a417 100644
--- a/src/nautilus-shell-ui.xml
+++ b/src/nautilus-shell-ui.xml
@@ -56,10 +56,6 @@
       <menuitem name="Zoom Out" action="Zoom Out"/>
       <menuitem name="Zoom Normal" action="Zoom Normal"/>
     </placeholder>
-    <placeholder name="View Choices">
-      <separator name="Before Short List"/>
-      <placeholder name="Short List"/>
-    </placeholder>
   </menu>
   <menu action="Bookmarks">
     <menuitem name="Add Bookmark" action="Add Bookmark"/>
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 3268c1d..87cab0d 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -200,6 +200,25 @@ nautilus_toolbar_constructed (GObject *obj)
 	gtk_widget_show_all (GTK_WIDGET (tool_item));
 	gtk_widget_set_margin_left (GTK_WIDGET (tool_item), 12);
 
+	/* View buttons */
+	tool_item = gtk_tool_item_new ();
+	box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+	tool_button = toolbar_create_toolbutton (self, FALSE, TRUE, NAUTILUS_ACTION_VIEW_LIST);
+	gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (tool_button));
+	tool_button = toolbar_create_toolbutton (self, FALSE, TRUE, NAUTILUS_ACTION_VIEW_GRID);
+	gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (tool_button));
+
+	gtk_style_context_add_class (gtk_widget_get_style_context (box),
+				     GTK_STYLE_CLASS_RAISED);
+	gtk_style_context_add_class (gtk_widget_get_style_context (box),
+				     GTK_STYLE_CLASS_LINKED);
+
+	gtk_container_add (GTK_CONTAINER (tool_item), box);
+	gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (tool_item));
+	gtk_widget_show_all (GTK_WIDGET (tool_item));
+	gtk_widget_set_margin_left (GTK_WIDGET (tool_item), 12);
+
 	/* Page Menu */
 	tool_item = gtk_tool_item_new ();
 	tool_button = toolbar_create_toolbutton (self, TRUE, FALSE, "emblem-system-symbolic");
@@ -210,7 +229,7 @@ nautilus_toolbar_constructed (GObject *obj)
 	gtk_container_add (GTK_CONTAINER (tool_item), tool_button);
 	gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET (tool_item));
 	gtk_widget_show_all (GTK_WIDGET (tool_item));
-	gtk_widget_set_margin_left (GTK_WIDGET (tool_item), 6);
+	gtk_widget_set_margin_left (GTK_WIDGET (tool_item), 12);
 
 	g_signal_connect_swapped (nautilus_preferences,
 				  "changed::" NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY,
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index 099e9ef..6eab17b 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -1426,8 +1426,8 @@ update_for_new_location (NautilusWindowSlot *slot)
 		nautilus_window_sync_up_button (window);
 		nautilus_window_sync_zoom_widgets (window);
 
-		/* Set up the content view menu for this new location. */
-		nautilus_window_load_view_as_menus (window);
+		/* Sync the content view menu for this new location. */
+		nautilus_window_sync_view_as_menus (window);
 
 		/* Load menus from nautilus extensions for this location */
 		nautilus_window_load_extension_menus (window);
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index e65d62c..e1a36d5 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -598,6 +598,7 @@ nautilus_window_create_toolbar_action_group (NautilusWindow *window)
 	NautilusNavigationState *navigation_state;
 	GtkActionGroup *action_group;
 	GtkAction *action;
+	GSList *radio_group = NULL;
 
 	action_group = gtk_action_group_new ("ToolbarActions");
 	gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
@@ -643,6 +644,30 @@ nautilus_window_create_toolbar_action_group (NautilusWindow *window)
 	gtk_action_set_icon_name (GTK_ACTION (action), "edit-find-symbolic");
 	g_object_unref (action);
 
+	action = GTK_ACTION
+		(gtk_radio_action_new (NAUTILUS_ACTION_VIEW_LIST,
+				       _("List"),
+				       _("View items as a list"),
+				       NULL, 0));
+	gtk_action_group_add_action (action_group, action);
+	gtk_accel_map_add_entry ("<Nautilus-Window>/View List", GDK_KEY_1, GDK_CONTROL_MASK);
+	gtk_action_set_accel_path (GTK_ACTION (action), "<Nautilus-Window>/View List");
+	gtk_action_set_icon_name (GTK_ACTION (action), "view-list-symbolic");
+	radio_group = gtk_radio_action_get_group (GTK_RADIO_ACTION (action));
+	g_object_unref (action);
+
+	action = GTK_ACTION
+		(gtk_radio_action_new (NAUTILUS_ACTION_VIEW_GRID,
+				       _("Icons"),
+				       _("View items as a grid of icons"),
+				       NULL, 0));
+	gtk_action_group_add_action (action_group, action);
+	gtk_action_set_icon_name (GTK_ACTION (action), "view-grid-symbolic");
+	gtk_accel_map_add_entry ("<Nautilus-Window>/View Grid", GDK_KEY_2, GDK_CONTROL_MASK);
+	gtk_action_set_accel_path (GTK_ACTION (action), "<Nautilus-Window>/View Grid");
+	gtk_radio_action_set_group (GTK_RADIO_ACTION (action), radio_group);
+	g_object_unref (action);
+
 	navigation_state = nautilus_window_get_navigation_state (window);
 	nautilus_navigation_state_add_group (navigation_state, action_group);
 
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index ef444a1..ed84eb2 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -47,14 +47,6 @@ struct NautilusWindowDetails
 
 	NautilusWindowShowHiddenFilesMode show_hidden_files_mode;
 
-	/* View As menu */
-	GList *short_list_viewers;
-
-	/* View As choices */
-	GtkActionGroup *view_as_action_group; /* owned by ui_manager */
-	GtkRadioAction *view_as_radio_action;
-	guint short_list_merge_id;
-
 	/* Ensures that we do not react on signals of a
 	 * view that is re-used as new view when its loading
 	 * is cancelled
@@ -107,7 +99,7 @@ struct NautilusWindowDetails
 typedef void (*NautilusBookmarkFailedCallback) (NautilusWindow *window,
                                                 NautilusBookmark *bookmark);
 
-void               nautilus_window_load_view_as_menus                    (NautilusWindow    *window);
+void               nautilus_window_sync_view_as_menus                    (NautilusWindow    *window);
 void               nautilus_window_load_extension_menus                  (NautilusWindow    *window);
 
 NautilusWindowSlot *nautilus_window_get_slot_for_view                    (NautilusWindow *window,
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 8cd1495..f6991ee 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -258,7 +258,7 @@ real_active (NautilusWindowSlot *slot)
 	nautilus_window_sync_search_widgets (window);
 
 	if (slot->viewed_file != NULL) {
-		nautilus_window_load_view_as_menus (window);
+		nautilus_window_sync_view_as_menus (window);
 		nautilus_window_load_extension_menus (window);
 	}
 }
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 555fae0..8b86128 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -42,6 +42,8 @@
 #include "nautilus-view-factory.h"
 #include "nautilus-window-manage-views.h"
 #include "nautilus-window-slot.h"
+#include "nautilus-list-view.h"
+#include "nautilus-canvas-view.h"
 
 #include <eel/eel-debug.h>
 #include <eel/eel-gtk-extensions.h>
@@ -70,8 +72,6 @@
 #include <sys/time.h>
 
 /* dock items */
-#define NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER  	"/ViewMenu/View/View Choices/Short List"
-
 #define MAX_TITLE_LENGTH 180
 
 /* Forward and back buttons on the mouse */
@@ -111,15 +111,6 @@ enum {
 static guint signals[LAST_SIGNAL] = { 0 };
 static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 
-typedef struct  {
-	NautilusWindow *window;
-	char *id;
-} ActivateViewData;
-
-static void cancel_view_as_callback         (NautilusWindowSlot      *slot);
-static void action_view_as_callback         (GtkAction               *action,
-					     ActivateViewData        *data);
-
 G_DEFINE_TYPE (NautilusWindow, nautilus_window, GTK_TYPE_APPLICATION_WINDOW);
 
 static const struct {
@@ -985,6 +976,33 @@ notebook_popup_menu_cb (GtkWidget *widget,
 	notebook_popup_menu_show (window, NULL);
 	return TRUE;
 }
+static void
+action_view_list_changed_cb (GtkRadioAction *action,
+			     GtkRadioAction *current,
+                             NautilusWindow *window)
+{
+	NautilusWindowSlot *slot;
+
+	if (action != current)
+		return;
+
+	slot = nautilus_window_get_active_slot (window);
+	nautilus_window_slot_set_content_view (slot, NAUTILUS_LIST_VIEW_ID);
+}
+
+static void
+action_view_grid_changed_cb (GtkRadioAction *action,
+			     GtkRadioAction *current,
+                             NautilusWindow *window)
+{
+	NautilusWindowSlot *slot;
+
+	if (action != current)
+		return;
+
+	slot = nautilus_window_get_active_slot (window);
+	nautilus_window_slot_set_content_view (slot, NAUTILUS_CANVAS_VIEW_ID);
+}
 
 static GtkWidget *
 create_toolbar (NautilusWindow *window)
@@ -1005,6 +1023,13 @@ create_toolbar (NautilusWindow *window)
 	action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_SEARCH);
 	g_signal_connect (action, "activate",
 			  G_CALLBACK (action_show_hide_search_callback), window);
+	action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_VIEW_LIST);
+	g_signal_connect (action, "changed",
+			  G_CALLBACK (action_view_list_changed_cb), window);
+	action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_VIEW_GRID);
+	g_signal_connect (action, "changed",
+			  G_CALLBACK (action_view_grid_changed_cb), window);
+
 	nautilus_navigation_state_set_master (window->details->nav_state, window->details->toolbar_action_group );
 
 	toolbar = nautilus_toolbar_new (nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)), action_group);
@@ -1166,13 +1191,6 @@ nautilus_window_get_property (GObject *object,
 }
 
 static void
-free_stored_viewers (NautilusWindow *window)
-{
-	g_list_free_full (window->details->short_list_viewers, g_free);
-	window->details->short_list_viewers = NULL;
-}
-
-static void
 destroy_slots_foreach (gpointer data,
 		       gpointer user_data)
 {
@@ -1225,8 +1243,6 @@ nautilus_window_finalize (GObject *object)
 	g_clear_object (&window->details->nav_state);
 	g_clear_object (&window->details->ui_manager);
 
-	free_stored_viewers (window);
-
 	/* nautilus_window_close() should have run */
 	g_assert (window->details->slots == NULL);
 
@@ -1475,101 +1491,6 @@ nautilus_window_key_press_event (GtkWidget *widget,
  * Main API
  */
 
-static void
-free_activate_view_data (gpointer data)
-{
-	ActivateViewData *activate_data;
-
-	activate_data = data;
-
-	g_free (activate_data->id);
-
-	g_slice_free (ActivateViewData, activate_data);
-}
-
-static void
-action_view_as_callback (GtkAction *action,
-			 ActivateViewData *data)
-{
-	NautilusWindow *window;
-	NautilusWindowSlot *slot;
-
-	window = data->window;
-
-	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
-		slot = nautilus_window_get_active_slot (window);
-		nautilus_window_slot_set_content_view (slot,
-						       data->id);
-	}
-}
-
-static GtkRadioAction *
-add_view_as_menu_item (NautilusWindow *window,
-		       const char *placeholder_path,
-		       const char *identifier,
-		       int index, /* extra_viewer is always index 0 */
-		       guint merge_id)
-{
-	const NautilusViewInfo *info;
-	GtkRadioAction *action;
-	char action_name[32];
-	ActivateViewData *data;
-
-	char accel[32];
-	char accel_path[48];
-	unsigned int accel_keyval;
-
-	info = nautilus_view_factory_lookup (identifier);
-	
-	g_snprintf (action_name, sizeof (action_name), "view_as_%d", index);
-	action = gtk_radio_action_new (action_name,
-				       _(info->view_menu_label_with_mnemonic),
-				       _(info->display_location_label),
-				       NULL,
-				       0);
-
-	if (index >= 1 && index <= 9) {
-		g_snprintf (accel, sizeof (accel), "%d", index);
-		g_snprintf (accel_path, sizeof (accel_path), "<Nautilus-Window>/%s", action_name);
-
-		accel_keyval = gdk_keyval_from_name (accel);
-		g_assert (accel_keyval != GDK_KEY_VoidSymbol);
-
-		gtk_accel_map_add_entry (accel_path, accel_keyval, GDK_CONTROL_MASK);
-		gtk_action_set_accel_path (GTK_ACTION (action), accel_path);
-	}
-
-	if (window->details->view_as_radio_action != NULL) {
-		gtk_radio_action_set_group (action,
-					    gtk_radio_action_get_group (window->details->view_as_radio_action));
-	} else if (index != 0) {
-		/* Index 0 is the extra view, and we don't want to use that here,
-		   as it can get deleted/changed later */
-		window->details->view_as_radio_action = action;
-	}
-
-	data = g_slice_new (ActivateViewData);
-	data->window = window;
-	data->id = g_strdup (identifier);
-	g_signal_connect_data (action, "activate",
-			       G_CALLBACK (action_view_as_callback),
-			       data, (GClosureNotify) free_activate_view_data, 0);
-	
-	gtk_action_group_add_action (window->details->view_as_action_group,
-				     GTK_ACTION (action));
-	g_object_unref (action);
-
-	gtk_ui_manager_add_ui (window->details->ui_manager,
-			       merge_id,
-			       placeholder_path,
-			       action_name,
-			       action_name,
-			       GTK_UI_MANAGER_MENUITEM,
-			       FALSE);
-
-	return action; /* return value owned by group */
-}
-
 /**
  * nautilus_window_sync_view_as_menus:
  * 
@@ -1579,14 +1500,11 @@ add_view_as_menu_item (NautilusWindow *window,
  * 
  * @window: The NautilusWindow whose "View as" option menu should be synched.
  */
-static void
+void
 nautilus_window_sync_view_as_menus (NautilusWindow *window)
 {
 	NautilusWindowSlot *slot;
-	int index;
-	char action_name[32];
 	GtkAction *action;
-	GList *node;
 
 	g_assert (NAUTILUS_IS_WINDOW (window));
 
@@ -1596,141 +1514,38 @@ nautilus_window_sync_view_as_menus (NautilusWindow *window)
 		return;
 	}
 
-	for (node = window->details->short_list_viewers, index = 1;
-	     node != NULL;
-	     node = node->next, ++index) {
-		if (nautilus_window_slot_content_view_matches_iid (slot, (char *)node->data)) {
-			break;
-		}
+	if (nautilus_window_slot_content_view_matches_iid (slot, NAUTILUS_LIST_VIEW_ID)) {
+		action = gtk_action_group_get_action (window->details->toolbar_action_group, NAUTILUS_ACTION_VIEW_LIST);
+	} else {
+		action = gtk_action_group_get_action (window->details->toolbar_action_group, NAUTILUS_ACTION_VIEW_GRID);
 	}
 
-	g_snprintf (action_name, sizeof (action_name), "view_as_%d", index);
-	action = gtk_action_group_get_action (window->details->view_as_action_group,
-					      action_name);
-
 	/* Don't trigger the action callback when we're synchronizing */
 	g_signal_handlers_block_matched (action,
 					 G_SIGNAL_MATCH_FUNC,
 					 0, 0,
 					 NULL,
-					 action_view_as_callback,
+					 action_view_list_changed_cb,
+					 NULL);
+	g_signal_handlers_block_matched (action,
+					 G_SIGNAL_MATCH_FUNC,
+					 0, 0,
+					 NULL,
+					 action_view_grid_changed_cb,
 					 NULL);
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
 	g_signal_handlers_unblock_matched (action,
 					   G_SIGNAL_MATCH_FUNC,
 					   0, 0,
 					   NULL,
-					   action_view_as_callback,
+					   action_view_list_changed_cb,
+					   NULL);
+	g_signal_handlers_unblock_matched (action,
+					   G_SIGNAL_MATCH_FUNC,
+					   0, 0,
+					   NULL,
+					   action_view_grid_changed_cb,
 					   NULL);
-}
-
-static void
-refresh_stored_viewers (NautilusWindow *window)
-{
-	NautilusWindowSlot *slot;
-	GList *viewers;
-	char *uri, *mimetype;
-
-	slot = nautilus_window_get_active_slot (window);
-
-	uri = nautilus_file_get_uri (slot->viewed_file);
-	mimetype = nautilus_file_get_mime_type (slot->viewed_file);
-	viewers = nautilus_view_factory_get_views_for_uri (uri,
-							   nautilus_file_get_file_type (slot->viewed_file),
-							   mimetype);
-	g_free (uri);
-	g_free (mimetype);
-
-        free_stored_viewers (window);
-	window->details->short_list_viewers = viewers;
-}
-
-static void
-load_view_as_menu (NautilusWindow *window)
-{
-	GList *node;
-	int index;
-	guint merge_id;
-
-	if (window->details->short_list_merge_id != 0) {
-		gtk_ui_manager_remove_ui (window->details->ui_manager,
-					  window->details->short_list_merge_id);
-		window->details->short_list_merge_id = 0;
-	}
-	if (window->details->view_as_action_group != NULL) {
-		gtk_ui_manager_remove_action_group (window->details->ui_manager,
-						    window->details->view_as_action_group);
-		window->details->view_as_action_group = NULL;
-	}
-
-	refresh_stored_viewers (window);
-
-	merge_id = gtk_ui_manager_new_merge_id (window->details->ui_manager);
-	window->details->short_list_merge_id = merge_id;
-	window->details->view_as_action_group = gtk_action_group_new ("ViewAsGroup");
-	gtk_action_group_set_translation_domain (window->details->view_as_action_group, GETTEXT_PACKAGE);
-	window->details->view_as_radio_action = NULL;
-	
-        /* Add a menu item for each view in the preferred list for this location. */
-	/* Start on 1, because extra_viewer gets index 0 */
-        for (node = window->details->short_list_viewers, index = 1; 
-             node != NULL; 
-             node = node->next, ++index) {
-		/* Menu item in View menu. */
-                add_view_as_menu_item (window, 
-				       NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER, 
-				       node->data, 
-				       index,
-				       merge_id);
-        }
-	gtk_ui_manager_insert_action_group (window->details->ui_manager,
-					    window->details->view_as_action_group,
-					    -1);
-	g_object_unref (window->details->view_as_action_group); /* owned by ui_manager */
-
-	nautilus_window_sync_view_as_menus (window);
-}
-
-static void
-load_view_as_menus_callback (NautilusFile *file, 
-			    gpointer callback_data)
-{
-	NautilusWindow *window;
-	NautilusWindowSlot *slot;
-
-	slot = callback_data;
-	window = nautilus_window_slot_get_window (slot);
-
-	if (slot == nautilus_window_get_active_slot (window)) {
-		load_view_as_menu (window);
-	}
-}
-
-static void
-cancel_view_as_callback (NautilusWindowSlot *slot)
-{
-	nautilus_file_cancel_call_when_ready (slot->viewed_file, 
-					      load_view_as_menus_callback,
-					      slot);
-}
-
-void
-nautilus_window_load_view_as_menus (NautilusWindow *window)
-{
-	NautilusWindowSlot *slot;
-	NautilusFileAttributes attributes;
-
-        g_return_if_fail (NAUTILUS_IS_WINDOW (window));
-
-	attributes = nautilus_mime_actions_get_required_file_attributes ();
-
-	slot = nautilus_window_get_active_slot (window);
-
-	cancel_view_as_callback (slot);
-	nautilus_file_call_when_ready (slot->viewed_file,
-				       attributes, 
-				       load_view_as_menus_callback,
-				       slot);
 }
 
 void
@@ -1875,7 +1690,7 @@ nautilus_window_connect_content_view (NautilusWindow *window,
        * views in the menu are for the old location).
        */
 	if (slot->pending_location == NULL) {
-		nautilus_window_load_view_as_menus (window);
+		nautilus_window_sync_view_as_menus (window);
 	} else {
 		directory = nautilus_directory_get (slot->pending_location);
 		if (!NAUTILUS_IS_SEARCH_DIRECTORY (directory)) {
@@ -1965,8 +1780,6 @@ nautilus_window_slot_set_viewed_file (NautilusWindowSlot *slot,
 
 	nautilus_file_ref (file);
 
-	cancel_view_as_callback (slot);
-
 	if (slot->viewed_file != NULL) {
 		nautilus_file_monitor_remove (slot->viewed_file,
 					      slot);



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