[nautilus] window: simplify toolbar actions creation



commit 52679f9710d8b27b02c6c4e0f8bf20efe7356582
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Aug 23 15:32:29 2012 +0200

    window: simplify toolbar actions creation
    
    Instead of having the toolbar create a different action group, with
    different actions, and having to keep those in sync with the window's
    main action group manually, just pass the main action group to the
    toolbar.
    This also makes NautilusNavigationState useless (and removes a lot of
    boilerplate code), and fixes Ctrl+1/Ctrl+2 not working correctly as
    shorcuts to switch view type.

 src/Makefile.am                 |    2 -
 src/nautilus-navigation-state.c |  262 ---------------------------------------
 src/nautilus-navigation-state.h |   75 -----------
 src/nautilus-shell-ui.xml       |    2 +
 src/nautilus-window-menus.c     |  136 ++++++--------------
 src/nautilus-window-private.h   |    7 +-
 src/nautilus-window-slot.c      |    7 +-
 src/nautilus-window.c           |  115 +++--------------
 src/nautilus-window.h           |    3 -
 9 files changed, 73 insertions(+), 536 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 8c129c0..9b60814 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -168,8 +168,6 @@ nautilus_SOURCES = \
 	nautilus-mime-actions.h 		\
 	nautilus-navigation-action.c		\
 	nautilus-navigation-action.h		\
-	nautilus-navigation-state.c		\
-	nautilus-navigation-state.h		\
 	nautilus-notebook.c			\
 	nautilus-notebook.h			\
 	nautilus-pathbar.c			\
diff --git a/src/nautilus-shell-ui.xml b/src/nautilus-shell-ui.xml
index 00d956f..187cc83 100644
--- a/src/nautilus-shell-ui.xml
+++ b/src/nautilus-shell-ui.xml
@@ -8,6 +8,8 @@
 <accelerator action="TabsMoveLeft"/>
 <accelerator action="TabsMoveRight"/>
 <accelerator action="Up"/>
+<accelerator action="View Grid"/>
+<accelerator action="View List"/>
 <accelerator action="ZoomInAccel"/>
 <accelerator action="ZoomInAccel2"/>
 <accelerator action="ZoomOutAccel"/>
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index 17fc430..093f3ad 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -31,8 +31,10 @@
 
 #include "nautilus-actions.h"
 #include "nautilus-application.h"
+#include "nautilus-canvas-view.h"
 #include "nautilus-connect-server-dialog.h"
 #include "nautilus-file-management-properties.h"
+#include "nautilus-list-view.h"
 #include "nautilus-navigation-action.h"
 #include "nautilus-notebook.h"
 #include "nautilus-window-manage-views.h"
@@ -437,6 +439,34 @@ action_tab_change_action_activate_callback (GtkAction *action,
 	}
 }
 
