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