diff options
Diffstat (limited to '')
-rw-r--r-- | src/nautilus-view-controls.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/nautilus-view-controls.c b/src/nautilus-view-controls.c new file mode 100644 index 0000000..bd8e6d7 --- /dev/null +++ b/src/nautilus-view-controls.c @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2022 The GNOME project contributors + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "nautilus-view-controls.h" + +#include "nautilus-toolbar-menu-sections.h" +#include "nautilus-window.h" + +struct _NautilusViewControls +{ + AdwBin parent_instance; + + GtkWidget *view_split_button; + GMenuModel *view_menu; + + NautilusWindowSlot *window_slot; +}; + +G_DEFINE_FINAL_TYPE (NautilusViewControls, nautilus_view_controls, ADW_TYPE_BIN); + + +enum +{ + PROP_0, + PROP_WINDOW_SLOT, + N_PROPS +}; + +static GParamSpec *properties[N_PROPS]; + +static void +on_slot_toolbar_menu_sections_changed (NautilusViewControls *self, + GParamSpec *param, + NautilusWindowSlot *slot) +{ + NautilusToolbarMenuSections *new_sections; + g_autoptr (GMenuItem) zoom_item = NULL; + g_autoptr (GMenuItem) sort_item = NULL; + + new_sections = nautilus_window_slot_get_toolbar_menu_sections (slot); + + gtk_widget_set_sensitive (self->view_split_button, (new_sections != NULL)); + if (new_sections == NULL) + { + return; + } + + /* Let's assume that sort section is the first item + * in view_menu, as per nautilus-toolbar.ui. */ + + sort_item = g_menu_item_new_from_model (self->view_menu, 0); + g_menu_remove (G_MENU (self->view_menu), 0); + g_menu_item_set_section (sort_item, new_sections->sort_section); + g_menu_insert_item (G_MENU (self->view_menu), 0, sort_item); +} + +static void +disconnect_toolbar_menu_sections_change_handler (NautilusViewControls *self) +{ + if (self->window_slot == NULL) + { + return; + } + + g_signal_handlers_disconnect_by_func (self->window_slot, + G_CALLBACK (on_slot_toolbar_menu_sections_changed), + self); +} + + +static void +nautilus_view_controls_set_window_slot (NautilusViewControls *self, + NautilusWindowSlot *window_slot) +{ + g_return_if_fail (NAUTILUS_IS_VIEW_CONTROLS (self)); + g_return_if_fail (window_slot == NULL || NAUTILUS_IS_WINDOW_SLOT (window_slot)); + + if (self->window_slot == window_slot) + { + return; + } + + disconnect_toolbar_menu_sections_change_handler (self); + + self->window_slot = window_slot; + + if (self->window_slot != NULL) + { + on_slot_toolbar_menu_sections_changed (self, NULL, self->window_slot); + g_signal_connect_swapped (self->window_slot, "notify::toolbar-menu-sections", + G_CALLBACK (on_slot_toolbar_menu_sections_changed), self); + } + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_WINDOW_SLOT]); +} + +static void +nautilus_view_controls_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + NautilusViewControls *self = NAUTILUS_VIEW_CONTROLS (object); + + switch (prop_id) + { + case PROP_WINDOW_SLOT: + { + g_value_set_object (value, G_OBJECT (self->window_slot)); + break; + } + + default: + { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + } +} + +static void +nautilus_view_controls_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + NautilusViewControls *self = NAUTILUS_VIEW_CONTROLS (object); + + switch (prop_id) + { + case PROP_WINDOW_SLOT: + { + nautilus_view_controls_set_window_slot (self, NAUTILUS_WINDOW_SLOT (g_value_get_object (value))); + break; + } + + default: + { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + } +} + +static void +nautilus_view_controls_finalize (GObject *obj) +{ + NautilusViewControls *self = NAUTILUS_VIEW_CONTROLS (obj); + + if (self->window_slot != NULL) + { + g_signal_handlers_disconnect_by_data (self->window_slot, self); + self->window_slot = NULL; + } + + G_OBJECT_CLASS (nautilus_view_controls_parent_class)->finalize (obj); +} + +static void +nautilus_view_controls_class_init (NautilusViewControlsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = nautilus_view_controls_finalize; + object_class->get_property = nautilus_view_controls_get_property; + object_class->set_property = nautilus_view_controls_set_property; + + properties[PROP_WINDOW_SLOT] = g_param_spec_object ("window-slot", + NULL, NULL, + NAUTILUS_TYPE_WINDOW_SLOT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + g_object_class_install_properties (object_class, N_PROPS, properties); + + gtk_widget_class_set_template_from_resource (widget_class, + "/org/gnome/nautilus/ui/nautilus-view-controls.ui"); + gtk_widget_class_bind_template_child (widget_class, NautilusViewControls, view_menu); + gtk_widget_class_bind_template_child (widget_class, NautilusViewControls, view_split_button); +} + +static void +nautilus_view_controls_init (NautilusViewControls *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} |