aboutsummaryrefslogtreecommitdiff
path: root/src/loadsave.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-11-05 22:02:54 +0100
committerThomas White <taw@bitwiz.org.uk>2011-11-05 22:02:54 +0100
commit6f29edb7b7ea789bc4bde1ee3237cca96c271202 (patch)
tree6ed2b9e0c20d1392c3c3ce0224818def5568f198 /src/loadsave.c
parentdbff61bb3053e4fe30397b48a32ec415119bcf66 (diff)
Loading mostly works
Diffstat (limited to 'src/loadsave.c')
-rw-r--r--src/loadsave.c151
1 files changed, 127 insertions, 24 deletions
diff --git a/src/loadsave.c b/src/loadsave.c
index 289d793..557e34a 100644
--- a/src/loadsave.c
+++ b/src/loadsave.c
@@ -34,16 +34,7 @@
#include "presentation.h"
#include "objects.h"
#include "stylesheet.h"
-
-
-struct ds_node
-{
- char *key;
- char *value;
- struct ds_node **children;
- int n_children;
- int max_children;
-};
+#include "slide_render.h"
static int alloc_children(struct ds_node *node)
@@ -313,7 +304,7 @@ static void free_ds_tree(struct ds_node *root)
}
-static int get_field_f(struct ds_node *root, const char *key, double *val)
+int get_field_f(struct ds_node *root, const char *key, double *val)
{
struct ds_node *node;
double v;
@@ -337,7 +328,7 @@ static int get_field_f(struct ds_node *root, const char *key, double *val)
}
-static int get_field_i(struct ds_node *root, const char *key, int *val)
+int get_field_i(struct ds_node *root, const char *key, int *val)
{
struct ds_node *node;
int v;
@@ -361,7 +352,7 @@ static int get_field_i(struct ds_node *root, const char *key, int *val)
}
-static int get_field_s(struct ds_node *root, const char *key, char **val)
+int get_field_s(struct ds_node *root, const char *key, char **val)
{
struct ds_node *node;
char *v;
@@ -491,10 +482,109 @@ static StyleSheet *tree_to_stylesheet(struct ds_node *root)
}
+static enum objtype text_to_type(const char *t)
+{
+ if ( strcmp(t, "text") == 0 ) return OBJ_TEXT;
+ if ( strcmp(t, "image") == 0 ) return OBJ_IMAGE;
+
+ return OBJ_UNKNOWN;
+}
+
+
+static const char *type_text(enum objtype t)
+{
+ switch ( t )
+ {
+ case OBJ_TEXT : return "text";
+ case OBJ_IMAGE : return "image";
+ default : return "unknown";
+ }
+}
+
+
+
+static struct object *tree_to_object(struct presentation *p,
+ struct ds_node *root, struct slide *s)
+{
+ struct object *o = NULL;
+ char *v;
+
+ if ( get_field_s(root, "type", &v) ) return NULL;
+
+ switch ( text_to_type(v) ) {
+
+ case OBJ_TEXT :
+ o = p->text_tool->deserialize(p, root, s, p->text_tool);
+ break;
+
+ case OBJ_IMAGE :
+ o = p->image_tool->deserialize(p, root, s, p->image_tool);
+ break;
+
+ default :
+ fprintf(stderr, "Unrecognised object type '%s'\n", v);
+ break;
+
+ }
+
+ return o;
+}
+
+
+static struct slide *tree_to_slide(struct presentation *p, struct ds_node *root)
+{
+ struct slide *s;
+ int i;
+
+ s = new_slide();
+ s->parent = p;
+
+ /* Loop over objects */
+ for ( i=0; i<root->n_children; i++ ) {
+
+ struct object *o;
+
+ o = tree_to_object(p, root->children[i], s);
+ if ( o != NULL ) {
+ add_object_to_slide(s, o);
+ }
+
+ }
+
+ redraw_slide(s);
+
+ return s;
+}
+
+
+static int tree_to_slides(struct ds_node *root, struct presentation *p)
+{
+ int i;
+
+ for ( i=0; i<root->n_children; i++ ) {
+
+ struct slide *s;
+
+ s = tree_to_slide(p, root->children[i]);
+ if ( s != NULL ) {
+ insert_slide(p, s, p->num_slides-1);
+ redraw_slide(s);
+ }
+
+ }
+
+ return 0;
+}
+
+
int tree_to_presentation(struct ds_node *root, struct presentation *p)
{
struct ds_node *node;
char *check;
+ int i;
+
+ p->cur_edit_slide = NULL;
+ p->cur_proj_slide = NULL;
node = find_node(root, "slide-properties/width");
if ( node == NULL ) return 1;
@@ -522,6 +612,24 @@ int tree_to_presentation(struct ds_node *root, struct presentation *p)
}
}
+ for ( i=0; i<p->num_slides; i++ ) {
+ free_slide(p->slides[i]);
+ p->num_slides = 0;
+ }
+
+ node = find_node(root, "slides");
+ if ( node != NULL ) {
+ tree_to_slides(node, p);
+ if ( p->num_slides == 0 ) {
+ fprintf(stderr, "Failed to load any slides\n");
+ p->cur_edit_slide = add_slide(p, 0);
+ return 1;
+ }
+ }
+
+ p->cur_edit_slide = p->slides[0];
+ redraw_slide(p->cur_edit_slide);
+
return 0;
}
@@ -550,7 +658,12 @@ int load_presentation(struct presentation *p, const char *filename)
fclose(fh);
- if ( r ) return r; /* Error */
+ if ( r ) {
+ p->cur_edit_slide = new_slide();
+ insert_slide(p, p->cur_edit_slide, 0);
+ p->completely_empty = 1;
+ return r; /* Error */
+ }
p->cur_edit_slide = p->slides[0];
@@ -558,16 +671,6 @@ int load_presentation(struct presentation *p, const char *filename)
}
-static const char *type_text(enum objtype t)
-{
- switch ( t )
- {
- case TEXT : return "text";
- default : return "unknown";
- }
-}
-
-
static void rebuild_prefix(struct serializer *ser)
{
int i;