+static void
+action_show_hide_search_callback (GtkAction *action,
+				  NautilusWindow *window)
+{
+	gboolean active;
+
+	active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+	nautilus_window_set_search_visible (window, active);
+}
+
+static void
+action_view_radio_changed (GtkRadioAction *action,
+			   GtkRadioAction *current,
+			   NautilusWindow *window)
+{
+	const gchar *name;
+	NautilusWindowSlot *slot;
+
+	name = gtk_action_get_name (GTK_ACTION (current));
+	slot = nautilus_window_get_active_slot (window);
+
+	if (g_strcmp0 (name, NAUTILUS_ACTION_VIEW_LIST) == 0) {
+		nautilus_window_slot_set_content_view (slot, NAUTILUS_LIST_VIEW_ID);
+	} else if (g_strcmp0 (name, NAUTILUS_ACTION_VIEW_GRID) == 0) {
+		nautilus_window_slot_set_content_view (slot, NAUTILUS_CANVAS_VIEW_ID);
+	}
+}
+
 static const GtkActionEntry main_entries[] = {
   /* name, stock id, label */  { "Help", NULL, N_("_Help") },
   /* name, stock id */         { NAUTILUS_ACTION_CLOSE, GTK_STOCK_CLOSE,
@@ -566,10 +596,17 @@ static const GtkToggleActionEntry main_toggle_entries[] = {
   /* name, stock id */     { NAUTILUS_ACTION_SEARCH, "edit-find-symbolic",
   /* label, accelerator */   N_("_Search for Files..."), "<control>f",
   /* tooltip */              N_("Search documents and folders by name"),
-			     NULL,
+			     G_CALLBACK (action_show_hide_search_callback),
   /* is_active */            FALSE },
 };
 
+static const GtkRadioActionEntry view_radio_entries[] = {
+	{ NAUTILUS_ACTION_VIEW_LIST, "view-list-symbolic", N_("List"),
+	  "<control>1", N_("View items as a list"), 0 },
+	{ NAUTILUS_ACTION_VIEW_GRID, "view-grid-symbolic", N_("List"),
+	  "<control>2", N_("View items as a grid of icons"), 1 }
+};
+
 static const gchar* app_actions[] = {
 	NAUTILUS_ACTION_NEW_WINDOW,
 	NAUTILUS_ACTION_CONNECT_TO_SERVER,
@@ -584,88 +621,6 @@ static const gchar* app_actions[] = {
 	"Help"
 };
 
-GtkActionGroup *
-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);
-
-	action = g_object_new (NAUTILUS_TYPE_NAVIGATION_ACTION,
-			       "name", NAUTILUS_ACTION_BACK,
-			       "label", _("_Back"),
-			       "icon-name", "go-previous-symbolic",
-			       "tooltip", _("Go to the previous visited location"),
-			       "arrow-tooltip", _("Back history"),
-			       "window", window,
-			       "direction", NAUTILUS_NAVIGATION_DIRECTION_BACK,
-			       "sensitive", FALSE,
-			       NULL);
-	g_signal_connect (action, "activate",
-			  G_CALLBACK (action_back_callback), window);
-	gtk_action_group_add_action (action_group, action);
-
-	g_object_unref (action);
-
-	action = g_object_new (NAUTILUS_TYPE_NAVIGATION_ACTION,
-			       "name", NAUTILUS_ACTION_FORWARD,
-			       "label", _("_Forward"),
-			       "icon-name", "go-next-symbolic",
-			       "tooltip", _("Go to the next visited location"),
-			       "arrow-tooltip", _("Forward history"),
-			       "window", window,
-			       "direction", NAUTILUS_NAVIGATION_DIRECTION_FORWARD,
-			       "sensitive", FALSE,
-			       NULL);
-	g_signal_connect (action, "activate",
-			  G_CALLBACK (action_forward_callback), window);
-	gtk_action_group_add_action (action_group, action);
-
-	g_object_unref (action);
-
-	action = GTK_ACTION
-		(gtk_toggle_action_new (NAUTILUS_ACTION_SEARCH,
-					_("Search"),
-					_("Search documents and folders by name"),
-					NULL));
-	gtk_action_group_add_action (action_group, action);
-	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);
-
-	return action_group;
-}
-
 static void
 window_menus_set_bindings (NautilusWindow *window)
 {
@@ -704,20 +659,9 @@ const GActionEntry win_entries[] = {
 void 
 nautilus_window_initialize_actions (NautilusWindow *window)
 {
-	GtkActionGroup *action_group;
-	const gchar *nav_state_actions[] = {
-		NAUTILUS_ACTION_BACK, NAUTILUS_ACTION_FORWARD,
-		NAUTILUS_ACTION_SEARCH, NULL
-	};
-
 	g_action_map_add_action_entries (G_ACTION_MAP (window),
 					 win_entries, G_N_ELEMENTS (win_entries),
 					 window);
-
-	action_group = nautilus_window_get_main_action_group (window);
-	window->details->nav_state = nautilus_navigation_state_new (action_group,
-								    nav_state_actions);
-
 	window_menus_set_bindings (window);
 }
 
@@ -770,6 +714,10 @@ nautilus_window_initialize_menus (NautilusWindow *window)
 	gtk_action_group_add_toggle_actions (action_group, 
 					     main_toggle_entries, G_N_ELEMENTS (main_toggle_entries),
 					     window);
+	gtk_action_group_add_radio_actions (action_group,
+					    view_radio_entries, G_N_ELEMENTS (view_radio_entries),
+					    -1, G_CALLBACK (action_view_radio_changed),
+					    window);
 
 	nautilus_window_menus_set_visibility_for_app_menu (window);
 	window->details->app_menu_visibility_id =
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index ed84eb2..ca9e57e 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -30,7 +30,6 @@
 
 #include "nautilus-window.h"
 #include "nautilus-window-slot.h"
-#include "nautilus-navigation-state.h"
 #include "nautilus-bookmark-list.h"
 
 #include <libnautilus-private/nautilus-directory.h>
@@ -62,7 +61,6 @@ struct NautilusWindowDetails
         NautilusWindowSlot *active_slot;
 
         GtkWidget *content_paned;
-        NautilusNavigationState *nav_state;
         
         /* Side Pane */
         int side_pane_width;
@@ -73,7 +71,6 @@ struct NautilusWindowDetails
 
         /* Toolbar */
         GtkWidget *toolbar;
-        GtkActionGroup *toolbar_action_group;
         gboolean temporary_navigation_bar;
 
         /* focus widget before the location bar has been shown temporarily */
@@ -119,8 +116,10 @@ void nautilus_window_sync_title            (NautilusWindow *window,
 void nautilus_window_sync_zoom_widgets     (NautilusWindow *window);
 void nautilus_window_sync_up_button        (NautilusWindow *window);
 
+void nautilus_window_set_search_visible   (NautilusWindow *window,
+                                           gboolean        visible);
+
 /* window menus */
-GtkActionGroup    *nautilus_window_create_toolbar_action_group           (NautilusWindow *window);
 void               nautilus_window_initialize_actions                    (NautilusWindow    *window);
 void               nautilus_window_initialize_menus                      (NautilusWindow    *window);
 void               nautilus_window_finalize_menus                        (NautilusWindow    *window);
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index f6991ee..ecf1deb 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -133,9 +133,12 @@ query_editor_cancel_callback (NautilusQueryEditor *editor,
 			      NautilusWindowSlot *slot)
 {
 	GtkAction *search;
+	NautilusWindow *window;
+	GtkActionGroup *action_group;
 
-	search = gtk_action_group_get_action (slot->window->details->toolbar_action_group,
-					      NAUTILUS_ACTION_SEARCH);
+	window = slot->window;
+	action_group = nautilus_window_get_main_action_group (window);
+	search = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_SEARCH);
 
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (search), FALSE);
 }
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 8b0c928..1602d24 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -276,16 +276,15 @@ notebook_switch_page_cb (GtkNotebook    *notebook,
 	return FALSE;
 }
 
-static void
-action_show_hide_search_callback (GtkAction *action,
-				  gpointer user_data)
+void
+nautilus_window_set_search_visible (NautilusWindow *window,
+				    gboolean visible)
 {
-	NautilusWindow *window = user_data;
 	NautilusWindowSlot *slot;
 
 	slot = window->details->active_slot;
 
-	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
+	if (visible) {
 		remember_focus_widget (window);
 		nautilus_window_slot_set_query_editor_visible (slot, TRUE);
 	} else {
@@ -693,7 +692,8 @@ toggle_toolbar_search_button (NautilusWindow *window,
 {
 	GtkAction *action;
 
-	action = gtk_action_group_get_action (window->details->toolbar_action_group, NAUTILUS_ACTION_SEARCH);
+	action = gtk_action_group_get_action (nautilus_window_get_main_action_group (window),
+					      NAUTILUS_ACTION_SEARCH);
 
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
 }
@@ -727,7 +727,8 @@ void
 nautilus_window_sync_location_widgets (NautilusWindow *window)
 {
 	NautilusWindowSlot *slot, *active_slot;
-	NautilusNavigationState *nav_state;
+	GtkActionGroup *action_group;
+	GtkAction *action;
 
 	slot = window->details->active_slot;
 
@@ -751,14 +752,13 @@ nautilus_window_sync_location_widgets (NautilusWindow *window)
 
 	/* Check if the back and forward buttons need enabling or disabling. */
 	active_slot = nautilus_window_get_active_slot (window);
-	nav_state = nautilus_window_get_navigation_state (window);
+	action_group = nautilus_window_get_main_action_group (window);
+
+	action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_BACK);
+	gtk_action_set_sensitive (action, active_slot->back_list != NULL);
 
-	nautilus_navigation_state_set_boolean (nav_state,
-					       NAUTILUS_ACTION_BACK,
-					       active_slot->back_list != NULL);
-	nautilus_navigation_state_set_boolean (nav_state,
-					       NAUTILUS_ACTION_FORWARD,
-					       active_slot->forward_list != NULL);
+	action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_FORWARD);
+	gtk_action_set_sensitive (action, active_slot->forward_list != NULL);
 }
 
 GtkWidget *
@@ -975,40 +975,11 @@ 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)
 {
 	GtkSizeGroup *header_size_group;
-	GtkActionGroup *action_group;
-	GtkAction *action;
 	GtkWidget *toolbar;
 	GtkWidget *path_bar;
 	GtkWidget *location_bar;
@@ -1017,21 +988,8 @@ create_toolbar (NautilusWindow *window)
 	gtk_size_group_set_ignore_hidden (header_size_group, FALSE);
 
 	/* build the toolbar */
-	action_group = nautilus_window_create_toolbar_action_group (window);
-	window->details->toolbar_action_group = action_group;
-	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);
+	toolbar = nautilus_toolbar_new (nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)),
+					nautilus_window_get_main_action_group (NAUTILUS_WINDOW (window)));
 
 	g_object_bind_property (window, "disable-chrome",
 				toolbar, "visible",
@@ -1239,7 +1197,6 @@ nautilus_window_finalize (GObject *object)
 
 	nautilus_window_finalize_menus (window);
 
-	g_clear_object (&window->details->nav_state);
 	g_clear_object (&window->details->ui_manager);
 
 	/* nautilus_window_close() should have run */
@@ -1503,6 +1460,7 @@ void
 nautilus_window_sync_view_as_menus (NautilusWindow *window)
 {
 	NautilusWindowSlot *slot;
+	GtkActionGroup *action_group;
 	GtkAction *action;
 
 	g_assert (NAUTILUS_IS_WINDOW (window));
@@ -1513,38 +1471,15 @@ nautilus_window_sync_view_as_menus (NautilusWindow *window)
 		return;
 	}
 
+	action_group = nautilus_window_get_main_action_group (window);
+
 	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);
