Hook up lots of stylesheet editor stuff
authorThomas White <taw@bitwiz.me.uk>
Sun, 8 Jul 2018 21:25:42 +0000 (23:25 +0200)
committerThomas White <taw@bitwiz.me.uk>
Sun, 8 Jul 2018 21:25:54 +0000 (23:25 +0200)
data/stylesheeteditor.ui
src/stylesheet_editor.c
src/stylesheet_editor.h

index 65ba964..53fc500 100644 (file)
                         <property name="receives_default">True</property>
                         <property name="font">Sans 12</property>
                         <property name="preview_text">Preview text</property>
+                        <signal name="font-set" handler="narrative_font_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="narrative_fgcol_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <items>
-                          <item translatable="yes">Flat colour</item>
-                          <item translatable="yes">Horizontal gradient</item>
-                          <item translatable="yes">Vertical gradient</item>
+                          <item id="flat" translatable="yes">Flat colour</item>
+                          <item id="horiz" translatable="yes">Horizontal gradient</item>
+                          <item id="vert" translatable="yes">Vertical gradient</item>
                         </items>
+                        <signal name="changed" handler="narrative_bggrad_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="narrative_bgcol_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="narrative_bgcol2_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkComboBoxText">
+                      <object class="GtkComboBoxText" id="slide_style_bggrad">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <items>
                           <item translatable="yes">Horizontal gradient</item>
                           <item translatable="yes">Vertical gradient</item>
                         </items>
+                        <signal name="changed" handler="slide_bggrad_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkColorButton">
+                      <object class="GtkColorButton" id="slide_style_bgcol">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="slide_bgcol_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkColorButton">
+                      <object class="GtkColorButton" id="slide_style_bgcol2">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="slide_bgcol2_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkFontButton">
+                      <object class="GtkFontButton" id="frame_style_font">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="font">Sans 12</property>
                         <property name="preview_text">Preview text</property>
+                        <signal name="font-set" handler="frame_font_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkColorButton">
+                      <object class="GtkColorButton" id="frame_style_fgcol">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="frame_fgcol_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkComboBoxText">
+                      <object class="GtkComboBoxText" id="frame_style_bggrad">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <items>
                           <item translatable="yes">Horizontal gradient</item>
                           <item translatable="yes">Vertical gradient</item>
                         </items>
+                        <signal name="changed" handler="frame_bggrad_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkColorButton">
+                      <object class="GtkColorButton" id="frame_style_bgcol">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="frame_bgcol_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkColorButton">
+                      <object class="GtkColorButton" id="frame_style_bgcol2">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
+                        <signal name="color-set" handler="frame_bgcol2_sig" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
index efce19a..945dd3d 100644 (file)
@@ -46,12 +46,33 @@ struct _sspriv
 };
 
 
