diff options
-rw-r--r-- | src/nautilus-canvas-view.c | 14 | ||||
-rw-r--r-- | src/nautilus-empty-view.c | 7 | ||||
-rw-r--r-- | src/nautilus-list-view.c | 15 | ||||
-rw-r--r-- | src/nautilus-toolbar-ui.xml | 6 | ||||
-rw-r--r-- | src/nautilus-toolbar.c | 238 | ||||
-rw-r--r-- | src/nautilus-toolbar.h | 5 | ||||
-rw-r--r-- | src/nautilus-view.c | 228 | ||||
-rw-r--r-- | src/nautilus-view.h | 6 | ||||
-rw-r--r-- | src/nautilus-window-slot.c | 49 | ||||
-rw-r--r-- | src/nautilus-window-slot.h | 4 | ||||
-rw-r--r-- | src/nautilus-window.c | 8 | ||||
-rw-r--r-- | src/nautilus-window.h | 2 |
12 files changed, 398 insertions, 184 deletions
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c index 53e37d9d5..879d1a6a7 100644 --- a/src/nautilus-canvas-view.c +++ b/src/nautilus-canvas-view.c @@ -105,6 +105,8 @@ struct NautilusCanvasViewDetails gboolean supports_manual_layout; gboolean supports_scaling; gboolean supports_keep_aligned; + + GIcon *icon; }; /* Note that the first item in this list is the default sort, @@ -1834,6 +1836,8 @@ nautilus_canvas_view_finalize (GObject *object) canvas_view = NAUTILUS_CANVAS_VIEW (object); + g_clear_object (&canvas_view->details->icon); + g_free (canvas_view->details); g_signal_handlers_disconnect_by_func (nautilus_preferences, @@ -1853,6 +1857,14 @@ nautilus_canvas_view_finalize (GObject *object) G_OBJECT_CLASS (nautilus_canvas_view_parent_class)->finalize (object); } +static GIcon* +nautilus_canvas_view_get_icon (NautilusView *view) +{ + g_return_val_if_fail (NAUTILUS_IS_CANVAS_VIEW (view), NULL); + + return NAUTILUS_CANVAS_VIEW (view)->details->icon; +} + static void nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass) { @@ -1896,6 +1908,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass) nautilus_view_class->get_view_id = nautilus_canvas_view_get_id; nautilus_view_class->get_first_visible_file = canvas_view_get_first_visible_file; nautilus_view_class->scroll_to_file = canvas_view_scroll_to_file; + nautilus_view_class->get_icon = nautilus_canvas_view_get_icon; properties[PROP_SUPPORTS_AUTO_LAYOUT] = g_param_spec_boolean ("supports-auto-layout", @@ -1937,6 +1950,7 @@ nautilus_canvas_view_init (NautilusCanvasView *canvas_view) canvas_view->details = g_new0 (NautilusCanvasViewDetails, 1); canvas_view->details->sort = &sort_criteria[0]; + canvas_view->details->icon = g_themed_icon_new ("view-grid-symbolic"); canvas_container = create_canvas_container (canvas_view); diff --git a/src/nautilus-empty-view.c b/src/nautilus-empty-view.c index 9881b841a..5ece1c4bf 100644 --- a/src/nautilus-empty-view.c +++ b/src/nautilus-empty-view.c @@ -229,6 +229,12 @@ nautilus_empty_view_get_id (NautilusView *view) return NAUTILUS_EMPTY_VIEW_ID; } +static GIcon* +nautilus_empty_view_get_icon (NautilusView *view) +{ + return NULL; +} + static void nautilus_empty_view_class_init (NautilusEmptyViewClass *class) { @@ -266,6 +272,7 @@ nautilus_empty_view_class_init (NautilusEmptyViewClass *class) nautilus_view_class->get_view_id = nautilus_empty_view_get_id; nautilus_view_class->get_first_visible_file = nautilus_empty_view_get_first_visible_file; nautilus_view_class->scroll_to_file = nautilus_empty_view_scroll_to_file; + nautilus_view_class->get_icon = nautilus_empty_view_get_icon; } static void diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 20a4882c4..d39b681c0 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -97,6 +97,8 @@ struct NautilusListViewDetails { gulong clipboard_handler_id; GQuark last_sort_attr; + + GIcon *icon; }; struct SelectionForeachData { @@ -3114,6 +3116,8 @@ nautilus_list_view_finalize (GObject *object) gtk_widget_destroy (list_view->details->column_editor); } + g_clear_object (&list_view->details->icon); + g_free (list_view->details); g_signal_handlers_disconnect_by_func (nautilus_preferences, @@ -3240,6 +3244,14 @@ nautilus_list_view_get_id (NautilusView *view) return NAUTILUS_LIST_VIEW_ID; } +static GIcon* +nautilus_list_view_get_icon (NautilusView *view) +{ + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL); + + return NAUTILUS_LIST_VIEW (view)->details->icon; +} + static void nautilus_list_view_class_init (NautilusListViewClass *class) { @@ -3277,6 +3289,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class) nautilus_view_class->get_view_id = nautilus_list_view_get_id; nautilus_view_class->get_first_visible_file = nautilus_list_view_get_first_visible_file; nautilus_view_class->scroll_to_file = list_view_scroll_to_file; + nautilus_view_class->get_icon = nautilus_list_view_get_icon; } static void @@ -3285,6 +3298,8 @@ nautilus_list_view_init (NautilusListView *list_view) GActionGroup *view_action_group; list_view->details = g_new0 (NautilusListViewDetails, 1); + list_view->details->icon = g_themed_icon_new ("view-list-symbolic"); + /* ensure that the zoom level is always set before settings up the tree view columns */ list_view->details->zoom_level = get_default_zoom_level (); diff --git a/src/nautilus-toolbar-ui.xml b/src/nautilus-toolbar-ui.xml index a417667de..52d5d6362 100644 --- a/src/nautilus-toolbar-ui.xml +++ b/src/nautilus-toolbar-ui.xml @@ -104,6 +104,12 @@ <style> <class name="image-button"/> </style> + <child> + <object class="GtkImage" id="view_icon"> + <property name="visible">True</property> + <property name="icon-size">1</property> + </object> + </child> <child internal-child="accessible"> <object class="AtkObject"> <property name="accessible-name" translatable="yes">View menu</property> diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c index 3e33d2840..6b40696db 100644 --- a/src/nautilus-toolbar.c +++ b/src/nautilus-toolbar.c @@ -71,21 +71,18 @@ struct _NautilusToolbarPrivate { GtkWidget *operations_container; GtkWidget *operations_revealer; GtkWidget *operations_icon; - GtkWidget *view_menu_widget; - GtkWidget *sort_menu; - GtkWidget *sort_trash_time; - GtkWidget *sort_search_relevance; - GtkWidget *visible_columns; - GtkWidget *stop; - GtkWidget *reload; - GtkAdjustment *zoom_adjustment; - GtkWidget *zoom_level_scale; + GtkWidget *view_icon; GMenu *action_menu; GtkWidget *forward_button; GtkWidget *back_button; NautilusProgressInfoManager *progress_manager; + + /* active slot & bindings */ + NautilusWindowSlot *active_slot; + GBinding *icon_binding; + GBinding *view_widget_binding; }; enum { @@ -262,66 +259,6 @@ show_menu (NautilusToolbar *self, button, event_time); } -static void -action_view_mode_state_changed (GActionGroup *action_group, - gchar *action_name, - GVariant *value, - gpointer user_data) -{ - NautilusToolbar *self = user_data; - const gchar *view_mode = g_variant_get_string (value, NULL); - const gchar *name; - GtkWidget *image; - - if (g_strcmp0 (view_mode, "list") == 0) { - name = "view-list-symbolic"; - } else if (g_strcmp0 (view_mode, "grid") == 0) { - name = "view-grid-symbolic"; - } else { - g_assert_not_reached (); - } - - 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 -action_reload_enabled_changed (GActionGroup *action_group, - gchar *action_name, - gboolean enabled, - gpointer user_data) -{ - NautilusToolbar *self = user_data; - gtk_widget_set_visible (self->priv->reload, enabled); -} - -static void -action_stop_enabled_changed (GActionGroup *action_group, - gchar *action_name, - gboolean enabled, - gpointer user_data) -{ - NautilusToolbar *self = user_data; - gtk_widget_set_visible (self->priv->stop, enabled); -} - -static void -nautilus_toolbar_set_window (NautilusToolbar *self, - NautilusWindow *window) - -{ - self->priv->window = window; - - g_signal_connect (self->priv->window, "action-enabled-changed::stop", - G_CALLBACK (action_stop_enabled_changed), self); - g_signal_connect (self->priv->window, "action-enabled-changed::reload", - G_CALLBACK (action_reload_enabled_changed), self); - g_signal_connect (self->priv->window, "action-state-changed::view-mode", - G_CALLBACK (action_view_mode_state_changed), self); -} - #define MENU_POPUP_TIMEOUT 1200 typedef struct { @@ -405,30 +342,6 @@ navigation_button_release_cb (GtkButton *button, return FALSE; } -static void -zoom_level_changed (GtkRange *range, - NautilusToolbar *self) -{ - NautilusWindowSlot *slot; - NautilusView *view; - gdouble zoom_level; - - zoom_level = gtk_range_get_value (range); - slot = nautilus_window_get_active_slot (self->priv->window); - view = nautilus_window_slot_get_current_view (slot); - - g_action_group_change_action_state (nautilus_view_get_action_group (view), - "zoom-to-level", - g_variant_new_int32 ((gint) zoom_level)); -} - -static void -view_menu_popover_closed (GtkPopover *popover, - NautilusToolbar *self) -{ - gtk_widget_grab_focus (GTK_WIDGET (self->priv->window)); -} - static gboolean should_hide_operations_button (NautilusToolbar *self) { @@ -755,24 +668,6 @@ nautilus_toolbar_init (NautilusToolbar *self) 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 = GTK_WIDGET (gtk_builder_get_object (builder, "view_menu_widget")); - self->priv->zoom_level_scale = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_level_scale")); - self->priv->zoom_adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment")); - - self->priv->sort_menu = GTK_WIDGET (gtk_builder_get_object (builder, "sort_menu")); - self->priv->sort_trash_time = GTK_WIDGET (gtk_builder_get_object (builder, "sort_trash_time")); - self->priv->sort_search_relevance = GTK_WIDGET (gtk_builder_get_object (builder, "sort_search_relevance")); - self->priv->visible_columns = GTK_WIDGET (gtk_builder_get_object (builder, "visible_columns")); - self->priv->reload = GTK_WIDGET (gtk_builder_get_object (builder, "reload")); - self->priv->stop = GTK_WIDGET (gtk_builder_get_object (builder, "stop")); - - g_signal_connect (self->priv->view_menu_widget, "closed", - G_CALLBACK (view_menu_popover_closed), self); - 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), @@ -796,8 +691,6 @@ nautilus_toolbar_init (NautilusToolbar *self) G_CALLBACK (navigation_button_press_cb), self); g_signal_connect (self->priv->forward_button, "button-release-event", G_CALLBACK (navigation_button_release_cb), self); - g_signal_connect (self->priv->zoom_level_scale, "value-changed", - G_CALLBACK (zoom_level_changed), self); gtk_widget_show_all (GTK_WIDGET (self)); toolbar_update_appearance (self); @@ -831,7 +724,7 @@ nautilus_toolbar_set_property (GObject *object, switch (property_id) { case PROP_WINDOW: - nautilus_toolbar_set_window (self, g_value_get_object (value)); + self->priv->window = g_value_get_object (value); break; case PROP_SHOW_LOCATION_ENTRY: nautilus_toolbar_set_show_location_entry (self, g_value_get_boolean (value)); @@ -901,6 +794,7 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass) gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_container); gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_revealer); gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_button); + gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_icon); 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); @@ -911,56 +805,6 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_operations_button_toggled); } -void -nautilus_toolbar_reset_menus (NautilusToolbar *self) -{ - NautilusWindowSlot *slot; - NautilusView *view; - GActionGroup *view_action_group; - GVariant *variant; - GVariantIter iter; - gboolean show_sort_trash, show_sort_search, show_sort_access, show_sort_modification, enable_sort; - const gchar *hint; - - /* 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)); - - gtk_widget_set_visible (self->priv->visible_columns, - g_action_group_has_action (view_action_group, "visible-columns")); - - enable_sort = g_action_group_get_action_enabled (view_action_group, "sort"); - show_sort_trash = show_sort_search = show_sort_modification = show_sort_access = FALSE; - gtk_widget_set_visible (self->priv->sort_menu, enable_sort); - - if (enable_sort) { - variant = g_action_group_get_action_state_hint (view_action_group, "sort"); - g_variant_iter_init (&iter, variant); - - while (g_variant_iter_next (&iter, "&s", &hint)) { - if (g_strcmp0 (hint, "trash-time") == 0) - show_sort_trash = TRUE; - if (g_strcmp0 (hint, "search-relevance") == 0) - show_sort_search = TRUE; - } - - g_variant_unref (variant); - } - - gtk_widget_set_visible (self->priv->sort_trash_time, show_sort_trash); - gtk_widget_set_visible (self->priv->sort_search_relevance, show_sort_search); - - variant = g_action_group_get_action_state (view_action_group, "zoom-to-level"); - gtk_adjustment_set_value (self->priv->zoom_adjustment, - g_variant_get_int32 (variant)); - g_variant_unref (variant); -} - GtkWidget * nautilus_toolbar_new () { @@ -1000,3 +844,69 @@ nautilus_toolbar_set_show_location_entry (NautilusToolbar *self, g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_LOCATION_ENTRY]); } } + +static gboolean +nautilus_toolbar_view_widget_transform_to (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + NautilusToolbar *toolbar; + GtkWidget *view_widget; + + toolbar = NAUTILUS_TOOLBAR (user_data); + view_widget = g_value_get_object (from_value); + + gtk_widget_set_sensitive (toolbar->priv->view_button, view_widget != NULL); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (toolbar->priv->view_button), NULL); + + if (view_widget) { + if (!GTK_IS_POPOVER (view_widget)) { + GtkWidget *popover; + + popover = gtk_popover_new (toolbar->priv->view_button); + gtk_container_add (GTK_CONTAINER (popover), view_widget); + + view_widget = popover; + } + } + + g_value_set_object (to_value, view_widget); + + return TRUE; +} + +void +nautilus_toolbar_set_active_slot (NautilusToolbar *toolbar, + NautilusWindowSlot *slot) +{ + g_return_if_fail (NAUTILUS_IS_TOOLBAR (toolbar)); + + g_clear_pointer (&toolbar->priv->icon_binding, g_binding_unbind); + g_clear_pointer (&toolbar->priv->view_widget_binding, g_binding_unbind); + + if (toolbar->priv->active_slot != slot) { + toolbar->priv->active_slot = slot; + + if (slot) { + GIcon *icon; + + icon = nautilus_window_slot_get_icon (slot); + + gtk_image_set_from_gicon (GTK_IMAGE (toolbar->priv->view_icon), icon, GTK_ICON_SIZE_BUTTON); + + toolbar->priv->icon_binding = g_object_bind_property (slot, "icon", + toolbar->priv->view_icon, "gicon", + G_BINDING_DEFAULT); + toolbar->priv->view_widget_binding = + g_object_bind_property_full (slot, "view-widget", + toolbar->priv->view_button, "popover", + G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE, + (GBindingTransformFunc) nautilus_toolbar_view_widget_transform_to, + NULL, + toolbar, + NULL); + } + + } +} diff --git a/src/nautilus-toolbar.h b/src/nautilus-toolbar.h index f281b954d..c66ef91b7 100644 --- a/src/nautilus-toolbar.h +++ b/src/nautilus-toolbar.h @@ -27,6 +27,7 @@ #include <gtk/gtk.h> +#include "nautilus-window-slot.h" #define NAUTILUS_TYPE_TOOLBAR nautilus_toolbar_get_type() #define NAUTILUS_TOOLBAR(obj) \ @@ -70,6 +71,8 @@ GMenu *nautilus_toolbar_get_action_menu (NautilusToolbar *self); void nautilus_toolbar_set_show_location_entry (NautilusToolbar *self, gboolean show_location_entry); -void nautilus_toolbar_reset_menus (NautilusToolbar *self); + +void nautilus_toolbar_set_active_slot (NautilusToolbar *toolbar, + NautilusWindowSlot *slot); #endif /* __NAUTILUS_TOOLBAR_H__ */ diff --git a/src/nautilus-view.c b/src/nautilus-view.c index 073bacc0e..120b13e89 100644 --- a/src/nautilus-view.c +++ b/src/nautilus-view.c @@ -141,6 +141,8 @@ enum { enum { PROP_WINDOW_SLOT = 1, PROP_SUPPORTS_ZOOMING, + PROP_ICON, + PROP_VIEW_WIDGET, NUM_PROPERTIES }; @@ -238,6 +240,21 @@ struct NautilusViewDetails guint floating_bar_set_status_timeout_id; guint floating_bar_loading_timeout_id; GtkWidget *floating_bar; + + /* View menu */ + GtkWidget *view_menu_widget; + GtkWidget *view_icon; + GtkWidget *sort_menu; + GtkWidget *sort_trash_time; + GtkWidget *sort_search_relevance; + GtkWidget *visible_columns; + GtkWidget *stop; + GtkWidget *reload; + GtkAdjustment *zoom_adjustment; + GtkWidget *zoom_level_scale; + + gulong stop_signal_handler; + gulong reload_signal_handler; }; typedef struct { @@ -593,6 +610,39 @@ nautilus_view_using_manual_layout (NautilusView *view) } /** + * nautilus_view_get_icon: + * @view: a #NautilusView + * + * Retrieves the #GIcon that represents @view. + * + * Returns: (transfer none): the #Gicon that represents @view + */ +GIcon* +nautilus_view_get_icon (NautilusView *view) +{ + g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL); + + return NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->get_icon (view); +} + +/** + * nautilus_view_get_view_widget: + * @view: a #NautilusView + * + * Retrieves the view menu, as a #GtkWidget. If it's %NULL, + * the button renders insensitive. + * + * Returns: (transfer none): a #GtkWidget for the view menu + */ +GtkWidget* +nautilus_view_get_view_widget (NautilusView *view) +{ + g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL); + + return view->details->view_menu_widget; +} + +/** * nautilus_view_can_rename_file * * Determine whether a file can be renamed. @@ -1514,6 +1564,15 @@ action_select_pattern (GSimpleAction *action, } static void +zoom_level_changed (GtkRange *range, + NautilusView *view) +{ + g_action_group_change_action_state (view->details->view_action_group, + "zoom-to-level", + g_variant_new_int32 (gtk_range_get_value (range))); +} + +static void reveal_newly_added_folder (NautilusView *view, NautilusFile *new_file, NautilusDirectory *directory, GFile *target_location) { @@ -2617,6 +2676,10 @@ slot_active (NautilusWindowSlot *slot, nautilus_view_update_toolbar_menus (view); schedule_update_context_menus (view); + + gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)), + "view", + G_ACTION_GROUP (view->details->view_action_group)); } static void @@ -2630,6 +2693,9 @@ slot_inactive (NautilusWindowSlot *slot, view->details->active = FALSE; remove_update_context_menus_timeout_callback (view); + gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)), + "view", + NULL); } static void @@ -6734,6 +6800,52 @@ nautilus_view_update_context_menus (NautilusView *view) NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->update_context_menus (view); } +static void +nautilus_view_reset_view_menu (NautilusView *view) +{ + GActionGroup *view_action_group; + GVariant *variant; + GVariantIter iter; + gboolean show_sort_trash, show_sort_search, show_sort_access, show_sort_modification, enable_sort; + const gchar *hint; + + /* Allow actions from the current view to be activated through + * the view menu and action menu of the toolbar */ + view_action_group = nautilus_view_get_action_group (view); + gtk_widget_insert_action_group (GTK_WIDGET (view), + "view", + G_ACTION_GROUP (view_action_group)); + + gtk_widget_set_visible (view->details->visible_columns, + g_action_group_has_action (view_action_group, "visible-columns")); + + enable_sort = g_action_group_get_action_enabled (view_action_group, "sort"); + show_sort_trash = show_sort_search = show_sort_modification = show_sort_access = FALSE; + gtk_widget_set_visible (view->details->sort_menu, enable_sort); + + if (enable_sort) { + variant = g_action_group_get_action_state_hint (view_action_group, "sort"); + g_variant_iter_init (&iter, variant); + + while (g_variant_iter_next (&iter, "&s", &hint)) { + if (g_strcmp0 (hint, "trash-time") == 0) + show_sort_trash = TRUE; + if (g_strcmp0 (hint, "search-relevance") == 0) + show_sort_search = TRUE; + } + + g_variant_unref (variant); + } + + gtk_widget_set_visible (view->details->sort_trash_time, show_sort_trash); + gtk_widget_set_visible (view->details->sort_search_relevance, show_sort_search); + + variant = g_action_group_get_action_state (view_action_group, "zoom-to-level"); + gtk_adjustment_set_value (view->details->zoom_adjustment, + g_variant_get_int32 (variant)); + g_variant_unref (variant); +} + /* Convenience function to reset the menus owned by the view but managed on * the toolbar, and update them with the current state. * It will also update the actions state, which will also update children @@ -6742,9 +6854,6 @@ nautilus_view_update_context_menus (NautilusView *view) void nautilus_view_update_toolbar_menus (NautilusView *view) { - NautilusToolbar *toolbar; - NautilusWindow *window; - g_assert (NAUTILUS_IS_VIEW (view)); /* Don't update after destroy (#349551), @@ -6754,11 +6863,7 @@ nautilus_view_update_toolbar_menus (NautilusView *view) !view->details->active) { return; } - window = nautilus_view_get_window (view); - toolbar = NAUTILUS_TOOLBAR (nautilus_window_get_toolbar (window)); - nautilus_toolbar_reset_menus (toolbar); - nautilus_window_reset_menus (window); - + nautilus_view_reset_view_menu (view); nautilus_view_update_actions_state (view); } @@ -7424,6 +7529,29 @@ real_get_selected_icon_locations (NautilusView *view) } static void +nautilus_view_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + NautilusView *view = NAUTILUS_VIEW (object); + + switch (prop_id) { + case PROP_ICON: + g_value_set_object (value, nautilus_view_get_icon (view)); + break; + + case PROP_VIEW_WIDGET: + g_value_set_object (value, nautilus_view_get_view_widget (view)); + break; + + default: + g_assert_not_reached (); + + } +} + +static void nautilus_view_set_property (GObject *object, guint prop_id, const GValue *value, @@ -7526,31 +7654,78 @@ nautilus_view_scroll_event (GtkWidget *widget, return FALSE; } + +static void +action_reload_enabled_changed (GActionGroup *action_group, + gchar *action_name, + gboolean enabled, + NautilusView *view) +{ + gtk_widget_set_visible (view->details->reload, enabled); +} + +static void +action_stop_enabled_changed (GActionGroup *action_group, + gchar *action_name, + gboolean enabled, + NautilusView *view) +{ + gtk_widget_set_visible (view->details->stop, enabled); +} + static void nautilus_view_parent_set (GtkWidget *widget, GtkWidget *old_parent) { + NautilusWindow *window; NautilusView *view; GtkWidget *parent; view = NAUTILUS_VIEW (widget); parent = gtk_widget_get_parent (widget); + window = nautilus_view_get_window (view); g_assert (parent == NULL || old_parent == NULL); if (GTK_WIDGET_CLASS (nautilus_view_parent_class)->parent_set != NULL) { GTK_WIDGET_CLASS (nautilus_view_parent_class)->parent_set (widget, old_parent); } + if (view->details->stop_signal_handler > 0) { + g_signal_handler_disconnect (window, view->details->stop_signal_handler); + view->details->stop_signal_handler = 0; + } + + if (view->details->reload_signal_handler > 0) { + g_signal_handler_disconnect (window, view->details->reload_signal_handler); + view->details->reload_signal_handler = 0; + } + if (parent != NULL) { g_assert (old_parent == NULL); - if (view->details->slot == - nautilus_window_get_active_slot (nautilus_view_get_window (view))) { + if (view->details->slot == nautilus_window_get_active_slot (window)) { view->details->active = TRUE; + gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)), + "view", + G_ACTION_GROUP (view->details->view_action_group)); } + + view->details->stop_signal_handler = + g_signal_connect (window, + "action-enabled-changed::stop", + G_CALLBACK (action_stop_enabled_changed), + view); + view->details->reload_signal_handler = + g_signal_connect (window, + "action-enabled-changed::reload", + G_CALLBACK (action_reload_enabled_changed), + view); } else { remove_update_context_menus_timeout_callback (view); + gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)), + "view", + NULL); } } @@ -7564,6 +7739,7 @@ nautilus_view_class_init (NautilusViewClass *klass) oclass = G_OBJECT_CLASS (klass); oclass->finalize = nautilus_view_finalize; + oclass->get_property = nautilus_view_get_property; oclass->set_property = nautilus_view_set_property; widget_class->destroy = nautilus_view_destroy; @@ -7671,6 +7847,19 @@ nautilus_view_class_init (NautilusViewClass *klass) TRUE, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + properties[PROP_ICON] = + g_param_spec_object ("icon", + "Icon", + "The icon that represents the view", + G_TYPE_ICON, + G_PARAM_READABLE); + + properties[PROP_VIEW_WIDGET] = + g_param_spec_object ("view-widget", + "View widget", + "The view's widget that will appear under the view menu button", + GTK_TYPE_WIDGET, + G_PARAM_READABLE); g_object_class_install_properties (oclass, NUM_PROPERTIES, properties); } @@ -7702,6 +7891,24 @@ nautilus_view_init (NautilusView *view) gtk_widget_add_events (GTK_WIDGET (view), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + /* View menu */ + builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-toolbar-view-menu.xml"); + view->details->view_menu_widget = g_object_ref (gtk_builder_get_object (builder, "view_menu_widget")); + view->details->zoom_level_scale = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_level_scale")); + view->details->zoom_adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment")); + + view->details->sort_menu = GTK_WIDGET (gtk_builder_get_object (builder, "sort_menu")); + view->details->sort_trash_time = GTK_WIDGET (gtk_builder_get_object (builder, "sort_trash_time")); + view->details->sort_search_relevance = GTK_WIDGET (gtk_builder_get_object (builder, "sort_search_relevance")); + view->details->visible_columns = GTK_WIDGET (gtk_builder_get_object (builder, "visible_columns")); + view->details->reload = GTK_WIDGET (gtk_builder_get_object (builder, "reload")); + view->details->stop = GTK_WIDGET (gtk_builder_get_object (builder, "stop")); + + g_signal_connect (view->details->zoom_level_scale, "value-changed", + G_CALLBACK (zoom_level_changed), view); + + g_object_unref (builder); + /* Scrolled Window */ view->details->scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view->details->scrolled_window), @@ -7812,7 +8019,6 @@ nautilus_view_init (NautilusView *view) gtk_widget_insert_action_group (GTK_WIDGET (view), "view", G_ACTION_GROUP (view->details->view_action_group)); - app = g_application_get_default (); /* Toolbar menu */ diff --git a/src/nautilus-view.h b/src/nautilus-view.h index 93fbc894d..b6e73ce27 100644 --- a/src/nautilus-view.h +++ b/src/nautilus-view.h @@ -276,6 +276,8 @@ struct NautilusViewClass { const char *uri); NautilusWindow * (*get_window) (NautilusView *view); + + GIcon * (* get_icon) (NautilusView *view); }; /* GObject support */ @@ -390,4 +392,8 @@ GActionGroup * nautilus_view_get_action_group (NautilusView *v GtkWidget* nautilus_view_get_content_widget (NautilusView *view); gboolean nautilus_view_is_search (NautilusView *view); +GIcon* nautilus_view_get_icon (NautilusView *view); + +GtkWidget* nautilus_view_get_view_widget (NautilusView *view); + #endif /* NAUTILUS_VIEW_H */ diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c index 766c6a564..0c5e3934e 100644 --- a/src/nautilus-window-slot.c +++ b/src/nautilus-window-slot.c @@ -55,6 +55,8 @@ enum { enum { PROP_WINDOW = 1, + PROP_ICON, + PROP_VIEW_WIDGET, NUM_PROPERTIES }; @@ -527,6 +529,12 @@ nautilus_window_slot_get_property (GObject *object, case PROP_WINDOW: g_value_set_object (value, slot->details->window); break; + case PROP_ICON: + g_value_set_object (value, nautilus_window_slot_get_icon (slot)); + break; + case PROP_VIEW_WIDGET: + g_value_set_object (value, nautilus_window_slot_get_view_widget (slot)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -2267,6 +2275,9 @@ nautilus_window_slot_switch_new_content_view (NautilusWindowSlot *slot) gtk_container_add (GTK_CONTAINER (slot), widget); gtk_widget_set_vexpand (widget, TRUE); gtk_widget_show (widget); + + g_object_notify_by_pspec (G_OBJECT (slot), properties[PROP_ICON]); + g_object_notify_by_pspec (G_OBJECT (slot), properties[PROP_VIEW_WIDGET]); } } @@ -2448,6 +2459,20 @@ nautilus_window_slot_class_init (NautilusWindowSlotClass *klass) NAUTILUS_TYPE_WINDOW, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + properties[PROP_ICON] = + g_param_spec_object ("icon", + "Icon that represents the slot", + "The icon that represents the slot", + G_TYPE_ICON, + G_PARAM_READABLE); + + properties[PROP_VIEW_WIDGET] = + g_param_spec_object ("view-widget", + "Widget for the view menu", + "The widget for the view's menu", + GTK_TYPE_WIDGET, + G_PARAM_READABLE); + g_object_class_install_properties (oclass, NUM_PROPERTIES, properties); g_type_class_add_private (klass, sizeof (NautilusWindowSlotDetails)); } @@ -2656,3 +2681,27 @@ nautilus_window_slot_new (NautilusWindow *window) "window", window, NULL); } + +GIcon* +nautilus_window_slot_get_icon (NautilusWindowSlot *slot) +{ + NautilusView *view; + + g_return_val_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot), NULL); + + view = nautilus_window_slot_get_current_view (slot); + + return view ? nautilus_view_get_icon (view) : NULL; +} + +GtkWidget* +nautilus_window_slot_get_view_widget (NautilusWindowSlot *slot) +{ + NautilusView *view; + + g_return_val_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot), NULL); + + view = nautilus_window_slot_get_current_view (slot); + + return view ? nautilus_view_get_view_widget (view) : NULL; +} diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h index 97ff788ae..36d27bc27 100644 --- a/src/nautilus-window-slot.h +++ b/src/nautilus-window-slot.h @@ -127,4 +127,8 @@ void nautilus_window_slot_display_view_selection_failure (NautilusWindow *wind GFile *location, GError *error); +GIcon* nautilus_window_slot_get_icon (NautilusWindowSlot *slot); + +GtkWidget* nautilus_window_slot_get_view_widget (NautilusWindowSlot *slot); + #endif /* NAUTILUS_WINDOW_SLOT_H */ diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 6daebbfff..eb0df248c 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -768,12 +768,6 @@ update_cursor (NautilusWindow *window) } void -nautilus_window_reset_menus (NautilusWindow *window) -{ - nautilus_window_sync_allow_stop (window, nautilus_window_get_active_slot (window)); -} - -void nautilus_window_sync_allow_stop (NautilusWindow *window, NautilusWindowSlot *slot) { @@ -2278,6 +2272,8 @@ nautilus_window_set_active_slot (NautilusWindow *window, NautilusWindowSlot *new /* inform sidebar panels */ nautilus_window_report_location_change (window); + nautilus_toolbar_set_active_slot (NAUTILUS_TOOLBAR (window->priv->toolbar), new_slot); + /* inform slot & view */ g_signal_emit_by_name (new_slot, "active"); } diff --git a/src/nautilus-window.h b/src/nautilus-window.h index 7bb3e2d04..f0183400e 100644 --- a/src/nautilus-window.h +++ b/src/nautilus-window.h @@ -126,8 +126,6 @@ void nautilus_window_back_or_forward (NautilusWindow *window, gboolean back, guint distance, NautilusWindowOpenFlags flags); -void nautilus_window_reset_menus (NautilusWindow *window); - GtkWidget * nautilus_window_get_notebook (NautilusWindow *window); NautilusWindowOpenFlags nautilus_event_get_window_open_flags (void); |