summaryrefslogtreecommitdiff
path: root/src/nautilus-toolbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-toolbar.c')
-rw-r--r--src/nautilus-toolbar.c58
1 files changed, 33 insertions, 25 deletions
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index f64f84f1f..63aa3ff8b 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -66,6 +66,7 @@ struct _NautilusToolbarPrivate {
GtkWidget *operations_button;
GtkWidget *view_button;
+ GtkWidget *view_menu_slot_section;
GtkWidget *view_toggle_button;
GtkWidget *view_toggle_icon;
@@ -889,6 +890,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_menu_slot_section);
gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_toggle_button);
gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_toggle_icon);
gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, path_bar_container);
@@ -953,29 +955,39 @@ nautilus_toolbar_view_toggle_icon_transform_to (GBinding *binding,
return TRUE;
}
-static gboolean
-nautilus_toolbar_view_widget_transform_to (GBinding *binding,
- const GValue *from_value,
- GValue *to_value,
- gpointer user_data)
+static void
+on_slot_view_widget_changed (NautilusToolbar *toolbar,
+ GParamSpec *param,
+ NautilusWindowSlot *slot)
{
- NautilusToolbar *toolbar;
GtkWidget *view_widget;
+ GList *children;
+ GList *child;
- toolbar = NAUTILUS_TOOLBAR (user_data);
- view_widget = g_value_get_object (from_value);
+ children = gtk_container_get_children (GTK_CONTAINER (toolbar->priv->view_menu_slot_section));
+ for (child = children; child != NULL; child = g_list_next (child)) {
+ gtk_container_remove (GTK_CONTAINER (toolbar->priv->view_menu_slot_section),
+ GTK_WIDGET (child->data));
+ }
+ g_list_free (children);
- gtk_menu_button_set_popover (GTK_MENU_BUTTON (toolbar->priv->view_button), NULL);
+ view_widget = nautilus_window_slot_get_view_widget (slot);
+ gtk_widget_set_sensitive (toolbar->priv->view_button, view_widget != NULL);
+ if (view_widget == NULL)
+ return;
- g_value_set_object (to_value, view_widget);
+ gtk_box_pack_start (GTK_BOX (toolbar->priv->view_menu_slot_section), view_widget, FALSE, FALSE, 0);
+}
- /* Make the sensitivity change after the popover has been set, so that the sensitivity
- * propagates to the popover. Otherwise the popover will remain greyed out after
- * switching to a previous tab
- */
- gtk_widget_set_sensitive (toolbar->priv->view_button, view_widget != NULL);
+static void
+disconnect_view_widget_change_handler (NautilusToolbar *toolbar)
+{
+ if (toolbar->priv->active_slot == NULL)
+ return;
- return TRUE;
+ g_signal_handlers_disconnect_by_func (toolbar->priv->active_slot,
+ G_CALLBACK (on_slot_view_widget_changed),
+ toolbar);
}
void
@@ -988,6 +1000,7 @@ nautilus_toolbar_set_active_slot (NautilusToolbar *toolbar,
g_clear_pointer (&toolbar->priv->view_widget_binding, g_binding_unbind);
if (toolbar->priv->active_slot != slot) {
+ disconnect_view_widget_change_handler (toolbar);
toolbar->priv->active_slot = slot;
if (slot) {
@@ -999,16 +1012,11 @@ nautilus_toolbar_set_active_slot (NautilusToolbar *toolbar,
NULL,
toolbar,
NULL);
- 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);
- }
+ on_slot_view_widget_changed (toolbar, NULL, slot);
+ g_signal_connect_swapped (slot, "notify::view-widget",
+ G_CALLBACK (on_slot_view_widget_changed), toolbar);
+ }
}
}