aboutsummaryrefslogtreecommitdiff
path: root/src/stylesheet.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-09-25 19:29:11 +0200
committerThomas White <taw@bitwiz.org.uk>2011-09-25 19:29:11 +0200
commit1dbcef5a7428a7132b746653af671b3a15fc7951 (patch)
tree4b902092d0c011739017f26989779d2538c37d57 /src/stylesheet.c
parente26dcd2049ae065f5a821f087abd736ba553dcad (diff)
First part of new concept for styles and layout elements
Diffstat (limited to 'src/stylesheet.c')
-rw-r--r--src/stylesheet.c392
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);