aboutsummaryrefslogtreecommitdiff
path: root/src/ld-symbol-library.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ld-symbol-library.c')
-rw-r--r--src/ld-symbol-library.c373
1 files changed, 373 insertions, 0 deletions
diff --git a/src/ld-symbol-library.c b/src/ld-symbol-library.c
new file mode 100644
index 0000000..8876dd8
--- /dev/null
+++ b/src/ld-symbol-library.c
@@ -0,0 +1,373 @@
+/*
+ * ld-symbol-library.c
+ *
+ * This file is a part of logdiag.
+ * Copyright Přemysl Janouch 2010. All rights reserved.
+ *
+ * See the file LICENSE for licensing information.
+ *
+ */
+
+#include <gtk/gtk.h>
+#include <lua.h>
+/* #include <lauxlib.h> */
+
+#include "config.h"
+
+#include "ld-symbol-library.h"
+#include "ld-symbol-category.h"
+#include "ld-symbol.h"
+
+/* ===== Symbol library ==================================================== */
+
+/**
+ * SECTION:ld-symbol-library
+ * @short_description: A symbol library.
+ * @see_also: #LogdiagSymbol, #LogdiagSymbolCategory
+ *
+ * #LogdiagSymbolLibrary is used for loading symbols from their files.
+ */
+
+/*
+ * LogdiagSymbolLibraryPrivate:
+ * @lua_state: Lua state.
+ */
+struct _LogdiagSymbolLibraryPrivate
+{
+ lua_State *lua_state;
+};
+
+G_DEFINE_TYPE (LogdiagSymbolLibrary, logdiag_symbol_library, G_TYPE_OBJECT);
+
+static void
+logdiag_symbol_library_finalize (GObject *gobject);
+
+
+static void
+logdiag_symbol_library_class_init (LogdiagSymbolLibraryClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = logdiag_symbol_library_finalize;
+
+/**
+ * LogdiagSymbolLibrary::changed:
+ * @library: The library object.
+ *
+ * Contents of the library have changed.
+ */
+ klass->changed_signal = g_signal_new
+ ("changed", G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ g_type_class_add_private (klass, sizeof (LogdiagSymbolLibraryPrivate));
+}
+
+static void
+logdiag_symbol_library_init (LogdiagSymbolLibrary *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE
+ (self, LOGDIAG_TYPE_SYMBOL_LIBRARY, LogdiagSymbolLibraryPrivate);
+
+ /* TODO: lua */
+ self->priv->lua_state = NULL;
+
+ self->categories = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref);
+}
+
+static void
+logdiag_symbol_library_finalize (GObject *gobject)
+{
+ LogdiagSymbolLibrary *self;
+
+ self = LOGDIAG_SYMBOL_LIBRARY (gobject);
+
+ g_hash_table_destroy (self->categories);
+
+ /* Chain up to the parent class. */
+ G_OBJECT_CLASS (logdiag_symbol_library_parent_class)->finalize (gobject);
+}
+
+/**
+ * logdiag_symbol_library_new:
+ *
+ * Create an instance.
+ */
+LogdiagSymbolLibrary *
+logdiag_symbol_library_new (void)
+{
+ return g_object_new (LOGDIAG_TYPE_SYMBOL_LIBRARY, NULL);
+}
+
+/*
+ * load_category:
+ * @self: A symbol library object.
+ * @path: The path to the category.
+ * @name: The default name of the category.
+ *
+ * Loads a category into the library.
+ */
+static LogdiagSymbolCategory *
+load_category (LogdiagSymbolLibrary *self, const char *path, const char *name)
+{
+ LogdiagSymbolCategory *cat;
+ gchar *icon_file;
+
+ g_return_val_if_fail (LOGDIAG_IS_SYMBOL_LIBRARY (self), NULL);
+ g_return_val_if_fail (path != NULL, NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ if (!g_file_test (path, G_FILE_TEST_IS_DIR))
+ return NULL;
+
+ icon_file = g_build_filename (path, "icon.svg", NULL);
+ if (!g_file_test (icon_file, G_FILE_TEST_IS_REGULAR))
+ {
+ g_warning ("The category in %s has no icon.", path);
+ g_free (icon_file);
+ return NULL;
+ }
+
+ /* TODO: Search for category.json and read the category name from it. */
+ /* TODO: Search for xyz.lua and load the objects into the category. */
+
+ cat = logdiag_symbol_category_new (self);
+ cat->name = g_strdup (name);
+ cat->image_path = icon_file;
+ return cat;
+}
+
+/**
+ * logdiag_symbol_library_load:
+ * @self: A symbol library object.
+ * @directory: A directory to be loaded.
+ *
+ * Load the contents of a directory into the library.
+ */
+gboolean
+logdiag_symbol_library_load (LogdiagSymbolLibrary *self, const char *path)
+{
+ GDir *dir;
+ const gchar *item;
+
+ g_return_val_if_fail (LOGDIAG_IS_SYMBOL_LIBRARY (self), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ dir = g_dir_open (path, 0, NULL);
+ if (!dir)
+ return FALSE;
+
+ while ((item = g_dir_read_name (dir)))
+ {
+ LogdiagSymbolCategory *cat;
+ gchar *categ_path;
+
+ categ_path = g_build_filename (path, item, NULL);
+ cat = load_category (self, categ_path, item);
+ if (cat)
+ g_hash_table_insert (self->categories, cat->name, cat);
+ g_free (categ_path);
+ }
+ g_dir_close (dir);
+ return TRUE;
+}
+
+/**
+ * logdiag_symbol_library_clear:
+ * @self: A symbol library object.
+ *
+ * Clears all the contents.
+ */
+void
+logdiag_symbol_library_clear (LogdiagSymbolLibrary *self)
+{
+ g_return_if_fail (LOGDIAG_IS_SYMBOL_LIBRARY (self));
+
+ g_hash_table_remove_all (self->categories);
+ return;
+}
+
+
+/* ===== Symbol category =================================================== */
+
+/**
+ * SECTION:ld-symbol-category
+ * @short_description: A category of symbols.
+ * @see_also: #LogdiagSymbol, #LogdiagSymbolLibrary
+ *
+ * #LogdiagSymbolCategory represents a category of #LogdiagSymbol objects.
+ */
+
+G_DEFINE_TYPE (LogdiagSymbolCategory, logdiag_symbol_category, G_TYPE_OBJECT);
+
+static void
+logdiag_symbol_category_finalize (GObject *gobject);
+
+
+static void
+logdiag_symbol_category_class_init (LogdiagSymbolCategoryClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = logdiag_symbol_category_finalize;
+}
+
+static void
+logdiag_symbol_category_init (LogdiagSymbolCategory *self)
+{
+ /* TODO: use _new_full, correct equal and specify destroy functions. */
+ /* XXX: How's the situation with subcategory names and symbol names
+ * within the same hashtable?
+ */
+ self->children = g_hash_table_new (g_str_hash, g_str_equal);
+}
+
+static void
+logdiag_symbol_category_finalize (GObject *gobject)
+{
+ LogdiagSymbolCategory *self;
+
+ self = LOGDIAG_SYMBOL_CATEGORY (gobject);
+
+ if (self->name)
+ g_free (self->name);
+ if (self->image_path)
+ g_free (self->image_path);
+
+ g_object_unref (self->parent);
+ g_hash_table_destroy (self->children);
+
+ /* Chain up to the parent class. */
+ G_OBJECT_CLASS (logdiag_symbol_category_parent_class)->finalize (gobject);
+}
+
+/**
+ * logdiag_symbol_category_new:
+ * @parent: The parent library for this category.
+ *
+ * Create an instance.
+ */
+LogdiagSymbolCategory *
+logdiag_symbol_category_new (LogdiagSymbolLibrary *parent)
+{
+ LogdiagSymbolCategory *cat;
+
+ cat = g_object_new (LOGDIAG_TYPE_SYMBOL_CATEGORY, NULL);
+
+ cat->parent = parent;
+ g_object_ref (parent);
+
+ return cat;
+}
+
+
+/* ===== Symbol ============================================================ */
+
+/**
+ * SECTION:ld-symbol
+ * @short_description: A symbol.
+ * @see_also: #LogdiagDocument, #LogdiagCanvas
+ *
+ * #LogdiagSymbol represents a symbol in the #LogdiagDocument that is in turn
+ * drawn onto the #LogdiagCanvas.
+ */
+
+/*
+ * LogdiagSymbolPrivate:
+ * @library: The parent LogdiagSymbolLibrary.
+ * The library contains the real function for rendering.
+ */
+struct _LogdiagSymbolPrivate
+{
+ LogdiagSymbolLibrary *library;
+};
+
+G_DEFINE_TYPE (LogdiagSymbol, logdiag_symbol, G_TYPE_OBJECT);
+
+static void
+logdiag_symbol_finalize (GObject *gobject);
+
+
+static void
+logdiag_symbol_class_init (LogdiagSymbolClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = logdiag_symbol_finalize;
+
+ g_type_class_add_private (klass, sizeof (LogdiagSymbolPrivate));
+}
+
+static void
+logdiag_symbol_init (LogdiagSymbol *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE
+ (self, LOGDIAG_TYPE_SYMBOL_LIBRARY, LogdiagSymbolPrivate);
+}
+
+static void
+logdiag_symbol_finalize (GObject *gobject)
+{
+ LogdiagSymbol *self;
+
+ self = LOGDIAG_SYMBOL (gobject);
+ g_object_unref (self->priv->library);
+
+ /* Chain up to the parent class. */
+ G_OBJECT_CLASS (logdiag_symbol_parent_class)->finalize (gobject);
+}
+
+/**
+ * logdiag_symbol_new:
+ * @library: A library object.
+ * @filename: The file from which the symbol will be loaded.
+ *
+ * Load a symbol from a file into the library.
+ */
+LogdiagSymbol *logdiag_symbol_new (LogdiagSymbolLibrary *library,
+ const gchar *filename)
+{
+ LogdiagSymbol *symbol;
+
+ symbol = g_object_new (LOGDIAG_TYPE_SYMBOL, NULL);
+ /* TODO: Use the filename, Luke. */
+
+ symbol->priv->library = library;
+ g_object_ref (library);
+}
+
+/**
+ * logdiag_symbol_build_identifier:
+ * @self: A symbol object.
+ *
+ * Build an identifier for the symbol.
+ * The identifier is in the format "Category/Category/Symbol".
+ */
+char *
+logdiag_symbol_build_identifier (LogdiagSymbol *self)
+{
+ return NULL;
+}
+
+/**
+ * logdiag_symbol_draw:
+ * @self: A symbol object.
+ * @surface: A cairo surface to be drawn on.
+ * @param: Parameters for the symbol in a table.
+ * @x: The X coordinate on the surface.
+ * @y: The Y coordinate on the surface.
+ * @zoom: Zoom ratio.
+ *
+ * Draw the symbol onto a Cairo surface.
+ */
+void
+logdiag_symbol_draw (LogdiagSymbol *self, cairo_t *surface,
+ GHashTable *param, gint x, gint y, gdouble zoom)
+{
+ return;
+}