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"
28 #include "wdgt-mini-preview.h"
35 #define WDGT_MINI_PREVIEW_WIDTH 160
36 #define WDGT_MINI_PREVIEW_HEIGHT 200
38 /*===========================================*/
40 /*===========================================*/
47 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
49 /*===========================================*/
51 /*===========================================*/
53 static GObjectClass *parent_class;
55 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
57 /*===========================================*/
58 /* Local function prototypes */
59 /*===========================================*/
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);
65 static void gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select);
67 static void page_size_entry_changed_cb (GtkEntry * entry,
69 static void template_entry_changed_cb (GtkEntry * entry,
72 static void details_update (glWdgtMediaSelect * media_select,
75 /****************************************************************************/
76 /* Boilerplate Object stuff. */
77 /****************************************************************************/
79 gl_wdgt_media_select_get_type (void)
81 static guint wdgt_media_select_type = 0;
83 if (!wdgt_media_select_type) {
84 GTypeInfo wdgt_media_select_info = {
85 sizeof (glWdgtMediaSelectClass),
88 (GClassInitFunc) gl_wdgt_media_select_class_init,
91 sizeof (glWdgtMediaSelect),
93 (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
96 wdgt_media_select_type =
97 g_type_register_static (gtk_vbox_get_type (),
99 &wdgt_media_select_info, 0);
102 return wdgt_media_select_type;
106 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass * class)
108 GObjectClass *object_class;
110 gl_debug (DEBUG_MEDIA_SELECT, "START");
112 object_class = (GObjectClass *) class;
114 parent_class = gtk_type_class (gtk_vbox_get_type ());
116 object_class->finalize = gl_wdgt_media_select_finalize;
118 wdgt_media_select_signals[CHANGED] =
119 g_signal_new ("changed",
120 G_OBJECT_CLASS_TYPE(object_class),
122 G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
124 gl_marshal_VOID__VOID,
127 gl_debug (DEBUG_MEDIA_SELECT, "END");
131 gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select)
133 gl_debug (DEBUG_MEDIA_SELECT, "START");
135 media_select->page_size_entry = NULL;
136 media_select->template_entry = NULL;
138 media_select->mini_preview = NULL;
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;
145 gl_debug (DEBUG_MEDIA_SELECT, "END");
149 gl_wdgt_media_select_finalize (GObject * object)
151 glWdgtMediaSelect *media_select;
152 glWdgtMediaSelectClass *class;
154 gl_debug (DEBUG_MEDIA_SELECT, "START");
156 g_return_if_fail (object != NULL);
157 g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
159 media_select = GL_WDGT_MEDIA_SELECT (object);
161 G_OBJECT_CLASS (parent_class)->finalize (object);
163 gl_debug (DEBUG_MEDIA_SELECT, "END");
167 gl_wdgt_media_select_new (void)
169 glWdgtMediaSelect *media_select;
171 gl_debug (DEBUG_MEDIA_SELECT, "START");
173 media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
175 gl_wdgt_media_select_construct (media_select);
177 gl_debug (DEBUG_MEDIA_SELECT, "END");
179 return GTK_WIDGET (media_select);
182 /*--------------------------------------------------------------------------*/
183 /* PRIVATE. Construct composite widget. */
184 /*--------------------------------------------------------------------------*/
186 gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select)
188 GtkWidget *whbox, *wvbox, *wcombo, *wvbox1, *whbox1;
190 GList *template_names, *page_sizes = NULL;
191 const gchar *page_size;
193 gl_debug (DEBUG_MEDIA_SELECT, "START");
195 page_size = gl_prefs_get_page_size ();
197 wvbox = GTK_WIDGET (media_select);
198 gtk_box_set_spacing (GTK_BOX(wvbox), GL_HIG_SPACING);
200 whbox = gtk_hbox_new (FALSE, GL_HIG_SPACING);
201 gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, 0);
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),
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),
216 gtk_box_pack_start (GTK_BOX (whbox), wcombo, FALSE, FALSE, 0);
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),
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),
230 gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
232 gtk_widget_set_size_request (media_select->template_entry, 400, -1);
233 gtk_box_pack_start (GTK_BOX (whbox), media_select->template_combo,
236 whbox = gtk_hbox_new (FALSE, GL_HIG_SPACING);
237 gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, TRUE, 0);
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,
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);
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:")),
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:")),
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:")),
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:")),
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);
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,
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,
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,
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,
298 /* Update mini_preview and details from default template */
300 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
301 media_select->template_entry);
303 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
305 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
306 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
308 details_update (media_select, name);
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),
315 g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
316 G_CALLBACK (template_entry_changed_cb),
319 gl_debug (DEBUG_MEDIA_SELECT, "END");
322 /*--------------------------------------------------------------------------*/
323 /* PRIVATE. modify widget due to change in selection */
324 /*--------------------------------------------------------------------------*/
326 page_size_entry_changed_cb (GtkEntry * entry,
329 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
331 GList *template_names;
333 gl_debug (DEBUG_MEDIA_SELECT, "START");
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),
343 gl_template_free_name_list (&template_names);
347 gl_debug (DEBUG_MEDIA_SELECT, "END");
350 /*--------------------------------------------------------------------------*/
351 /* PRIVATE. modify widget due to change in selection */
352 /*--------------------------------------------------------------------------*/
354 template_entry_changed_cb (GtkEntry * entry,
357 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
360 gl_debug (DEBUG_MEDIA_SELECT, "START");
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),
369 gl_debug (DEBUG_MEDIA_SELECT, "m1");
370 details_update (media_select, name);
371 gl_debug (DEBUG_MEDIA_SELECT, "m2");
373 /* Emit our "changed" signal */
374 g_signal_emit (G_OBJECT (user_data),
375 wdgt_media_select_signals[CHANGED], 0);
379 gl_debug (DEBUG_MEDIA_SELECT, "END");
382 /*--------------------------------------------------------------------------*/
383 /* PRIVATE. update "details" widgets from new template. */
384 /*--------------------------------------------------------------------------*/
386 details_update (glWdgtMediaSelect * media_select,
389 glTemplate *template;
392 const gchar *units_string;
393 gdouble units_per_point;
395 gl_debug (DEBUG_MEDIA_SELECT, "START");
397 units = gl_prefs_get_units ();
398 units_string = gl_prefs_get_units_string ();
399 units_per_point = gl_prefs_get_units_per_point ();
402 template = gl_template_from_name (name);
404 gtk_label_set_text (GTK_LABEL (media_select->desc_label),
405 template->description);
407 gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
408 template->page_size);
410 text = gl_template_get_layout_desc (template);
411 gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
414 text = gl_template_get_label_size_desc (template);
415 gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
418 gl_template_free( &template );
420 gl_debug (DEBUG_MEDIA_SELECT, "END");
423 /****************************************************************************/
424 /* query selected label template name. */
425 /****************************************************************************/
427 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
429 gl_debug (DEBUG_MEDIA_SELECT, "");
431 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
435 /****************************************************************************/
436 /* set selected label template name. */
437 /****************************************************************************/
439 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
444 gl_debug (DEBUG_MEDIA_SELECT, "START");
446 g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
447 G_CALLBACK(template_entry_changed_cb),
449 gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
451 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
452 G_CALLBACK(template_entry_changed_cb),
456 gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
457 name, strlen (name), &pos);
459 gl_debug (DEBUG_MEDIA_SELECT, "END");
462 /****************************************************************************/
463 /* query selected label template page size. */
464 /****************************************************************************/
466 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
468 gl_debug (DEBUG_MEDIA_SELECT, "");
471 gtk_editable_get_chars (GTK_EDITABLE
472 (media_select->page_size_entry), 0, -1);
475 /****************************************************************************/
476 /* set selected label template page size. */
477 /****************************************************************************/
479 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
484 gl_debug (DEBUG_MEDIA_SELECT, "START");
486 g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
487 G_CALLBACK(page_size_entry_changed_cb),
489 gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
491 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
492 G_CALLBACK(page_size_entry_changed_cb),
496 gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
497 page_size, strlen (page_size), &pos);
499 gl_debug (DEBUG_MEDIA_SELECT, "END");