]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
Refinements to new label dialog and associated widgets.
[glabels] / glabels2 / src / wdgt-media-select.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_media_select.c:  media selection 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-media-select.h"
26 #include "hig.h"
27 #include "template.h"
28 #include "wdgt-mini-preview.h"
29 #include "prefs.h"
30 #include "util.h"
31 #include "marshal.h"
32
33 #include "debug.h"
34
35 #define WDGT_MINI_PREVIEW_WIDTH  160
36 #define WDGT_MINI_PREVIEW_HEIGHT 200
37
38 /*===========================================*/
39 /* Private types                             */
40 /*===========================================*/
41
42 enum {
43         CHANGED,
44         LAST_SIGNAL
45 };
46
47 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
48
49 /*===========================================*/
50 /* Private globals                           */
51 /*===========================================*/
52
53 static GObjectClass *parent_class;
54
55 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
56
57 /*===========================================*/
58 /* Local function prototypes                 */
59 /*===========================================*/
60
61 static void gl_wdgt_media_select_class_init    (glWdgtMediaSelectClass * class);
62 static void gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select);
63 static void gl_wdgt_media_select_finalize      (GObject * object);
64
65 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect * media_select);
66
67 static void page_size_entry_changed_cb         (GtkEntry * entry,
68                                                 gpointer user_data);
69 static void template_entry_changed_cb          (GtkEntry * entry,
70                                                 gpointer user_data);
71
72 static void details_update                     (glWdgtMediaSelect * media_select,
73                                                 gchar * name);
74 \f
75 /****************************************************************************/
76 /* Boilerplate Object stuff.                                                */
77 /****************************************************************************/
78 guint
79 gl_wdgt_media_select_get_type (void)
80 {
81         static guint wdgt_media_select_type = 0;
82
83         if (!wdgt_media_select_type) {
84                 GTypeInfo wdgt_media_select_info = {
85                         sizeof (glWdgtMediaSelectClass),
86                         NULL,
87                         NULL,
88                         (GClassInitFunc) gl_wdgt_media_select_class_init,
89                         NULL,
90                         NULL,
91                         sizeof (glWdgtMediaSelect),
92                         0,
93                         (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
94                 };
95
96                 wdgt_media_select_type =
97                         g_type_register_static (gtk_vbox_get_type (),
98                                                 "glWdgtMediaSelect",
99                                                 &wdgt_media_select_info, 0);
100         }
101
102         return wdgt_media_select_type;
103 }
104
105 static void
106 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass * class)
107 {
108         GObjectClass *object_class;
109
110         gl_debug (DEBUG_MEDIA_SELECT, "START");
111
112         object_class = (GObjectClass *) class;
113
114         parent_class = gtk_type_class (gtk_vbox_get_type ());
115
116         object_class->finalize = gl_wdgt_media_select_finalize;
117
118         wdgt_media_select_signals[CHANGED] =
119             g_signal_new ("changed",
120                           G_OBJECT_CLASS_TYPE(object_class),
121                           G_SIGNAL_RUN_LAST,
122                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
123                           NULL, NULL,
124                           gl_marshal_VOID__VOID,
125                           G_TYPE_NONE, 0);
126
127         gl_debug (DEBUG_MEDIA_SELECT, "END");
128 }
129
130 static void
131 gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select)
132 {
133         gl_debug (DEBUG_MEDIA_SELECT, "START");
134
135         media_select->page_size_entry = NULL;
136         media_select->template_entry = NULL;
137
138         media_select->mini_preview = NULL;
139
140         media_select->desc_label = NULL;
141         media_select->sheet_size_label = NULL;
142         media_select->number_label = NULL;
143         media_select->label_size_label = NULL;
144
145         gl_debug (DEBUG_MEDIA_SELECT, "END");
146 }
147
148 static void
149 gl_wdgt_media_select_finalize (GObject * object)
150 {
151         glWdgtMediaSelect *media_select;
152         glWdgtMediaSelectClass *class;
153
154         gl_debug (DEBUG_MEDIA_SELECT, "START");
155
156         g_return_if_fail (object != NULL);
157         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
158
159         media_select = GL_WDGT_MEDIA_SELECT (object);
160
161         G_OBJECT_CLASS (parent_class)->finalize (object);
162
163         gl_debug (DEBUG_MEDIA_SELECT, "END");
164 }
165
166 GtkWidget *
167 gl_wdgt_media_select_new (void)
168 {
169         glWdgtMediaSelect *media_select;
170
171         gl_debug (DEBUG_MEDIA_SELECT, "START");
172
173         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
174
175         gl_wdgt_media_select_construct (media_select);
176
177         gl_debug (DEBUG_MEDIA_SELECT, "END");
178
179         return GTK_WIDGET (media_select);
180 }
181
182 /*--------------------------------------------------------------------------*/
183 /* PRIVATE.  Construct composite widget.                                    */
184 /*--------------------------------------------------------------------------*/
185 static void
186 gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select)
187 {
188         GtkWidget *whbox, *wvbox, *wcombo, *wvbox1, *whbox1;
189         gchar *name;
190         GList *template_names, *page_sizes = NULL;
191         const gchar *page_size;
192
193         gl_debug (DEBUG_MEDIA_SELECT, "START");
194
195         page_size = gl_prefs_get_page_size ();
196
197         wvbox = GTK_WIDGET (media_select);
198         gtk_box_set_spacing (GTK_BOX(wvbox), GL_HIG_SPACING);
199
200         whbox = gtk_hbox_new (FALSE, GL_HIG_SPACING);
201         gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, 0);
202
203         /* Page size selection control */
204         gl_debug (DEBUG_MEDIA_SELECT, "Creating page size combo...");
205         wcombo = gtk_combo_new ();
206         page_sizes = gl_template_get_page_size_list ();
207         gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), page_sizes);
208         gl_template_free_page_size_list (&page_sizes);
209         media_select->page_size_entry = GTK_COMBO (wcombo)->entry;
210         gtk_entry_set_editable (GTK_ENTRY (media_select->page_size_entry),
211                                 FALSE);
212         gtk_combo_set_value_in_list (GTK_COMBO(wcombo), TRUE, FALSE);
213         gtk_widget_set_size_request (media_select->page_size_entry, 100, -1);
214         gtk_entry_set_text (GTK_ENTRY (media_select->page_size_entry),
215                             page_size);
216         gtk_box_pack_start (GTK_BOX (whbox), wcombo, FALSE, FALSE, 0);
217
218         /* Actual selection control */
219         gl_debug (DEBUG_MEDIA_SELECT, "Creating template combo...");
220         gl_debug (DEBUG_MEDIA_SELECT, "page_size = %s", page_size);
221         template_names = gl_template_get_name_list (page_size);
222         media_select->template_combo = gtk_combo_new ();
223         gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
224                                        template_names);
225         gl_template_free_name_list (&template_names);
226         media_select->template_entry =
227             GTK_COMBO (media_select->template_combo)->entry;
228         gtk_entry_set_editable (GTK_ENTRY (media_select->template_entry),
229                                 FALSE);
230         gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
231                                      TRUE, FALSE);
232         gtk_widget_set_size_request (media_select->template_entry, 400, -1);
233         gtk_box_pack_start (GTK_BOX (whbox), media_select->template_combo,
234                             FALSE, FALSE, 0);
235
236         whbox = gtk_hbox_new (FALSE, GL_HIG_SPACING);
237         gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, 0);
238
239         /* mini_preview canvas */
240         gl_debug (DEBUG_MEDIA_SELECT, "Creating mini preview...");
241         media_select->mini_preview = gl_wdgt_mini_preview_new ( WDGT_MINI_PREVIEW_HEIGHT,
242                                                            WDGT_MINI_PREVIEW_WIDTH);
243         gtk_box_pack_start (GTK_BOX (whbox), media_select->mini_preview,
244                             FALSE, FALSE, 0);
245
246         /* Label column */
247         gl_debug (DEBUG_MEDIA_SELECT, "Creating label column...");
248         wvbox1 = gtk_vbox_new (FALSE, GL_HIG_SPACING);
249         gtk_box_pack_start (GTK_BOX (whbox), wvbox1, FALSE, FALSE, 0);
250
251         whbox1 = gtk_hbox_new (FALSE, 0);
252         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
253         gtk_box_pack_start (GTK_BOX (whbox1),
254                             gtk_label_new (_("Description:")),
255                             FALSE, FALSE, 0);
256         whbox1 = gtk_hbox_new (FALSE, 0);
257         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
258         gtk_box_pack_start (GTK_BOX (whbox1),
259                             gtk_label_new (_("Page size:")),
260                             FALSE, FALSE, 0);
261         whbox1 = gtk_hbox_new (FALSE, 0);
262         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
263         gtk_box_pack_start (GTK_BOX (whbox1),
264                             gtk_label_new (_("Label size:")),
265                             FALSE, FALSE, 0);
266         whbox1 = gtk_hbox_new (FALSE, 0);
267         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
268         gtk_box_pack_start (GTK_BOX (whbox1),
269                             gtk_label_new (_("Layout:")),
270                             FALSE, FALSE, 0);
271
272         /* detail widgets column */
273         gl_debug (DEBUG_MEDIA_SELECT, "Creating details column...");
274         wvbox1 = gtk_vbox_new (FALSE, GL_HIG_SPACING);
275         gtk_box_pack_start (GTK_BOX (whbox), wvbox1, FALSE, FALSE, 0);
276
277         whbox1 = gtk_hbox_new (FALSE, 0);
278         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
279         media_select->desc_label = gtk_label_new ("");
280         gtk_box_pack_start (GTK_BOX (whbox1), media_select->desc_label,
281                             FALSE, FALSE, 0);
282         whbox1 = gtk_hbox_new (FALSE, 0);
283         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
284         media_select->sheet_size_label = gtk_label_new ("");
285         gtk_box_pack_start (GTK_BOX (whbox1), media_select->sheet_size_label,
286                             FALSE, FALSE, 0);
287         whbox1 = gtk_hbox_new (FALSE, 0);
288         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
289         media_select->label_size_label = gtk_label_new ("");
290         gtk_box_pack_start (GTK_BOX (whbox1), media_select->label_size_label,
291                             FALSE, FALSE, 0);
292         whbox1 = gtk_hbox_new (FALSE, 0);
293         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
294         media_select->number_label = gtk_label_new ("");
295         gtk_box_pack_start (GTK_BOX (whbox1), media_select->number_label,
296                             FALSE, FALSE, 0);
297
298         /* Update mini_preview and details from default template */
299         
300         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
301                   media_select->template_entry);
302         name =
303             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
304                                     0, -1);
305         gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
306         gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
307                                    name);
308         details_update (media_select, name);
309         g_free (name);
310
311         /* Connect signals to controls */
312         g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
313                           G_CALLBACK (page_size_entry_changed_cb),
314                           media_select);
315         g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
316                           G_CALLBACK (template_entry_changed_cb),
317                           media_select);
318
319         gl_debug (DEBUG_MEDIA_SELECT, "END");
320 }
321
322 /*--------------------------------------------------------------------------*/
323 /* PRIVATE.  modify widget due to change in selection                       */
324 /*--------------------------------------------------------------------------*/
325 static void
326 page_size_entry_changed_cb (GtkEntry * entry,
327                             gpointer user_data)
328 {
329         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
330         gchar *page_size;
331         GList *template_names;
332
333         gl_debug (DEBUG_MEDIA_SELECT, "START");
334
335
336         /* Update template selections for new page size */
337         page_size = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
338         if ( strlen(page_size) ) {
339                 gl_debug (DEBUG_MEDIA_SELECT, "page_size = \"%s\"", page_size);
340                 template_names = gl_template_get_name_list (page_size);
341                 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
342                                                template_names);
343                 gl_template_free_name_list (&template_names);
344         }
345         g_free (page_size);
346
347         gl_debug (DEBUG_MEDIA_SELECT, "END");
348 }
349
350 /*--------------------------------------------------------------------------*/
351 /* PRIVATE.  modify widget due to change in selection                       */
352 /*--------------------------------------------------------------------------*/
353 static void
354 template_entry_changed_cb (GtkEntry * entry,
355                            gpointer user_data)
356 {
357         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
358         gchar *name;
359
360         gl_debug (DEBUG_MEDIA_SELECT, "START");
361
362         /* Update mini_preview canvas & details with template */
363         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
364         name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
365         if ( strlen(name) ) {
366                 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
367                 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
368                                            name);
369                 gl_debug (DEBUG_MEDIA_SELECT, "m1");
370                 details_update (media_select, name);
371                 gl_debug (DEBUG_MEDIA_SELECT, "m2");
372
373                 /* Emit our "changed" signal */
374                 g_signal_emit (G_OBJECT (user_data),
375                                wdgt_media_select_signals[CHANGED], 0);
376         }
377         g_free (name);
378
379         gl_debug (DEBUG_MEDIA_SELECT, "END");
380 }
381
382 /*--------------------------------------------------------------------------*/
383 /* PRIVATE. update "details" widgets from new template.               */
384 /*--------------------------------------------------------------------------*/
385 static void
386 details_update (glWdgtMediaSelect * media_select,
387                 gchar * name)
388 {
389         glTemplate *template;
390         gchar *text;
391         glPrefsUnits units;
392         const gchar *units_string;
393         gdouble units_per_point;
394
395         gl_debug (DEBUG_MEDIA_SELECT, "START");
396
397         units = gl_prefs_get_units ();
398         units_string = gl_prefs_get_units_string ();
399         units_per_point = gl_prefs_get_units_per_point ();
400
401         /* Fetch template */
402         template = gl_template_from_name (name);
403
404         gtk_label_set_text (GTK_LABEL (media_select->desc_label),
405                             template->description);
406
407         gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
408                             template->page_size);
409
410         text = gl_template_get_layout_desc (template);
411         gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
412         g_free (text);
413
414         text = gl_template_get_label_size_desc (template);
415         gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
416         g_free (text);
417
418         gl_template_free( &template );
419
420         gl_debug (DEBUG_MEDIA_SELECT, "END");
421 }
422
423 /****************************************************************************/
424 /* query selected label template name.                                      */
425 /****************************************************************************/
426 gchar *
427 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
428 {
429         gl_debug (DEBUG_MEDIA_SELECT, "");
430         return
431             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
432                                     0, -1);
433 }
434
435 /****************************************************************************/
436 /* set selected label template name.                                        */
437 /****************************************************************************/
438 void
439 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
440                                gchar * name)
441 {
442         gint pos;
443
444         gl_debug (DEBUG_MEDIA_SELECT, "START");
445
446         g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
447                                         G_CALLBACK(template_entry_changed_cb),
448                                         media_select);
449         gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
450                                   0, -1);
451         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
452                                            G_CALLBACK(template_entry_changed_cb),
453                                            media_select);
454
455         pos = 0;
456         gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
457                                   name, strlen (name), &pos);
458
459         gl_debug (DEBUG_MEDIA_SELECT, "END");
460 }
461
462 /****************************************************************************/
463 /* query selected label template page size.                                 */
464 /****************************************************************************/
465 gchar *
466 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
467 {
468         gl_debug (DEBUG_MEDIA_SELECT, "");
469
470         return
471             gtk_editable_get_chars (GTK_EDITABLE
472                                     (media_select->page_size_entry), 0, -1);
473 }
474
475 /****************************************************************************/
476 /* set selected label template page size.                                   */
477 /****************************************************************************/
478 void
479 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
480                                     gchar * page_size)
481 {
482         gint pos;
483
484         gl_debug (DEBUG_MEDIA_SELECT, "START");
485
486         g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
487                                         G_CALLBACK(page_size_entry_changed_cb),
488                                         media_select);
489         gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
490                                   0, -1);
491         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
492                                           G_CALLBACK(page_size_entry_changed_cb),
493                                           media_select);
494
495         pos = 0;
496         gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
497                                   page_size, strlen (page_size), &pos);
498
499         gl_debug (DEBUG_MEDIA_SELECT, "END");
500 }