Storycode - more work
authorThomas White <taw@bitwiz.org.uk>
Mon, 14 May 2012 07:28:37 +0000 (09:28 +0200)
committerThomas White <taw@bitwiz.org.uk>
Mon, 14 May 2012 07:28:37 +0000 (09:28 +0200)
src/loadsave.c
src/presentation.c
src/presentation.h
src/storycode.c
src/storycode.h
src/stylesheet-editor.c
src/stylesheet.c

index aac2e4a..4388953 100644 (file)
@@ -553,52 +553,9 @@ int get_field_s(struct ds_node *root, const char *key, char **val)
 }
 
 
-static enum objtype text_to_type(const char *t)
+static struct frame *tree_to_frame(struct ds_node *root)
 {
-       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 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, p->text_tool);
-               break;
-
-               case OBJ_IMAGE :
-               o = p->image_tool->deserialize(p, root, p->image_tool);
-               break;
-
-               default :
-               fprintf(stderr, "Unrecognised object type '%s'\n", v);
-               break;
-
-       }
-
-       return o;
+       return NULL;
 }
 
 
@@ -615,94 +572,19 @@ static struct slide *tree_to_slide(struct presentation *p, struct ds_node *root)
        /* Loop over objects */
        for ( i=0; i<root->n_children; i++ ) {
 
-               struct object *o;
+               struct frame *fr;
 
-               o = tree_to_object(p, root->children[i]);
-               if ( o != NULL ) {
-                       add_object_to_slide(s, o);
-                       if ( o->type != OBJ_TEXT) o->update_object(o);
+               fr = tree_to_frame(root->children[i]);
+               if ( fr != NULL ) {
+                       add_frame_to_slide(s, fr);
                }
 
        }
 
-       redraw_slide(s);
-
        return s;
 }
 
 
-static void try_last(struct slide *s, struct slide *ls, enum object_role r)
-{
-       if ( s->roles[r] == NULL ) {
-               s->roles[r] = ls->roles[r];
-       }
-}
-
-
-static void try_update(struct object *o)
-{
-       if ( o == NULL ) return;
-       o->update_object(o);
-}
-
-
-/* Go through all the slides and make sure the roles are tidied up */
-static void fix_up_roles(struct presentation *p)
-{
-       int i;
-       struct slide *last_slide = NULL;
-
-       for ( i=0; i<p->num_slides; i++ ) {
-
-               int j;
-               struct slide *s;
-
-               s = p->slides[i];
-
-               for ( j=0; j<NUM_S_ROLES; j++ ) {
-                       s->roles[j] = NULL;
-               }
-
-               for ( j=0; j<s->num_objects; j++ ) {
-
-                       struct object *o;
-                       enum object_role r;
-
-                       o = s->objects[j];
-                       r = o->style->role;
-
-                       if ( r == S_ROLE_NONE ) continue;
-
-                       if ( s->roles[r] != NULL ) {
-                               fprintf(stderr, "Warning, two objects in slide"
-                                               " with role %i.\n", r);
-                               continue;
-                       }
-
-                       s->roles[r] = o;
-
-               }
-
-               if ( last_slide != NULL ) {
-
-                       /* Set off-slide references for this slide */
-                       try_last(s, last_slide, S_ROLE_PTITLE_REF);
-                       try_last(s, last_slide, S_ROLE_PAUTHOR_REF);
-                       try_last(s, last_slide, S_ROLE_PDATE_REF);
-
-               }
-
-               try_update(s->roles[S_ROLE_PTITLE]);
-               try_update(s->roles[S_ROLE_PAUTHOR]);
-               try_update(s->roles[S_ROLE_PDATE]);
-               try_update(s->roles[S_ROLE_SLIDENUMBER]);
-
-               last_slide = s;
-
-       }
-}
-
-
 static int tree_to_slides(struct ds_node *root, struct presentation *p)
 {
        int i;
@@ -714,13 +596,10 @@ static int tree_to_slides(struct ds_node *root, struct presentation *p)
                s = tree_to_slide(p, root->children[i]);
                if ( s != NULL ) {
                        insert_slide(p, s, p->num_slides-1);
-                       redraw_slide(s);
                }
 
        }
 
