]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-bc-props.c
Initial revision
[glabels] / glabels2 / src / wdgt-bc-props.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_bc_props.c:  barcode properties widget module
5  *
6  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include "wdgt-bc-props.h"
26 #include "marshal.h"
27
28 #include "debug.h"
29
30 #define RED(x)   ( ((x)>>24) & 0xff )
31 #define GREEN(x) ( ((x)>>16) & 0xff )
32 #define BLUE(x)  ( ((x)>>8)  & 0xff )
33 #define ALPHA(x) (  (x)      & 0xff )
34
35 /*===========================================*/
36 /* Private types                             */
37 /*===========================================*/
38
39 enum {
40         CHANGED,
41         LAST_SIGNAL
42 };
43
44 typedef void (*glWdgtBCPropsSignal) (GObject * object, gpointer data);
45
46 /*===========================================*/
47 /* Private globals                           */
48 /*===========================================*/
49
50 static GtkContainerClass *parent_class;
51
52 static gint wdgt_bc_props_signals[LAST_SIGNAL] = { 0 };
53
54 /*===========================================*/
55 /* Local function prototypes                 */
56 /*===========================================*/
57
58 static void gl_wdgt_bc_props_class_init (glWdgtBCPropsClass * class);
59 static void gl_wdgt_bc_props_instance_init (glWdgtBCProps * prop);
60 static void gl_wdgt_bc_props_finalize (GObject * object);
61 static void gl_wdgt_bc_props_construct (glWdgtBCProps * prop, gchar * label);
62 static void changed_cb (glWdgtBCProps * prop);
63 \f
64 /*================================================================*/
65 /* Boilerplate Object stuff.                                      */
66 /*================================================================*/
67 guint
68 gl_wdgt_bc_props_get_type (void)
69 {
70         static guint wdgt_bc_props_type = 0;
71
72         if (!wdgt_bc_props_type) {
73                 GTypeInfo wdgt_bc_props_info = {
74                         sizeof (glWdgtBCPropsClass),
75                         NULL,
76                         NULL,
77                         (GClassInitFunc) gl_wdgt_bc_props_class_init,
78                         NULL,
79                         NULL,
80                         sizeof (glWdgtBCProps),
81                         0,
82                         (GInstanceInitFunc) gl_wdgt_bc_props_instance_init,
83                 };
84
85                 wdgt_bc_props_type =
86                         g_type_register_static (gtk_vbox_get_type (),
87                                                 "glWdgtBCProps", &wdgt_bc_props_info, 0);
88         }
89
90         return wdgt_bc_props_type;
91 }
92
93 static void
94 gl_wdgt_bc_props_class_init (glWdgtBCPropsClass * class)
95 {
96         GObjectClass *object_class;
97
98         object_class = (GObjectClass *) class;
99
100         parent_class = gtk_type_class (gtk_vbox_get_type ());
101
102         object_class->finalize = gl_wdgt_bc_props_finalize;
103
104         wdgt_bc_props_signals[CHANGED] =
105             g_signal_new ("changed",
106                           G_OBJECT_CLASS_TYPE(object_class),
107                           G_SIGNAL_RUN_LAST,
108                           G_STRUCT_OFFSET (glWdgtBCPropsClass, changed),
109                           NULL, NULL,
110                           gl_marshal_VOID__VOID,
111                           G_TYPE_NONE, 0);
112
113 }
114
115 static void
116 gl_wdgt_bc_props_instance_init (glWdgtBCProps * prop)
117 {
118         prop->scale_spin = NULL;
119         prop->color_picker = NULL;
120 }
121
122 static void
123 gl_wdgt_bc_props_finalize (GObject * object)
124 {
125         glWdgtBCProps *prop;
126         glWdgtBCPropsClass *class;
127
128         g_return_if_fail (object != NULL);
129         g_return_if_fail (GL_IS_WDGT_BC_PROPS (object));
130
131         prop = GL_WDGT_BC_PROPS (object);
132
133         G_OBJECT_CLASS (parent_class)->finalize (object);
134 }
135
136 GtkWidget *
137 gl_wdgt_bc_props_new (gchar * label)
138 {
139         glWdgtBCProps *prop;
140
141         prop = g_object_new (gl_wdgt_bc_props_get_type (), NULL);
142
143         gl_wdgt_bc_props_construct (prop, label);
144
145         return GTK_WIDGET (prop);
146 }
147 \f
148 /*============================================================*/
149 /* Construct composite widget.                                */
150 /*============================================================*/
151 static void
152 gl_wdgt_bc_props_construct (glWdgtBCProps * prop,
153                       gchar * label)
154 {
155         GtkWidget *wvbox, *wframe, *wtable, *wlabel;
156         GtkObject *adjust;
157
158         wvbox = GTK_WIDGET (prop);
159
160         wframe = gtk_frame_new (label);
161         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
162
163         wtable = gtk_table_new (2, 3, TRUE);
164         gtk_container_set_border_width (GTK_CONTAINER (wtable), 10);
165         gtk_table_set_row_spacings (GTK_TABLE (wtable), 5);
166         gtk_table_set_col_spacings (GTK_TABLE (wtable), 5);
167         gtk_container_add (GTK_CONTAINER (wframe), wtable);
168
169         /* Scale Label */
170         wlabel = gtk_label_new (_("Scale:"));
171         gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
172         gtk_label_set_justify (GTK_LABEL (wlabel), GTK_JUSTIFY_RIGHT);
173         gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 0, 1, 0, 1);
174         /* Scale widget */
175         adjust = gtk_adjustment_new (100.0, 50.0, 200.0, 10.0, 10.0, 10.0);
176         prop->scale_spin =
177             gtk_spin_button_new (GTK_ADJUSTMENT (adjust), 10.0, 0);
178         g_signal_connect_swapped (G_OBJECT (prop->scale_spin), "changed",
179                                   G_CALLBACK (changed_cb),
180                                   G_OBJECT (prop));
181         gtk_table_attach_defaults (GTK_TABLE (wtable), prop->scale_spin, 1, 2,
182                                    0, 1);
183         /* % Label */
184         wlabel = gtk_label_new (_("%"));
185         gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
186         gtk_label_set_justify (GTK_LABEL (wlabel), GTK_JUSTIFY_RIGHT);
187         gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 2, 3, 0, 1);
188
189         /* Line Color Label */
190         wlabel = gtk_label_new (_("Color:"));
191         gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
192         gtk_label_set_justify (GTK_LABEL (wlabel), GTK_JUSTIFY_RIGHT);
193         gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 0, 1, 1, 2);
194         /* Line Color picker widget */
195         prop->color_picker = gnome_color_picker_new ();
196         g_signal_connect_swapped (G_OBJECT (prop->color_picker), "color_set",
197                                   G_CALLBACK (changed_cb),
198                                   G_OBJECT (prop));
199         gtk_table_attach_defaults (GTK_TABLE (wtable), prop->color_picker, 1, 3,
200                                    1, 2);
201 }
202
203 /*--------------------------------------------------------------------------*/
204 /* PRIVATE.  Callback for when any control in the widget has changed.       */
205 /*--------------------------------------------------------------------------*/
206 static void
207 changed_cb (glWdgtBCProps * prop)
208 {
209         /* Emit our "changed" signal */
210         g_signal_emit (G_OBJECT (prop), wdgt_bc_props_signals[CHANGED], 0);
211 }
212 \f
213 /*====================================================================*/
214 /* query values from controls.                                        */
215 /*====================================================================*/
216 void
217 gl_wdgt_bc_props_get_params (glWdgtBCProps * prop,
218                              gdouble * scale,
219                              guint * color)
220 {
221         guint8 r, g, b, a;
222
223         /* ------- Get updated scale ------ */
224         *scale =
225             gtk_spin_button_get_value (GTK_SPIN_BUTTON(prop->scale_spin));
226         *scale /= 100.0;
227
228         /* ------- Get updated line color ------ */
229         gnome_color_picker_get_i8 (GNOME_COLOR_PICKER (prop->color_picker),
230                                    &r, &g, &b, &a);
231         *color = GNOME_CANVAS_COLOR_A (r, g, b, a);
232
233 }
234
235 /*====================================================================*/
236 /* fill in values and ranges for controls.                            */
237 /*====================================================================*/
238 void
239 gl_wdgt_bc_props_set_params (glWdgtBCProps * prop,
240                              gdouble scale,
241                              guint color)
242 {
243         scale *= 100.0;
244         gtk_spin_button_set_value (GTK_SPIN_BUTTON (prop->scale_spin), scale);
245
246         gnome_color_picker_set_i8 (GNOME_COLOR_PICKER (prop->color_picker),
247                                    RED (color), GREEN (color), BLUE (color),
248                                    ALPHA (color));
249
250 }