-static void set_ss(struct presentation *p, const char *find, const char *seti)
+static void find_replace(SCBlock *parent, const char *find, const char *seti)
+{
+       SCBlock *bl = sc_block_child(parent);
+
+       while ( bl != NULL ) {
+
+               const char *name = sc_block_name(bl);
+               if ( (name != NULL) && (strcmp(name, find)==0) ) {
+                       printf("replaced '%s' with '%s'\n", sc_block_options(bl),
+                              seti);
+                       sc_block_set_options(bl, strdup(seti));
+                       return;
+               }
+
+               bl = sc_block_next(bl);
+
+       }
+}
+
+
+static void set_ss(struct presentation *p, const char *style_name,
+                   const char *find, const char *seti)
 {
-       char *set;
        const char *name;
        SCBlock *bl;
 
+       /* If no stylesheet yet, create one now */
        if ( p->stylesheet == NULL ) {
                p->stylesheet = sc_parse("\\stylesheet");
                if ( p->stylesheet == NULL ) {
@@ -63,9 +84,6 @@ static void set_ss(struct presentation *p, const char *find, const char *seti)
        }
        bl = p->stylesheet;
 
-       set = strdup(seti);
-       if ( set == NULL ) return;
-
        name = sc_block_name(bl);
        if ( (name != NULL) && (strcmp(name, "stylesheet")==0) ) {
                bl = sc_block_child(bl);
@@ -74,8 +92,12 @@ static void set_ss(struct presentation *p, const char *find, const char *seti)
        while ( bl != NULL ) {
 
                const char *name = sc_block_name(bl);
-               if ( (name != NULL) && (strcmp(name, find)==0) ) {
-                       sc_block_set_options(bl, set);
+               const char *options = sc_block_options(bl);
+               if ( (name != NULL) && (strcmp(name, "style")==0)
+                 && (strcmp(options, style_name)==0) )
+               {
+                       printf("found style %s\n", options);
+                       find_replace(bl, find, seti);
                        return;
                }
 
@@ -83,7 +105,9 @@ static void set_ss(struct presentation *p, const char *find, const char *seti)
 
        }
 
-       sc_block_append_inside(p->stylesheet, strdup(find), set, NULL);
+       /* Not found -> add style */
+       bl = sc_block_append_inside(p->stylesheet, strdup("style"), strdup(style_name), NULL);
+       sc_block_append_inside(bl, strdup(find), strdup(seti), NULL);
 }
 
 
@@ -93,41 +117,128 @@ static void revert_sig(GtkButton *button, StylesheetEditor *widget)
 }
 
 
-static void narrative_font_sig(GtkFontButton *widget, StylesheetEditor *se)
+static GradientType id_to_gradtype(const gchar *id)
+{
+       if ( strcmp(id, "flat") == 0 ) return GRAD_NONE;
+       if ( strcmp(id, "horiz") == 0 ) return GRAD_HORIZ;
+       if ( strcmp(id, "vert") == 0 ) return GRAD_VERT;
+       return GRAD_NONE;
+}
+
+
+static void set_font(GtkFontButton *widget, StylesheetEditor *se,
+                     const char *style_name)
 {
        const gchar *font;
        font = gtk_font_button_get_font_name(GTK_FONT_BUTTON(widget));
-       set_ss(se->priv->p, "font", font);
+       set_ss(se->priv->p, style_name, "font", font);
        set_values_from_presentation(se);
        g_signal_emit_by_name(se, "changed");
 }
 
 
-static void narrative_fgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
+static void set_col(GtkColorButton *widget, StylesheetEditor *se,
+                    const char *style_name, const char *col_name)
 {
        GdkRGBA rgba;
        gchar *col;
        gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &rgba);
        col = gdk_rgba_to_string(&rgba);
-       set_ss(se->priv->p, "fgcol", col);
+       set_ss(se->priv->p, style_name, col_name, col);
        g_free(col);
        set_values_from_presentation(se);
        g_signal_emit_by_name(se, "changed");
 }
 
 
+static void set_bggrad(GtkComboBox *widget, StylesheetEditor *se,
+                       const char *style_name)
+{
+       const gchar *id;
+       GradientType grad;
+       id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(widget));
+       grad = id_to_gradtype(id);
+       //set_ss(se->priv->p, style_name, "bggrad", grad);
+       set_values_from_presentation(se);
+       g_signal_emit_by_name(se, "changed");
+}
+
+
+static void narrative_font_sig(GtkFontButton *widget, StylesheetEditor *se)
+{
+       set_font(widget, se, "narrative");
+}
+
+
+static void narrative_fgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "narrative", "fgcol");
+}
+
+
 static void narrative_bgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
 {
+       set_col(widget, se, "narrative", "bgcol");
 }
 
 
 static void narrative_bgcol2_sig(GtkColorButton *widget, StylesheetEditor *se)
 {
+       set_col(widget, se, "narrative", "bgcol2");
 }
 
 
 static void narrative_bggrad_sig(GtkComboBox *widget, StylesheetEditor *se)
 {
+       set_bggrad(widget, se, "narrative");
+}
+
+
+static void slide_bgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "slide", "bgcol");
+}
+
+
+static void slide_bgcol2_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "slide", "bgcol2");
+}
+
+
+static void slide_bggrad_sig(GtkComboBox *widget, StylesheetEditor *se)
+{
+       set_bggrad(widget, se, "slide");
+}
+
+
+static void frame_font_sig(GtkFontButton *widget, StylesheetEditor *se)
+{
+       set_font(widget, se, "frame");
+}
+
+
+static void frame_fgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "frame", "fgcol");
+}
+
+
+static void frame_bgcol_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "frame", "bgcol");
+}
+
+
+static void frame_bgcol2_sig(GtkColorButton *widget, StylesheetEditor *se)
+{
+       set_col(widget, se, "frame", "bgcol2");
+}
+
+
+static void frame_bggrad_sig(GtkComboBox *widget, StylesheetEditor *se)
+{
+       set_bggrad(widget, se, "frame");
 }
 
 
