[dia] DiaRenderScript can load what it saves
- From: Hans Breuer <hans src gnome org>
- To: svn-commits-list gnome org
- Subject: [dia] DiaRenderScript can load what it saves
- Date: Sun, 28 Jun 2009 17:38:11 +0000 (UTC)
commit 958cd048c655624f37e2edb0278dcf10c2e5c04d
Author: Hans Breuer <hans breuer org>
Date: Sun Jun 28 18:13:41 2009 +0200
DiaRenderScript can load what it saves
plug-ins/drs/dia-render-script-import.c | 88 ++++++++++++++++++++++++++++--
plug-ins/drs/dia-render-script.c | 31 +++++++++--
2 files changed, 109 insertions(+), 10 deletions(-)
---
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index b59fedf..8e93a23 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -26,6 +26,8 @@
#include "geometry.h"
#include "color.h"
#include "diagramdata.h"
+#include "group.h"
+#include "message.h"
#include <libxml/tree.h>
@@ -138,6 +140,15 @@ struct _RenderOp {
void *params[6];
};
+xmlNodePtr
+find_child_named (xmlNodePtr node, const char *name)
+{
+ for (node = node->children; node; node = node->next)
+ if (xmlStrcmp (node->name, (const xmlChar *)name) == 0)
+ return node;
+ return NULL;
+}
+
/*!
* Fill a GList* with objects which is to be put in a
* diagram or a group by the caller.
@@ -154,7 +165,41 @@ read_items (xmlNodePtr startnode)
continue;
if (node->type != XML_ELEMENT_NODE)
continue;
-
+ if (!xmlStrcmp(node->name, (const xmlChar *)"object")) {
+ xmlChar *sType = xmlGetProp(node, (const xmlChar *)"type");
+ const DiaObjectType *ot = object_get_type (sType);
+ xmlNodePtr child, props = NULL, render = NULL;
+
+ props = find_child_named (node, "properties");
+ render = find_child_named (node, "render");
+
+ if (ot && !ot->ops) {
+ GList *moreitems;
+ /* FIXME: 'render' is also the grouping element */
+ moreitems = read_items (render->children);
+ if (moreitems) {
+ DiaObject *group = group_create (moreitems);
+ /* group eats list */
+ items = g_list_append (items, group);
+ }
+ } else if (ot) {
+ Point startpoint = {0.0,0.0};
+ Handle *handle1,*handle2;
+ DiaObject *o;
+
+ o = ot->ops->create(&startpoint,
+ ot->default_user_data,
+ &handle1,&handle2);
+ if (o) {
+ object_load_props (o, props);
+ items = g_list_append (items, o);
+ }
+ } else {
+ g_debug ("DRS: unknown object '%s'", sType);
+ }
+ } else {
+ g_debug ("DRS-Import: %s?", node->name);
+ }
}
return items;
}
@@ -165,13 +210,44 @@ import_drs (const gchar *filename, DiagramData *dia, void* user_data)
{
GList *item, *items;
xmlDocPtr doc = xmlParseFile(filename);
+ xmlNodePtr root, node;
+ Layer *active_layer = NULL;
- items = read_items (doc->xmlChildrenNode);
- for (item = items; item != NULL; item = g_list_next (item)) {
- DiaObject *obj = (DiaObject *)item->data;
- layer_add_object(dia->active_layer, obj);
+ for (node = doc->children; node; node = node->next)
+ if (xmlStrcmp (node->name, (const xmlChar *)"drs") == 0)
+ root = node;
+
+ if (!root || !(root = find_child_named (root, "diagram"))) {
+ message_warning (_("Broken file?"));
+ return FALSE;
+ }
+
+ for (node = root->children; node != NULL; node = node->next) {
+ if (xmlStrcmp (node->name, (const xmlChar *)"layer") == 0) {
+ xmlChar *str;
+ xmlChar *name = xmlGetProp (node, (const xmlChar *)"name");
+ Layer *layer = new_layer (g_strdup (name ? (gchar *)name : _("Layer")), dia);
+
+ if (name)
+ xmlFree (name);
+
+ str = xmlGetProp (node, "active");
+ if (xmlStrcmp (str, "true")) {
+ active_layer = layer;
+ xmlFree (str);
+ }
+
+ items = read_items (node->children);
+ for (item = items; item != NULL; item = g_list_next (item)) {
+ DiaObject *obj = (DiaObject *)item->data;
+ layer_add_object(layer, obj);
+ }
+ g_list_free (items);
+ data_add_layer (dia, layer);
+ }
}
- g_list_free (items);
+ if (active_layer)
+ data_set_active_layer (dia, active_layer);
xmlFreeDoc(doc);
return TRUE;
}
diff --git a/plug-ins/drs/dia-render-script.c b/plug-ins/drs/dia-render-script.c
index d439a84..28a772f 100644
--- a/plug-ins/drs/dia-render-script.c
+++ b/plug-ins/drs/dia-render-script.c
@@ -63,10 +63,11 @@
#include "diagramdata.h"
#include "dia_xml_libxml.h"
+#include "dia-render-script.h"
#include "dia-render-script-renderer.h"
static void
-drs_render_layer (DiaRenderer *self, Layer *layer)
+drs_render_layer (DiaRenderer *self, Layer *layer, gboolean active)
{
DrsRenderer *renderer = DRS_RENDERER (self);
xmlNodePtr node;
@@ -78,6 +79,8 @@ drs_render_layer (DiaRenderer *self, Layer *layer)
renderer->root = node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"layer", NULL);
xmlSetProp(node, (const xmlChar *)"name", (xmlChar *)layer->name);
xmlSetProp(node, (const xmlChar *)"visible", (xmlChar *)(layer->visible ? "true" : "false"));
+ if (active)
+ xmlSetProp(node, (const xmlChar *)"active", (xmlChar *)"true");
/* Draw all objects: */
list = layer->objects;
@@ -99,7 +102,7 @@ drs_data_render (DiagramData *data, DiaRenderer *renderer)
DIA_RENDERER_GET_CLASS(renderer)->begin_render(renderer);
for (i=0; i<data->layers->len; i++) {
Layer *layer = (Layer *) g_ptr_array_index(data->layers, i);
- drs_render_layer (renderer, layer);
+ drs_render_layer (renderer, layer, layer == data->active_layer);
}
DIA_RENDERER_GET_CLASS(renderer)->end_render(renderer);
}
@@ -149,11 +152,29 @@ export_data(DiagramData *data, const gchar *filename,
}
static const gchar *extensions[] = { "drs", NULL };
-DiaExportFilter export_filter = {
+static DiaExportFilter export_filter = {
N_("DiaRenderScript"),
extensions,
export_data
};
+static DiaImportFilter import_filter = {
+ N_("DiaRenderScript"),
+ extensions,
+ import_drs
+};
+
+static gboolean
+_plugin_can_unload (PluginInfo *info)
+{
+ return TRUE;
+}
+
+static void
+_plugin_unload (PluginInfo *info)
+{
+ filter_unregister_export(&export_filter);
+ filter_unregister_import(&import_filter);
+}
DIA_PLUGIN_CHECK_INIT
@@ -162,10 +183,12 @@ dia_plugin_init(PluginInfo *info)
{
if (!dia_plugin_info_init(info, "drs",
N_("DiaRenderScript filter"),
- NULL, NULL))
+ _plugin_can_unload,
+ _plugin_unload))
return DIA_PLUGIN_INIT_ERROR;
filter_register_export(&export_filter);
+ filter_register_import(&import_filter);
return DIA_PLUGIN_INIT_OK;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]