From 1736f126a80ab4035d441fc84c1af86ea6ccc849 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 8 Jul 2018 23:25:42 +0200 Subject: Hook up lots of stylesheet editor stuff --- data/stylesheeteditor.ui | 35 ++++--- src/stylesheet_editor.c | 234 ++++++++++++++++++++++++++++++++++++++--------- src/stylesheet_editor.h | 8 ++ 3 files changed, 225 insertions(+), 52 deletions(-) diff --git a/data/stylesheeteditor.ui b/data/stylesheeteditor.ui index 65ba964..53fc500 100644 --- a/data/stylesheeteditor.ui +++ b/data/stylesheeteditor.ui @@ -107,6 +107,7 @@ True Sans 12 Preview text + True @@ -119,6 +120,7 @@ True True True + False @@ -156,10 +158,11 @@ True False - Flat colour - Horizontal gradient - Vertical gradient + Flat colour + Horizontal gradient + Vertical gradient + True @@ -172,6 +175,7 @@ True True True + False @@ -184,6 +188,7 @@ True True True + False @@ -668,7 +673,7 @@ - + True False @@ -676,6 +681,7 @@ Horizontal gradient Vertical gradient + True @@ -684,10 +690,11 @@ - + True True True + False @@ -696,10 +703,11 @@ - + True True True + False @@ -756,12 +764,13 @@ - + True True True Sans 12 Preview text + True @@ -770,10 +779,11 @@ - + True True True + False @@ -807,7 +817,7 @@ - + True False @@ -815,6 +825,7 @@ Horizontal gradient Vertical gradient + True @@ -823,10 +834,11 @@ - + True True True + False @@ -835,10 +847,11 @@ - + True True True + False diff --git a/src/stylesheet_editor.c b/src/stylesheet_editor.c index efce19a..945dd3d 100644 --- a/src/stylesheet_editor.c +++ b/src/stylesheet_editor.c @@ -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); } diff --git a/src/stylesheet_editor.h b/src/stylesheet_editor.h index fc551a6..4ab2061 100644 --- a/src/stylesheet_editor.h +++ b/src/stylesheet_editor.h @@ -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; }; -- cgit v1.2.3