|
rpm-build |
f53ec4 |
/* dzl-graph-column.c
|
|
rpm-build |
f53ec4 |
*
|
|
rpm-build |
f53ec4 |
* Copyright (C) 2015 Christian Hergert <christian@hergert.me>
|
|
rpm-build |
f53ec4 |
*
|
|
rpm-build |
f53ec4 |
* This file is free software; you can redistribute it and/or modify it
|
|
rpm-build |
f53ec4 |
* under the terms of the GNU Lesser General Public License as
|
|
rpm-build |
f53ec4 |
* published by the Free Software Foundation; either version 3 of the
|
|
rpm-build |
f53ec4 |
* License, or (at your option) any later version.
|
|
rpm-build |
f53ec4 |
*
|
|
rpm-build |
f53ec4 |
* This file is distributed in the hope that it will be useful, but
|
|
rpm-build |
f53ec4 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
rpm-build |
f53ec4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
rpm-build |
f53ec4 |
* Lesser General Public License for more details.
|
|
rpm-build |
f53ec4 |
*
|
|
rpm-build |
f53ec4 |
* You should have received a copy of the GNU General Public License
|
|
rpm-build |
f53ec4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
rpm-build |
f53ec4 |
*/
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
#include "config.h"
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
#include <glib/gi18n.h>
|
|
rpm-build |
f53ec4 |
#include <gobject/gvaluecollector.h>
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
#include "dzl-graph-column.h"
|
|
rpm-build |
f53ec4 |
#include "dzl-graph-column-private.h"
|
|
rpm-build |
f53ec4 |
#include "util/dzl-ring.h"
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
struct _DzlGraphColumn
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
GObject parent_instance;
|
|
rpm-build |
f53ec4 |
gchar *name;
|
|
rpm-build |
f53ec4 |
DzlRing *values;
|
|
rpm-build |
f53ec4 |
GType value_type;
|
|
rpm-build |
f53ec4 |
};
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
G_DEFINE_TYPE (DzlGraphColumn, dzl_graph_view_column, G_TYPE_OBJECT)
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
enum {
|
|
rpm-build |
f53ec4 |
PROP_0,
|
|
rpm-build |
f53ec4 |
PROP_NAME,
|
|
rpm-build |
f53ec4 |
PROP_VALUE_TYPE,
|
|
rpm-build |
f53ec4 |
LAST_PROP
|
|
rpm-build |
f53ec4 |
};
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static GParamSpec *properties [LAST_PROP];
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
DzlGraphColumn *
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_new (const gchar *name,
|
|
rpm-build |
f53ec4 |
GType value_type)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
return g_object_new (DZL_TYPE_GRAPH_COLUMN,
|
|
rpm-build |
f53ec4 |
"name", name,
|
|
rpm-build |
f53ec4 |
"value-type", value_type,
|
|
rpm-build |
f53ec4 |
NULL);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
const gchar *
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_get_name (DzlGraphColumn *self)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_return_val_if_fail (DZL_IS_GRAPH_COLUMN (self), NULL);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
return self->name;
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_set_name (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
const gchar *name)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
if (g_strcmp0 (name, self->name) != 0)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_free (self->name);
|
|
rpm-build |
f53ec4 |
self->name = g_strdup (name);
|
|
rpm-build |
f53ec4 |
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_NAME]);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_copy_value (gpointer data,
|
|
rpm-build |
f53ec4 |
gpointer user_data)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
const GValue *src_value = data;
|
|
rpm-build |
f53ec4 |
DzlRing *ring = user_data;
|
|
rpm-build |
f53ec4 |
GValue copy = G_VALUE_INIT;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
if (G_IS_VALUE (src_value))
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_value_init (©, G_VALUE_TYPE (src_value));
|
|
rpm-build |
f53ec4 |
g_value_copy (src_value, ©);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
dzl_ring_append_val (ring, copy);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_set_n_rows (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint n_rows)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
DzlRing *ring;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (n_rows > 0);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
ring = dzl_ring_sized_new (sizeof (GValue), n_rows, NULL);
|
|
rpm-build |
f53ec4 |
dzl_ring_foreach (self->values, dzl_graph_view_column_copy_value, ring);
|
|
rpm-build |
f53ec4 |
g_clear_pointer (&self->values, dzl_ring_unref);
|
|
rpm-build |
f53ec4 |
self->values = ring;
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
guint
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_push (DzlGraphColumn *self)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
GValue value = G_VALUE_INIT;
|
|
rpm-build |
f53ec4 |
guint ret;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_val_if_fail (DZL_IS_GRAPH_COLUMN (self), 0);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_value_init (&value, self->value_type);
|
|
rpm-build |
f53ec4 |
ret = dzl_ring_append_val (self->values, value);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
return ret;
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_get_value (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint index,
|
|
rpm-build |
f53ec4 |
GValue *value)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
const GValue *src_value;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (value != NULL);
|
|
rpm-build |
f53ec4 |
g_return_if_fail (index < self->values->len);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
src_value = &((GValue *)(gpointer)self->values->data)[index];
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_value_init (value, self->value_type);
|
|
rpm-build |
f53ec4 |
if (G_IS_VALUE (src_value))
|
|
rpm-build |
f53ec4 |
g_value_copy (src_value, value);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_collect (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint index,
|
|
rpm-build |
f53ec4 |
va_list args)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
GValue *value;
|
|
rpm-build |
f53ec4 |
gchar *errmsg = NULL;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (index < self->values->len);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
value = &((GValue *)(gpointer)self->values->data)[index];
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
G_VALUE_COLLECT (value, args, 0, &errmsg);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
if (G_UNLIKELY (errmsg != NULL))
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_critical ("%s", errmsg);
|
|
rpm-build |
f53ec4 |
g_free (errmsg);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_set (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint index,
|
|
rpm-build |
f53ec4 |
...)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
va_list args;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (index < self->values->len);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
va_start (args, index);
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_collect (self, index, args);
|
|
rpm-build |
f53ec4 |
va_end (args);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_get (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint index,
|
|
rpm-build |
f53ec4 |
...)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
va_list args;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (index < self->values->len);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
va_start (args, index);
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_lcopy (self, index, args);
|
|
rpm-build |
f53ec4 |
va_end (args);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
void
|
|
rpm-build |
f53ec4 |
_dzl_graph_view_column_lcopy (DzlGraphColumn *self,
|
|
rpm-build |
f53ec4 |
guint index,
|
|
rpm-build |
f53ec4 |
va_list args)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
const GValue *value;
|
|
rpm-build |
f53ec4 |
gchar *errmsg = NULL;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_return_if_fail (DZL_IS_GRAPH_COLUMN (self));
|
|
rpm-build |
f53ec4 |
g_return_if_fail (index < self->values->len);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
value = &((GValue *)(gpointer)self->values->data)[index];
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
if (!G_IS_VALUE (value))
|
|
rpm-build |
f53ec4 |
return;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
G_VALUE_LCOPY (value, args, 0, &errmsg);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
if (G_UNLIKELY (errmsg != NULL))
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
g_critical ("%s", errmsg);
|
|
rpm-build |
f53ec4 |
g_free (errmsg);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_finalize (GObject *object)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
DzlGraphColumn *self = (DzlGraphColumn *)object;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_clear_pointer (&self->name, g_free);
|
|
rpm-build |
f53ec4 |
g_clear_pointer (&self->values, dzl_ring_unref);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
G_OBJECT_CLASS (dzl_graph_view_column_parent_class)->finalize (object);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_get_property (GObject *object,
|
|
rpm-build |
f53ec4 |
guint prop_id,
|
|
rpm-build |
f53ec4 |
GValue *value,
|
|
rpm-build |
f53ec4 |
GParamSpec *pspec)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
DzlGraphColumn *self = DZL_GRAPH_COLUMN (object);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
switch (prop_id)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
case PROP_NAME:
|
|
rpm-build |
f53ec4 |
g_value_set_string (value, dzl_graph_view_column_get_name (self));
|
|
rpm-build |
f53ec4 |
break;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
case PROP_VALUE_TYPE:
|
|
rpm-build |
f53ec4 |
g_value_set_gtype (value, self->value_type);
|
|
rpm-build |
f53ec4 |
break;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
default:
|
|
rpm-build |
f53ec4 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_set_property (GObject *object,
|
|
rpm-build |
f53ec4 |
guint prop_id,
|
|
rpm-build |
f53ec4 |
const GValue *value,
|
|
rpm-build |
f53ec4 |
GParamSpec *pspec)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
DzlGraphColumn *self = DZL_GRAPH_COLUMN (object);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
switch (prop_id)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
case PROP_NAME:
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_set_name (self, g_value_get_string (value));
|
|
rpm-build |
f53ec4 |
break;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
case PROP_VALUE_TYPE:
|
|
rpm-build |
f53ec4 |
self->value_type = g_value_get_gtype (value);
|
|
rpm-build |
f53ec4 |
break;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
default:
|
|
rpm-build |
f53ec4 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_class_init (DzlGraphColumnClass *klass)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
object_class->finalize = dzl_graph_view_column_finalize;
|
|
rpm-build |
f53ec4 |
object_class->get_property = dzl_graph_view_column_get_property;
|
|
rpm-build |
f53ec4 |
object_class->set_property = dzl_graph_view_column_set_property;
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
properties [PROP_NAME] =
|
|
rpm-build |
f53ec4 |
g_param_spec_string ("name",
|
|
rpm-build |
f53ec4 |
"Name",
|
|
rpm-build |
f53ec4 |
"The name of the column",
|
|
rpm-build |
f53ec4 |
NULL,
|
|
rpm-build |
f53ec4 |
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
properties [PROP_VALUE_TYPE] =
|
|
rpm-build |
f53ec4 |
g_param_spec_gtype ("value-type",
|
|
rpm-build |
f53ec4 |
"Value Type",
|
|
rpm-build |
f53ec4 |
"Value Type",
|
|
rpm-build |
f53ec4 |
G_TYPE_NONE,
|
|
rpm-build |
f53ec4 |
(G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
g_object_class_install_properties (object_class, LAST_PROP, properties);
|
|
rpm-build |
f53ec4 |
}
|
|
rpm-build |
f53ec4 |
|
|
rpm-build |
f53ec4 |
static void
|
|
rpm-build |
f53ec4 |
dzl_graph_view_column_init (DzlGraphColumn *self)
|
|
rpm-build |
f53ec4 |
{
|
|
rpm-build |
f53ec4 |
self->values = dzl_ring_sized_new (sizeof (GValue), 60, (GDestroyNotify)g_value_unset);
|
|
rpm-build |
f53ec4 |
}
|