-       fix_up_roles(p);
-
        return 0;
 }
 
@@ -776,7 +655,7 @@ int tree_to_presentation(struct ds_node *root, struct presentation *p)
        }
 
        p->cur_edit_slide = p->slides[0];
-       redraw_slide(p->cur_edit_slide);
+//     redraw_slide(p->cur_edit_slide);
 
        return 0;
 }
@@ -943,17 +822,16 @@ int save_presentation(struct presentation *p, const char *filename)
 
                snprintf(s_id, 31, "%i", i);
                serialize_start(&ser, s_id);
-               for ( j=0; j<s->num_objects; j++ ) {
+               for ( j=0; j<s->num_frames; j++ ) {
 
-                       struct object *o = s->objects[j];
-                       char o_id[32];
+                       struct frame *fr = s->frames[j];
+                       char fr_id[32];
 
-                       if ( o->empty ) continue;
-                       snprintf(o_id, 31, "%i", j);
+                       if ( fr->empty ) continue;
+                       snprintf(fr_id, 31, "%i", j);
 
-                       serialize_start(&ser, o_id);
-                       serialize_s(&ser, "type", type_text(o->type));
-                       o->serialize(o, &ser);
+                       serialize_start(&ser, fr_id);
+                       fr->serialize(fr, &ser);
                        serialize_end(&ser);
 
                }
index 2ca1cd6..36e2abe 100644 (file)
@@ -117,9 +117,9 @@ struct slide *new_slide()
        new = calloc(1, sizeof(struct slide));
        if ( new == NULL ) return NULL;
 
-       /* No objects to start with */
-       new->num_objects = 0;
-       new->objects = NULL;
+       /* No frames to start with */
+       new->num_frames = 0;
+       new->frames = NULL;
 
        new->rendered_edit = NULL;
        new->rendered_proj = NULL;
@@ -131,12 +131,26 @@ struct slide *new_slide()
 }
 
 
