1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* stylesheet_editor.c
*
* Copyright © 2013-2018 Thomas White <taw@bitwiz.org.uk>
*
* This file is part of Colloquium.
*
* Colloquium is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <gtk/gtk.h>
#include "stylesheet_editor.h"
#include "presentation.h"
#include "sc_interp.h"
G_DEFINE_TYPE_WITH_CODE(StylesheetEditor, stylesheet_editor,
GTK_TYPE_DIALOG, NULL)
struct _sspriv
{
struct presentation *p;
};
static void revert_sig(GtkButton *button, StylesheetEditor *widget)
{
printf("click revert!\n");
}
static void stylesheet_editor_init(StylesheetEditor *se)
{
se->priv = G_TYPE_INSTANCE_GET_PRIVATE(se, COLLOQUIUM_TYPE_STYLESHEET_EDITOR,
StylesheetEditorPrivate);
gtk_widget_init_template(GTK_WIDGET(se));
}
void stylesheet_editor_class_init(StylesheetEditorClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
gtk_widget_class_set_template_from_resource(widget_class,
"/uk/me/bitwiz/Colloquium/stylesheeteditor.ui");
g_type_class_add_private(gobject_class, sizeof(StylesheetEditorPrivate));
gtk_widget_class_bind_template_child(widget_class, StylesheetEditor,
default_style_ss);
gtk_widget_class_bind_template_child(widget_class, StylesheetEditor,
default_style_font);
gtk_widget_class_bind_template_child(widget_class, StylesheetEditor,
default_style_fgcol);
gtk_widget_class_bind_template_callback(widget_class, revert_sig);
}
static void set_values_from_presentation(StylesheetEditor *se)
{
SCInterpreter *scin;
char *fontname;
PangoFontDescription *fontdesc;
double *col;
GdkRGBA rgba;
GtkTextBuffer *buf;
char *sc;
scin = sc_interp_new(NULL, NULL, NULL, NULL);
sc_interp_run_stylesheet(scin, se->priv->p->stylesheet); /* NULL stylesheet is OK */
/* Default style */
fontdesc = sc_interp_get_fontdesc(scin);
fontname = pango_font_description_to_string(fontdesc);
gtk_font_button_set_font_name(GTK_FONT_BUTTON(se->default_style_font), 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->default_style_fgcol), &rgba);
sc = serialise_sc_block_chain(sc_block_child(se->priv->p->stylesheet));
buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(se->default_style_ss));
gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), sc, -1);
free(sc);
sc_interp_destroy(scin);
}
StylesheetEditor *stylesheet_editor_new(struct presentation *p)
{
StylesheetEditor *se;
se = g_object_new(COLLOQUIUM_TYPE_STYLESHEET_EDITOR, NULL);
if ( se == NULL ) return NULL;
se->priv->p = p;
set_values_from_presentation(se);
return se;
}
|