]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
When creating origins for labels, y is now sorted in reverse.
[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 (""),
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 (_("Description:")),
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 (_("Page 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 (_("Label size:")),
270                             FALSE, FALSE, 0);
271         whbox1 = gtk_hbox_new (FALSE, 0);
272         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
273         gtk_box_pack_start (GTK_BOX (whbox1),
274                             gtk_label_new (_("Layout:")),
275                             FALSE, FALSE, 0);
276
277         /* detail widgets column */
278         gl_debug (DEBUG_MEDIA_SELECT, "Creating details column...");
279         wvbox1 = gtk_vbox_new (FALSE, GL_HIG_SPACING);
280         gtk_box_pack_start (GTK_BOX (whbox), wvbox1, FALSE, FALSE, 0);
281
282         whbox1 = gtk_hbox_new (FALSE, 0);
283         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
284         gtk_box_pack_start (GTK_BOX (whbox1),
285                             gtk_label_new (""),
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->desc_label = gtk_label_new ("");
290         gtk_box_pack_start (GTK_BOX (whbox1), media_select->desc_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->sheet_size_label = gtk_label_new ("");
295         gtk_box_pack_start (GTK_BOX (whbox1), media_select->sheet_size_label,
296                             FALSE, FALSE, 0);
297         whbox1 = gtk_hbox_new (FALSE, 0);
298         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
299         media_select->label_size_label = gtk_label_new ("");
300         gtk_box_pack_start (GTK_BOX (whbox1), media_select->label_size_label,
301                             FALSE, FALSE, 0);
302         whbox1 = gtk_hbox_new (FALSE, 0);
303         gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
304         media_select->number_label = gtk_label_new ("");
305         gtk_box_pack_start (GTK_BOX (whbox1), media_select->number_label,
306                             FALSE, FALSE, 0);
307
308         /* Update mini_preview and details from default template */
309         
310         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
311                   media_select->template_entry);
312         name =
313             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
314                                     0, -1);
315         gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
316         gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
317                                    name);
318         details_update (media_select, name);
319         g_free (name);
320
321         /* Connect signals to controls */
322         g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
323                           G_CALLBACK (page_size_entry_changed_cb),
324                           media_select);
325         g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
326                           G_CALLBACK (template_entry_changed_cb),
327                           media_select);
328
329         gl_debug (DEBUG_MEDIA_SELECT, "END");
330 }
331
332 /*--------------------------------------------------------------------------*/
333 /* PRIVATE.  modify widget due to change in selection                       */
334 /*--------------------------------------------------------------------------*/
335 static void
336 page_size_entry_changed_cb (GtkEntry * entry,
337                             gpointer user_data)
338 {
339         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
340         gchar *page_size;
341         GList *template_names;
342
343         gl_debug (DEBUG_MEDIA_SELECT, "START");
344
345
346         /* Update template selections for new page size */
347         page_size = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
348         if ( strlen(page_size) ) {
349                 gl_debug (DEBUG_MEDIA_SELECT, "page_size = \"%s\"", page_size);
350                 template_names = gl_template_get_name_list (page_size);
351                 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
352                                                template_names);
353                 gl_template_free_name_list (&template_names);
354         }
355         g_free (page_size);
356
357         gl_debug (DEBUG_MEDIA_SELECT, "END");
358 }
359
360 /*--------------------------------------------------------------------------*/
361 /* PRIVATE.  modify widget due to change in selection                       */
362 /*--------------------------------------------------------------------------*/
363 static void
364 template_entry_changed_cb (GtkEntry * entry,
365                            gpointer user_data)
366 {
367         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
368         gchar *name;
369
370         gl_debug (DEBUG_MEDIA_SELECT, "START");
371
372         /* Update mini_preview canvas & details with template */
373         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
374         name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
375         if ( strlen(name) ) {
376                 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
377                 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
378                                            name);
379                 gl_debug (DEBUG_MEDIA_SELECT, "m1");
380                 details_update (media_select, name);
381                 gl_debug (DEBUG_MEDIA_SELECT, "m2");
382
383                 /* Emit our "changed" signal */
384                 g_signal_emit (G_OBJECT (user_data),
385                                wdgt_media_select_signals[CHANGED], 0);
386         }
387         g_free (name);
388
389         gl_debug (DEBUG_MEDIA_SELECT, "END");
390 }
391
392 /*--------------------------------------------------------------------------*/
393 /* PRIVATE. update "details" widgets from new template.               */
394 /*--------------------------------------------------------------------------*/
395 static void
396 details_update (glWdgtMediaSelect * media_select,
397                 gchar * name)
398 {
399         glTemplate *template;
400         gchar *text;
401         glPrefsUnits units;
402         const gchar *units_string;
403         gdouble units_per_point;
404
405         gl_debug (DEBUG_MEDIA_SELECT, "START");
406
407         units = gl_prefs_get_units ();
408         units_string = gl_prefs_get_units_string ();
409         units_per_point = gl_prefs_get_units_per_point ();
410
411         /* Fetch template */
412         template = gl_template_from_name (name);
413
414         gtk_label_set_text (GTK_LABEL (media_select->desc_label),
415                             template->description);
416
417         gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
418                             template->page_size);
419
420         text = gl_template_get_layout_desc (template);
421         gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
422         g_free (text);
423
424         text = gl_template_get_label_size_desc (template);
425         gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
426         g_free (text);
427
428         gl_template_free( &template );
429
430         gl_debug (DEBUG_MEDIA_SELECT, "END");
431 }
432
433 /****************************************************************************/
434 /* query selected label template name.                                      */
435 /****************************************************************************/
436 gchar *
437 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
438 {
439         gl_debug (DEBUG_MEDIA_SELECT, "");
440         return
441             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
442                                     0, -1);
443 }
444
445 /****************************************************************************/
446 /* set selected label template name.                                        */
447 /****************************************************************************/
448 void
449 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
450                                gchar * name)
451 {
452         gint pos;
453
454         gl_debug (DEBUG_MEDIA_SELECT, "START");
455
456         g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
457                                         G_CALLBACK(template_entry_changed_cb),
458                                         media_select);
459         gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
460                                   0, -1);
461         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
462                                            G_CALLBACK(template_entry_changed_cb),
463                                            media_select);
464
465         pos = 0;
466         gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
467                                   name, strlen (name), &pos);
468
469         gl_debug (DEBUG_MEDIA_SELECT, "END");
470 }
471
472 /****************************************************************************/
473 /* query selected label template page size.                                 */
474 /****************************************************************************/
475 gchar *
476 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
477 {
478         gl_debug (DEBUG_MEDIA_SELECT, "");
479
480         return
481             gtk_editable_get_chars (GTK_EDITABLE
482                                     (media_select->page_size_entry), 0, -1);
483 }
484
485 /****************************************************************************/
486 /* set selected label template page size.                                   */
487 /****************************************************************************/
488 void
489 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
490                                     gchar * page_size)
491 {
492         gint pos;
493
494         gl_debug (DEBUG_MEDIA_SELECT, "START");
495
496         g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
497                                         G_CALLBACK(page_size_entry_changed_cb),
498                                         media_select);
499         gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
500                                   0, -1);
501         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
502                                           G_CALLBACK(page_size_entry_changed_cb),
503                                           media_select);
504
505         pos = 0;
506         gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
507                                   page_size, strlen (page_size), &pos);
508
509         gl_debug (DEBUG_MEDIA_SELECT, "END");
510 }