2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * prefs-dialog.c: Preferences dialog 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
24 #include <libgnome/libgnome.h>
25 #include <libgnomeui/libgnomeui.h>
27 #include "prefs-dialog.h"
29 #include "wdgt-line.h"
30 #include "wdgt-fill.h"
31 #include "wdgt-text-props.h"
34 /*========================================================*/
35 /* Private macros and constants. */
36 /*========================================================*/
38 #define US_LETTER "US Letter"
41 /*========================================================*/
43 /*========================================================*/
45 struct _glPrefsDialogPrivate
47 GtkWidget* categories_tree;
51 GtkTreeModel *categories_tree_model;
54 GtkWidget *units_points_radio;
55 GtkWidget *units_inches_radio;
56 GtkWidget *units_mm_radio;
59 GtkWidget *page_size_us_letter_radio;
60 GtkWidget *page_size_a4_radio;
62 /* Default text properties */
65 /* Default line properties */
68 /* Default fill properties */
72 /*========================================================*/
73 /* Private globals. */
74 /*========================================================*/
76 static glHigDialogClass* parent_class = NULL;
78 /*========================================================*/
79 /* Private function prototypes. */
80 /*========================================================*/
82 static void gl_prefs_dialog_class_init (glPrefsDialogClass *klass);
83 static void gl_prefs_dialog_init (glPrefsDialog *dlg);
84 static void gl_prefs_dialog_finalize (GObject *object);
85 static void gl_prefs_dialog_construct (glPrefsDialog *dlg);
87 static void response_cb (glPrefsDialog *dialog,
91 static GtkWidget *locale_page (glPrefsDialog *dlg);
92 static GtkWidget *object_page (glPrefsDialog *dlg);
94 static update_locale_page_from_prefs (glPrefsDialog *dlg);
95 static update_object_page_from_prefs (glPrefsDialog *dlg);
97 static update_prefs_from_locale_page (glPrefsDialog *dlg);
98 static update_prefs_from_object_page (glPrefsDialog *dlg);
101 /*****************************************************************************/
102 /* Boilerplate object stuff. */
103 /*****************************************************************************/
105 gl_prefs_dialog_get_type (void)
107 static GType dialog_type = 0;
111 static const GTypeInfo dialog_info =
113 sizeof (glPrefsDialogClass),
114 NULL, /* base_init */
115 NULL, /* base_finalize */
116 (GClassInitFunc) gl_prefs_dialog_class_init,
117 NULL, /* class_finalize */
118 NULL, /* class_data */
119 sizeof (glPrefsDialog),
121 (GInstanceInitFunc) gl_prefs_dialog_init
124 dialog_type = g_type_register_static (GL_TYPE_HIG_DIALOG,
134 gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
136 GObjectClass *object_class = G_OBJECT_CLASS (klass);
138 gl_debug (DEBUG_PREFS, "");
140 parent_class = g_type_class_peek_parent (klass);
142 object_class->finalize = gl_prefs_dialog_finalize;
146 gl_prefs_dialog_init (glPrefsDialog *dlg)
148 gl_debug (DEBUG_PREFS, "");
150 dlg->private = g_new0 (glPrefsDialogPrivate, 1);
154 gl_prefs_dialog_finalize (GObject *object)
158 gl_debug (DEBUG_PREFS, "");
160 g_return_if_fail (object != NULL);
162 dlg = GL_PREFS_DIALOG (object);
164 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
165 g_return_if_fail (dlg->private != NULL);
167 G_OBJECT_CLASS (parent_class)->finalize (object);
169 g_free (dlg->private);
172 /*****************************************************************************/
173 /* NEW preferences dialog. */
174 /*****************************************************************************/
176 gl_prefs_dialog_new (GtkWindow *parent)
180 gl_debug (DEBUG_PREFS, "");
182 dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
185 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
187 gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
192 /*---------------------------------------------------------------------------*/
193 /* PRIVATE. Construct composite widget. */
194 /*---------------------------------------------------------------------------*/
196 gl_prefs_dialog_construct (glPrefsDialog *dlg)
198 GtkWidget *notebook, *wlabel, *wvbox, *wvbox1, *whbox, *wframe;
199 GSList *radio_group = NULL;
201 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
202 g_return_if_fail (dlg->private != NULL);
204 gtk_dialog_add_button (GTK_DIALOG(dlg),
205 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
207 gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
209 g_signal_connect(G_OBJECT (dlg), "response",
210 G_CALLBACK (response_cb), NULL);
212 notebook = gtk_notebook_new ();
213 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
215 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
217 gtk_label_new (_("Locale")));
219 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
221 gtk_label_new (_("Object defaults")));
223 update_locale_page_from_prefs (dlg);
224 update_object_page_from_prefs (dlg);
226 gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);
228 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
229 gtk_window_set_title (GTK_WINDOW (dlg), _("gLabels Preferences"));
230 gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
233 /*---------------------------------------------------------------------------*/
234 /* PRIVATE. "Response" callback. */
235 /*---------------------------------------------------------------------------*/
237 response_cb (glPrefsDialog *dlg,
241 gl_debug (DEBUG_VIEW, "START");
243 g_return_if_fail(dlg != NULL);
244 g_return_if_fail(GTK_IS_DIALOG(dlg));
247 case GTK_RESPONSE_CLOSE:
248 gtk_widget_hide (GTK_WIDGET(dlg));
250 case GTK_RESPONSE_DELETE_EVENT:
253 g_print ("response = %d", response);
254 g_assert_not_reached ();
257 gl_debug (DEBUG_VIEW, "END");
260 /*--------------------------------------------------------------------------*/
261 /* PRIVATE. Build Locale Properties Notebook Tab */
262 /*--------------------------------------------------------------------------*/
264 locale_page (glPrefsDialog *dlg)
266 GtkWidget *wlabel, *wvbox, *wframe;
267 GSList *radio_group = NULL;
269 wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
271 wlabel = gtk_label_new (_("Select locale specific behavior."));
272 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
273 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
275 /* ----- Display Units Frame ------------------------------------ */
276 wframe = gl_hig_category_new (_("Display units"));
277 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
281 dlg->private->units_points_radio =
282 gtk_radio_button_new_with_label (radio_group, _("Points"));
284 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
285 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
286 dlg->private->units_points_radio);
288 dlg->private->units_inches_radio =
289 gtk_radio_button_new_with_label (radio_group, _("Inches"));
291 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
292 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
293 dlg->private->units_inches_radio);
295 dlg->private->units_mm_radio =
296 gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
298 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
299 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
300 dlg->private->units_mm_radio);
302 /* ----- Page Size Frame ------------------------------------ */
303 wframe = gl_hig_category_new (_("Default page size"));
304 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
308 dlg->private->page_size_us_letter_radio =
309 gtk_radio_button_new_with_label (radio_group, US_LETTER);
311 gtk_radio_button_get_group (GTK_RADIO_BUTTON
312 (dlg->private->page_size_us_letter_radio));
313 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
314 dlg->private->page_size_us_letter_radio);
316 dlg->private->page_size_a4_radio =
317 gtk_radio_button_new_with_label (radio_group, A4);
319 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
320 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
321 dlg->private->page_size_a4_radio);
323 g_signal_connect_swapped (
324 G_OBJECT(dlg->private->units_points_radio),
325 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
326 g_signal_connect_swapped (
327 G_OBJECT(dlg->private->units_inches_radio),
328 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
329 g_signal_connect_swapped (
330 G_OBJECT(dlg->private->units_mm_radio),
331 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
332 g_signal_connect_swapped (
333 G_OBJECT(dlg->private->page_size_us_letter_radio),
334 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
335 g_signal_connect_swapped (
336 G_OBJECT(dlg->private->page_size_a4_radio),
337 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
342 /*--------------------------------------------------------------------------*/
343 /* PRIVATE. Build Default Object Properties Notebook Tab */
344 /*--------------------------------------------------------------------------*/
346 object_page (glPrefsDialog *dlg)
348 GtkWidget *wlabel, *wvbox, *wframe;
349 GtkSizeGroup *label_size_group;
351 wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
352 label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
354 wlabel = gtk_label_new (_("Select default properties for new objects."));
355 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
356 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
358 /* ------ text props entry ------ */
359 wframe = gl_hig_category_new (_("Text"));
360 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
361 dlg->private->text = gl_wdgt_text_props_new ();
362 gl_wdgt_text_props_set_label_size_group (GL_WDGT_TEXT_PROPS(dlg->private->text),
364 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
367 /* ------ Line box ------ */
368 wframe = gl_hig_category_new (_("Line"));
369 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
370 dlg->private->line = gl_wdgt_line_new ();
371 gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(dlg->private->line),
373 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
376 /* ------ Fill box ------ */
377 wframe = gl_hig_category_new (_("Fill"));
378 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
379 dlg->private->fill = gl_wdgt_fill_new ();
380 gl_wdgt_fill_set_label_size_group (GL_WDGT_FILL(dlg->private->fill),
382 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
385 g_signal_connect_swapped (G_OBJECT(dlg->private->text),
387 G_CALLBACK(update_prefs_from_object_page),
389 g_signal_connect_swapped (G_OBJECT(dlg->private->line),
391 G_CALLBACK(update_prefs_from_object_page),
393 g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
395 G_CALLBACK(update_prefs_from_object_page),
401 /*--------------------------------------------------------------------------*/
402 /* PRIVATE. Update locale page widgets from current prefs. */
403 /*--------------------------------------------------------------------------*/
404 static update_locale_page_from_prefs (glPrefsDialog *dlg)
406 g_signal_handlers_block_by_func (
407 G_OBJECT(dlg->private->units_points_radio),
408 G_CALLBACK(update_prefs_from_locale_page), dlg);
409 g_signal_handlers_block_by_func (
410 G_OBJECT(dlg->private->units_inches_radio),
411 G_CALLBACK(update_prefs_from_locale_page), dlg);
412 g_signal_handlers_block_by_func (
413 G_OBJECT(dlg->private->units_mm_radio),
414 G_CALLBACK(update_prefs_from_locale_page), dlg);
415 g_signal_handlers_block_by_func (
416 G_OBJECT(dlg->private->page_size_us_letter_radio),
417 G_CALLBACK(update_prefs_from_locale_page), dlg);
418 g_signal_handlers_block_by_func (
419 G_OBJECT(dlg->private->page_size_a4_radio),
420 G_CALLBACK(update_prefs_from_locale_page), dlg);
422 switch (gl_prefs->units) {
423 case GL_PREFS_UNITS_PTS:
424 gtk_toggle_button_set_active (
425 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
428 case GL_PREFS_UNITS_INCHES:
429 gtk_toggle_button_set_active (
430 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
433 case GL_PREFS_UNITS_MM:
434 gtk_toggle_button_set_active (
435 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
439 g_warning ("Illegal units"); /* Should not happen */
443 if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
444 gtk_toggle_button_set_active (
445 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
447 } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
448 gtk_toggle_button_set_active (
449 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
452 g_warning ("Unknown default page size"); /* Shouldn't happen */
455 g_signal_handlers_unblock_by_func (
456 G_OBJECT(dlg->private->units_points_radio),
457 G_CALLBACK(update_prefs_from_locale_page), dlg);
458 g_signal_handlers_unblock_by_func (
459 G_OBJECT(dlg->private->units_inches_radio),
460 G_CALLBACK(update_prefs_from_locale_page), dlg);
461 g_signal_handlers_unblock_by_func (
462 G_OBJECT(dlg->private->units_mm_radio),
463 G_CALLBACK(update_prefs_from_locale_page), dlg);
464 g_signal_handlers_unblock_by_func (
465 G_OBJECT(dlg->private->page_size_us_letter_radio),
466 G_CALLBACK(update_prefs_from_locale_page), dlg);
467 g_signal_handlers_unblock_by_func (
468 G_OBJECT(dlg->private->page_size_a4_radio),
469 G_CALLBACK(update_prefs_from_locale_page), dlg);
472 /*--------------------------------------------------------------------------*/
473 /* PRIVATE. Update object page widgets from current prefs. */
474 /*--------------------------------------------------------------------------*/
475 static update_object_page_from_prefs (glPrefsDialog *dlg)
477 g_signal_handlers_block_by_func (
478 G_OBJECT(dlg->private->text),
479 G_CALLBACK(update_prefs_from_object_page), dlg);
480 g_signal_handlers_block_by_func (
481 G_OBJECT(dlg->private->line),
482 G_CALLBACK(update_prefs_from_object_page), dlg);
483 g_signal_handlers_block_by_func (
484 G_OBJECT(dlg->private->fill),
485 G_CALLBACK(update_prefs_from_object_page), dlg);
487 gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
488 gl_prefs->default_font_family,
489 gl_prefs->default_font_size,
490 gl_prefs->default_font_weight,
491 gl_prefs->default_font_italic_flag,
492 gl_prefs->default_text_color,
493 gl_prefs->default_text_alignment);
495 gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
496 gl_prefs->default_line_width,
497 gl_prefs->default_line_color);
499 gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
500 gl_prefs->default_fill_color);
502 g_signal_handlers_unblock_by_func (
503 G_OBJECT(dlg->private->text),
504 G_CALLBACK(update_prefs_from_object_page), dlg);
505 g_signal_handlers_unblock_by_func (
506 G_OBJECT(dlg->private->line),
507 G_CALLBACK(update_prefs_from_object_page), dlg);
508 g_signal_handlers_unblock_by_func (
509 G_OBJECT(dlg->private->fill),
510 G_CALLBACK(update_prefs_from_object_page), dlg);
513 /*--------------------------------------------------------------------------*/
514 /* PRIVATE. Update prefs from current state of locale page widgets. */
515 /*--------------------------------------------------------------------------*/
516 static update_prefs_from_locale_page (glPrefsDialog *dlg)
518 if (gtk_toggle_button_get_active (
519 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio))) {
520 gl_prefs->units = GL_PREFS_UNITS_PTS;
522 if (gtk_toggle_button_get_active (
523 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio))) {
524 gl_prefs->units = GL_PREFS_UNITS_INCHES;
526 if (gtk_toggle_button_get_active (
527 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio))) {
528 gl_prefs->units = GL_PREFS_UNITS_MM;
531 if (gtk_toggle_button_get_active (
532 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio))) {
533 gl_prefs->default_page_size = US_LETTER;
535 if (gtk_toggle_button_get_active (
536 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio))) {
537 gl_prefs->default_page_size = A4;
540 gl_prefs_save_settings ();
543 /*--------------------------------------------------------------------------*/
544 /* PRIVATE. Update prefs from current state of object page widgets. */
545 /*--------------------------------------------------------------------------*/
546 static update_prefs_from_object_page (glPrefsDialog *dlg)
548 gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
549 &gl_prefs->default_font_family,
550 &gl_prefs->default_font_size,
551 &gl_prefs->default_font_weight,
552 &gl_prefs->default_font_italic_flag,
553 &gl_prefs->default_text_color,
554 &gl_prefs->default_text_alignment);
556 gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
557 &gl_prefs->default_line_width,
558 &gl_prefs->default_line_color);
560 gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
561 &gl_prefs->default_fill_color);
563 gl_prefs_save_settings ();