+static void free_frame(struct frame *fr)
+{
+       int i;
+
+       for ( i=0; i<fr->num_children; i++ ) {
+               free_frame(fr->children[i]);
+       }
+
+       free(fr->sc);
+
+       free(fr);
+}
+
+
 void free_slide(struct slide *s)
 {
        int i;
 
-       for ( i=0; i<s->num_objects; i++ ) {
-               delete_object(s->objects[i]);
+       for ( i=0; i<s->num_frames; i++ ) {
+               free_frame(s->frames[i]);
        }
 
        free(s);
@@ -192,16 +206,15 @@ struct slide *add_slide(struct presentation *p, int pos)
 }
 
 
-int add_object_to_slide(struct slide *s, struct object *o)
+int add_frame_to_slide(struct slide *s, struct frame *fr)
 {
-       struct object **try;
+       struct frame **try;
 
-       try = realloc(s->objects, (1+s->num_objects)*sizeof(struct object *));
+       try = realloc(s->frames, (1+s->num_frames)*sizeof(struct frame *));
        if ( try == NULL ) return 1;
-       s->objects = try;
+       s->frames = try;
 
-       s->objects[s->num_objects++] = o;
-       o->parent = s;
+       s->frames[s->num_frames++] = fr;
 
        s->parent->completely_empty = 0;
 
@@ -209,49 +222,49 @@ int add_object_to_slide(struct slide *s, struct object *o)
 }
 
 
-void remove_object_from_slide(struct slide *s, struct object *o)
+void remove_frame_from_slide(struct slide *s, struct frame *fr)
 {
        int i;
        int found = 0;
 
-       for ( i=0; i<s->num_objects; i++ ) {
+       for ( i=0; i<s->num_frames; i++ ) {
 
-               if ( s->objects[i] == o ) {
+               if ( s->frames[i] == fr ) {
                        assert(!found);
                        found = 1;
                }
 
                if ( found ) {
-                       if ( i == s->num_objects-1 ) {
-                               s->objects[i] = NULL;
+                       if ( i == s->num_frames-1 ) {
+                               s->frames[i] = NULL;
                        } else {
-                               s->objects[i] = s->objects[i+1];
+                               s->frames[i] = s->frames[i+1];
                        }
                }
 
        }
 
-       s->num_objects--;
+       s->num_frames--;
 }
 
 
-struct object *find_object_at_position(struct slide *s, double x, double y)
+struct frame *find_frame_at_position(struct slide *s, double x, double y)
 {
        int i;
-       struct object *o = NULL;
+       struct frame *fr = NULL;
 
-       for ( i=0; i<s->num_objects; i++ ) {
+       for ( i=0; i<s->num_frames; i++ ) {
 
-               if ( (x>s->objects[i]->x) && (y>s->objects[i]->y)
-                 && (x<s->objects[i]->x+s->objects[i]->bb_width)
-                 && (y<s->objects[i]->y+s->objects[i]->bb_height) )
+               if ( /* FIXME: implement */ 1 )
                {
-                       o = s->objects[i];
+                       fr = s->frames[i];
                }
 
        }
 
-       return o;
+       /* FIXME: Recurse */
+
+       return fr;
 }
 
 
index ddd8b4e..1e0e787 100644 (file)
@@ -44,8 +44,8 @@ struct slide
        /* This should always be present (and up to date). */
        cairo_surface_t *rendered_thumb;
 
-       int              num_objects;
-       struct object  **objects;
+       int              num_frames;
+       struct frame   **frames;
 
        char *notes;
 };
@@ -156,9 +156,15 @@ struct frame
        struct frame_class *cl;
 
        struct frame      **children;
-       int                 n_children;
+       int                 num_children;
+
+       int                (*render_frame)(struct frame *this, cairo_t *cr);
+       int                (*serialize)(struct frame *this,
+                                       struct serializer *ser);
 
        char               *sc;  /* Storycode */
+
+       int                 empty;
 };
 
 
@@ -170,6 +176,8 @@ extern struct slide *add_slide(struct presentation *p, int pos);
 extern int insert_slide(struct presentation *p, struct slide *s, int pos);
 extern void free_slide(struct slide *s);
 
+extern int add_frame_to_slide(struct slide *s, struct frame *fr);
+
 extern void get_titlebar_string(struct presentation *p);
 
 extern struct frame *find_frame_at_position(struct slide *s,
index a0a6da9..d394f02 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * slide_render.c
+ * storycode.c
  *
  * Colloquium - A tiny presentation program
  *
@@ -116,17 +116,18 @@ static void render_slide_bits(struct slide *s, cairo_t *cr)
                render_bgblock(cr, s->st->bgblocks[i]);
        }
 
-       for ( i=0; i<s->num_objects; i++ ) {
+       for ( i=0; i<s->num_frames; i++ ) {
 
-               struct object *o = s->objects[i];
+               struct frame *fr = s->frames[i];
 
-               o->render_object(cr, o);
+               fr->render_frame(fr, cr);
 
        }
 
        cairo_font_options_destroy(fopts);
 }
 
+
 static cairo_surface_t *render_slide(struct slide *s, int w, int h)
 {
        cairo_surface_t *surf;
index 34f4d85..bd33638 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * slide_render.h
+ * storycode.h
  *
  * Colloquium - A tiny presentation program
  *
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef SLIDE_RENDER_H
-#define SLIDE_RENDER_H
+#ifndef STORYCODE_H
+#define STORYCODE_H
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -42,4 +42,7 @@ extern void draw_editing_box(cairo_t *cr, double xmin, double ymin,
 
 extern int export_pdf(struct presentation *p, const char *filename);
 
-#endif /* SLIDE_RENDER_H */
+extern char *sc_get_final_font(const char *sc);
+extern char *sc_get_final_text_colour(const char *sc);
+
+#endif /* STORYCODE_H */
index cd6abc7..c08271c 100644 (file)
 #include "stylesheet.h"
 #include "objects.h"
 #include "loadsave.h"
+#include "storycode.h"
 
 
 struct _stylesheetwindow
 {
-       struct presentation *p;  /* Presentation to update when user alters
-                                 * something in this window */
-       GtkWidget           *window;
-       StyleSheet          *ss; /* Style sheet this window corresponds to */
+       struct presentation   *p;  /* Presentation to update when user alters
+                                   * something in this window */
+       GtkWidget             *window;
+       StyleSheet            *ss; /* Style sheet this window corresponds to */
 
-       GtkWidget           *margin_left;
-       GtkWidget           *margin_right;
-       GtkWidget           *margin_top;
-       GtkWidget           *margin_bottom;
+       GtkWidget             *margin_left;
+       GtkWidget             *margin_right;
+       GtkWidget             *margin_top;
+       GtkWidget             *margin_bottom;
 
-       GtkWidget           *text_font;
-       GtkWidget           *text_colour;
+       GtkWidget             *text_font;
+       GtkWidget             *text_colour;
 
-       struct style        *cur_style;
+       char                  *font;
+       char                  *colour;
+       double                 alpha;
+
+       struct slide_template *cur_slide_template;
+       struct frame_class    *cur_frame_class;
 };
 
 
@@ -61,10 +67,10 @@ static void text_font_set_sig(GtkFontButton *widget,
        const gchar *font;
 
        font = gtk_font_button_get_font_name(widget);
-       free(s->cur_style->font);
-       s->cur_style->font = strdup(font);
+       free(s->font);
+       s->font = strdup(font);
 
-       notify_style_update(s->p, s->cur_style);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
@@ -75,76 +81,86 @@ static void text_colour_set_sig(GtkColorButton *widget,
        guint16 al;
 
        gtk_color_button_get_color(widget, &col);
-       free(s->cur_style->colour);
-       s->cur_style->colour = gdk_color_to_string(&col);
+       free(s->colour);
+       s->colour = gdk_color_to_string(&col);
        al = gtk_color_button_get_alpha(widget);
-       s->cur_style->alpha = (double)al / 65535.0;
+       s->alpha = (double)al / 65535.0;
 
-       notify_style_update(s->p, s->cur_style);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
 static void margin_left_changed_sig(GtkSpinButton *spin,
                                     struct _stylesheetwindow *s)
 {
-       s->cur_style->margin_left = gtk_spin_button_get_value(spin);
-       notify_style_update(s->p, s->cur_style);
+       s->cur_frame_class->margin_left = gtk_spin_button_get_value(spin);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
 static void margin_right_changed_sig(GtkSpinButton *spin,
                                      struct _stylesheetwindow *s)
 {
-       s->cur_style->margin_right = gtk_spin_button_get_value(spin);
-       notify_style_update(s->p, s->cur_style);
+       s->cur_frame_class->margin_right = gtk_spin_button_get_value(spin);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
 static void margin_top_changed_sig(GtkSpinButton *spin,
                                    struct _stylesheetwindow *s)
 {
-       s->cur_style->margin_top = gtk_spin_button_get_value(spin);
-       notify_style_update(s->p, s->cur_style);
+       s->cur_frame_class->margin_top = gtk_spin_button_get_value(spin);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
 static void margin_bottom_changed_sig(GtkSpinButton *spin,
                                       struct _stylesheetwindow *s)
 {
-       s->cur_style->margin_bottom = gtk_spin_button_get_value(spin);
-       notify_style_update(s->p, s->cur_style);
+       s->cur_frame_class->margin_bottom = gtk_spin_button_get_value(spin);
+//     notify_style_update(s->p, s->cur_frame_class);
 }
 
 
-static void style_changed_sig(GtkComboBox *combo,
-                               struct _stylesheetwindow *s)
+static void frame_class_changed_sig(GtkComboBox *combo,
+                                    struct _stylesheetwindow *s)
 {
        int n;
        GdkColor col;
+       char *font;
 
        n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
-       s->cur_style = s->ss->styles[n];
+       s->cur_frame_class = s->cur_slide_template->frame_classes[n];
 
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_left),
-                                 s->cur_style->margin_left);
+                                 s->cur_frame_class->margin_left);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_right),
-                                 s->cur_style->margin_right);
+                                 s->cur_frame_class->margin_right);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_bottom),
-                                 s->cur_style->margin_bottom);
+                                 s->cur_frame_class->margin_bottom);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_top),
-                                 s->cur_style->margin_top);
+                                 s->cur_frame_class->margin_top);
 