+		action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_VIEW_LIST);
 	} else {
-		action = gtk_action_group_get_action (window->details->toolbar_action_group, NAUTILUS_ACTION_VIEW_GRID);
+		action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_VIEW_GRID);
 	}
 
-	/* 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_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_list_changed_cb,
-					   NULL);
-	g_signal_handlers_unblock_matched (action,
-					   G_SIGNAL_MATCH_FUNC,
-					   0, 0,
-					   NULL,
-					   action_view_grid_changed_cb,
-					   NULL);
 }
 
 void
@@ -1752,14 +1687,6 @@ nautilus_window_get_main_action_group (NautilusWindow *window)
 	return window->details->main_action_group;
 }
 
-NautilusNavigationState *
-nautilus_window_get_navigation_state (NautilusWindow *window)
-{
-	g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
-
-	return window->details->nav_state;
-}
-
 void
 nautilus_window_slot_set_viewed_file (NautilusWindowSlot *slot,
 				      NautilusFile *file)
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 50e9e6c..8a79966 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -34,7 +34,6 @@
 #include <libnautilus-private/nautilus-bookmark.h>
 #include <libnautilus-private/nautilus-search-directory.h>
 
-#include "nautilus-navigation-state.h"
 #include "nautilus-view.h"
 #include "nautilus-window-types.h"
 
@@ -116,8 +115,6 @@ void             nautilus_window_new_tab              (NautilusWindow    *window
 
 GtkUIManager *   nautilus_window_get_ui_manager       (NautilusWindow    *window);
 GtkActionGroup * nautilus_window_get_main_action_group (NautilusWindow   *window);
-NautilusNavigationState * 
-                 nautilus_window_get_navigation_state (NautilusWindow    *window);
 
 void                 nautilus_window_report_load_complete     (NautilusWindow *window,
                                                                NautilusView *view);



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