Blame src/graphing/dzl-graph-column.c

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 (&copy, 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
}