2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * wdgt_media_select.c: media selection widget module
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include "wdgt-media-select.h"
27 #include "wdgt-mini-preview.h"
34 #define WDGT_MINI_PREVIEW_WIDTH 160
35 #define WDGT_MINI_PREVIEW_HEIGHT 200
37 /*===========================================*/
39 /*===========================================*/
46 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
48 /*===========================================*/
50 /*===========================================*/
52 static GObjectClass *parent_class;
54 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
56 /*===========================================*/
57 /* Local function prototypes */
58 /*===========================================*/
60 static void gl_wdgt_media_select_class_init (glWdgtMediaSelectClass * class);
61 static void gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select);
62 static void gl_wdgt_media_select_finalize (GObject * object);
64 static void gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select);
66 static void page_size_entry_changed_cb (GtkEntry * entry,
68 static void template_entry_changed_cb (GtkEntry * entry,
71 static void details_update (glWdgtMediaSelect * media_select,
74 /****************************************************************************/
75 /* Boilerplate Object stuff. */
76 /****************************************************************************/
78 gl_wdgt_media_select_get_type (void)
80 static guint wdgt_media_select_type = 0;
82 if (!wdgt_media_select_type) {
83 GTypeInfo wdgt_media_select_info = {
84 sizeof (glWdgtMediaSelectClass),
87 (GClassInitFunc) gl_wdgt_media_select_class_init,
90 sizeof (glWdgtMediaSelect),
92 (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
95 wdgt_media_select_type =
96 g_type_register_static (gtk_vbox_get_type (),
98 &wdgt_media_select_info, 0);
101 return wdgt_media_select_type;
105 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass * class)
107 GObjectClass *object_class;
109 gl_debug (DEBUG_MEDIA_SELECT, "START");
111 object_class = (GObjectClass *) class;
113 parent_class = gtk_type_class (gtk_vbox_get_type ());
115 object_class->finalize = gl_wdgt_media_select_finalize;
117 wdgt_media_select_signals[CHANGED] =
118 g_signal_new ("changed",
119 G_OBJECT_CLASS_TYPE(object_class),
121 G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
123 gl_marshal_VOID__VOID,
126 gl_debug (DEBUG_MEDIA_SELECT, "END");
130 gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select)
132 gl_debug (DEBUG_MEDIA_SELECT, "START");
134 media_select->page_size_entry = NULL;
135 media_select->template_entry = NULL;
137 media_select->mini_preview = NULL;
139 media_select->desc_label = NULL;
140 media_select->sheet_size_label = NULL;
141 media_select->number_label = NULL;
142 media_select->label_size_label = NULL;
144 gl_debug (DEBUG_MEDIA_SELECT, "END");
148 gl_wdgt_media_select_finalize (GObject * object)
150 glWdgtMediaSelect *media_select;
151 glWdgtMediaSelectClass *class;
153 gl_debug (DEBUG_MEDIA_SELECT, "START");
155 g_return_if_fail (object != NULL);
156 g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
158 media_select = GL_WDGT_MEDIA_SELECT (object);
160 G_OBJECT_CLASS (parent_class)->finalize (object);
162 gl_debug (DEBUG_MEDIA_SELECT, "END");
166 gl_wdgt_media_select_new (void)
168 glWdgtMediaSelect *media_select;
170 gl_debug (DEBUG_MEDIA_SELECT, "START");
172 media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
174 gl_wdgt_media_select_construct (media_select);
176 gl_debug (DEBUG_MEDIA_SELECT, "END");
178 return GTK_WIDGET (media_select);
181 /*--------------------------------------------------------------------------*/
182 /* PRIVATE. Construct composite widget. */
183 /*--------------------------------------------------------------------------*/
185 gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select)
187 GtkWidget *whbox, *wvbox, *wcombo, *wvbox1, *whbox1;
189 GList *template_names, *page_sizes = NULL;
190 const gchar *page_size;
192 gl_debug (DEBUG_MEDIA_SELECT, "START");
194 page_size = gl_prefs_get_page_size ();
196 wvbox = GTK_WIDGET (media_select);
198 whbox = gtk_hbox_new (FALSE, GNOME_PAD);
199 gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, GNOME_PAD);
201 /* Page size selection control */
202 gl_debug (DEBUG_MEDIA_SELECT, "Creating page size combo...");
203 wcombo = gtk_combo_new ();
204 page_sizes = gl_template_get_page_size_list ();
205 gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), page_sizes);
206 gl_template_free_page_size_list (&page_sizes);
207 media_select->page_size_entry = GTK_COMBO (wcombo)->entry;
208 gtk_entry_set_editable (GTK_ENTRY (media_select->page_size_entry),
210 gtk_combo_set_value_in_list (GTK_COMBO(wcombo), TRUE, FALSE);
211 gtk_widget_set_size_request (media_select->page_size_entry, 100, -1);
212 gtk_entry_set_text (GTK_ENTRY (media_select->page_size_entry),
214 gtk_box_pack_start (GTK_BOX (whbox), wcombo, FALSE, FALSE, GNOME_PAD);
216 /* Actual selection control */
217 gl_debug (DEBUG_MEDIA_SELECT, "Creating template combo...");
218 gl_debug (DEBUG_MEDIA_SELECT, "page_size = %s", page_size);
219 template_names = gl_template_get_name_list (page_size);
220 media_select->template_combo = gtk_combo_new ();
221 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
223 gl_template_free_name_list (&template_names);
224 media_select->template_entry =
225 GTK_COMBO (media_select->template_combo)->entry;
226 gtk_entry_set_editable (GTK_ENTRY (media_select->template_entry),
228 gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
230 gtk_widget_set_size_request (media_select->template_entry, 400, -1);
231 gtk_box_pack_start (GTK_BOX (whbox), media_select->template_combo,
232 FALSE, FALSE, GNOME_PAD);
234 whbox = gtk_hbox_new (FALSE, GNOME_PAD);
235 gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, GNOME_PAD);
237 /* mini_preview canvas */
238 gl_debug (DEBUG_MEDIA_SELECT, "Creating mini preview...");
239 media_select->mini_preview = gl_wdgt_mini_preview_new ( WDGT_MINI_PREVIEW_HEIGHT,
240 WDGT_MINI_PREVIEW_WIDTH);
241 gtk_box_pack_start (GTK_BOX (whbox), media_select->mini_preview,
242 FALSE, FALSE, GNOME_PAD);
245 gl_debug (DEBUG_MEDIA_SELECT, "Creating label column...");
246 wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
247 gtk_box_pack_start (GTK_BOX (whbox), wvbox1, FALSE, FALSE, 0);
249 whbox1 = gtk_hbox_new (FALSE, 0);
250 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
251 gtk_box_pack_start (GTK_BOX (whbox1),
252 gtk_label_new (_("Description:")),
253 FALSE, FALSE, GNOME_PAD);
254 whbox1 = gtk_hbox_new (FALSE, 0);
255 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
256 gtk_box_pack_start (GTK_BOX (whbox1),
257 gtk_label_new (_("Page size:")),
258 FALSE, FALSE, GNOME_PAD);
259 whbox1 = gtk_hbox_new (FALSE, 0);
260 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
261 gtk_box_pack_start (GTK_BOX (whbox1),
262 gtk_label_new (_("Label size:")),
263 FALSE, FALSE, GNOME_PAD);
264 whbox1 = gtk_hbox_new (FALSE, 0);
265 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
266 gtk_box_pack_start (GTK_BOX (whbox1),
267 gtk_label_new (_("Layout:")),
268 FALSE, FALSE, GNOME_PAD);
270 /* detail widgets column */
271 gl_debug (DEBUG_MEDIA_SELECT, "Creating details column...");
272 wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
273 gtk_box_pack_start (GTK_BOX (whbox), wvbox1, FALSE, FALSE, 0);
275 whbox1 = gtk_hbox_new (FALSE, 0);
276 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
277 media_select->desc_label = gtk_label_new ("");
278 gtk_box_pack_start (GTK_BOX (whbox1), media_select->desc_label,
279 FALSE, FALSE, GNOME_PAD);
280 whbox1 = gtk_hbox_new (FALSE, 0);
281 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
282 media_select->sheet_size_label = gtk_label_new ("");
283 gtk_box_pack_start (GTK_BOX (whbox1), media_select->sheet_size_label,
284 FALSE, FALSE, GNOME_PAD);
285 whbox1 = gtk_hbox_new (FALSE, 0);
286 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
287 media_select->label_size_label = gtk_label_new ("");
288 gtk_box_pack_start (GTK_BOX (whbox1), media_select->label_size_label,
289 FALSE, FALSE, GNOME_PAD);
290 whbox1 = gtk_hbox_new (FALSE, 0);
291 gtk_box_pack_start (GTK_BOX (wvbox1), whbox1, FALSE, FALSE, 0);
292 media_select->number_label = gtk_label_new ("");
293 gtk_box_pack_start (GTK_BOX (whbox1), media_select->number_label,
294 FALSE, FALSE, GNOME_PAD);
296 /* Update mini_preview and details from default template */
298 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
299 media_select->template_entry);
301 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
303 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
304 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
306 details_update (media_select, name);
309 /* Connect signals to controls */
310 g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
311 G_CALLBACK (page_size_entry_changed_cb),
313 g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
314 G_CALLBACK (template_entry_changed_cb),
317 gl_debug (DEBUG_MEDIA_SELECT, "END");
320 /*--------------------------------------------------------------------------*/
321 /* PRIVATE. modify widget due to change in selection */
322 /*--------------------------------------------------------------------------*/
324 page_size_entry_changed_cb (GtkEntry * entry,
327 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
329 GList *template_names;
331 gl_debug (DEBUG_MEDIA_SELECT, "START");
334 /* Update template selections for new page size */
335 page_size = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
336 if ( strlen(page_size) ) {
337 gl_debug (DEBUG_MEDIA_SELECT, "page_size = \"%s\"", page_size);
338 template_names = gl_template_get_name_list (page_size);
339 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
341 gl_template_free_name_list (&template_names);
345 gl_debug (DEBUG_MEDIA_SELECT, "END");
348 /*--------------------------------------------------------------------------*/
349 /* PRIVATE. modify widget due to change in selection */
350 /*--------------------------------------------------------------------------*/
352 template_entry_changed_cb (GtkEntry * entry,
355 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
358 gl_debug (DEBUG_MEDIA_SELECT, "START");
360 /* Update mini_preview canvas & details with template */
361 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
362 name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
363 if ( strlen(name) ) {
364 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
365 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
367 gl_debug (DEBUG_MEDIA_SELECT, "m1");
368 details_update (media_select, name);
369 gl_debug (DEBUG_MEDIA_SELECT, "m2");
371 /* Emit our "changed" signal */
372 g_signal_emit (G_OBJECT (user_data),
373 wdgt_media_select_signals[CHANGED], 0);
377 gl_debug (DEBUG_MEDIA_SELECT, "END");
380 /*--------------------------------------------------------------------------*/
381 /* PRIVATE. update "details" widgets from new template. */
382 /*--------------------------------------------------------------------------*/
384 details_update (glWdgtMediaSelect * media_select,
387 glTemplate *template;
390 const gchar *units_string;
391 gdouble units_per_point;
393 gl_debug (DEBUG_MEDIA_SELECT, "START");
395 units = gl_prefs_get_units ();
396 units_string = gl_prefs_get_units_string ();
397 units_per_point = gl_prefs_get_units_per_point ();
400 template = gl_template_from_name (name);
402 gtk_label_set_text (GTK_LABEL (media_select->desc_label),
403 template->description);
405 gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
406 template->page_size);
408 text = g_strdup_printf (_("%d x %d (%d per sheet)"),
409 template->nx, template->ny,
410 template->nx * template->ny);
412 gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
415 if ( units == GL_PREFS_UNITS_INCHES ) {
418 xstr = gl_util_fraction (template->label_height
420 ystr = gl_util_fraction (template->label_width
422 text = g_strdup_printf (_("%s x %s %s"),
423 xstr, ystr, units_string);
427 text = g_strdup_printf (_("%.5g x %.5g %s"),
428 template->label_height*units_per_point,
429 template->label_width*units_per_point,
432 gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
435 gl_template_free( &template );
437 gl_debug (DEBUG_MEDIA_SELECT, "END");
440 /****************************************************************************/
441 /* query selected label template name. */
442 /****************************************************************************/
444 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
446 gl_debug (DEBUG_MEDIA_SELECT, "");
448 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
452 /****************************************************************************/
453 /* set selected label template name. */
454 /****************************************************************************/
456 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
461 gl_debug (DEBUG_MEDIA_SELECT, "START");
463 g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
464 G_CALLBACK(template_entry_changed_cb),
466 gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
468 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
469 G_CALLBACK(template_entry_changed_cb),
473 gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
474 name, strlen (name), &pos);
476 gl_debug (DEBUG_MEDIA_SELECT, "END");
479 /****************************************************************************/
480 /* query selected label template page size. */
481 /****************************************************************************/
483 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
485 gl_debug (DEBUG_MEDIA_SELECT, "");
488 gtk_editable_get_chars (GTK_EDITABLE
489 (media_select->page_size_entry), 0, -1);
492 /****************************************************************************/
493 /* set selected label template page size. */
494 /****************************************************************************/
496 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
501 gl_debug (DEBUG_MEDIA_SELECT, "START");
503 g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
504 G_CALLBACK(page_size_entry_changed_cb),
506 gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
508 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
509 G_CALLBACK(page_size_entry_changed_cb),
513 gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
514 page_size, strlen (page_size), &pos);
516 gl_debug (DEBUG_MEDIA_SELECT, "END");