3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
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.
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.
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/>.
23 #include "prefs-model.h"
28 #include <gconf/gconf-client.h>
30 #include <libglabels.h>
38 /*========================================================*/
39 /* Private macros and constants. */
40 /*========================================================*/
43 #define BASE_KEY "/apps/glabels"
45 #define PREF_UNITS "/units"
46 #define PREF_DEFAULT_PAGE_SIZE "/default-page-size"
48 #define PREF_DEFAULT_FONT_FAMILY "/default-font-family"
49 #define PREF_DEFAULT_FONT_SIZE "/default-font-size"
50 #define PREF_DEFAULT_FONT_WEIGHT "/default-font-weight"
51 #define PREF_DEFAULT_FONT_ITALIC_FLAG "/default-font-italic-flag"
52 #define PREF_DEFAULT_TEXT_COLOR "/default-text-color"
53 #define PREF_DEFAULT_TEXT_ALIGNMENT "/default-text-alignment"
54 #define PREF_DEFAULT_TEXT_LINE_SPACING "/default-text-line-spacing"
56 #define PREF_DEFAULT_LINE_WIDTH "/default-line-width"
57 #define PREF_DEFAULT_LINE_COLOR "/default-line-color"
59 #define PREF_DEFAULT_FILL_COLOR "/default-fill-color"
61 #define PREF_MAIN_TOOLBAR_VISIBLE "/main-toolbar-visible"
63 #define PREF_DRAWING_TOOLBAR_VISIBLE "/drawing-toolbar-visible"
65 #define PREF_PROPERTY_TOOLBAR_VISIBLE "/property-toolbar-visible"
67 #define PREF_GRID_VISIBLE "/grid-visible"
68 #define PREF_MARKUP_VISIBLE "/markup-visible"
70 #define PREF_MAX_RECENTS "/max-recents"
74 #define DEFAULT_UNITS_STRING_US lgl_units_get_id (LGL_UNITS_INCH)
75 #define DEFAULT_PAGE_SIZE_US "US-Letter"
77 #define DEFAULT_UNITS_STRING_METRIC lgl_units_get_id (LGL_UNITS_MM)
78 #define DEFAULT_PAGE_SIZE_METRIC "A4"
80 #define DEFAULT_FONT_FAMILY "Sans"
81 #define DEFAULT_FONT_SIZE 14.0
82 #define DEFAULT_FONT_WEIGHT_STRING gl_str_util_weight_to_string (PANGO_WEIGHT_NORMAL)
83 #define DEFAULT_FONT_ITALIC_FLAG FALSE
84 #define DEFAULT_TEXT_ALIGN_STRING gl_str_util_align_to_string (PANGO_ALIGN_LEFT)
85 #define DEFAULT_TEXT_COLOR GL_COLOR (0,0,0)
86 #define DEFAULT_TEXT_LINE_SPACING 1.0
88 #define DEFAULT_LINE_WIDTH 1.0
89 #define DEFAULT_LINE_COLOR GL_COLOR_A (0, 0, 0, 255)
91 #define DEFAULT_FILL_COLOR GL_COLOR_A (0, 255, 0, 255)
94 /*========================================================*/
96 /*========================================================*/
98 struct _glPrefsModelPrivate {
100 GConfClient *gconf_client;
110 /*========================================================*/
111 /* Private globals. */
112 /*========================================================*/
114 static guint signals[LAST_SIGNAL] = {0};
117 /*========================================================*/
118 /* Private function prototypes. */
119 /*========================================================*/
121 static void gl_prefs_model_finalize (GObject *object);
123 static void notify_cb (GConfClient *client,
126 glPrefsModel *prefs_model);
128 static gchar *get_string (GConfClient *client,
132 static gboolean get_bool (GConfClient *client,
136 static gint get_int (GConfClient *client,
140 static gdouble get_float (GConfClient *client,
145 /*****************************************************************************/
146 /* Boilerplate object stuff. */
147 /*****************************************************************************/
148 G_DEFINE_TYPE (glPrefsModel, gl_prefs_model, G_TYPE_OBJECT);
152 gl_prefs_model_class_init (glPrefsModelClass *class)
154 GObjectClass *object_class = G_OBJECT_CLASS (class);
156 gl_debug (DEBUG_PREFS, "START");
158 gl_prefs_model_parent_class = g_type_class_peek_parent (class);
160 object_class->finalize = gl_prefs_model_finalize;
163 g_signal_new ("changed",
164 G_OBJECT_CLASS_TYPE (object_class),
166 G_STRUCT_OFFSET (glPrefsModelClass, changed),
168 gl_marshal_VOID__VOID,
172 gl_debug (DEBUG_PREFS, "END");
177 gl_prefs_model_init (glPrefsModel *this)
179 gl_debug (DEBUG_PREFS, "START");
181 this->priv = g_new0 (glPrefsModelPrivate, 1);
183 this->priv->gconf_client = gconf_client_get_default ();
185 g_return_if_fail (this->priv->gconf_client != NULL);
187 gconf_client_add_dir (this->priv->gconf_client,
189 GCONF_CLIENT_PRELOAD_ONELEVEL,
192 gconf_client_notify_add (this->priv->gconf_client,
194 (GConfClientNotifyFunc)notify_cb, this,
197 gl_debug (DEBUG_PREFS, "END");
202 gl_prefs_model_finalize (GObject *object)
204 glPrefsModel *this = GL_PREFS_MODEL (object);
206 gl_debug (DEBUG_PREFS, "START");
208 g_return_if_fail (object && GL_IS_PREFS_MODEL (object));
210 g_object_unref (G_OBJECT(this->priv->gconf_client));
213 G_OBJECT_CLASS (gl_prefs_model_parent_class)->finalize (object);
215 gl_debug (DEBUG_PREFS, "END");
219 /*****************************************************************************/
220 /* New prefs_model object. */
221 /*****************************************************************************/
223 gl_prefs_model_new (void)
227 gl_debug (DEBUG_PREFS, "START");
229 this = GL_PREFS_MODEL (g_object_new (gl_prefs_model_get_type(), NULL));
231 gl_debug (DEBUG_PREFS, "END");
237 /*****************************************************************************/
239 /*****************************************************************************/
241 gl_prefs_model_set_units (glPrefsModel *this,
244 gconf_client_set_string (this->priv->gconf_client,
246 lgl_units_get_id (units),
251 /*****************************************************************************/
253 /*****************************************************************************/
255 gl_prefs_model_get_units (glPrefsModel *this)
258 const gchar *default_units_string;
262 /* Make educated guess about locale default. */
263 pgsize = gtk_paper_size_get_default ();
264 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
266 default_units_string = DEFAULT_UNITS_STRING_US;
270 default_units_string = DEFAULT_UNITS_STRING_METRIC;
273 string = get_string (this->priv->gconf_client,
275 default_units_string);
276 units = lgl_units_from_id (string);
279 /* If invalid, make an educated guess from locale. */
280 if (units == LGL_UNITS_INVALID)
282 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
284 units = LGL_UNITS_INCH;
288 units = LGL_UNITS_MM;
296 /*****************************************************************************/
297 /* Set default page size. */
298 /*****************************************************************************/
300 gl_prefs_model_set_default_page_size (glPrefsModel *this,
301 const gchar *page_size)
303 gconf_client_set_string (this->priv->gconf_client,
304 BASE_KEY PREF_DEFAULT_PAGE_SIZE,
310 /*****************************************************************************/
311 /* Get default page size. */
312 /*****************************************************************************/
314 gl_prefs_model_get_default_page_size (glPrefsModel *this)
317 const gchar *default_page_size;
321 /* Make educated guess about locale default. */
322 pgsize = gtk_paper_size_get_default ();
323 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
325 default_page_size = DEFAULT_PAGE_SIZE_US;
329 default_page_size = DEFAULT_PAGE_SIZE_METRIC;
332 page_size = get_string (this->priv->gconf_client,
333 BASE_KEY PREF_DEFAULT_PAGE_SIZE,
336 /* Proof read the default page size -- it must be a valid id. */
337 /* (For compatability with older versions.) */
338 paper = lgl_db_lookup_paper_from_id (page_size);
339 if ( paper == NULL ) {
341 page_size = g_strdup (DEFAULT_PAGE_SIZE_US);
343 lgl_paper_free (paper);
350 /*****************************************************************************/
351 /* Set default font family. */
352 /*****************************************************************************/
354 gl_prefs_model_set_default_font_family (glPrefsModel *this,
357 gconf_client_set_string (this->priv->gconf_client,
358 BASE_KEY PREF_DEFAULT_FONT_FAMILY,
364 /*****************************************************************************/
365 /* Get default font family. */
366 /*****************************************************************************/
368 gl_prefs_model_get_default_font_family (glPrefsModel *this)
372 family = get_string (this->priv->gconf_client,
373 BASE_KEY PREF_DEFAULT_FONT_FAMILY,
374 DEFAULT_FONT_FAMILY);
380 /*****************************************************************************/
381 /* Set default font size. */
382 /*****************************************************************************/
384 gl_prefs_model_set_default_font_size (glPrefsModel *this,
387 gconf_client_set_float (this->priv->gconf_client,
388 BASE_KEY PREF_DEFAULT_FONT_SIZE,
394 /*****************************************************************************/
395 /* Get default font size. */
396 /*****************************************************************************/
398 gl_prefs_model_get_default_font_size (glPrefsModel *this)
402 size = get_float (this->priv->gconf_client,
403 BASE_KEY PREF_DEFAULT_FONT_SIZE,
410 /*****************************************************************************/
411 /* Set default font weight. */
412 /*****************************************************************************/
414 gl_prefs_model_set_default_font_weight (glPrefsModel *this,
417 gconf_client_set_string (this->priv->gconf_client,
418 BASE_KEY PREF_DEFAULT_FONT_WEIGHT,
419 gl_str_util_weight_to_string(weight),
424 /*****************************************************************************/
425 /* Get default font weight. */
426 /*****************************************************************************/
428 gl_prefs_model_get_default_font_weight (glPrefsModel *this)
433 string = get_string (this->priv->gconf_client,
434 BASE_KEY PREF_DEFAULT_FONT_WEIGHT,
435 DEFAULT_FONT_WEIGHT_STRING);
436 weight = gl_str_util_string_to_weight (string);
443 /*****************************************************************************/
444 /* Set default font italic flag. */
445 /*****************************************************************************/
447 gl_prefs_model_set_default_font_italic_flag (glPrefsModel *this,
448 gboolean italic_flag)
450 gconf_client_set_bool (this->priv->gconf_client,
451 BASE_KEY PREF_DEFAULT_FONT_ITALIC_FLAG,
457 /*****************************************************************************/
458 /* Get default font italic flag. */
459 /*****************************************************************************/
461 gl_prefs_model_get_default_font_italic_flag (glPrefsModel *this)
463 gboolean italic_flag;
465 italic_flag = get_bool (this->priv->gconf_client,
466 BASE_KEY PREF_DEFAULT_FONT_ITALIC_FLAG,
467 DEFAULT_FONT_ITALIC_FLAG);
473 /*****************************************************************************/
474 /* Set default text color. */
475 /*****************************************************************************/
477 gl_prefs_model_set_default_text_color (glPrefsModel *this,
480 gconf_client_set_int (this->priv->gconf_client,
481 BASE_KEY PREF_DEFAULT_TEXT_COLOR,
487 /*****************************************************************************/
488 /* Get default text color. */
489 /*****************************************************************************/
491 gl_prefs_model_get_default_text_color (glPrefsModel *this)
495 color = get_int (this->priv->gconf_client,
496 BASE_KEY PREF_DEFAULT_TEXT_COLOR,
503 /*****************************************************************************/
504 /* Set default text alignment. */
505 /*****************************************************************************/
507 gl_prefs_model_set_default_text_alignment (glPrefsModel *this,
508 PangoAlignment alignment)
510 gconf_client_set_string (this->priv->gconf_client,
511 BASE_KEY PREF_DEFAULT_TEXT_ALIGNMENT,
512 gl_str_util_align_to_string(alignment),
517 /*****************************************************************************/
518 /* Get default text alignment. */
519 /*****************************************************************************/
521 gl_prefs_model_get_default_text_alignment (glPrefsModel *this)
524 PangoAlignment alignment;
526 string = get_string (this->priv->gconf_client,
527 BASE_KEY PREF_DEFAULT_TEXT_ALIGNMENT,
528 DEFAULT_TEXT_ALIGN_STRING);
529 alignment = gl_str_util_string_to_align (string);
536 /*****************************************************************************/
537 /* Set default text line spacing. */
538 /*****************************************************************************/
540 gl_prefs_model_set_default_text_line_spacing (glPrefsModel *this,
543 gconf_client_set_float (this->priv->gconf_client,
544 BASE_KEY PREF_DEFAULT_TEXT_LINE_SPACING,
550 /*****************************************************************************/
551 /* Get default text line spacing. */
552 /*****************************************************************************/
554 gl_prefs_model_get_default_text_line_spacing (glPrefsModel *this)
558 spacing = get_float (this->priv->gconf_client,
559 BASE_KEY PREF_DEFAULT_TEXT_LINE_SPACING,
560 DEFAULT_TEXT_LINE_SPACING);
566 /*****************************************************************************/
567 /* Set default line width. */
568 /*****************************************************************************/
570 gl_prefs_model_set_default_line_width (glPrefsModel *this,
573 gconf_client_set_float (this->priv->gconf_client,
574 BASE_KEY PREF_DEFAULT_LINE_WIDTH,
580 /*****************************************************************************/
581 /* Get default line width. */
582 /*****************************************************************************/
584 gl_prefs_model_get_default_line_width (glPrefsModel *this)
588 width = get_float (this->priv->gconf_client,
589 BASE_KEY PREF_DEFAULT_LINE_WIDTH,
596 /*****************************************************************************/
597 /* Set default line color. */
598 /*****************************************************************************/
600 gl_prefs_model_set_default_line_color (glPrefsModel *this,
603 gconf_client_set_int (this->priv->gconf_client,
604 BASE_KEY PREF_DEFAULT_LINE_COLOR,
610 /*****************************************************************************/
611 /* Get default line color. */
612 /*****************************************************************************/
614 gl_prefs_model_get_default_line_color (glPrefsModel *this)
618 color = get_int (this->priv->gconf_client,
619 BASE_KEY PREF_DEFAULT_LINE_COLOR,
626 /*****************************************************************************/
627 /* Set default fill color. */
628 /*****************************************************************************/
630 gl_prefs_model_set_default_fill_color (glPrefsModel *this,
633 gconf_client_set_int (this->priv->gconf_client,
634 BASE_KEY PREF_DEFAULT_FILL_COLOR,
640 /*****************************************************************************/
641 /* Get default fill color. */
642 /*****************************************************************************/
644 gl_prefs_model_get_default_fill_color (glPrefsModel *this)
648 color = get_int (this->priv->gconf_client,
649 BASE_KEY PREF_DEFAULT_FILL_COLOR,
656 /*****************************************************************************/
657 /* Set main toolbar visible flag. */
658 /*****************************************************************************/
660 gl_prefs_model_set_main_toolbar_visible (glPrefsModel *this,
663 gconf_client_set_bool (this->priv->gconf_client,
664 BASE_KEY PREF_MAIN_TOOLBAR_VISIBLE,
670 /*****************************************************************************/
671 /* Get main toolbar visible flag. */
672 /*****************************************************************************/
674 gl_prefs_model_get_main_toolbar_visible (glPrefsModel *this)
678 visible = get_bool (this->priv->gconf_client,
679 BASE_KEY PREF_MAIN_TOOLBAR_VISIBLE,
686 /*****************************************************************************/
687 /* Set drawing toolbar visible flag. */
688 /*****************************************************************************/
690 gl_prefs_model_set_drawing_toolbar_visible (glPrefsModel *this,
693 gconf_client_set_bool (this->priv->gconf_client,
694 BASE_KEY PREF_DRAWING_TOOLBAR_VISIBLE,
700 /*****************************************************************************/
701 /* Get drawing toolbar visible flag. */
702 /*****************************************************************************/
704 gl_prefs_model_get_drawing_toolbar_visible (glPrefsModel *this)
708 visible = get_bool (this->priv->gconf_client,
709 BASE_KEY PREF_DRAWING_TOOLBAR_VISIBLE,
716 /*****************************************************************************/
717 /* Set property toolbar visible flag. */
718 /*****************************************************************************/
720 gl_prefs_model_set_property_toolbar_visible (glPrefsModel *this,
723 gconf_client_set_bool (this->priv->gconf_client,
724 BASE_KEY PREF_PROPERTY_TOOLBAR_VISIBLE,
730 /*****************************************************************************/
731 /* Get property toolbar visible flag. */
732 /*****************************************************************************/
734 gl_prefs_model_get_property_toolbar_visible (glPrefsModel *this)
738 visible = get_bool (this->priv->gconf_client,
739 BASE_KEY PREF_PROPERTY_TOOLBAR_VISIBLE,
746 /*****************************************************************************/
747 /* Set grid visible flag. */
748 /*****************************************************************************/
750 gl_prefs_model_set_grid_visible (glPrefsModel *this,
753 gconf_client_set_bool (this->priv->gconf_client,
754 BASE_KEY PREF_GRID_VISIBLE,
760 /*****************************************************************************/
761 /* Get grid visible flag. */
762 /*****************************************************************************/
764 gl_prefs_model_get_grid_visible (glPrefsModel *this)
768 visible = get_bool (this->priv->gconf_client,
769 BASE_KEY PREF_GRID_VISIBLE,
776 /*****************************************************************************/
777 /* Set markup visible flag. */
778 /*****************************************************************************/
780 gl_prefs_model_set_markup_visible (glPrefsModel *this,
783 gconf_client_set_bool (this->priv->gconf_client,
784 BASE_KEY PREF_MARKUP_VISIBLE,
790 /*****************************************************************************/
791 /* Get markup visible flag. */
792 /*****************************************************************************/
794 gl_prefs_model_get_markup_visible (glPrefsModel *this)
798 visible = get_bool (this->priv->gconf_client,
799 BASE_KEY PREF_MARKUP_VISIBLE,
806 /*****************************************************************************/
807 /* Set max recents. */
808 /*****************************************************************************/
810 gl_prefs_model_set_max_recents (glPrefsModel *this,
813 gconf_client_set_int (this->priv->gconf_client,
814 BASE_KEY PREF_MAX_RECENTS,
820 /*****************************************************************************/
821 /* Get max recents. */
822 /*****************************************************************************/
824 gl_prefs_model_get_max_recents (glPrefsModel *this)
828 max_recents = get_int (this->priv->gconf_client,
829 BASE_KEY PREF_MAX_RECENTS,
836 /*---------------------------------------------------------------------------*/
837 /* PRIVATE. Key changed callback. */
838 /*---------------------------------------------------------------------------*/
840 notify_cb (GConfClient *client,
845 gl_debug (DEBUG_PREFS, "Key was changed: %s", entry->key);
847 g_signal_emit (G_OBJECT(this), signals[CHANGED], 0);
851 /*---------------------------------------------------------------------------*/
852 /* PRIVATE. Utilities to get values with defaults. */
853 /*---------------------------------------------------------------------------*/
855 get_string (GConfClient *client,
861 val = gconf_client_get_string (client, key, NULL);
869 return def ? g_strdup (def) : NULL;
876 get_bool (GConfClient *client,
883 val = gconf_client_get (client, key, NULL);
887 if ( val->type == GCONF_VALUE_BOOL ) {
888 retval = gconf_value_get_bool (val);
893 gconf_value_free (val);
906 get_int (GConfClient *client,
913 val = gconf_client_get (client, key, NULL);
917 if ( val->type == GCONF_VALUE_INT) {
918 retval = gconf_value_get_int(val);
923 gconf_value_free (val);
936 get_float (GConfClient *client,
943 val = gconf_client_get (client, key, NULL);
947 if ( val->type == GCONF_VALUE_FLOAT ) {
948 retval = gconf_value_get_float(val);
953 gconf_value_free (val);
968 * Local Variables: -- emacs
970 * c-basic-offset: 8 -- emacs
971 * tab-width: 8 -- emacs
972 * indent-tabs-mode: nil -- emacs