]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
2008-10-19 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / prefs-dialog.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  prefs-dialog.c:  Preferences dialog module
7  *
8  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "prefs-dialog.h"
27
28 #include <glib/gi18n.h>
29 #include <gtk/gtkbuilder.h>
30 #include <gtk/gtktogglebutton.h>
31 #include <gtk/gtkstock.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtkspinbutton.h>
34
35 #include "prefs.h"
36 #include "hig.h"
37 #include "color-combo.h"
38 #include "color.h"
39 #include "util.h"
40
41 #include "debug.h"
42
43 /*========================================================*/
44 /* Private macros and constants.                          */
45 /*========================================================*/
46
47 #define US_LETTER_ID "US-Letter"
48 #define A4_ID        "A4"
49
50 /*========================================================*/
51 /* Private types.                                         */
52 /*========================================================*/
53
54 struct _glPrefsDialogPrivate
55 {
56         GtkBuilder      *gui;
57
58         /* Units properties */
59         GtkWidget       *units_points_radio;
60         GtkWidget       *units_inches_radio;
61         GtkWidget       *units_mm_radio;
62
63         /* Page size properties */
64         GtkWidget       *page_size_us_letter_radio;
65         GtkWidget       *page_size_a4_radio;
66
67         /* Default text properties */
68         GtkWidget       *text_family_combo;
69         GtkWidget       *text_size_spin;
70         GtkWidget       *text_bold_toggle;
71         GtkWidget       *text_italic_toggle;
72         GtkWidget       *text_color_hbox;
73         GtkWidget       *text_color_combo;
74         GtkWidget       *text_left_toggle;
75         GtkWidget       *text_center_toggle;
76         GtkWidget       *text_right_toggle;
77         GtkWidget       *text_line_spacing_spin;
78
79         /* Default line properties */
80         GtkWidget       *line_width_spin;
81         GtkWidget       *line_color_hbox;
82         GtkWidget       *line_color_combo;
83
84         /* Default fill properties */
85         GtkWidget       *fill_color_hbox;
86         GtkWidget       *fill_color_combo;
87
88         /* Prevent recursion */
89         gboolean    stop_signals;
90 };
91
92 /*========================================================*/
93 /* Private globals.                                       */
94 /*========================================================*/
95
96
97 /*========================================================*/
98 /* Private function prototypes.                           */
99 /*========================================================*/
100
101 static void gl_prefs_dialog_finalize      (GObject            *object);
102 static void gl_prefs_dialog_construct     (glPrefsDialog      *dialog);
103
104 static void response_cb                   (glPrefsDialog      *dialog,
105                                            gint                response,
106                                            gpointer            user_data);
107
108 static void construct_locale_page         (glPrefsDialog      *dialog);
109 static void construct_object_page         (glPrefsDialog      *dialog);
110
111 static void align_toggle_cb               (GtkToggleButton    *toggle,
112                                            glPrefsDialog      *dialog);
113                                                                                 
114 static void update_locale_page_from_prefs (glPrefsDialog      *dialog);
115 static void update_object_page_from_prefs (glPrefsDialog      *dialog);
116
117 static void update_prefs_from_locale_page (glPrefsDialog      *dialog);
118 static void update_prefs_from_object_page (glPrefsDialog      *dialog);
119
120 \f
121 /*****************************************************************************/
122 /* Boilerplate object stuff.                                                 */
123 /*****************************************************************************/
124 G_DEFINE_TYPE (glPrefsDialog, gl_prefs_dialog, GTK_TYPE_DIALOG);
125
126 static void
127 gl_prefs_dialog_class_init (glPrefsDialogClass *class)
128 {
129         GObjectClass *object_class = G_OBJECT_CLASS (class);
130
131         gl_debug (DEBUG_PREFS, "");
132         
133         gl_prefs_dialog_parent_class = g_type_class_peek_parent (class);
134
135         object_class->finalize = gl_prefs_dialog_finalize;      
136 }
137
138 static void
139 gl_prefs_dialog_init (glPrefsDialog *dialog)
140 {
141         GError *error = NULL;
142
143         gl_debug (DEBUG_PREFS, "START");
144
145         dialog->priv = g_new0 (glPrefsDialogPrivate, 1);
146
147         dialog->priv->gui = gtk_builder_new ();
148         gtk_builder_add_from_file (dialog->priv->gui,
149                                    GLABELS_BUILDER_DIR "prefs-dialog.builder",
150                                    &error);
151         if (error) {
152                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
153                 g_error_free (error);
154                 return;
155         }
156
157         gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2);
158
159         gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
160         gtk_dialog_add_button (GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
161         gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
162
163         g_signal_connect(G_OBJECT (dialog), "response",
164                          G_CALLBACK (response_cb), NULL);
165
166         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
167         gtk_window_set_title (GTK_WINDOW (dialog), _("gLabels Preferences"));
168         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
169
170         gl_debug (DEBUG_PREFS, "END");
171 }
172
173 static void 
174 gl_prefs_dialog_finalize (GObject *object)
175 {
176         glPrefsDialog* dialog = GL_PREFS_DIALOG (object);
177         
178         gl_debug (DEBUG_PREFS, "START");
179
180         g_return_if_fail (object != NULL);
181         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
182         g_return_if_fail (dialog->priv != NULL);
183
184         if (dialog->priv->gui)
185         {
186                 g_object_unref (G_OBJECT (dialog->priv->gui));
187         }
188         g_free (dialog->priv);
189
190         G_OBJECT_CLASS (gl_prefs_dialog_parent_class)->finalize (object);
191
192         gl_debug (DEBUG_PREFS, "END");
193 }
194
195 /*****************************************************************************/
196 /* NEW preferences dialog.                                                   */
197 /*****************************************************************************/
198 GtkWidget*
199 gl_prefs_dialog_new (GtkWindow *parent)
200 {
201         GtkWidget *dialog;
202
203         gl_debug (DEBUG_PREFS, "START");
204         gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size);
205
206         dialog = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
207
208         if (parent)
209                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
210         
211         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dialog));
212
213
214         gl_debug (DEBUG_PREFS, "END");
215
216         return dialog;
217 }
218
219 /*---------------------------------------------------------------------------*/
220 /* PRIVATE.  Construct composite widget.                                     */
221 /*---------------------------------------------------------------------------*/
222 static void
223 gl_prefs_dialog_construct (glPrefsDialog *dialog)
224 {
225         GtkWidget *notebook;
226
227         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
228         g_return_if_fail (dialog->priv != NULL);
229
230         gl_util_get_builder_widgets (dialog->priv->gui,
231                                      "prefs_notebook", &notebook,
232                                      NULL);
233         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, FALSE, FALSE, 0);
234
235         construct_locale_page (dialog);
236         construct_object_page (dialog);
237
238         update_locale_page_from_prefs (dialog);
239         update_object_page_from_prefs (dialog);
240
241         gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);   
242 }
243
244 /*---------------------------------------------------------------------------*/
245 /* PRIVATE.  "Response" callback.                                            */
246 /*---------------------------------------------------------------------------*/
247 static void
248 response_cb (glPrefsDialog *dialog,
249              gint          response,
250              gpointer      user_data)
251 {
252         gl_debug (DEBUG_VIEW, "START");
253
254         g_return_if_fail(dialog != NULL);
255         g_return_if_fail(GTK_IS_DIALOG(dialog));
256
257         switch(response) {
258         case GTK_RESPONSE_CLOSE:
259                 gtk_widget_hide (GTK_WIDGET(dialog));
260                 break;
261         case GTK_RESPONSE_DELETE_EVENT:
262                 break;
263         default:
264                 g_print ("response = %d", response);
265                 g_assert_not_reached ();
266         }
267
268         gl_debug (DEBUG_VIEW, "END");
269 }
270
271 /*--------------------------------------------------------------------------*/
272 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
273 /*--------------------------------------------------------------------------*/
274 static void
275 construct_locale_page (glPrefsDialog *dialog)
276 {
277
278         gl_util_get_builder_widgets (dialog->priv->gui,
279                                      "units_points_radio",        &dialog->priv->units_points_radio,
280                                      "units_inches_radio",        &dialog->priv->units_inches_radio,
281                                      "units_mm_radio",            &dialog->priv->units_mm_radio,
282                                      "page_size_us_letter_radio", &dialog->priv->page_size_us_letter_radio,
283                                      "page_size_a4_radio",        &dialog->priv->page_size_a4_radio,
284                                      NULL);
285
286         g_signal_connect_swapped (
287                 G_OBJECT(dialog->priv->units_points_radio),
288                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
289         g_signal_connect_swapped (
290                 G_OBJECT(dialog->priv->units_inches_radio),
291                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
292         g_signal_connect_swapped (
293                 G_OBJECT(dialog->priv->units_mm_radio),
294                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
295         g_signal_connect_swapped (
296                 G_OBJECT(dialog->priv->page_size_us_letter_radio),
297                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
298         g_signal_connect_swapped (
299                 G_OBJECT(dialog->priv->page_size_a4_radio),
300                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
301 }
302
303 /*--------------------------------------------------------------------------*/
304 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
305 /*--------------------------------------------------------------------------*/
306 static void
307 construct_object_page (glPrefsDialog *dialog)
308 {
309         GList    *family_names;
310
311         gl_util_get_builder_widgets (dialog->priv->gui,
312                                      "text_family_combo",      &dialog->priv->text_family_combo,
313                                      "text_size_spin",         &dialog->priv->text_size_spin,
314                                      "text_bold_toggle",       &dialog->priv->text_bold_toggle,
315                                      "text_italic_toggle",     &dialog->priv->text_italic_toggle,
316                                      "text_color_hbox",        &dialog->priv->text_color_hbox,
317                                      "text_left_toggle",       &dialog->priv->text_left_toggle,
318                                      "text_center_toggle",     &dialog->priv->text_center_toggle,
319                                      "text_right_toggle",      &dialog->priv->text_right_toggle,
320                                      "text_line_spacing_spin", &dialog->priv->text_line_spacing_spin,
321                                      "line_width_spin",        &dialog->priv->line_width_spin,
322                                      "line_color_hbox",        &dialog->priv->line_color_hbox,
323                                      "fill_color_hbox",        &dialog->priv->fill_color_hbox,
324                                      NULL);
325
326         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->text_family_combo));
327
328         dialog->priv->text_color_combo = gl_color_combo_new (NULL, _("Default"),
329                                                              GL_COLOR_TEXT_DEFAULT,
330                                                              gl_prefs->default_text_color);
331         dialog->priv->line_color_combo = gl_color_combo_new (NULL, _("No Line"),
332                                                              GL_COLOR_NO_LINE,
333                                                              gl_prefs->default_line_color);
334         dialog->priv->fill_color_combo = gl_color_combo_new (NULL, _("No Fill"),
335                                                              GL_COLOR_NO_FILL,
336                                                              gl_prefs->default_fill_color);
337
338         gtk_container_add (GTK_CONTAINER (dialog->priv->text_color_hbox),
339                            dialog->priv->text_color_combo);
340         gtk_container_add (GTK_CONTAINER (dialog->priv->line_color_hbox),
341                            dialog->priv->line_color_combo);
342         gtk_container_add (GTK_CONTAINER (dialog->priv->fill_color_hbox),
343                            dialog->priv->fill_color_combo);
344
345         /* Load family names */
346         family_names = gl_util_get_font_family_list ();
347         gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->text_family_combo),
348                                        family_names);
349         gl_util_font_family_list_free (family_names);
350                                                                                 
351
352         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_family_combo),
353                                   "changed",
354                                   G_CALLBACK(update_prefs_from_object_page),
355                                   G_OBJECT(dialog));
356         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_size_spin),
357                                   "changed",
358                                   G_CALLBACK(update_prefs_from_object_page),
359                                   G_OBJECT(dialog));
360         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_bold_toggle),
361                                   "toggled",
362                                   G_CALLBACK(update_prefs_from_object_page),
363                                   G_OBJECT(dialog));
364         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_italic_toggle),
365                                   "toggled",
366                                   G_CALLBACK(update_prefs_from_object_page),
367                                   G_OBJECT(dialog));
368         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_color_combo),
369                                   "color_changed",
370                                   G_CALLBACK(update_prefs_from_object_page),
371                                   G_OBJECT(dialog));
372
373         g_signal_connect (G_OBJECT(dialog->priv->text_left_toggle),
374                           "toggled",
375                           G_CALLBACK(align_toggle_cb),
376                           G_OBJECT(dialog));
377         g_signal_connect (G_OBJECT(dialog->priv->text_center_toggle),
378                           "toggled",
379                           G_CALLBACK(align_toggle_cb),
380                           G_OBJECT(dialog));
381         g_signal_connect (G_OBJECT(dialog->priv->text_right_toggle),
382                           "toggled",
383                           G_CALLBACK(align_toggle_cb),
384                           G_OBJECT(dialog));
385
386         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_line_spacing_spin),
387                                   "changed",
388                                   G_CALLBACK(update_prefs_from_object_page),
389                                   G_OBJECT(dialog));
390
391         g_signal_connect_swapped (G_OBJECT(dialog->priv->line_width_spin),
392                                   "changed",
393                                   G_CALLBACK(update_prefs_from_object_page),
394                                   G_OBJECT(dialog));
395         g_signal_connect_swapped (G_OBJECT(dialog->priv->line_color_combo),
396                                   "color_changed",
397                                   G_CALLBACK(update_prefs_from_object_page),
398                                   G_OBJECT(dialog));
399
400         g_signal_connect_swapped (G_OBJECT(dialog->priv->fill_color_combo),
401                                   "color_changed",
402                                   G_CALLBACK(update_prefs_from_object_page),
403                                   G_OBJECT(dialog));
404 }
405
406
407 /*--------------------------------------------------------------------------*/
408 /* PRIVATE.  Alignment togglebutton callback.                               */
409 /*--------------------------------------------------------------------------*/
410 static void
411 align_toggle_cb (GtkToggleButton *toggle,
412                  glPrefsDialog   *dialog)
413 {
414         if (gtk_toggle_button_get_active (toggle))
415         {
416   
417                 if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_left_toggle))
418                 {
419                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
420                                                       (dialog->priv->text_center_toggle),
421                                                       FALSE);
422                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
423                                                       (dialog->priv->text_right_toggle),
424                                                       FALSE);
425                 }
426                 else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_center_toggle))
427                 {
428                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
429                                                       (dialog->priv->text_left_toggle),
430                                                       FALSE);
431                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
432                                                       (dialog->priv->text_right_toggle),
433                                                       FALSE);
434                 }
435                 else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_right_toggle))
436                 {
437                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
438                                                       (dialog->priv->text_left_toggle),
439                                                       FALSE);
440                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
441                                                       (dialog->priv->text_center_toggle),
442                                                       FALSE);
443                 }
444                                                                                 
445                 update_prefs_from_object_page (dialog);
446         }
447                                                                                 
448 }
449                                                                                 
450
451 /*--------------------------------------------------------------------------*/
452 /* PRIVATE.  Update locale page widgets from current prefs.                 */
453 /*--------------------------------------------------------------------------*/
454 static void
455 update_locale_page_from_prefs (glPrefsDialog *dialog)
456 {
457         dialog->priv->stop_signals = TRUE;
458
459         switch (gl_prefs->units) {
460         case LGL_UNITS_POINT:
461                 gtk_toggle_button_set_active (
462                         GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio),
463                         TRUE);
464                 break;
465         case LGL_UNITS_INCH:
466                 gtk_toggle_button_set_active (
467                         GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio),
468                         TRUE);
469                 break;
470         case LGL_UNITS_MM:
471                 gtk_toggle_button_set_active (
472                         GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio),
473                         TRUE);
474                 break;
475         default:
476                 g_message ("Illegal units");    /* Should not happen */
477                 break;
478         }
479
480         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0)
481         {
482                 gtk_toggle_button_set_active (
483                         GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio), TRUE);
484         }
485         else if ( g_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0)
486         {
487                 gtk_toggle_button_set_active (
488                         GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio), TRUE);
489         }
490         else
491         {
492                 g_message ("Unknown default page size"); /* Shouldn't happen */
493         }
494
495         dialog->priv->stop_signals = FALSE;
496 }
497
498 /*--------------------------------------------------------------------------*/
499 /* PRIVATE.  Update object page widgets from current prefs.                 */
500 /*--------------------------------------------------------------------------*/
501 static void
502 update_object_page_from_prefs (glPrefsDialog *dialog)
503 {
504         GList    *family_names;
505         gchar    *good_font_family;
506  
507         dialog->priv->stop_signals = TRUE;
508
509
510         /* Make sure we have a valid font family.  if not provide a good default. */
511         family_names = gl_util_get_font_family_list ();
512         if (g_list_find_custom (family_names,
513                                 gl_prefs->default_font_family,
514                                 (GCompareFunc)g_utf8_collate))
515         {
516                 good_font_family = g_strdup (gl_prefs->default_font_family);
517         }
518         else
519         {
520                 if (family_names != NULL)
521                 {
522                         good_font_family = g_strdup (family_names->data); /* 1st entry */
523                 }
524                 else
525                 {
526                         good_font_family = NULL;
527                 }
528         }
529         gl_util_font_family_list_free (family_names);
530         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo),
531                                            good_font_family);
532         g_free (good_font_family);
533
534         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_size_spin),
535                                    gl_prefs->default_font_size);
536  
537         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle),
538                                       (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD));
539  
540         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_italic_toggle),
541                                       gl_prefs->default_font_italic_flag);
542  
543         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
544                                   gl_prefs->default_text_color);
545
546         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle),
547                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT));
548         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle),
549                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER));
550         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle),
551                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT));
552
553         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_line_spacing_spin),
554                                    gl_prefs->default_text_line_spacing);
555
556         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->line_width_spin),
557                                    gl_prefs->default_line_width);
558  
559         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
560                 gl_prefs->default_line_color);
561
562
563         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
564                                   gl_prefs->default_fill_color);
565
566
567         dialog->priv->stop_signals = FALSE;
568 }
569
570 /*--------------------------------------------------------------------------*/
571 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
572 /*--------------------------------------------------------------------------*/
573 static void
574 update_prefs_from_locale_page (glPrefsDialog *dialog)
575 {
576         if (dialog->priv->stop_signals) return;
577
578         if (gtk_toggle_button_get_active (
579                     GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio)))
580         {
581                 gl_prefs->units = LGL_UNITS_POINT;
582         }
583         if (gtk_toggle_button_get_active (
584                     GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio)))
585         {
586                 gl_prefs->units = LGL_UNITS_INCH;
587         }
588         if (gtk_toggle_button_get_active (
589                     GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio)))
590         {
591                 gl_prefs->units = LGL_UNITS_MM;
592         }
593
594         if (gtk_toggle_button_get_active (
595                     GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio)))
596         {
597                 g_free (gl_prefs->default_page_size);
598                 gl_prefs->default_page_size = g_strdup (US_LETTER_ID);
599         }
600         if (gtk_toggle_button_get_active (
601                     GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio)))
602         {
603                 g_free (gl_prefs->default_page_size);
604                 gl_prefs->default_page_size = g_strdup (A4_ID);
605         }
606
607         gl_prefs_model_save_settings (gl_prefs);
608 }
609
610 /*--------------------------------------------------------------------------*/
611 /* PRIVATE.  Update prefs from current state of object page widgets.        */
612 /*--------------------------------------------------------------------------*/
613 static void
614 update_prefs_from_object_page (glPrefsDialog *dialog)
615 {
616         guint     color;
617         gboolean  is_default;
618
619         if (dialog->priv->stop_signals) return;
620
621         g_free (gl_prefs->default_font_family);
622         gl_prefs->default_font_family =
623                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo));
624         gl_prefs->default_font_size =
625                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_size_spin));
626
627         if (gtk_toggle_button_get_active
628             (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle)))
629         {
630                 gl_prefs->default_font_weight = PANGO_WEIGHT_BOLD;
631         }
632         else
633         {
634                 gl_prefs->default_font_weight = PANGO_WEIGHT_NORMAL;
635         }
636
637         gl_prefs->default_font_italic_flag =
638                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
639                                               (dialog->priv->text_italic_toggle));
640
641         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
642                                           &is_default);
643         if (!is_default)
644         {
645                 gl_prefs->default_text_color = color;
646         }
647
648         if (gtk_toggle_button_get_active
649             (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle)))
650         {
651                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
652         }
653         else if (gtk_toggle_button_get_active
654                  (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle)))
655         {
656                 gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT;
657         }
658         else if (gtk_toggle_button_get_active
659                  (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle)))
660         {
661                 gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER;
662         }
663         else
664         {
665                 /* Should not happen. */
666                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
667         }
668                                                                                 
669
670         gl_prefs->default_text_line_spacing =
671                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_line_spacing_spin));
672
673         gl_prefs->default_line_width =
674                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->line_width_spin));
675
676         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
677                                           &is_default);
678         if (!is_default)
679         {
680                 gl_prefs->default_line_color = color;
681         }
682
683
684         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
685                                           &is_default);
686         if (!is_default)
687         {
688                 gl_prefs->default_fill_color = color;
689         }
690
691         gl_prefs_model_save_settings (gl_prefs);
692 }
693
694
695