]> git.sur5r.net Git - glabels/blob - src/prefs-model.c
Imported Upstream version 3.0.0
[glabels] / src / prefs-model.c
1 /*
2  *  prefs-model.h
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-model.h"
24
25 #include <gio/gio.h>
26 #include <gtk/gtk.h>
27 #include <string.h>
28
29 #include <libglabels.h>
30 #include "marshal.h"
31 #include "str-util.h"
32 #include "color.h"
33
34 #include "debug.h"
35
36
37 /*========================================================*/
38 /* Private macros and constants.                          */
39 /*========================================================*/
40
41 /* Default values */
42 #define DEFAULT_UNITS_STRING_US     lgl_units_get_id (LGL_UNITS_INCH)
43 #define DEFAULT_PAGE_SIZE_US        "US-Letter"
44
45 #define DEFAULT_UNITS_STRING_METRIC lgl_units_get_id (LGL_UNITS_MM)
46 #define DEFAULT_PAGE_SIZE_METRIC    "A4"
47
48
49 /*========================================================*/
50 /* Private types.                                         */
51 /*========================================================*/
52
53 struct _glPrefsModelPrivate {
54
55         GSettings *locale;
56         GSettings *objects;
57         GSettings *ui;
58
59 };
60
61 enum {
62         CHANGED,
63         LAST_SIGNAL
64 };
65
66
67 /*========================================================*/
68 /* Private globals.                                       */
69 /*========================================================*/
70
71 static guint signals[LAST_SIGNAL] = {0};
72
73
74 /*========================================================*/
75 /* Private function prototypes.                           */
76 /*========================================================*/
77
78 static void           gl_prefs_model_finalize      (GObject             *object);
79
80 static void           gsettings_changed_cb         (glPrefsModel        *prefs_model);
81
82
83 /*****************************************************************************/
84 /* Boilerplate object stuff.                                                 */
85 /*****************************************************************************/
86 G_DEFINE_TYPE (glPrefsModel, gl_prefs_model, G_TYPE_OBJECT)
87
88
89 static void
90 gl_prefs_model_class_init (glPrefsModelClass *class)
91 {
92         GObjectClass *object_class = G_OBJECT_CLASS (class);
93
94         gl_debug (DEBUG_PREFS, "START");
95
96         gl_prefs_model_parent_class = g_type_class_peek_parent (class);
97
98         object_class->finalize = gl_prefs_model_finalize;
99
100         signals[CHANGED] =
101                 g_signal_new ("changed",
102                               G_OBJECT_CLASS_TYPE (object_class),
103                               G_SIGNAL_RUN_LAST,
104                               G_STRUCT_OFFSET (glPrefsModelClass, changed),
105                               NULL, NULL,
106                               gl_marshal_VOID__VOID,
107                               G_TYPE_NONE,
108                               0);
109
110         gl_debug (DEBUG_PREFS, "END");
111 }
112
113
114 static void
115 gl_prefs_model_init (glPrefsModel *this)
116 {
117         gl_debug (DEBUG_PREFS, "START");
118
119         this->priv = g_new0 (glPrefsModelPrivate, 1);
120
121         this->priv->locale  = g_settings_new ("org.gnome.glabels-3.locale");
122         this->priv->objects = g_settings_new ("org.gnome.glabels-3.objects");
123         this->priv->ui      = g_settings_new ("org.gnome.glabels-3.ui");
124
125         g_return_if_fail (this->priv->locale != NULL);
126         g_return_if_fail (this->priv->objects != NULL);
127         g_return_if_fail (this->priv->ui != NULL);
128  
129         g_signal_connect_swapped (G_OBJECT (this->priv->locale), "changed",
130                                   G_CALLBACK (gsettings_changed_cb), this);
131         g_signal_connect_swapped (G_OBJECT (this->priv->objects), "changed",
132                                   G_CALLBACK (gsettings_changed_cb), this);
133         g_signal_connect_swapped (G_OBJECT (this->priv->ui), "changed",
134                                   G_CALLBACK (gsettings_changed_cb), this);
135
136         gl_debug (DEBUG_PREFS, "END");
137 }
138
139
140 static void
141 gl_prefs_model_finalize (GObject *object)
142 {
143         glPrefsModel *this = GL_PREFS_MODEL (object);
144
145         gl_debug (DEBUG_PREFS, "START");
146
147         g_return_if_fail (object && GL_IS_PREFS_MODEL (object));
148
149         g_object_unref (G_OBJECT(this->priv->locale));
150         g_object_unref (G_OBJECT(this->priv->objects));
151         g_object_unref (G_OBJECT(this->priv->ui));
152         g_free (this->priv);
153
154         G_OBJECT_CLASS (gl_prefs_model_parent_class)->finalize (object);
155
156         gl_debug (DEBUG_PREFS, "END");
157 }
158
159
160 /*****************************************************************************/
161 /* New prefs_model object.                                                   */
162 /*****************************************************************************/
163 glPrefsModel *
164 gl_prefs_model_new (void)
165 {
166         glPrefsModel *this;
167
168         gl_debug (DEBUG_PREFS, "START");
169
170         this = GL_PREFS_MODEL (g_object_new (gl_prefs_model_get_type(), NULL));
171
172         gl_debug (DEBUG_PREFS, "END");
173
174         return this;
175 }
176
177
178 /*****************************************************************************/
179 /* Set units.                                                                */
180 /*****************************************************************************/
181 void
182 gl_prefs_model_set_units (glPrefsModel     *this,
183                           lglUnits          units)
184 {
185         g_settings_set_string (this->priv->locale,
186                                "units",
187                                lgl_units_get_id (units));
188 }
189
190
191 /*****************************************************************************/
192 /* Get units.                                                                */
193 /*****************************************************************************/
194 lglUnits
195 gl_prefs_model_get_units (glPrefsModel     *this)
196 {
197         const gchar  *pgsize;
198         gchar        *string;
199         lglUnits      units;
200
201         string = g_settings_get_string (this->priv->locale, "units");
202         
203         /* If not set, make educated guess about locale default. */
204         if ( !string || (*string == '\0') )
205         {
206                 pgsize = gtk_paper_size_get_default ();
207                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
208                 {
209                         string = g_strdup (DEFAULT_UNITS_STRING_US);
210                 }
211                 else
212                 {
213                         string = g_strdup (DEFAULT_UNITS_STRING_METRIC);
214                 }
215         }
216
217         units = lgl_units_from_id (string);
218         g_free (string);
219
220         /* If invalid, make an educated guess from locale. */
221         if (units == LGL_UNITS_INVALID)
222         {
223                 pgsize = gtk_paper_size_get_default ();
224                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
225                 {
226                         units = LGL_UNITS_INCH;
227                 }
228                 else
229                 {
230                         units = LGL_UNITS_MM;
231                 }
232         }
233
234         return units;
235 }
236
237
238 /*****************************************************************************/
239 /* Set default page size.                                                    */
240 /*****************************************************************************/
241 void
242 gl_prefs_model_set_default_page_size (glPrefsModel     *this,
243                                       const gchar      *page_size)
244 {
245         g_settings_set_string (this->priv->locale,
246                                "default-page-size",
247                                page_size);
248 }
249
250
251 /*****************************************************************************/
252 /* Get default page size.                                                    */
253 /*****************************************************************************/
254 gchar *
255 gl_prefs_model_get_default_page_size (glPrefsModel     *this)
256 {
257         const gchar *pgsize;
258         gchar       *page_size;
259         lglPaper    *paper;
260
261         page_size = g_settings_get_string (this->priv->locale, "default-page-size");
262
263         /* If not set, make educated guess about locale default. */
264         if ( !page_size || (*page_size == '\0') )
265         {
266                 pgsize = gtk_paper_size_get_default ();
267                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
268                 {
269                         page_size = g_strdup (DEFAULT_PAGE_SIZE_US);
270                 }
271                 else
272                 {
273                         page_size = g_strdup (DEFAULT_PAGE_SIZE_METRIC);
274                 }
275         }
276
277         /* Proof read the default page size -- it must be a valid id. */
278         /* (For compatability with older versions.) */
279         paper = lgl_db_lookup_paper_from_id (page_size);
280         if ( paper == NULL ) {
281                 g_free (page_size);
282                 page_size = g_strdup (DEFAULT_PAGE_SIZE_US);
283         } else {
284                 lgl_paper_free (paper);
285         }
286
287         return page_size;
288 }
289
290
291 /*****************************************************************************/
292 /* Set default font family.                                                  */
293 /*****************************************************************************/
294 void
295 gl_prefs_model_set_default_font_family (glPrefsModel     *this,
296                                         const gchar      *family)
297 {
298         g_settings_set_string (this->priv->objects,
299                                "default-font-family",
300                                family);
301 }
302
303
304 /*****************************************************************************/
305 /* Get default font family.                                                  */
306 /*****************************************************************************/
307 gchar *
308 gl_prefs_model_get_default_font_family (glPrefsModel     *this)
309 {
310         gchar *family;
311
312         family = g_settings_get_string (this->priv->objects,
313                                         "default-font-family");
314
315         return family;
316 }
317
318
319 /*****************************************************************************/
320 /* Set default font size.                                                    */
321 /*****************************************************************************/
322 void
323 gl_prefs_model_set_default_font_size (glPrefsModel     *this,
324                                       gdouble           size)
325 {
326         g_settings_set_double (this->priv->objects,
327                                "default-font-size",
328                                size);
329 }
330
331
332 /*****************************************************************************/
333 /* Get default font size.                                                    */
334 /*****************************************************************************/
335 gdouble
336 gl_prefs_model_get_default_font_size (glPrefsModel     *this)
337 {
338         gdouble size;
339
340         size = g_settings_get_double (this->priv->objects,
341                                       "default-font-size");
342
343         return size;
344 }
345
346
347 /*****************************************************************************/
348 /* Set default font weight.                                                  */
349 /*****************************************************************************/
350 void
351 gl_prefs_model_set_default_font_weight (glPrefsModel     *this,
352                                         PangoWeight       weight)
353 {
354         g_settings_set_string (this->priv->objects,
355                                "default-font-weight",
356                                gl_str_util_weight_to_string(weight));
357 }
358
359
360 /*****************************************************************************/
361 /* Get default font weight.                                                  */
362 /*****************************************************************************/
363 PangoWeight
364 gl_prefs_model_get_default_font_weight (glPrefsModel     *this)
365 {
366         gchar       *string;
367         PangoWeight  weight;
368
369         string = g_settings_get_string (this->priv->objects,
370                                         "default-font-weight");
371         weight = gl_str_util_string_to_weight (string);
372         g_free (string);
373
374         return weight;
375 }
376
377
378 /*****************************************************************************/
379 /* Set default font italic flag.                                             */
380 /*****************************************************************************/
381 void
382 gl_prefs_model_set_default_font_italic_flag (glPrefsModel     *this,
383                                              gboolean          italic_flag)
384 {
385         g_settings_set_boolean (this->priv->objects,
386                                 "default-font-italic-flag",
387                                 italic_flag);
388 }
389
390
391 /*****************************************************************************/
392 /* Get default font italic flag.                                             */
393 /*****************************************************************************/
394 gboolean
395 gl_prefs_model_get_default_font_italic_flag (glPrefsModel     *this)
396 {
397         gboolean italic_flag;
398
399         italic_flag = g_settings_get_boolean (this->priv->objects,
400                                               "default-font-italic-flag");
401
402         return italic_flag;
403 }
404
405
406 /*****************************************************************************/
407 /* Set default text color.                                                   */
408 /*****************************************************************************/
409 void
410 gl_prefs_model_set_default_text_color (glPrefsModel     *this,
411                                        guint             color)
412 {
413         g_settings_set_value (this->priv->objects,
414                               "default-text-color",
415                               g_variant_new_uint32 (color));
416 }
417
418
419 /*****************************************************************************/
420 /* Get default text color.                                                   */
421 /*****************************************************************************/
422 guint
423 gl_prefs_model_get_default_text_color (glPrefsModel     *this)
424 {
425         GVariant *value;
426         guint     color;
427
428         value = g_settings_get_value (this->priv->objects, "default-text-color");
429         color = g_variant_get_uint32 (value);
430         g_variant_unref (value);
431
432         return color;
433 }
434
435
436 /*****************************************************************************/
437 /* Set default text alignment.                                               */
438 /*****************************************************************************/
439 void
440 gl_prefs_model_set_default_text_alignment (glPrefsModel     *this,
441                                            PangoAlignment    alignment)
442 {
443         g_settings_set_string (this->priv->objects,
444                                "default-text-alignment",
445                                gl_str_util_align_to_string(alignment));
446 }
447
448
449 /*****************************************************************************/
450 /* Get default text alignment.                                               */
451 /*****************************************************************************/
452 PangoAlignment
453 gl_prefs_model_get_default_text_alignment (glPrefsModel     *this)
454 {
455         gchar          *string;
456         PangoAlignment  alignment;
457
458         string = g_settings_get_string (this->priv->objects,
459                                         "default-text-alignment");
460         alignment = gl_str_util_string_to_align (string);
461         g_free (string);
462
463         return alignment;
464 }
465
466
467 /*****************************************************************************/
468 /* Set default text line spacing.                                            */
469 /*****************************************************************************/
470 void
471 gl_prefs_model_set_default_text_line_spacing (glPrefsModel     *this,
472                                               gdouble           spacing)
473 {
474         g_settings_set_double (this->priv->objects,
475                                "default-text-line-spacing",
476                                spacing);
477 }
478
479
480 /*****************************************************************************/
481 /* Get default text line spacing.                                            */
482 /*****************************************************************************/
483 gdouble
484 gl_prefs_model_get_default_text_line_spacing (glPrefsModel     *this)
485 {
486         gdouble spacing;
487
488         spacing = g_settings_get_double (this->priv->objects,
489                                          "default-text-line-spacing");
490
491         return spacing;
492 }
493
494
495 /*****************************************************************************/
496 /* Set default line width.                                                   */
497 /*****************************************************************************/
498 void
499 gl_prefs_model_set_default_line_width (glPrefsModel     *this,
500                                        gdouble           width)
501 {
502         g_settings_set_double (this->priv->objects,
503                                "default-line-width",
504                                width);
505 }
506
507
508 /*****************************************************************************/
509 /* Get default line width.                                                   */
510 /*****************************************************************************/
511 gdouble
512 gl_prefs_model_get_default_line_width (glPrefsModel     *this)
513 {
514         gdouble width;
515
516         width = g_settings_get_double (this->priv->objects,
517                                        "default-line-width");
518
519         return width;
520 }
521
522
523 /*****************************************************************************/
524 /* Set default line color.                                                   */
525 /*****************************************************************************/
526 void
527 gl_prefs_model_set_default_line_color (glPrefsModel     *this,
528                                        guint             color)
529 {
530         g_settings_set_value (this->priv->objects,
531                               "default-line-color",
532                               g_variant_new_uint32 (color));
533 }
534
535
536 /*****************************************************************************/
537 /* Get default line color.                                                   */
538 /*****************************************************************************/
539 guint
540 gl_prefs_model_get_default_line_color (glPrefsModel     *this)
541 {
542         GVariant *value;
543         guint     color;
544
545         value = g_settings_get_value (this->priv->objects, "default-line-color");
546         color = g_variant_get_uint32 (value);
547         g_variant_unref (value);
548
549         return color;
550 }
551
552
553 /*****************************************************************************/
554 /* Set default fill color.                                                   */
555 /*****************************************************************************/
556 void
557 gl_prefs_model_set_default_fill_color (glPrefsModel     *this,
558                                        guint             color)
559 {
560         g_settings_set_value (this->priv->objects,
561                               "default-fill-color",
562                               g_variant_new_uint32 (color));
563 }
564
565
566 /*****************************************************************************/
567 /* Get default fill color.                                                   */
568 /*****************************************************************************/
569 guint
570 gl_prefs_model_get_default_fill_color (glPrefsModel     *this)
571 {
572         GVariant *value;
573         guint     color;
574
575         value = g_settings_get_value (this->priv->objects, "default-fill-color");
576         color = g_variant_get_uint32 (value);
577         g_variant_unref (value);
578
579         return color;
580 }
581
582
583 /*****************************************************************************/
584 /* Set main toolbar visible flag.                                            */
585 /*****************************************************************************/
586 void
587 gl_prefs_model_set_main_toolbar_visible (glPrefsModel     *this,
588                                          gboolean          visible)
589 {
590         g_settings_set_boolean (this->priv->ui,
591                                 "main-toolbar-visible",
592                                 visible);
593 }
594
595
596 /*****************************************************************************/
597 /* Get main toolbar visible flag.                                            */
598 /*****************************************************************************/
599 gboolean
600 gl_prefs_model_get_main_toolbar_visible (glPrefsModel     *this)
601 {
602         gboolean visible;
603
604         visible = g_settings_get_boolean (this->priv->ui,
605                                           "main-toolbar-visible");
606
607         return visible;
608 }
609
610
611 /*****************************************************************************/
612 /* Set drawing toolbar visible flag.                                         */
613 /*****************************************************************************/
614 void
615 gl_prefs_model_set_drawing_toolbar_visible (glPrefsModel     *this,
616                                             gboolean          visible)
617 {
618         g_settings_set_boolean (this->priv->ui,
619                                 "drawing-toolbar-visible",
620                                 visible);
621 }
622
623
624 /*****************************************************************************/
625 /* Get drawing toolbar visible flag.                                         */
626 /*****************************************************************************/
627 gboolean
628 gl_prefs_model_get_drawing_toolbar_visible (glPrefsModel     *this)
629 {
630         gboolean visible;
631
632         visible = g_settings_get_boolean (this->priv->ui,
633                                           "drawing-toolbar-visible");
634
635         return visible;
636 }
637
638
639 /*****************************************************************************/
640 /* Set property toolbar visible flag.                                        */
641 /*****************************************************************************/
642 void
643 gl_prefs_model_set_property_toolbar_visible (glPrefsModel     *this,
644                                              gboolean          visible)
645 {
646         g_settings_set_boolean (this->priv->ui,
647                                 "property-toolbar-visible",
648                                 visible);
649 }
650
651
652 /*****************************************************************************/
653 /* Get property toolbar visible flag.                                        */
654 /*****************************************************************************/
655 gboolean
656 gl_prefs_model_get_property_toolbar_visible (glPrefsModel     *this)
657 {
658         gboolean visible;
659
660         visible = g_settings_get_boolean (this->priv->ui,
661                                           "property-toolbar-visible");
662
663         return visible;
664 }
665
666
667 /*****************************************************************************/
668 /* Set grid visible flag.                                                    */
669 /*****************************************************************************/
670 void
671 gl_prefs_model_set_grid_visible (glPrefsModel     *this,
672                                  gboolean          visible)
673 {
674         g_settings_set_boolean (this->priv->ui,
675                                 "grid-visible",
676                                 visible);
677 }
678
679
680 /*****************************************************************************/
681 /* Get grid visible flag.                                                    */
682 /*****************************************************************************/
683 gboolean
684 gl_prefs_model_get_grid_visible (glPrefsModel     *this)
685 {
686         gboolean visible;
687
688         visible = g_settings_get_boolean (this->priv->ui,
689                                           "grid-visible");
690
691         return visible;
692 }
693
694
695 /*****************************************************************************/
696 /* Set markup visible flag.                                                  */
697 /*****************************************************************************/
698 void
699 gl_prefs_model_set_markup_visible (glPrefsModel     *this,
700                                    gboolean          visible)
701 {
702         g_settings_set_boolean (this->priv->ui,
703                                 "markup-visible",
704                                 visible);
705 }
706
707
708 /*****************************************************************************/
709 /* Get markup visible flag.                                                  */
710 /*****************************************************************************/
711 gboolean
712 gl_prefs_model_get_markup_visible (glPrefsModel     *this)
713 {
714         gboolean visible;
715
716         visible = g_settings_get_boolean (this->priv->ui,
717                                           "markup-visible");
718
719         return visible;
720 }
721
722
723 /*****************************************************************************/
724 /* Set max recents.                                                          */
725 /*****************************************************************************/
726 void
727 gl_prefs_model_set_max_recents (glPrefsModel     *this,
728                                 gint              max_recents)
729 {
730         g_settings_set_int (this->priv->ui,
731                             "max-recents",
732                             max_recents);
733 }
734
735
736 /*****************************************************************************/
737 /* Get max recents.                                                          */
738 /*****************************************************************************/
739 gint
740 gl_prefs_model_get_max_recents (glPrefsModel     *this)
741 {
742         gint max_recents;
743
744         max_recents = g_settings_get_int (this->priv->ui,
745                                           "max-recents");
746
747         return max_recents;
748 }
749
750
751 /*---------------------------------------------------------------------------*/
752 /* PRIVATE.  Key changed callback.                                           */
753 /*---------------------------------------------------------------------------*/
754 static void 
755 gsettings_changed_cb (glPrefsModel *this)
756 {
757         g_signal_emit (G_OBJECT(this), signals[CHANGED], 0);
758 }
759
760
761
762
763 /*
764  * Local Variables:       -- emacs
765  * mode: C                -- emacs
766  * c-basic-offset: 8      -- emacs
767  * tab-width: 8           -- emacs
768  * indent-tabs-mode: nil  -- emacs
769  * End:                   -- emacs
770  */