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