@@ -161,6 +272,18 @@ void stylesheet_editor_class_init(StylesheetEditorClass *klass)
        SE_BIND_CHILD(narrative_style_bgcol2, narrative_bgcol2_sig);
        SE_BIND_CHILD(narrative_style_bggrad, narrative_bggrad_sig);
 
+       /* Slide style */
+       SE_BIND_CHILD(slide_style_bgcol, slide_bgcol_sig);
+       SE_BIND_CHILD(slide_style_bgcol2, slide_bgcol2_sig);
+       SE_BIND_CHILD(slide_style_bggrad, slide_bggrad_sig);
+
+       /* Slide->frame style */
+       SE_BIND_CHILD(frame_style_font, frame_font_sig);
+       SE_BIND_CHILD(frame_style_fgcol, frame_fgcol_sig);
+       SE_BIND_CHILD(frame_style_bgcol, frame_bgcol_sig);
+       SE_BIND_CHILD(frame_style_bgcol2, frame_bgcol2_sig);
+       SE_BIND_CHILD(frame_style_bggrad, frame_bggrad_sig);
+
        gtk_widget_class_bind_template_callback(widget_class, revert_sig);
 
        g_signal_new("changed", COLLOQUIUM_TYPE_STYLESHEET_EDITOR,
@@ -168,52 +291,81 @@ void stylesheet_editor_class_init(StylesheetEditorClass *klass)
 }
 
 
-static void set_values_from_presentation(StylesheetEditor *se)
+static void set_from_interp_col(double *col, GtkWidget *w)
 {
-       SCInterpreter *scin;
-       char *fontname;
-       PangoFontDescription *fontdesc;
-       double *col;
        GdkRGBA rgba;
 
-       scin = sc_interp_new(NULL, NULL, NULL, NULL);
-       sc_interp_run_stylesheet(scin, se->priv->p->stylesheet);  /* NULL stylesheet is OK */
+       rgba.red = col[0];
+       rgba.green = col[1];
+       rgba.blue = col[2];
+       rgba.alpha = col[3];
+       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(w), &rgba);
+}
 
-       /* Narrative style */
-       sc_interp_save(scin);
-       sc_interp_run_style(scin, "narrative");
+
+static void set_from_interp_bggrad(SCInterpreter *scin, GtkWidget *w)
+{
+       GradientType grad;
+       const gchar *id;
+
+       grad = sc_interp_get_bggrad(scin);
+
+       switch ( grad ) {
+               case GRAD_NONE : id = "flat"; break;
+               case GRAD_HORIZ : id = "horiz"; break;
+               case GRAD_VERT : id = "vert"; break;
+       }
+
+       gtk_combo_box_set_active_id(GTK_COMBO_BOX(w), id);
+}
+
+
+static void set_from_interp_font(SCInterpreter *scin, GtkWidget *w)
+{
+       char *fontname;
+       PangoFontDescription *fontdesc;
 
        fontdesc = sc_interp_get_fontdesc(scin);
        fontname = pango_font_description_to_string(fontdesc);
-       gtk_font_button_set_font_name(GTK_FONT_BUTTON(se->narrative_style_font), fontname);
+       gtk_font_button_set_font_name(GTK_FONT_BUTTON(w), fontname);
        g_free(fontname);
+}
 
