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 (gl_hig_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 = g_type_class_peek_parent (class);
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, *wlabel;
189 GtkSizeGroup *label_size_group;
191 GList *template_names, *page_sizes = NULL;
192 const gchar *page_size;
194 gl_debug (DEBUG_MEDIA_SELECT, "START");
196 page_size = gl_prefs_get_page_size ();
198 wvbox = GTK_WIDGET (media_select);
200 whbox = gl_hig_hbox_new ();
201 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
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 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wcombo);
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 media_select->template_entry =
226 GTK_COMBO (media_select->template_combo)->entry;
227 gtk_entry_set_editable (GTK_ENTRY (media_select->template_entry),
229 gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
231 gtk_widget_set_size_request (media_select->template_entry, 400, -1);
232 gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
233 template_names->data);
234 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
235 media_select->template_combo);
236 gl_template_free_name_list (&template_names);
238 whbox = gl_hig_hbox_new ();
239 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
241 /* mini_preview canvas */
242 gl_debug (DEBUG_MEDIA_SELECT, "Creating mini preview...");
243 media_select->mini_preview = gl_wdgt_mini_preview_new ( WDGT_MINI_PREVIEW_HEIGHT,
244 WDGT_MINI_PREVIEW_WIDTH);
245 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
246 media_select->mini_preview);
248 /* ---- Information area ---- */
249 wvbox1 = gl_hig_vbox_new (GL_HIG_VBOX_INNER);
250 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wvbox1);
251 label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
254 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), gtk_label_new (""));
256 /* Description line */
257 whbox1 = gl_hig_hbox_new ();
258 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
259 wlabel = gtk_label_new (_("Description:"));
260 gtk_size_group_add_widget (label_size_group, wlabel);
261 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
262 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
263 media_select->desc_label = gtk_label_new ("");
264 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), media_select->desc_label);
267 whbox1 = gl_hig_hbox_new ();
268 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
269 wlabel = gtk_label_new (_("Page size:"));
270 gtk_size_group_add_widget (label_size_group, wlabel);
271 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
272 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
273 media_select->sheet_size_label = gtk_label_new ("");
274 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
275 media_select->sheet_size_label);
277 /* Label size line */
278 whbox1 = gl_hig_hbox_new ();
279 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
280 wlabel = gtk_label_new (_("Label size:"));
281 gtk_size_group_add_widget (label_size_group, wlabel);
282 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
283 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
284 media_select->label_size_label = gtk_label_new ("");
285 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
286 media_select->label_size_label);
289 whbox1 = gl_hig_hbox_new ();
290 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
291 wlabel = gtk_label_new (_("Layout:"));
292 gtk_size_group_add_widget (label_size_group, wlabel);
293 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
294 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
295 media_select->number_label = gtk_label_new ("");
296 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
297 media_select->number_label);
299 /* Update mini_preview and details from default template */
301 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
302 media_select->template_entry);
304 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
306 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
307 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
309 details_update (media_select, name);
312 /* Connect signals to controls */
313 g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
314 G_CALLBACK (page_size_entry_changed_cb),
316 g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
317 G_CALLBACK (template_entry_changed_cb),
320 gl_debug (DEBUG_MEDIA_SELECT, "END");
323 /*--------------------------------------------------------------------------*/
324 /* PRIVATE. modify widget due to change in selection */
325 /*--------------------------------------------------------------------------*/
327 page_size_entry_changed_cb (GtkEntry * entry,
330 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
332 GList *template_names;
334 gl_debug (DEBUG_MEDIA_SELECT, "START");
337 /* Update template selections for new page size */
338 page_size = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
339 if ( strlen(page_size) ) {
340 gl_debug (DEBUG_MEDIA_SELECT, "page_size = \"%s\"", page_size);
341 template_names = gl_template_get_name_list (page_size);
342 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
344 gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
345 template_names->data);
346 gl_template_free_name_list (&template_names);
350 gl_debug (DEBUG_MEDIA_SELECT, "END");
353 /*--------------------------------------------------------------------------*/
354 /* PRIVATE. modify widget due to change in selection */
355 /*--------------------------------------------------------------------------*/
357 template_entry_changed_cb (GtkEntry * entry,
360 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
363 gl_debug (DEBUG_MEDIA_SELECT, "START");
365 /* Update mini_preview canvas & details with template */
366 gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
367 name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
368 if ( strlen(name) ) {
369 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
370 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
372 gl_debug (DEBUG_MEDIA_SELECT, "m1");
373 details_update (media_select, name);
374 gl_debug (DEBUG_MEDIA_SELECT, "m2");
376 /* Emit our "changed" signal */
377 g_signal_emit (G_OBJECT (user_data),
378 wdgt_media_select_signals[CHANGED], 0);
382 gl_debug (DEBUG_MEDIA_SELECT, "END");
385 /*--------------------------------------------------------------------------*/
386 /* PRIVATE. update "details" widgets from new template. */
387 /*--------------------------------------------------------------------------*/
389 details_update (glWdgtMediaSelect * media_select,
392 glTemplate *template;
395 const gchar *units_string;
396 gdouble units_per_point;
398 gl_debug (DEBUG_MEDIA_SELECT, "START");
400 units = gl_prefs_get_units ();
401 units_string = gl_prefs_get_units_string ();
402 units_per_point = gl_prefs_get_units_per_point ();
405 template = gl_template_from_name (name);
407 gtk_label_set_text (GTK_LABEL (media_select->desc_label),
408 template->description);
410 gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
411 template->page_size);
413 text = gl_template_get_layout_desc (template);
414 gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
417 text = gl_template_get_label_size_desc (template);
418 gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
421 gl_template_free( &template );
423 gl_debug (DEBUG_MEDIA_SELECT, "END");
426 /****************************************************************************/
427 /* query selected label template name. */
428 /****************************************************************************/
430 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
432 gl_debug (DEBUG_MEDIA_SELECT, "");
434 gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
438 /****************************************************************************/
439 /* set selected label template name. */
440 /****************************************************************************/
442 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
447 gl_debug (DEBUG_MEDIA_SELECT, "START");
449 g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
450 G_CALLBACK(template_entry_changed_cb),
452 gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
454 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
455 G_CALLBACK(template_entry_changed_cb),
459 gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
460 name, strlen (name), &pos);
462 gl_debug (DEBUG_MEDIA_SELECT, "END");
465 /****************************************************************************/
466 /* query selected label template page size. */
467 /****************************************************************************/
469 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
471 gl_debug (DEBUG_MEDIA_SELECT, "");
474 gtk_editable_get_chars (GTK_EDITABLE
475 (media_select->page_size_entry), 0, -1);
478 /****************************************************************************/
479 /* set selected label template page size. */
480 /****************************************************************************/
482 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
487 gl_debug (DEBUG_MEDIA_SELECT, "START");
489 g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
490 G_CALLBACK(page_size_entry_changed_cb),
492 gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
494 g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
495 G_CALLBACK(page_size_entry_changed_cb),
499 gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
500 page_size, strlen (page_size), &pos);
502 gl_debug (DEBUG_MEDIA_SELECT, "END");