diff options
author | Thomas White <taw@bitwiz.org.uk> | 2011-09-25 19:29:11 +0200 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2011-09-25 19:29:11 +0200 |
commit | 1dbcef5a7428a7132b746653af671b3a15fc7951 (patch) | |
tree | 4b902092d0c011739017f26989779d2538c37d57 /src/stylesheet.c | |
parent | e26dcd2049ae065f5a821f087abd736ba553dcad (diff) |
First part of new concept for styles and layout elements
Diffstat (limited to 'src/stylesheet.c')
-rw-r--r-- | src/stylesheet.c | 392 |
1 files changed, 155 insertions, 237 deletions
diff --git a/src/stylesheet.c b/src/stylesheet.c index 46167a1..b4cc11e 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -57,38 +57,20 @@ struct _stylesheetwindow GtkWidget *max_width; GtkWidget *use_max; - struct text_style *cur_text_style; - struct layout_element *cur_layout_element; + struct style *cur_style; }; -static void text_changed_sig(GtkComboBox *combo, - struct _stylesheetwindow *s) -{ - int n; - GdkColor col; - - n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); - s->cur_text_style = s->ss->text_styles[n]; - - gtk_font_button_set_font_name(GTK_FONT_BUTTON(s->text_font), - s->cur_text_style->font); - - gdk_color_parse(s->cur_text_style->colour, &col); - gtk_color_button_set_color(GTK_COLOR_BUTTON(s->text_colour), &col); -} - - static void text_font_set_sig(GtkFontButton *widget, struct _stylesheetwindow *s) { const gchar *font; font = gtk_font_button_get_font_name(widget); - free(s->cur_text_style->font); - s->cur_text_style->font = strdup(font); + free(s->cur_style->font); + s->cur_style->font = strdup(font); - notify_style_update(s->p, s->cur_text_style); + notify_style_update(s->p, s->cur_style); } @@ -99,147 +81,84 @@ static void text_colour_set_sig(GtkColorButton *widget, guint16 al; gtk_color_button_get_color(widget, &col); - free(s->cur_text_style->colour); - s->cur_text_style->colour = gdk_color_to_string(&col); + free(s->cur_style->colour); + s->cur_style->colour = gdk_color_to_string(&col); al = gtk_color_button_get_alpha(widget); - s->cur_text_style->alpha = (double)al / 65535.0; + s->cur_style->alpha = (double)al / 65535.0; - notify_style_update(s->p, s->cur_text_style); -} - - -static void do_text(struct _stylesheetwindow *s, GtkWidget *b) -{ - GtkWidget *table; - GtkWidget *box; - GtkWidget *line; - GtkWidget *label; - GtkWidget *combo; - GtkWidget *vbox; - int i; - - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(b), vbox, TRUE, TRUE, 0); - - table = gtk_table_new(4, 2, FALSE); - gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5.0); - gtk_table_set_col_spacings(GTK_TABLE(table), 5.0); - - label = gtk_label_new("Style:"); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); - combo = gtk_combo_box_new_text(); - gtk_table_attach_defaults(GTK_TABLE(table), combo, 1, 4, 0, 1); - - for ( i=0; i<s->ss->n_text_styles; i++ ) { - gtk_combo_box_append_text(GTK_COMBO_BOX(combo), - s->ss->text_styles[i]->name); - } - gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); - gtk_widget_set_size_request(GTK_WIDGET(combo), 300, -1); - g_signal_connect(G_OBJECT(combo), "changed", - G_CALLBACK(text_changed_sig), s); - - line = gtk_hseparator_new(); - gtk_table_attach_defaults(GTK_TABLE(table), line, 0, 4, 1, 2); - gtk_table_set_row_spacing(GTK_TABLE(table), 0, 10); - gtk_table_set_row_spacing(GTK_TABLE(table), 1, 10); - - label = gtk_label_new("Font:"); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); - s->text_font = gtk_font_button_new_with_font("Sans 12"); - box = gtk_hbox_new(FALSE, 0); - gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 2, 3); - gtk_box_pack_start(GTK_BOX(box), s->text_font, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(s->text_font), "font-set", - G_CALLBACK(text_font_set_sig), s); - - label = gtk_label_new("Colour:"); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); - s->text_colour = gtk_color_button_new(); - box = gtk_hbox_new(FALSE, 0); - gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 3, 4); - gtk_box_pack_start(GTK_BOX(box), s->text_colour, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(s->text_colour), "color-set", - G_CALLBACK(text_colour_set_sig), s); - - /* Force first update */ - text_changed_sig(GTK_COMBO_BOX(combo), s); + notify_style_update(s->p, s->cur_style); } static void margin_left_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->margin_left = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->margin_left = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void margin_right_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->margin_right = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->margin_right = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void margin_top_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->margin_top = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->margin_top = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void margin_bottom_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->margin_bottom = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->margin_bottom = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void offset_x_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->offset_x = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->offset_x = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void offset_y_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->offset_y = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->offset_y = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } static void halign_changed_sig(GtkComboBox *combo, struct _stylesheetwindow *s) { - s->cur_layout_element->halign = gtk_combo_box_get_active(combo); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->halign = gtk_combo_box_get_active(combo); + notify_style_update(s->p, s->cur_style); } static void valign_changed_sig(GtkComboBox *combo, struct _stylesheetwindow *s) { - s->cur_layout_element->valign = gtk_combo_box_get_active(combo); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->valign = gtk_combo_box_get_active(combo); + notify_style_update(s->p, s->cur_style); } static void max_changed_sig(GtkSpinButton *spin, struct _stylesheetwindow *s) { - s->cur_layout_element->max_width = gtk_spin_button_get_value(spin); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->max_width = gtk_spin_button_get_value(spin); + notify_style_update(s->p, s->cur_style); } @@ -249,45 +168,56 @@ static void use_max_toggled_sig(GtkToggleButton *combo, int v; v = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(s->use_max)); - s->cur_layout_element->use_max_width = v; + s->cur_style->use_max_width = v; gtk_widget_set_sensitive(s->max_width, - s->cur_layout_element->use_max_width); - notify_layout_update(s->p, s->cur_layout_element); + s->cur_style->use_max_width); + notify_style_update(s->p, s->cur_style); } -static void layout_changed_sig(GtkComboBox *combo, +static void style_changed_sig(GtkComboBox *combo, struct _stylesheetwindow *s) { int n; + GdkColor col; n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); - s->cur_layout_element = s->ss->layout_elements[n]; + s->cur_style = s->ss->styles[n]; + /* FIXME: Handle default style */ gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_left), - s->cur_layout_element->margin_left); + s->cur_style->margin_left); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_right), - s->cur_layout_element->margin_right); + s->cur_style->margin_right); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_bottom), - s->cur_layout_element->margin_bottom); + s->cur_style->margin_bottom); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_top), - s->cur_layout_element->margin_top); + s->cur_style->margin_top); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->offset_x), - s->cur_layout_element->offset_x); + s->cur_style->offset_x); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->offset_y), - s->cur_layout_element->offset_y); + s->cur_style->offset_y); gtk_combo_box_set_active(GTK_COMBO_BOX(s->halign), - s->cur_layout_element->halign); + s->cur_style->halign); gtk_combo_box_set_active(GTK_COMBO_BOX(s->valign), - s->cur_layout_element->valign); + s->cur_style->valign); gtk_widget_set_sensitive(s->max_width, - s->cur_layout_element->use_max_width); + s->cur_style->use_max_width); gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->max_width), - s->cur_layout_element->max_width); + s->cur_style->max_width); + + n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + s->cur_style = s->ss->styles[n]; + + gtk_font_button_set_font_name(GTK_FONT_BUTTON(s->text_font), + s->cur_style->font); + + gdk_color_parse(s->cur_style->colour, &col); + gtk_color_button_set_color(GTK_COLOR_BUTTON(s->text_colour), &col); } @@ -307,13 +237,13 @@ 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_layout_elements; i++ ) { + for ( i=0; i<s->ss->n_styles; i++ ) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), - s->ss->layout_elements[i]->name); + s->ss->styles[i]->name); } gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); g_signal_connect(G_OBJECT(combo), "changed", - G_CALLBACK(layout_changed_sig), s); + G_CALLBACK(style_changed_sig), s); gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0); line = gtk_hseparator_new(); @@ -428,8 +358,34 @@ static void do_layout(struct _stylesheetwindow *s, GtkWidget *b) g_signal_connect(G_OBJECT(s->max_width), "value-changed", G_CALLBACK(max_changed_sig), s); + /* Font/colour stuff */ + table = gtk_table_new(3, 2, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); + gtk_table_set_row_spacings(GTK_TABLE(table), 5.0); + gtk_table_set_col_spacings(GTK_TABLE(table), 5.0); + + label = gtk_label_new("Font:"); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + s->text_font = gtk_font_button_new_with_font("Sans 12"); + box = gtk_hbox_new(FALSE, 0); + gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 0, 1); + gtk_box_pack_start(GTK_BOX(box), s->text_font, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(s->text_font), "font-set", + G_CALLBACK(text_font_set_sig), s); + + label = gtk_label_new("Colour:"); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + s->text_colour = gtk_color_button_new(); + box = gtk_hbox_new(FALSE, 0); + gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 1, 2); + gtk_box_pack_start(GTK_BOX(box), s->text_colour, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(s->text_colour), "color-set", + G_CALLBACK(text_colour_set_sig), s); + /* Force first update */ - layout_changed_sig(GTK_COMBO_BOX(combo), s); + style_changed_sig(GTK_COMBO_BOX(combo), s); } @@ -442,115 +398,85 @@ static gint destroy_stylesheet_sig(GtkWidget *w, struct _stylesheetwindow *s) } -static void add_text_style(StyleSheet *ss, struct text_style *st) -{ - int n = ss->n_text_styles; - ss->text_styles = realloc(ss->text_styles, - (n+1)*sizeof(st)); - - ss->text_styles[n] = st; - - ss->n_text_styles = n+1; -} - - -static struct text_style *new_text_style(StyleSheet *ss, const char *name) +static struct style *new_style(StyleSheet *ss, const char *name) { - struct text_style *st; - - st = malloc(sizeof(*st)); - if ( st == NULL ) return NULL; - - st->name = strdup(name); - st->colour = strdup("#000000000000"); /* Black */ - st->alpha = 1.0; - - add_text_style(ss, st); - - return st; -} - - -static struct layout_element *new_layout_element(StyleSheet *ss, - const char *name) -{ - struct layout_element *ly; + struct style *sty; int n; + struct style **styles_new; - ly = malloc(sizeof(*ly)); - if ( ly == NULL ) return NULL; - - ly->name = strdup(name); - - n = ss->n_layout_elements; - ss->layout_elements = realloc(ss->layout_elements, (n+1)*sizeof(ly)); - /* Yes, the size of the pointer */ + sty = malloc(sizeof(*sty)); + if ( sty == NULL ) return NULL; - ss->layout_elements[n] = ly; - ss->n_layout_elements = n+1; + n = ss->n_styles; + styles_new = realloc(ss->styles, (n+1)*sizeof(sty)); + if ( styles_new == NULL ) { + free(sty); + return NULL; + } + ss->styles = styles_new; + ss->styles[n] = sty; + ss->n_styles = n+1; - return ly; + return sty; } static void default_stylesheet(StyleSheet *ss) { - struct text_style *st; - struct layout_element *ly; - - st = new_text_style(ss, "Slide title"); - st->font = strdup("Sans 40"); - ly = new_layout_element(ss, st->name); - ly->text_style = st; - ly->margin_left = 20.0; - ly->margin_right = 20.0; - ly->margin_top = 20.0; - ly->margin_bottom = 20.0; - ly->halign = J_CENTER; - ly->valign = V_TOP; - ly->offset_x = 0.0; - ly->offset_y = 0.0; /* irrelevant */ - - st = new_text_style(ss, "Presentation title"); - st->font = strdup("Sans 50"); - ly = new_layout_element(ss, st->name); - ly->text_style = st; - ly->margin_left = 20.0; - ly->margin_right = 20.0; - ly->margin_top = 20.0; - ly->margin_bottom = 20.0; - ly->halign = J_CENTER; - ly->valign = V_CENTER; - ly->offset_x = -200.0; - ly->offset_y = +300.0; - - st = new_text_style(ss, "Presentation author"); - st->font = strdup("Sans 30"); - ly = new_layout_element(ss, st->name); - ly->text_style = st; - ly->margin_left = 20.0; - ly->margin_right = 20.0; - ly->margin_top = 20.0; - ly->margin_bottom = 20.0; - ly->halign = J_CENTER; - ly->valign = V_CENTER; - ly->offset_x = +200.0; - ly->offset_y = -300.0; - - st = new_text_style(ss, "Running text"); - st->font = strdup("Sans 14"); - - ly = new_layout_element(ss, "Slide content"); - ly->text_style = st; - ly->margin_left = 20.0; - ly->margin_right = 20.0; - ly->margin_top = 20.0; - ly->margin_bottom = 20.0; - ly->halign = J_CENTER; - ly->valign = V_CENTER; - ly->offset_x = +200.0; - ly->offset_y = -300.0; - + struct style *sty; + + /* Default style must be first */ + sty = new_style(ss, "Default"); + sty->font = strdup("Sans 18"); + sty->colour = strdup("#000000000000"); /* Black */ + sty->alpha = 1.0; + sty->margin_left = 20.0; + sty->margin_right = 20.0; + sty->margin_top = 20.0; + sty->margin_bottom = 20.0; + sty->halign = J_CENTER; /* Ignored */ + sty->valign = V_CENTER; /* Ignored */ + sty->offset_x = 0.0; /* Ignored */ + sty->offset_y = 0.0; /* Ignored */ + + sty = new_style(ss, "Slide title"); + sty->font = strdup("Sans 40"); + sty->colour = strdup("#000000000000"); /* Black */ + sty->alpha = 1.0; + sty->margin_left = 20.0; + sty->margin_right = 20.0; + sty->margin_top = 20.0; + sty->margin_bottom = 20.0; + sty->halign = J_CENTER; + sty->valign = V_TOP; + sty->offset_x = 0.0; + sty->offset_y = 0.0; /* irrelevant */ + + sty = new_style(ss, "Presentation title"); + sty->font = strdup("Sans 50"); + sty->colour = strdup("#000000000000"); /* Black */ + sty->alpha = 1.0; + sty->margin_left = 20.0; + sty->margin_right = 20.0; + sty->margin_top = 20.0; + sty->margin_bottom = 20.0; + sty->halign = J_CENTER; + sty->valign = V_CENTER; + sty->offset_x = -200.0; + sty->offset_y = +300.0; + + sty = new_style(ss, "Presentation author"); + sty->font = strdup("Sans 30"); + sty->colour = strdup("#000000000000"); /* Black */ + sty->alpha = 1.0; + sty->margin_left = 20.0; + sty->margin_right = 20.0; + sty->margin_top = 20.0; + sty->margin_bottom = 20.0; + sty->halign = J_CENTER; + sty->valign = V_CENTER; + sty->offset_x = +200.0; + sty->offset_y = -300.0; } @@ -561,10 +487,8 @@ StyleSheet *new_stylesheet() ss = calloc(1, sizeof(struct _stylesheet)); if ( ss == NULL ) return NULL; - ss->n_text_styles = 0; - ss->text_styles = NULL; - ss->n_layout_elements = 0; - ss->layout_elements = NULL; + ss->n_styles = 0; + ss->styles = NULL; default_stylesheet(ss); return ss; @@ -622,8 +546,8 @@ StylesheetWindow *open_stylesheet(struct presentation *p) s->p = p; s->ss = p->ss; - s->cur_text_style = NULL; - s->cur_layout_element = NULL; + s->cur_style = NULL; + s->cur_style = NULL; s->window = gtk_dialog_new_with_buttons("Stylesheet", GTK_WINDOW(p->window), 0, @@ -639,12 +563,6 @@ StylesheetWindow *open_stylesheet(struct presentation *p) text_box = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(text_box), 12); gtk_notebook_append_page(GTK_NOTEBOOK(nb), text_box, - gtk_label_new("Text styles")); - do_text(s, text_box); - - text_box = gtk_vbox_new(FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(text_box), 12); - gtk_notebook_append_page(GTK_NOTEBOOK(nb), text_box, gtk_label_new("Slide layout")); do_layout(s, text_box); |