-       col = sc_interp_get_fgcol(scin);
-       rgba.red = col[0];
-       rgba.green = col[1];
-       rgba.blue = col[2];
-       rgba.alpha = col[3];
-       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(se->narrative_style_fgcol), &rgba);
 
-       col = sc_interp_get_bgcol(scin);
-       rgba.red = col[0];
-       rgba.green = col[1];
-       rgba.blue = col[2];
-       rgba.alpha = col[3];
-       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(se->narrative_style_bgcol), &rgba);
+static void set_values_from_presentation(StylesheetEditor *se)
+{
+       SCInterpreter *scin;
 
-       col = sc_interp_get_bgcol2(scin);
-       rgba.red = col[0];
-       rgba.green = col[1];
-       rgba.blue = col[2];
-       rgba.alpha = col[3];
-       gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(se->narrative_style_bgcol2), &rgba);
+       scin = sc_interp_new(NULL, NULL, NULL, NULL);
+       sc_interp_run_stylesheet(scin, se->priv->p->stylesheet);  /* NULL stylesheet is OK */
 
+       /* Narrative style */
+       sc_interp_save(scin);
+       sc_interp_run_style(scin, "narrative");
+       set_from_interp_font(scin, se->narrative_style_font);
+       set_from_interp_col(sc_interp_get_fgcol(scin), se->narrative_style_fgcol);
+       set_from_interp_col(sc_interp_get_bgcol(scin), se->narrative_style_bgcol);
+       set_from_interp_col(sc_interp_get_bgcol2(scin), se->narrative_style_bgcol2);
+       set_from_interp_bggrad(scin, se->narrative_style_bggrad);
        sc_interp_restore(scin);
 
        /* Slide style */
+       sc_interp_save(scin);
+       sc_interp_run_style(scin, "silde");
+       set_from_interp_col(sc_interp_get_bgcol(scin), se->slide_style_bgcol);
+       set_from_interp_col(sc_interp_get_bgcol2(scin), se->slide_style_bgcol2);
+       set_from_interp_bggrad(scin, se->slide_style_bggrad);
+       sc_interp_restore(scin);
 
        /* Slide->Frame style */
+       sc_interp_save(scin);
+       sc_interp_run_style(scin, "frame");
+       set_from_interp_font(scin, se->frame_style_font);
+       set_from_interp_col(sc_interp_get_fgcol(scin), se->frame_style_fgcol);
+       set_from_interp_col(sc_interp_get_bgcol(scin), se->frame_style_bgcol);
+       set_from_interp_col(sc_interp_get_bgcol2(scin), se->frame_style_bgcol2);
+       set_from_interp_bggrad(scin, se->frame_style_bggrad);
+       sc_interp_restore(scin);
 
        sc_interp_destroy(scin);
 }
index fc551a6..4ab2061 100644 (file)
@@ -62,6 +62,14 @@ struct _stylesheeteditor
        GtkWidget *narrative_style_bgcol;
        GtkWidget *narrative_style_bgcol2;
        GtkWidget *narrative_style_bggrad;
+       GtkWidget *slide_style_bgcol;
+       GtkWidget *slide_style_bgcol2;
+       GtkWidget *slide_style_bggrad;
+       GtkWidget *frame_style_font;
+       GtkWidget *frame_style_fgcol;
+       GtkWidget *frame_style_bgcol;
+       GtkWidget *frame_style_bgcol2;
+       GtkWidget *frame_style_bggrad;
        StylesheetEditorPrivate *priv;
 };