diff options
Diffstat (limited to '')
-rw-r--r-- | src/nautilus-label-cell.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/nautilus-label-cell.c b/src/nautilus-label-cell.c new file mode 100644 index 0000000..e8b62df --- /dev/null +++ b/src/nautilus-label-cell.c @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2022 António Fernandes <antoniof@gnome.org> + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* Needed for NautilusColumn (full GType). */ +#include <nautilus-extension.h> + +#include "nautilus-label-cell.h" + +struct _NautilusLabelCell +{ + NautilusViewCell parent_instance; + + GSignalGroup *item_signal_group; + + NautilusColumn *column; + GQuark attribute_q; + + GtkLabel *label; + + gboolean show_snippet; +}; + +G_DEFINE_TYPE (NautilusLabelCell, nautilus_label_cell, NAUTILUS_TYPE_VIEW_CELL) + +enum +{ + PROP_0, + PROP_COLUMN, + N_PROPS +}; + +static GParamSpec *properties[N_PROPS] = { NULL, }; + +static void +on_file_changed (NautilusLabelCell *self) +{ + g_autoptr (NautilusViewItem) item = NULL; + NautilusFile *file; + g_autofree gchar *string = NULL; + + item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); + g_return_if_fail (item != NULL); + file = nautilus_view_item_get_file (item); + + string = nautilus_file_get_string_attribute_q (file, self->attribute_q); + gtk_label_set_text (self->label, string); +} + +static void +nautilus_label_cell_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + NautilusLabelCell *self = NAUTILUS_LABEL_CELL (object); + + switch (prop_id) + { + case PROP_COLUMN: + { + self->column = g_value_get_object (value); + } + break; + + default: + { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + } +} + +static void +nautilus_label_cell_init (NautilusLabelCell *self) +{ + GtkWidget *child; + + child = gtk_label_new (NULL); + adw_bin_set_child (ADW_BIN (self), child); + gtk_widget_set_valign (child, GTK_ALIGN_CENTER); + gtk_widget_add_css_class (child, "dim-label"); + self->label = GTK_LABEL (child); + + /* Connect automatically to an item. */ + self->item_signal_group = g_signal_group_new (NAUTILUS_TYPE_VIEW_ITEM); + g_signal_group_connect_swapped (self->item_signal_group, "file-changed", + (GCallback) on_file_changed, self); + g_signal_connect_object (self->item_signal_group, "bind", + (GCallback) on_file_changed, self, + G_CONNECT_SWAPPED); + g_object_bind_property (self, "item", + self->item_signal_group, "target", + G_BINDING_SYNC_CREATE); +} + +static void +nautilus_label_cell_constructed (GObject *object) +{ + NautilusLabelCell *self = NAUTILUS_LABEL_CELL (object); + g_autofree gchar *column_name = NULL; + gfloat xalign; + + G_OBJECT_CLASS (nautilus_label_cell_parent_class)->constructed (object); + + g_object_get (self->column, + "attribute_q", &self->attribute_q, + "name", &column_name, + "xalign", &xalign, + NULL); + gtk_label_set_xalign (self->label, xalign); + + if (g_strcmp0 (column_name, "permissions") == 0) + { + gtk_widget_add_css_class (GTK_WIDGET (self->label), "monospace"); + } + else + { + gtk_widget_add_css_class (GTK_WIDGET (self->label), "numeric"); + } +} + +static void +nautilus_label_cell_finalize (GObject *object) +{ + NautilusLabelCell *self = (NautilusLabelCell *) object; + + g_object_unref (self->item_signal_group); + G_OBJECT_CLASS (nautilus_label_cell_parent_class)->finalize (object); +} + +static void +nautilus_label_cell_class_init (NautilusLabelCellClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = nautilus_label_cell_set_property; + object_class->constructed = nautilus_label_cell_constructed; + object_class->finalize = nautilus_label_cell_finalize; + + properties[PROP_COLUMN] = g_param_spec_object ("column", + "", "", + NAUTILUS_TYPE_COLUMN, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, properties); +} + +NautilusViewCell * +nautilus_label_cell_new (NautilusListBase *view, + NautilusColumn *column) +{ + return NAUTILUS_VIEW_CELL (g_object_new (NAUTILUS_TYPE_LABEL_CELL, + "view", view, + "column", column, + NULL)); +} |