-       n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
-       s->cur_style = s->ss->styles[n];
+       font = sc_get_final_font(s->cur_frame_class->sc_prologue);
+       gtk_font_button_set_font_name(GTK_FONT_BUTTON(s->text_font), font);
 
-       gtk_font_button_set_font_name(GTK_FONT_BUTTON(s->text_font),
-                                     s->cur_style->font);
-
-       gdk_color_parse(s->cur_style->colour, &col);
+       s->colour = sc_get_final_text_colour(s->cur_frame_class->sc_prologue);
+       gdk_color_parse(s->colour, &col);
        gtk_color_button_set_color(GTK_COLOR_BUTTON(s->text_colour), &col);
 }
 
 
+static void slide_template_changed_sig(GtkComboBox *combo,
+                                       struct _stylesheetwindow *s)
+{
+       for ( i=0; i<s->ss->n_styles; i++ ) {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo),
+                                         s->ss->styles[i]->name);
+       }
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+}
+
+
 static void do_layout(struct _stylesheetwindow *s, GtkWidget *b)
 {
        GtkWidget *table;
@@ -161,11 +177,6 @@ static void do_layout(struct _stylesheetwindow *s, GtkWidget *b)
        gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
        gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
        combo = gtk_combo_box_new_text();
-       for ( i=0; i<s->ss->n_styles; i++ ) {
-               gtk_combo_box_append_text(GTK_COMBO_BOX(combo),
-                                         s->ss->styles[i]->name);
-       }
-       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
        g_signal_connect(G_OBJECT(combo), "changed",
                         G_CALLBACK(style_changed_sig), s);
        gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
@@ -236,7 +247,7 @@ static void do_layout(struct _stylesheetwindow *s, GtkWidget *b)
                         G_CALLBACK(text_colour_set_sig), s);
 
        /* Force first update */
-       style_changed_sig(GTK_COMBO_BOX(combo), s);
+       frame_class_changed_sig(GTK_COMBO_BOX(combo), s);
 }
 
 
@@ -264,8 +275,8 @@ StylesheetWindow *open_stylesheet(struct presentation *p)
 
        s->p = p;
        s->ss = p->ss;
-       s->cur_style = NULL;
-       s->cur_style = NULL;
+       s->cur_slide_template = NULL;
+       s->cur_frame_class = NULL;
 
        s->window = gtk_dialog_new_with_buttons("Stylesheet",
                                           GTK_WINDOW(p->window), 0,
index a4b3543..eb959c1 100644 (file)
@@ -327,7 +327,7 @@ struct slide_template *tree_to_slide_template(StyleSheet *ss,
        get_field_s(root, "name", &v);
        if ( v == NULL ) {
                fprintf(stderr, "No name for slide template '%s'\n",
-                       root->children[i]->key);
+                       root->key);
                return NULL;
        }