summaryrefslogtreecommitdiff
path: root/src/nautilus-toolbar.c
diff options
context:
space:
mode:
authorCarlos Soriano <carlos.sorian89@gmail.com>2015-01-07 16:48:24 +0100
committerCarlos Soriano <carlos.sorian89@gmail.com>2015-01-12 17:12:38 +0100
commitd344c0a46528b63928a87b7b1bed707967f248a1 (patch)
treed5507cd5c4be570aeacad615225cc3f903d899ac /src/nautilus-toolbar.c
parent193eab98c2066d1d5c2b53ea5792656deeb6de70 (diff)
downloadnautilus-wip/gaction_reordered.tar.gz
general: Rework menus of nautiluswip/gaction_reordered
Refresh the nautilus menus in the view (context menus) and the menus in the toolbar, changin as well in the path the UI of the toolbar to match mockups. In the way, port to GAction and GMenu every action and menu of nautilus and some clean ups thanks to this port.
Diffstat (limited to 'src/nautilus-toolbar.c')
-rw-r--r--src/nautilus-toolbar.c425
1 files changed, 261 insertions, 164 deletions
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 642f524bc..d0e428436 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -28,7 +28,6 @@
#include "nautilus-location-entry.h"
#include "nautilus-pathbar.h"
-#include "nautilus-actions.h"
#include <libnautilus-private/nautilus-global-preferences.h>
#include <libnautilus-private/nautilus-ui-utilities.h>
@@ -42,15 +41,32 @@ typedef enum {
NAUTILUS_NAVIGATION_DIRECTION_FORWARD
} NautilusNavigationDirection;
-struct _NautilusToolbarPriv {
+struct _NautilusToolbarPrivate {
NautilusWindow *window;
+ GtkWidget *path_bar_container;
+ GtkWidget *location_entry_container;
GtkWidget *path_bar;
GtkWidget *location_entry;
gboolean show_location_entry;
guint popup_timeout_id;
+
+ gdouble scale_zoom_level;
+
+ GtkWidget *view_button;
+ GtkWidget *action_button;
+
+ GtkWidget *view_menu_widget;
+ GtkAdjustment *zoom_adjustment_grid;
+ GtkAdjustment *zoom_adjustment_list;
+ GtkAdjustment *active_zoom_adjustment;
+ GtkWidget *zoom_level_scale;
+ GMenu *action_menu;
+
+ GtkWidget *forward_button;
+ GtkWidget *back_button;
};
enum {
@@ -61,9 +77,37 @@ enum {
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
-G_DEFINE_TYPE (NautilusToolbar, nautilus_toolbar, GTK_TYPE_HEADER_BAR);
+G_DEFINE_TYPE_WITH_PRIVATE(NautilusToolbar, nautilus_toolbar, GTK_TYPE_HEADER_BAR);
static void unschedule_menu_popup_timeout (NautilusToolbar *self);
+static gboolean show_widget_recursive (GtkWidget *widget,
+ gchar *id);
+
+static gboolean hide_widget_recursive (GtkWidget *widget,
+ gchar *id);
+void
+nautilus_toolbar_update_view_mode (NautilusToolbar *self,
+ const gchar *view_mode)
+{
+ gchar *name;
+ GtkWidget *image;
+
+ if (g_strcmp0 (view_mode, "list") == 0) {
+ name = "view-list-symbolic";
+ self->priv->active_zoom_adjustment = self->priv->zoom_adjustment_list;
+ } else if (g_strcmp0 (view_mode, "grid") == 0) {
+ name = "view-grid-symbolic";
+ self->priv->active_zoom_adjustment = self->priv->zoom_adjustment_grid;
+ }
+
+ gtk_range_set_adjustment (GTK_RANGE (self->priv->zoom_level_scale),
+ self->priv->active_zoom_adjustment);
+
+ image = gtk_image_new ();
+ gtk_button_set_image (GTK_BUTTON (self->priv->view_button), image);
+ gtk_image_set_from_icon_name (GTK_IMAGE (image), name,
+ GTK_ICON_SIZE_MENU);
+}
static void
toolbar_update_appearance (NautilusToolbar *self)
@@ -79,45 +123,6 @@ toolbar_update_appearance (NautilusToolbar *self)
!show_location_entry);
}
-static GtkWidget *
-toolbar_create_toolbutton (NautilusToolbar *self,
- gboolean create_menu,
- gboolean create_toggle,
- const gchar *name,
- const gchar *tooltip)
-{
- GtkWidget *button, *image;
- GtkActionGroup *action_group;
- GtkAction *action;
-
- action_group = nautilus_window_get_main_action_group (self->priv->window);
-
- if (create_menu) {
- button = gtk_menu_button_new ();
- } else if (create_toggle) {
- button = gtk_toggle_button_new ();
- } else {
- button = gtk_button_new ();
- }
-
- image = gtk_image_new ();
-
- gtk_button_set_image (GTK_BUTTON (button), image);
-
- if (create_menu) {
- gtk_image_set_from_icon_name (GTK_IMAGE (image), name,
- GTK_ICON_SIZE_MENU);
- gtk_widget_set_tooltip_text (button, tooltip);
- } else {
- action = gtk_action_group_get_action (action_group, name);
- gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action);
- gtk_button_set_label (GTK_BUTTON (button), NULL);
- gtk_widget_set_tooltip_text (button, gtk_action_get_tooltip (action));
- }
-
- return button;
-}
-
static void
activate_back_or_forward_menu_item (GtkMenuItem *menu_item,
NautilusWindow *window,
@@ -145,6 +150,25 @@ activate_forward_menu_item_callback (GtkMenuItem *menu_item, NautilusWindow *win
activate_back_or_forward_menu_item (menu_item, window, FALSE);
}
+void
+nautilus_toolbar_sync_navigation_buttons (NautilusToolbar *self)
+{
+ NautilusWindowSlot *active_slot;
+ GAction *action;
+ gboolean enabled;
+
+ /* Check if the back and forward buttons need enabling or disabling. */
+ active_slot = nautilus_window_get_active_slot (self->priv->window);
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (self->priv->window), "back");
+ enabled = nautilus_window_slot_get_back_history (active_slot) != NULL;
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (self->priv->window), "forward");
+ enabled = nautilus_window_slot_get_forward_history (active_slot) != NULL;
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
+}
+
static void
fill_menu (NautilusWindow *window,
GtkWidget *menu,
@@ -316,11 +340,10 @@ schedule_menu_popup_timeout (NautilusToolbar *self,
popup_menu_timeout_cb, data,
(GDestroyNotify) schedule_menu_data_free);
}
-
static gboolean
-tool_button_press_cb (GtkButton *button,
- GdkEventButton *event,
- gpointer user_data)
+navigation_button_press_cb (GtkButton *button,
+ GdkEventButton *event,
+ gpointer user_data)
{
NautilusToolbar *self = user_data;
@@ -338,7 +361,7 @@ tool_button_press_cb (GtkButton *button,
}
static gboolean
-tool_button_release_cb (GtkButton *button,
+navigation_button_release_cb (GtkButton *button,
GdkEventButton *event,
gpointer user_data)
{
@@ -350,137 +373,75 @@ tool_button_release_cb (GtkButton *button,
}
static void
-navigation_button_setup_menu (NautilusToolbar *self,
- GtkWidget *button,
- NautilusNavigationDirection direction)
+zoom_level_changed (GtkRange *range,
+ NautilusToolbar *self)
{
- g_object_set_data (G_OBJECT (button), "nav-direction", GUINT_TO_POINTER (direction));
-
- g_signal_connect (button, "button-press-event",
- G_CALLBACK (tool_button_press_cb), self);
- g_signal_connect (button, "button-release-event",
- G_CALLBACK (tool_button_release_cb), self);
-}
-
-static gboolean
-gear_menu_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer user_data)
-{
- GdkModifierType mask = gtk_accelerator_get_default_mod_mask ();
+ NautilusWindowSlot *slot;
+ NautilusView *view;
+ gdouble zoom_level;
- if ((event->state & mask) == 0 && (event->keyval == GDK_KEY_F10)) {
- gtk_menu_shell_deactivate (GTK_MENU_SHELL (widget));
- return TRUE;
- }
+ zoom_level = gtk_range_get_value (range);
+ slot = nautilus_window_get_active_slot (self->priv->window);
+ view = nautilus_window_slot_get_current_view (slot);
- return FALSE;
+ g_action_group_change_action_state (nautilus_view_get_action_group (view),
+ "zoom-to-level",
+ g_variant_new_int32 ((gint) zoom_level));
}
static void
-nautilus_toolbar_constructed (GObject *obj)
+nautilus_toolbar_init (NautilusToolbar *self)
{
- NautilusToolbar *self = NAUTILUS_TOOLBAR (obj);
- GtkWidget *toolbar;
- GtkWidget *button;
- GtkWidget *menu;
- GtkWidget *box;
- GtkUIManager *ui_manager;
-
- G_OBJECT_CLASS (nautilus_toolbar_parent_class)->constructed (obj);
-
- toolbar = GTK_WIDGET (obj);
-
- ui_manager = nautilus_window_get_ui_manager (self->priv->window);
-
- /* Back and Forward */
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-
- /* Back */
- button = toolbar_create_toolbutton (self, FALSE, FALSE, NAUTILUS_ACTION_BACK, NULL);
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_action_set_icon_name (gtk_activatable_get_related_action (GTK_ACTIVATABLE (button)),
- "go-previous-symbolic");
- navigation_button_setup_menu (self, button, NAUTILUS_NAVIGATION_DIRECTION_BACK);
- gtk_container_add (GTK_CONTAINER (box), button);
+ GtkBuilder *builder;
- /* Forward */
- button = toolbar_create_toolbutton (self, FALSE, FALSE, NAUTILUS_ACTION_FORWARD, NULL);
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_action_set_icon_name (gtk_activatable_get_related_action (GTK_ACTIVATABLE (button)),
- "go-next-symbolic");
- navigation_button_setup_menu (self, button, NAUTILUS_NAVIGATION_DIRECTION_FORWARD);
- gtk_container_add (GTK_CONTAINER (box), 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_header_bar_pack_start (GTK_HEADER_BAR (toolbar), box);
+ self->priv = nautilus_toolbar_get_instance_private (self);
+ gtk_widget_init_template (GTK_WIDGET (self));
self->priv->path_bar = g_object_new (NAUTILUS_TYPE_PATH_BAR, NULL);
- gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), self->priv->path_bar);
+ gtk_container_add (GTK_CONTAINER (self->priv->path_bar_container),
+ self->priv->path_bar);
- /* entry-like location bar */
self->priv->location_entry = nautilus_location_entry_new ();
- gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), self->priv->location_entry);
-
- /* Action Menu */
- button = toolbar_create_toolbutton (self, TRUE, FALSE, "open-menu-symbolic", _("Location options"));
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- menu = gtk_ui_manager_get_widget (ui_manager, "/ActionMenu");
- gtk_widget_set_halign (menu, GTK_ALIGN_END);
- gtk_menu_button_set_popup (GTK_MENU_BUTTON (button), menu);
- gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "win.gear-menu");
- g_signal_connect (menu, "key-press-event", G_CALLBACK (gear_menu_key_press), self);
-
- gtk_header_bar_pack_end (GTK_HEADER_BAR (toolbar), button);
-
- /* View buttons */
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-
- button = toolbar_create_toolbutton (self, FALSE, TRUE, NAUTILUS_ACTION_VIEW_LIST, NULL);
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_container_add (GTK_CONTAINER (box), button);
- button = toolbar_create_toolbutton (self, FALSE, TRUE, NAUTILUS_ACTION_VIEW_GRID, NULL);
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_container_add (GTK_CONTAINER (box), button);
- button = toolbar_create_toolbutton (self, TRUE, FALSE, "go-down-symbolic", _("View options"));
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_container_add (GTK_CONTAINER (box), button);
- menu = gtk_ui_manager_get_widget (ui_manager, "/ViewMenu");
- gtk_menu_button_set_popup (GTK_MENU_BUTTON (button), menu);
-
- 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_header_bar_pack_end (GTK_HEADER_BAR (toolbar), box);
-
- /* search */
- button = toolbar_create_toolbutton (self, FALSE, TRUE, NAUTILUS_ACTION_SEARCH, NULL);
- gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_widget_set_margin_start (button, 76);
- gtk_header_bar_pack_end (GTK_HEADER_BAR (toolbar), button);
-
- g_signal_connect_swapped (nautilus_preferences,
- "changed::" NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY,
- G_CALLBACK (toolbar_update_appearance), self);
-
- gtk_widget_show_all (toolbar);
+ gtk_container_add (GTK_CONTAINER (self->priv->location_entry_container),
+ self->priv->location_entry);
+
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-toolbar-view-menu.xml");
+ self->priv->view_menu_widget = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "view_menu_widget")));
+ self->priv->zoom_level_scale = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "zoom_level_scale")));
+ self->priv->zoom_adjustment_grid = g_object_ref (GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment_grid")));
+ self->priv->zoom_adjustment_list = g_object_ref (GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment_list")));
+ gtk_menu_button_set_popover (GTK_MENU_BUTTON (self->priv->view_button),
+ self->priv->view_menu_widget);
+ g_object_unref (builder);
+
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-toolbar-action-menu.xml");
+ self->priv->action_menu = G_MENU (gtk_builder_get_object (builder, "action-menu"));
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->action_button),
+ G_MENU_MODEL (self->priv->action_menu));
+ g_object_unref (builder);
+
+ g_signal_connect(self->priv->zoom_level_scale, "value-changed",
+ G_CALLBACK(zoom_level_changed),
+ self);
+
+ g_object_set_data (G_OBJECT (self->priv->back_button), "nav-direction",
+ GUINT_TO_POINTER (NAUTILUS_NAVIGATION_DIRECTION_BACK));
+ g_object_set_data (G_OBJECT (self->priv->forward_button), "nav-direction",
+ GUINT_TO_POINTER (NAUTILUS_NAVIGATION_DIRECTION_FORWARD));
+ g_signal_connect (self->priv->back_button, "button-press-event",
+ G_CALLBACK (navigation_button_press_cb), self);
+ g_signal_connect (self->priv->back_button, "button-release-event",
+ G_CALLBACK (navigation_button_release_cb), self);
+ g_signal_connect (self->priv->forward_button, "button-press-event",
+ G_CALLBACK (navigation_button_press_cb), self);
+ g_signal_connect (self->priv->forward_button, "button-release-event",
+ G_CALLBACK (navigation_button_release_cb), self);
+
+ gtk_widget_show_all (GTK_WIDGET (self));
toolbar_update_appearance (self);
}
static void
-nautilus_toolbar_init (NautilusToolbar *self)
-{
- self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NAUTILUS_TYPE_TOOLBAR,
- NautilusToolbarPriv);
-}
-
-static void
nautilus_toolbar_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -535,11 +496,12 @@ static void
nautilus_toolbar_class_init (NautilusToolbarClass *klass)
{
GObjectClass *oclass;
+ GtkWidgetClass *widget_class;
+ widget_class = GTK_WIDGET_CLASS (klass);
oclass = G_OBJECT_CLASS (klass);
oclass->get_property = nautilus_toolbar_get_property;
oclass->set_property = nautilus_toolbar_set_property;
- oclass->constructed = nautilus_toolbar_constructed;
oclass->dispose = nautilus_toolbar_dispose;
properties[PROP_WINDOW] =
@@ -556,8 +518,143 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
- g_type_class_add_private (klass, sizeof (NautilusToolbarClass));
g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
+
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/org/gnome/nautilus/nautilus-toolbar-ui.xml");
+
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_button);
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, action_button);
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, path_bar_container);
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, location_entry_container);
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, back_button);
+ gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, forward_button);
+}
+
+static gboolean
+hide_widget_recursive (GtkWidget *widget,
+ gchar *id)
+{
+ GList *children;
+ GList *child;
+ gboolean found = FALSE;
+
+ if (g_strcmp0 (gtk_buildable_get_name (GTK_BUILDABLE (widget)), id) == 0) {
+ gtk_widget_hide (widget);
+ return TRUE;
+ }
+
+ if (GTK_IS_CONTAINER (widget)) {
+ children = gtk_container_get_children (GTK_CONTAINER (widget));
+ for (child = children; child != NULL && !found; child = child->next) {
+ found = hide_widget_recursive (child->data, id);
+ }
+ g_list_free (children);
+ }
+
+ return found;
+}
+
+void
+nautilus_toolbar_action_menu_add_item (NautilusToolbar *self,
+ GMenuItem *item,
+ const gchar *section_name)
+{
+ nautilus_gmenu_add_item_in_submodel (self->priv->action_menu,
+ item,
+ section_name,
+ FALSE);
+}
+
+void
+nautilus_toolbar_reset_menus (NautilusToolbar *self)
+{
+ NautilusWindowSlot *slot;
+ NautilusView *view;
+ GActionGroup *view_action_group;
+ GtkBuilder *builder;
+
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->action_button), NULL);
+
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-toolbar-action-menu.xml");
+ self->priv->action_menu = G_MENU (gtk_builder_get_object (builder, "action-menu"));
+ /* This ref the action_menu */
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->priv->action_button),
+ G_MENU_MODEL (self->priv->action_menu));
+ g_object_unref (builder);
+
+ /* Allow actions from the current view to be activated through
+ * the view menu and action menu of the toolbar */
+ slot = nautilus_window_get_active_slot (self->priv->window);
+ view = nautilus_window_slot_get_current_view (slot);
+ view_action_group = nautilus_view_get_action_group (view);
+ gtk_widget_insert_action_group (GTK_WIDGET (self),
+ "view",
+ G_ACTION_GROUP (view_action_group));
+
+ hide_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), "sort_menu");
+ hide_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), "sort_trash_time");
+ hide_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), "sort_search_relevance");
+ hide_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), "visible_columns");
+}
+
+void
+nautilus_toolbar_view_menu_widget_show_element (NautilusToolbar *self,
+ gchar *id)
+{
+ g_assert (NAUTILUS_IS_TOOLBAR (self));
+
+ show_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), id);
+}
+
+void
+nautilus_toolbar_view_menu_widget_hide_element (NautilusToolbar *self,
+ gchar *id)
+{
+ g_assert (NAUTILUS_IS_TOOLBAR (self));
+
+ hide_widget_recursive (GTK_WIDGET (self->priv->view_menu_widget), id);
+}
+
+static gboolean
+show_widget_recursive (GtkWidget *widget,
+ gchar *id)
+{
+ GList *children;
+ GList *child;
+ gboolean found = FALSE;
+
+ if (g_strcmp0 (gtk_buildable_get_name (GTK_BUILDABLE (widget)), id) == 0) {
+ gtk_widget_show (widget);
+ return TRUE;
+ }
+
+ if (GTK_IS_CONTAINER (widget)) {
+ children = gtk_container_get_children (GTK_CONTAINER (widget));
+ for (child = children; child != NULL && !found; child = child->next) {
+ found = show_widget_recursive (child->data, id);
+ }
+ g_list_free (children);
+ }
+
+ return found;
+}
+
+void nautilus_toolbar_view_menu_widget_set_zoom_level (NautilusToolbar *self,
+ gdouble level)
+{
+ g_assert (NAUTILUS_IS_TOOLBAR (self));
+
+ /* We only want to change the level when there's and actual view
+ * mode set, so skip all other calls to here. Those calls came from
+ * update_toolbar_menus in the natuilus-view after a parent is set, etc.
+ * We will receive eventually a mode change and another update here by nautilus view
+ * update_toolbar_menus */
+ if (self->priv->active_zoom_adjustment == NULL)
+ return;
+
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (self->priv->active_zoom_adjustment),
+ level);
}
GtkWidget *