aboutsummaryrefslogtreecommitdiff
path: root/src/stylesheet_editor.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2018-07-08 23:25:42 +0200
committerThomas White <taw@bitwiz.me.uk>2018-07-08 23:25:54 +0200
commit1736f126a80ab4035d441fc84c1af86ea6ccc849 (patch)
treef97e2c3996a5222ded44394ee6be4677714f65f2 /src/stylesheet_editor.c
parentb8519332af98e39d06cfe2e98b6583720b937255 (diff)
Hook up lots of stylesheet editor stuff
Diffstat (limited to 'src/stylesheet_editor.c')
-rw-r--r--src/stylesheet_editor.c234
1 files changed, 193 insertions, 41 deletions
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);
}