summaryrefslogtreecommitdiffstats
path: root/src/nautilus-view-cell.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/nautilus-view-cell.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/nautilus-view-cell.c b/src/nautilus-view-cell.c
new file mode 100644
index 0000000..6f28fd8
--- /dev/null
+++ b/src/nautilus-view-cell.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2022 2022 António Fernandes <antoniof@gnome.org>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include "nautilus-view-cell.h"
+#include "nautilus-list-base.h"
+
+/**
+ * NautilusViewCell:
+ *
+ * Abstract class of widgets tailored to be set as #GtkListItem:child in a view
+ * which subclasses #NautilusListBase.
+ *
+ * Subclass constructors should take a pointer to the #NautilusListBase view.
+ *
+ * The view is responsible for setting #NautilusViewCell:item. This can be done
+ * using a GBinding from #GtkListItem:item to #NautilusViewCell:item.
+ */
+
+typedef struct _NautilusViewCellPrivate NautilusViewCellPrivate;
+struct _NautilusViewCellPrivate
+{
+ AdwBin parent_instance;
+
+ NautilusListBase *view; /* Unowned */
+ NautilusViewItem *item; /* Owned reference */
+
+ gboolean called_once;
+};
+
+
+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (NautilusViewCell, nautilus_view_cell, ADW_TYPE_BIN)
+
+enum
+{
+ PROP_0,
+ PROP_VIEW,
+ PROP_ITEM,
+ N_PROPS
+};
+
+static GParamSpec *properties[N_PROPS] = { NULL, };
+
+static void
+nautilus_view_cell_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusViewCell *self = NAUTILUS_VIEW_CELL (object);
+ NautilusViewCellPrivate *priv = nautilus_view_cell_get_instance_private (self);
+
+ switch (prop_id)
+ {
+ case PROP_VIEW:
+ {
+ g_value_set_object (value, priv->view);
+ }
+ break;
+
+ case PROP_ITEM:
+ {
+ g_value_set_object (value, priv->item);
+ }
+ break;
+
+ default:
+ {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ }
+}
+
+static void
+nautilus_view_cell_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusViewCell *self = NAUTILUS_VIEW_CELL (object);
+ NautilusViewCellPrivate *priv = nautilus_view_cell_get_instance_private (self);
+
+ switch (prop_id)
+ {
+ case PROP_VIEW:
+ {
+ priv->view = g_value_get_object (value);
+ }
+ break;
+
+ case PROP_ITEM:
+ {
+ g_set_object (&priv->item, g_value_get_object (value));
+ }
+ break;
+
+ default:
+ {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ }
+}
+
+static void
+nautilus_view_cell_init (NautilusViewCell *self)
+{
+ gtk_widget_set_name (GTK_WIDGET (self), "NautilusViewCell");
+}
+
+static void
+nautilus_view_cell_finalize (GObject *object)
+{
+ NautilusViewCell *self = NAUTILUS_VIEW_CELL (object);
+ NautilusViewCellPrivate *priv = nautilus_view_cell_get_instance_private (self);
+
+ g_clear_object (&priv->item);
+
+ G_OBJECT_CLASS (nautilus_view_cell_parent_class)->finalize (object);
+}
+
+static void
+nautilus_view_cell_class_init (NautilusViewCellClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = nautilus_view_cell_finalize;
+ object_class->get_property = nautilus_view_cell_get_property;
+ object_class->set_property = nautilus_view_cell_set_property;
+
+ properties[PROP_VIEW] = g_param_spec_object ("view",
+ "", "",
+ NAUTILUS_TYPE_LIST_BASE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ properties[PROP_ITEM] = g_param_spec_object ("item",
+ "", "",
+ NAUTILUS_TYPE_VIEW_ITEM,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, N_PROPS, properties);
+}
+
+gboolean
+nautilus_view_cell_once (NautilusViewCell *self)
+{
+ NautilusViewCellPrivate *priv = nautilus_view_cell_get_instance_private (self);
+
+ if (priv->called_once)
+ {
+ return FALSE;
+ }
+ priv->called_once = TRUE;
+
+ return TRUE;
+}
+
+NautilusListBase *
+nautilus_view_cell_get_view (NautilusViewCell *self)
+{
+ NautilusListBase *view;
+
+ g_return_val_if_fail (NAUTILUS_IS_VIEW_CELL (self), NULL);
+
+ g_object_get (self, "view", &view, NULL);
+
+ return view;
+}
+
+void
+nautilus_view_cell_set_item (NautilusViewCell *self,
+ NautilusViewItem *item)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW_CELL (self));
+ g_return_if_fail (item == NULL || NAUTILUS_IS_VIEW_ITEM (item));
+
+ g_object_set (self, "item", item, NULL);
+}
+
+NautilusViewItem *
+nautilus_view_cell_get_item (NautilusViewCell *self)
+{
+ NautilusViewItem *item;
+
+ g_return_val_if_fail (NAUTILUS_IS_VIEW_CELL (self), NULL);
+
+ g_object_get (self, "item", &item, NULL);
+
+ return item;
+}