summaryrefslogtreecommitdiff
path: root/liblogdiag/ld-symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'liblogdiag/ld-symbol.c')
-rw-r--r--liblogdiag/ld-symbol.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/liblogdiag/ld-symbol.c b/liblogdiag/ld-symbol.c
new file mode 100644
index 0000000..fafa9ab
--- /dev/null
+++ b/liblogdiag/ld-symbol.c
@@ -0,0 +1,232 @@
+/*
+ * ld-symbol.c
+ *
+ * This file is a part of logdiag.
+ * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
+ *
+ * See the file LICENSE for licensing information.
+ *
+ */
+
+#include "liblogdiag.h"
+#include "config.h"
+
+
+/**
+ * SECTION:ld-symbol
+ * @short_description: A symbol.
+ * @see_also: #LdDiagramSymbol, #LdCanvas
+ *
+ * #LdSymbol represents a symbol to be drawn onto a #LdCanvas.
+ *
+ * All implementations of this abstract class are required to use
+ * cairo_save() and cairo_restore() when drawing to store the state.
+ */
+
+enum
+{
+ PROP_0,
+ PROP_NAME,
+ PROP_HUMAN_NAME,
+ PROP_AREA,
+ PROP_TERMINALS
+};
+
+static void ld_symbol_get_property (GObject *object, guint property_id,
+ GValue *value, GParamSpec *pspec);
+static void ld_symbol_set_property (GObject *object, guint property_id,
+ const GValue *value, GParamSpec *pspec);
+
+
+G_DEFINE_ABSTRACT_TYPE (LdSymbol, ld_symbol, G_TYPE_OBJECT);
+
+static void
+ld_symbol_class_init (LdSymbolClass *klass)
+{
+ GObjectClass *object_class;
+ GParamSpec *pspec;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->get_property = ld_symbol_get_property;
+ object_class->set_property = ld_symbol_set_property;
+
+/**
+ * LdSymbol:name:
+ *
+ * The name of this symbol.
+ */
+ pspec = g_param_spec_string ("name", "Name",
+ "The name of this symbol.",
+ "", G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_NAME, pspec);
+
+/**
+ * LdSymbol:human-name:
+ *
+ * The localized human name of this symbol.
+ */
+ pspec = g_param_spec_string ("human-name", "Human name",
+ "The localized human name of this symbol.",
+ "", G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_HUMAN_NAME, pspec);
+
+/**
+ * LdSymbol:area:
+ *
+ * The area of this symbol.
+ */
+ pspec = g_param_spec_boxed ("area", "Area",
+ "The area of this symbol.",
+ LD_TYPE_RECTANGLE, G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_AREA, pspec);
+
+/**
+ * LdSymbol:terminals:
+ *
+ * A point array that specifies terminals of this symbol.
+ */
+ pspec = g_param_spec_boxed ("terminals", "Terminals",
+ "A point array that specifies terminals of this symbol.",
+ LD_TYPE_POINT_ARRAY, G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_TERMINALS, pspec);
+}
+
+static void
+ld_symbol_init (LdSymbol *self)
+{
+}
+
+static void
+ld_symbol_get_property (GObject *object, guint property_id,
+ GValue *value, GParamSpec *pspec)
+{
+ LdSymbol *self;
+
+ self = LD_SYMBOL (object);
+ switch (property_id)
+ {
+ case PROP_NAME:
+ g_value_set_string (value, ld_symbol_get_name (self));
+ break;
+ case PROP_HUMAN_NAME:
+ g_value_set_string (value, ld_symbol_get_human_name (self));
+ break;
+ case PROP_AREA:
+ {
+ LdRectangle area;
+
+ ld_symbol_get_area (self, &area);
+ g_value_set_boxed (value, &area);
+ }
+ break;
+ case PROP_TERMINALS:
+ g_value_set_boxed (value, ld_symbol_get_terminals (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+ld_symbol_set_property (GObject *object, guint property_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+
+/**
+ * ld_symbol_get_name:
+ * @self: An #LdSymbol object.
+ *
+ * Return value: The name of the symbol.
+ */
+const gchar *
+ld_symbol_get_name (LdSymbol *self)
+{
+ LdSymbolClass *klass;
+
+ g_return_val_if_fail (LD_IS_SYMBOL (self), NULL);
+
+ klass = LD_SYMBOL_GET_CLASS (self);
+ g_return_val_if_fail (klass->get_name != NULL, NULL);
+ return klass->get_name (self);
+}
+
+/**
+ * ld_symbol_get_human_name:
+ * @self: An #LdSymbol object.
+ *
+ * Return value: The localised human name of the symbol.
+ */
+const gchar *
+ld_symbol_get_human_name (LdSymbol *self)
+{
+ LdSymbolClass *klass;
+
+ g_return_val_if_fail (LD_IS_SYMBOL (self), NULL);
+
+ klass = LD_SYMBOL_GET_CLASS (self);
+ g_return_val_if_fail (klass->get_human_name != NULL, NULL);
+ return klass->get_human_name (self);
+}
+
+/**
+ * ld_symbol_get_area:
+ * @self: An #LdSymbol object.
+ * @area: Where the area of the symbol will be returned.
+ *
+ * Get the area of the symbol.
+ */
+void
+ld_symbol_get_area (LdSymbol *self, LdRectangle *area)
+{
+ LdSymbolClass *klass;
+
+ g_return_if_fail (LD_IS_SYMBOL (self));
+ g_return_if_fail (area != NULL);
+
+ klass = LD_SYMBOL_GET_CLASS (self);
+ g_return_if_fail (klass->get_area != NULL);
+ klass->get_area (self, area);
+}
+
+/**
+ * ld_symbol_get_terminals:
+ * @self: An #LdSymbol object.
+ *
+ * Get a list of symbol terminals.
+ *
+ * Return value: An #LdPointArray structure.
+ */
+const LdPointArray *
+ld_symbol_get_terminals (LdSymbol *self)
+{
+ LdSymbolClass *klass;
+
+ g_return_val_if_fail (LD_IS_SYMBOL (self), NULL);
+
+ klass = LD_SYMBOL_GET_CLASS (self);
+ g_return_val_if_fail (klass->get_terminals != NULL, NULL);
+ return klass->get_terminals (self);
+}
+
+/**
+ * ld_symbol_draw:
+ * @self: An #LdSymbol object.
+ * @cr: A cairo surface to be drawn on.
+ *
+ * Draw the symbol onto a Cairo surface.
+ */
+void
+ld_symbol_draw (LdSymbol *self, cairo_t *cr)
+{
+ LdSymbolClass *klass;
+
+ g_return_if_fail (LD_IS_SYMBOL (self));
+ g_return_if_fail (cr != NULL);
+
+ klass = LD_SYMBOL_GET_CLASS (self);
+ g_return_if_fail (klass->draw != NULL);
+ klass->draw (self, cr);
+}