]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
b263e522c08401a19427c8003ef44c718e79c18c
[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 "font-combo.h"
38 #include "font-util.h"
39 #include "util.h"
40
41 #include "debug.h"
42
43
44 /*========================================================*/
45 /* Private macros and constants.                          */
46 /*========================================================*/
47
48 #define US_LETTER_ID "US-Letter"
49 #define A4_ID        "A4"
50
51
52 /*========================================================*/
53 /* Private types.                                         */
54 /*========================================================*/
55
56 struct _glPrefsDialogPrivate
57 {
58         GtkBuilder      *builder;
59
60         /* Units properties */
61         GtkWidget       *units_points_radio;
62         GtkWidget       *units_inches_radio;
63         GtkWidget       *units_mm_radio;
64
65         /* Page size properties */
66         GtkWidget       *page_size_us_letter_radio;
67         GtkWidget       *page_size_a4_radio;
68
69         /* Default text properties */
70         GtkWidget       *text_family_hbox;
71         GtkWidget       *text_family_combo;
72         GtkWidget       *text_size_spin;
73         GtkWidget       *text_bold_toggle;
74         GtkWidget       *text_italic_toggle;
75         GtkWidget       *text_color_hbox;
76         GtkWidget       *text_color_combo;
77         GtkWidget       *text_left_toggle;
78         GtkWidget       *text_center_toggle;
79         GtkWidget       *text_right_toggle;
80         GtkWidget       *text_line_spacing_spin;
81
82         /* Default line properties */
83         GtkWidget       *line_width_spin;
84         GtkWidget       *line_color_hbox;
85         GtkWidget       *line_color_combo;
86
87         /* Default fill properties */
88         GtkWidget       *fill_color_hbox;
89         GtkWidget       *fill_color_combo;
90
91         /* Prevent recursion */
92         gboolean    stop_signals;
93 };
94
95
96 /*========================================================*/
97 /* Private globals.                                       */
98 /*========================================================*/
99
100
101 /*========================================================*/
102 /* Private function prototypes.                           */
103 /*========================================================*/
104
105 static void gl_prefs_dialog_finalize      (GObject            *object);
106 static void gl_prefs_dialog_construct     (glPrefsDialog      *dialog);
107
108 static void response_cb                   (glPrefsDialog      *dialog,
109                                            gint                response,
110                                            gpointer            user_data);
111
112 static void construct_locale_page         (glPrefsDialog      *dialog);
113 static void construct_object_page         (glPrefsDialog      *dialog);
114
115 static void align_toggle_cb               (GtkToggleButton    *toggle,
116                                            glPrefsDialog      *dialog);
117                                                                                 
118 static void update_locale_page_from_prefs (glPrefsDialog      *dialog);
119 static void update_object_page_from_prefs (glPrefsDialog      *dialog);
120
121 static void update_prefs_from_locale_page (glPrefsDialog      *dialog);
122 static void update_prefs_from_object_page (glPrefsDialog      *dialog);
123
124
125 /*****************************************************************************/
126 /* Boilerplate object stuff.                                                 */
127 /*****************************************************************************/
128 G_DEFINE_TYPE (glPrefsDialog, gl_prefs_dialog, GTK_TYPE_DIALOG);
129
130
131 static void
132 gl_prefs_dialog_class_init (glPrefsDialogClass *class)
133 {
134         GObjectClass *object_class = G_OBJECT_CLASS (class);
135
136         gl_debug (DEBUG_PREFS, "");
137         
138         gl_prefs_dialog_parent_class = g_type_class_peek_parent (class);
139
140         object_class->finalize = gl_prefs_dialog_finalize;      
141 }
142
143
144 static void
145 gl_prefs_dialog_init (glPrefsDialog *dialog)
146 {
147         static gchar *object_ids[] = { "prefs_notebook",
148                                        "adjustment1",  "adjustment2",  "adjustment3",
149                                        NULL };
150         GError *error = NULL;
151
152         gl_debug (DEBUG_PREFS, "START");
153
154         dialog->priv = g_new0 (glPrefsDialogPrivate, 1);
155
156         dialog->priv->builder = gtk_builder_new ();
157         gtk_builder_add_objects_from_file (dialog->priv->builder,
158                                            GLABELS_BUILDER_DIR "prefs-dialog.builder",
159                                            object_ids,
160                                            &error);
161         if (error) {
162                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
163                 g_error_free (error);
164                 return;
165         }
166
167         gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2);
168
169         gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
170         gtk_dialog_add_button (GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
171         gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
172
173         g_signal_connect(G_OBJECT (dialog), "response",
174                          G_CALLBACK (response_cb), NULL);
175
176         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
177         gtk_window_set_title (GTK_WINDOW (dialog), _("gLabels Preferences"));
178         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
179
180         gl_debug (DEBUG_PREFS, "END");
181 }
182
183
184 static void 
185 gl_prefs_dialog_finalize (GObject *object)
186 {
187         glPrefsDialog* dialog = GL_PREFS_DIALOG (object);
188         
189         gl_debug (DEBUG_PREFS, "START");
190
191         g_return_if_fail (object != NULL);
192         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
193         g_return_if_fail (dialog->priv != NULL);
194
195         if (dialog->priv->builder)
196         {
197                 g_object_unref (G_OBJECT (dialog->priv->builder));
198         }
199         g_free (dialog->priv);
200
201         G_OBJECT_CLASS (gl_prefs_dialog_parent_class)->finalize (object);
202
203         gl_debug (DEBUG_PREFS, "END");
204 }
205
206
207 /*****************************************************************************/
208 /* NEW preferences dialog.                                                   */
209 /*****************************************************************************/
210 GtkWidget*
211 gl_prefs_dialog_new (GtkWindow *parent)
212 {
213         GtkWidget *dialog;
214
215         gl_debug (DEBUG_PREFS, "START");
216         gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size);
217
218         dialog = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
219
220         if (parent)
221                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
222         
223         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dialog));
224
225
226         gl_debug (DEBUG_PREFS, "END");
227
228         return dialog;
229 }
230
231
232 /*---------------------------------------------------------------------------*/
233 /* PRIVATE.  Construct composite widget.                                     */
234 /*---------------------------------------------------------------------------*/
235 static void
236 gl_prefs_dialog_construct (glPrefsDialog *dialog)
237 {
238         GtkWidget *notebook;
239
240         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
241         g_return_if_fail (dialog->priv != NULL);
242
243         gl_util_get_builder_widgets (dialog->priv->builder,
244                                      "prefs_notebook", &notebook,
245                                      NULL);
246         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, FALSE, FALSE, 0);
247
248         construct_locale_page (dialog);
249         construct_object_page (dialog);
250
251         update_locale_page_from_prefs (dialog);
252         update_object_page_from_prefs (dialog);
253
254         gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);   
255 }
256
257
258 /*---------------------------------------------------------------------------*/
259 /* PRIVATE.  "Response" callback.                                            */
260 /*---------------------------------------------------------------------------*/
261 static void
262 response_cb (glPrefsDialog *dialog,
263              gint          response,
264              gpointer      user_data)
265 {
266         gl_debug (DEBUG_VIEW, "START");
267
268         g_return_if_fail(dialog != NULL);
269         g_return_if_fail(GTK_IS_DIALOG(dialog));
270
271         switch(response) {
272         case GTK_RESPONSE_CLOSE:
273                 gtk_widget_hide (GTK_WIDGET(dialog));
274                 break;
275         case GTK_RESPONSE_DELETE_EVENT:
276                 break;
277         default:
278                 g_print ("response = %d", response);
279                 g_assert_not_reached ();
280         }
281
282         gl_debug (DEBUG_VIEW, "END");
283 }
284
285
286 /*--------------------------------------------------------------------------*/
287 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
288 /*--------------------------------------------------------------------------*/
289 static void
290 construct_locale_page (glPrefsDialog *dialog)
291 {
292
293         gl_util_get_builder_widgets (dialog->priv->builder,
294                                      "units_points_radio",        &dialog->priv->units_points_radio,
295                                      "units_inches_radio",        &dialog->priv->units_inches_radio,
296                                      "units_mm_radio",            &dialog->priv->units_mm_radio,
297                                      "page_size_us_letter_radio", &dialog->priv->page_size_us_letter_radio,
298                                      "page_size_a4_radio",        &dialog->priv->page_size_a4_radio,
299                                      NULL);
300
301         g_signal_connect_swapped (
302                 G_OBJECT(dialog->priv->units_points_radio),
303                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
304         g_signal_connect_swapped (
305                 G_OBJECT(dialog->priv->units_inches_radio),
306                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
307         g_signal_connect_swapped (
308                 G_OBJECT(dialog->priv->units_mm_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_us_letter_radio),
312                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
313         g_signal_connect_swapped (
314                 G_OBJECT(dialog->priv->page_size_a4_radio),
315                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
316 }
317
318
319 /*--------------------------------------------------------------------------*/
320 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
321 /*--------------------------------------------------------------------------*/
322 static void
323 construct_object_page (glPrefsDialog *dialog)
324 {
325         GList    *family_names;
326
327         gl_util_get_builder_widgets (dialog->priv->builder,
328                                      "text_family_hbox",       &dialog->priv->text_family_hbox,
329                                      "text_size_spin",         &dialog->priv->text_size_spin,
330                                      "text_bold_toggle",       &dialog->priv->text_bold_toggle,
331                                      "text_italic_toggle",     &dialog->priv->text_italic_toggle,
332                                      "text_color_hbox",        &dialog->priv->text_color_hbox,
333                                      "text_left_toggle",       &dialog->priv->text_left_toggle,
334                                      "text_center_toggle",     &dialog->priv->text_center_toggle,
335                                      "text_right_toggle",      &dialog->priv->text_right_toggle,
336                                      "text_line_spacing_spin", &dialog->priv->text_line_spacing_spin,
337                                      "line_width_spin",        &dialog->priv->line_width_spin,
338                                      "line_color_hbox",        &dialog->priv->line_color_hbox,
339                                      "fill_color_hbox",        &dialog->priv->fill_color_hbox,
340                                      NULL);
341
342         dialog->priv->text_family_combo = gl_font_combo_new ("Sans");
343
344         dialog->priv->text_color_combo = gl_color_combo_new (_("Default"),
345                                                              GL_COLOR_TEXT_DEFAULT,
346                                                              gl_prefs->default_text_color);
347         dialog->priv->line_color_combo = gl_color_combo_new (_("No Line"),
348                                                              GL_COLOR_NO_LINE,
349                                                              gl_prefs->default_line_color);
350         dialog->priv->fill_color_combo = gl_color_combo_new (_("No Fill"),
351                                                              GL_COLOR_NO_FILL,
352                                                              gl_prefs->default_fill_color);
353
354         gtk_box_pack_start (GTK_BOX (dialog->priv->text_family_hbox),
355                             dialog->priv->text_family_combo,
356                             FALSE, FALSE, 0);
357         gtk_box_pack_start (GTK_BOX (dialog->priv->text_color_hbox),
358                             dialog->priv->text_color_combo,
359                             FALSE, FALSE, 0);
360         gtk_box_pack_start (GTK_BOX (dialog->priv->line_color_hbox),
361                             dialog->priv->line_color_combo,
362                             FALSE, FALSE, 0);
363         gtk_box_pack_start (GTK_BOX (dialog->priv->fill_color_hbox),
364                             dialog->priv->fill_color_combo,
365                             FALSE, FALSE, 0);
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         const 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_font_util_get_all_families ();
528         if (g_list_find_custom ((GList *)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_font_combo_set_family (GL_FONT_COMBO (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                 gl_font_combo_get_family (GL_FONT_COMBO (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  */