settings cleanups
[tunertool] / src / settings.c
1 /* vim: set sts=2 sw=2 et: */
2 /* 
3  * Copyright (C) 2008-2009 Jari Tenhunen <jari.tenhunen@iki.fi>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <gtk/gtk.h>
26 #include <hildon/hildon-caption.h>
27 #include <hildon/hildon-defines.h>
28 #include <hildon/hildon-number-editor.h>
29 #include <hildon/hildon.h>
30
31 #include "settings.h"
32
33 static GConfClient * client = NULL;
34
35 static GConfClient *
36 get_client ()
37 {
38   if (!client)
39     client = gconf_client_get_default ();
40
41   return client;
42
43 }
44
45 gboolean
46 settings_get_display_keepalive (gboolean default_value)
47 {
48   GConfValue * value = NULL;
49   GError * err = NULL;
50   gboolean val = default_value;
51
52   value = gconf_client_get (get_client (), GCONF_KEY_DISPLAY_KEEPALIVE, &err);
53   if (err) {
54     g_error_free (err);
55   }
56
57   if (value) {
58     if (value->type == GCONF_VALUE_BOOL)
59       val = gconf_value_get_bool (value);
60
61     gconf_value_free (value);
62   }
63
64   return val;
65 }
66
67 gboolean
68 settings_set_display_keepalive (gboolean val)
69 {
70   return gconf_client_set_bool (get_client (), GCONF_KEY_DISPLAY_KEEPALIVE, val, NULL);
71 }
72
73 gint
74 settings_get_algorithm (gint default_value)
75 {
76   GConfValue * value = NULL;
77   GError * err = NULL;
78   gint val = default_value;
79
80   value = gconf_client_get (get_client (), GCONF_KEY_ALGORITHM, &err);
81   if (err) {
82     g_error_free (err);
83   }
84
85   if (value) {
86     if (value->type == GCONF_VALUE_INT)
87       val = gconf_value_get_int (value);
88
89     gconf_value_free (value);
90   }
91
92   return val;
93 }
94
95 gboolean
96 settings_set_algorithm (gint value)
97 {
98   return gconf_client_set_int (get_client (), GCONF_KEY_ALGORITHM, value, NULL);
99 }
100
101 gint
102 settings_get_calibration (gint default_value)
103 {
104   GError * err = NULL;
105   gint val;
106
107   val = gconf_client_get_int (get_client (), GCONF_KEY_CALIBRATION, &err);
108   if (err) {
109     val = default_value;
110     g_error_free (err);
111   }
112   if (val == 0)
113     val = default_value;
114
115   return val;
116 }
117
118 gboolean
119 settings_set_calibration (gint value)
120 {
121   return gconf_client_set_int (get_client (), GCONF_KEY_CALIBRATION, value, NULL);
122 }
123
124 gboolean
125 settings_init (GConfClientNotifyFunc func, gpointer user_data)
126 {
127   gconf_client_add_dir (get_client (), GCONF_ROOT, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
128   gconf_client_notify_add (get_client (), GCONF_ROOT, func, user_data, NULL, NULL);
129
130   return TRUE;
131 }
132
133 static void
134 fix_hildon_number_editor (GtkWidget * widget, gpointer data)
135 {
136   if (GTK_IS_EDITABLE (widget)) {
137     gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
138     g_object_set (G_OBJECT (widget), "can-focus", FALSE, NULL);
139   }
140 }
141
142 GtkWidget *
143 calibration_editor_new (gint min, gint max)
144 {
145   GtkWidget *control;
146  
147   control = hildon_number_editor_new (min, max);
148   /* we don't want that ugly cursor there */
149   gtk_container_forall (GTK_CONTAINER (control),
150       (GtkCallback) fix_hildon_number_editor, NULL);
151
152   return control;
153 }
154
155 void
156 settings_dialog_show (GtkWindow * parent)
157 {
158   GtkWidget *dialog;
159   GtkWidget *vbox;
160   GtkWidget *editor = NULL;
161   GtkWidget *control;
162   gint res;
163
164   dialog = gtk_dialog_new_with_buttons("Settings",
165       parent,
166       GTK_DIALOG_MODAL | 
167       GTK_DIALOG_DESTROY_WITH_PARENT | 
168       GTK_DIALOG_NO_SEPARATOR,
169       "Save", GTK_RESPONSE_OK,
170       "Cancel",
171       GTK_RESPONSE_CANCEL,
172       NULL, NULL);
173
174   g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK (gtk_widget_destroy), NULL);
175
176   vbox = gtk_vbox_new (FALSE, HILDON_MARGIN_DEFAULT);
177   gtk_container_set_border_width (GTK_CONTAINER (vbox), HILDON_MARGIN_DEFAULT);
178   gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
179
180   HildonPickerButton *picker = HILDON_PICKER_BUTTON (hildon_picker_button_new (
181         HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_HALFSCREEN_WIDTH, 
182         HILDON_BUTTON_ARRANGEMENT_VERTICAL));
183   hildon_button_set_title (HILDON_BUTTON (picker), "Pitch detection algorithm");
184   HildonTouchSelector *selector = HILDON_TOUCH_SELECTOR (hildon_touch_selector_new_text());
185   hildon_picker_button_set_selector (picker, selector);
186   hildon_touch_selector_append_text (selector, "Simple FFT");
187   hildon_touch_selector_append_text (selector, "Harmonic Product Spectrum");
188   hildon_picker_button_set_active (picker, settings_get_algorithm (DEFAULT_ALGORITHM));
189   gtk_button_set_alignment (GTK_BUTTON (picker), 0.0, 0.5);
190   gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (picker), FALSE, FALSE, 0);
191 #if 0
192   editor = calibration_editor_new (CALIB_MIN, CALIB_MAX);
193   hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (editor), CALIB_DEFAULT);
194   caption = hildon_caption_new (group, "Calibration:",
195       editor, NULL, HILDON_CAPTION_OPTIONAL);
196   gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, 0);
197 #endif
198
199   control = hildon_check_button_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_HALFSCREEN_WIDTH | HILDON_BUTTON_ARRANGEMENT_VERTICAL);
200   gtk_button_set_label (GTK_BUTTON (control), "Keep display on");
201   hildon_check_button_set_active (HILDON_CHECK_BUTTON (control), 
202       settings_get_display_keepalive (DEFAULT_DISPLAY_KEEPALIVE));
203   gtk_box_pack_start (GTK_BOX (vbox), control, FALSE, FALSE, 0);
204
205   gtk_widget_show_all (dialog);
206   res = gtk_dialog_run (GTK_DIALOG (dialog));
207
208   if (res == GTK_RESPONSE_OK) {
209     /* save settings */
210     g_debug ("algorithm: %d", hildon_picker_button_get_active (picker));
211     settings_set_algorithm (hildon_picker_button_get_active (picker));
212     if (editor) {
213       g_debug ("calib: %d", hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (editor)));
214       settings_set_calibration (hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (editor)));
215     }
216     g_debug ("keepalive: %d", hildon_check_button_get_active (HILDON_CHECK_BUTTON (control)));
217     settings_set_display_keepalive (hildon_check_button_get_active (HILDON_CHECK_BUTTON (control)));
218   }
219
220   gtk_widget_destroy (dialog);
221 }
222