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),
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:")),
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:")),
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:")),
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:")),
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);
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),
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,
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,
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,
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,
308 /* Update mini_preview and details from default template */
310 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
311 media_select->template_entry);
313 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
315 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
316 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
318 details_update (media_select, name);
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),
325 g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
326 G_CALLBACK (template_entry_changed_cb),
329 gl_debug (DEBUG_MEDIA_SELECT, "END");
332 /*--------------------------------------------------------------------------*/
333 /* PRIVATE. modify widget due to change in selection */
334 /*--------------------------------------------------------------------------*/
336 page_size_entry_changed_cb (GtkEntry * entry,
339 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
341 GList *template_names;
343 gl_debug (DEBUG_MEDIA_SELECT, "START");
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),
353 gl_template_free_name_list (&template_names);
357 gl_debug (DEBUG_MEDIA_SELECT, "END");
360 /*--------------------------------------------------------------------------*/
361 /* PRIVATE. modify widget due to change in selection */
362 /*--------------------------------------------------------------------------*/
364 template_entry_changed_cb (GtkEntry * entry,
367 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
370 gl_debug (DEBUG_MEDIA_SELECT, "START");
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),
379 gl_debug (DEBUG_MEDIA_SELECT, "m1");
380 details_update (media_select, name);
381 gl_debug (DEBUG_MEDIA_SELECT, "m2");
383 /* Emit our "changed" signal */
384 g_signal_emit (G_OBJECT (user_data),
385 wdgt_media_select_signals[CHANGED], 0);
389 gl_debug (DEBUG_MEDIA_SELECT, "END");
392 /*--------------------------------------------------------------------------*/
393 /* PRIVATE. update "details" widgets from new template. */
394 /*--------------------------------------------------------------------------*/
396 details_update (glWdgtMediaSelect * media_select,
399 glTemplate *template;
402 const gchar *units_string;
403 gdouble units_per_point;
405 gl_debug (DEBUG_MEDIA_SELECT, "START");
407 units = gl_prefs_get_units ();
408 units_string = gl_prefs_get_units_string ();
409 units_per_point = gl_prefs_get_units_per_point ();
412 template = gl_template_from_name (name);
414 gtk_label_set_text (GTK_LABEL (media_select->desc_label),
415 template->description);
417 gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
418 template->page_size);
420 text = gl_template_get_layout_desc (template);
421 gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
424 text = gl_template_get_label_size_desc (template);
425 gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
428 gl_template_free( &template );
430 gl_debug (DEBUG_MEDIA_SELECT, "END");
433 /****************************************************************************/
434 /* query selected label template name. */
435 /****************************************************************************/
437 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
439 gl_debug (DEBUG_MEDIA_SELECT, "");
441 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
445 /****************************************************************************/
446 /* set selected label template name. */
447 /****************************************************************************/
449 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
454 gl_debug (DEBUG_MEDIA_SELECT, "START");
456 g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
457 G_CALLBACK(template_entry_changed_cb),
459 gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
461 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
462 G_CALLBACK(template_entry_changed_cb),
466 gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
467 name, strlen (name), &pos);
469 gl_debug (DEBUG_MEDIA_SELECT, "END");
472 /****************************************************************************/
473 /* query selected label template page size. */
474 /****************************************************************************/
476 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
478 gl_debug (DEBUG_MEDIA_SELECT, "");
481 gtk_editable_get_chars (GTK_EDITABLE
482 (media_select->page_size_entry), 0, -1);
485 /****************************************************************************/
486 /* set selected label template page size. */
487 /****************************************************************************/
489 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
494 gl_debug (DEBUG_MEDIA_SELECT, "START");
496 g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
497 G_CALLBACK(page_size_entry_changed_cb),
499 gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
501 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
502 G_CALLBACK(page_size_entry_changed_cb),
506 gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
507 page_size, strlen (page_size), &pos);
509 gl_debug (DEBUG_MEDIA_SELECT, "END");