added default dir&format settings
[maemo-recorder] / src / settings.c
1 /*
2  * settings.c
3  * GConf settings
4  * 
5  * Copyright (C) 2006 Nokia Corporation
6  *
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15  * for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  *
21  */
22
23 #include <gtk/gtk.h>
24 #include <hildon-widgets/hildon-caption.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <osso-log.h>
28 #include <hildon-fm/hildon-widgets/hildon-file-chooser-dialog.h>
29
30 #include "maemo-recorder.h"
31 #include "settings.h"
32
33 #define GCONF_PATH                      "/apps/maemo-recorder/settings"
34 #define KEY_DEFAULT_DIR                  GCONF_PATH "/default_dir"
35 #define KEY_DEFAULT_FILTER               GCONF_PATH "/default_filter"
36
37 typedef struct _SettingsPriv SettingsPriv;
38
39 struct _SettingsPriv
40 {
41         GConfClient *gconf;
42         gchar* default_dir;
43         gint default_filter;    
44 };
45
46 SettingsPriv *settings_priv;
47
48 typedef struct _SettingsData SettingsData;
49
50 struct _SettingsData
51 {
52        AppData* appdata;
53        GtkWidget* label;
54        GtkWidget* window;
55        GtkComboBox *format_combobox;    
56 };
57
58 SettingsData *settings_data;
59
60 static gboolean load_settings();
61
62 static void set_default()
63 {
64     gchar* str;
65
66     str = g_strdup_printf("/home/user/MyDocs/.sounds");
67     gconf_client_set_string(
68            settings_priv->gconf,
69            KEY_DEFAULT_DIR,
70            str,
71            NULL);
72     settings_priv->default_dir = str;
73
74     gconf_client_set_int(
75            settings_priv->gconf,
76            KEY_DEFAULT_FILTER,
77            FORMAT_ILBC,
78            NULL);
79     settings_priv->default_filter = FORMAT_ILBC;
80 }
81
82 gint get_default_filter()
83 {
84     load_settings();
85     return settings_priv->default_filter;
86 }
87
88 void set_default_filter( gint filter )
89 {
90         gconf_client_set_int(
91                         settings_priv->gconf,
92                         KEY_DEFAULT_FILTER,
93                         filter,
94                         NULL);
95         settings_priv->default_filter = filter;
96         
97 }
98
99 gchar* get_default_dir()
100 {
101     load_settings();
102     return settings_priv->default_dir;
103 }
104
105 void set_default_dir(gchar* selected)
106 {
107     gconf_client_set_string(
108                         settings_priv->gconf,
109                         KEY_DEFAULT_DIR,
110                         selected,
111                         NULL);
112 }
113
114 static void cb_format_changed(gpointer data)
115 {
116    gint active;
117
118    active = gtk_combo_box_get_active(settings_data->format_combobox);
119    switch (active)
120    {
121         case 0:
122                 settings_priv->default_filter = FORMAT_WAV;
123                 break;
124         case 1:
125                 settings_priv->default_filter = FORMAT_PCMA;
126                 break;
127         case 2:
128                 settings_priv->default_filter = FORMAT_ILBC;
129                 break;
130         default:
131                 break;
132         
133    }
134 }
135
136 static void cb_chdir(gpointer data)
137 {
138     GtkWidget* dialog = NULL;
139     gchar *selected = NULL;
140
141     g_assert(settings_data);
142
143     /* create dialog */
144     dialog = GTK_WIDGET(hildon_file_chooser_dialog_new(
145               GTK_WINDOW(settings_data->window),
146               GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER));
147
148     /* show it */
149     gtk_widget_show_all(dialog);
150
151     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
152     {
153         selected = g_strdup_printf("Default dir: %s", 
154                 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
155         gtk_label_set_text(GTK_LABEL(settings_data->label), selected);
156         settings_priv->default_dir = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
157     }
158
159     gtk_widget_destroy(dialog);
160
161 }
162
163 static gboolean load_settings()
164 {
165     settings_priv->default_dir = gconf_client_get_string( 
166                 settings_priv->gconf,
167                 KEY_DEFAULT_DIR,
168                 NULL);
169
170     settings_priv->default_filter = gconf_client_get_int(
171                 settings_priv->gconf,
172                 KEY_DEFAULT_FILTER,
173                 NULL);
174
175     if ( settings_priv->default_dir && settings_priv->default_filter )
176         return TRUE;
177     else
178         return FALSE;
179     
180 }
181
182 GConfClient *init_settings(gint argc, gchar *argv[])
183 {
184     GError *err = NULL;
185     settings_priv = g_new0(SettingsPriv, 1);
186     settings_data = g_new0(SettingsData, 1);
187     gconf_init(argc, argv, &err);
188     if(err)
189     {
190         ULOG_ERR("Unable to initialize gconf");
191         set_default();
192         return NULL;
193     }
194     settings_priv->gconf = gconf_client_get_default();
195     if(!settings_priv->gconf)
196     {
197         ULOG_ERR("Unable to initialize gconf");
198         set_default();
199         return NULL;
200     }
201
202     gconf_client_add_dir(settings_priv->gconf, GCONF_PATH,
203         GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
204
205     if(!load_settings())
206     {
207         ULOG_ERR("Unable to load all settings");
208         set_default();
209         return settings_priv->gconf;
210     }
211     
212     return settings_priv->gconf;
213 }
214
215 void edit_settings(GtkWidget* widget, AppData *data)
216 {
217         GtkWidget* btn_chdir;
218         GtkWidget* label_def_format;
219         gint res;
220         gchar* str;
221
222         load_settings();
223
224         settings_data->appdata = data;
225         
226         settings_data->window = gtk_dialog_new_with_buttons("Settings", 
227                         GTK_WINDOW(data->mainView),
228                         GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
229                         "OK", RESP_OK,
230                         "Cancel", RESP_CANCEL,
231                         NULL, NULL);
232         
233         settings_data->format_combobox = GTK_COMBO_BOX(gtk_combo_box_new_text());
234         
235         g_signal_connect(G_OBJECT(settings_data->window),
236                         "delete_event",
237                         G_CALLBACK(gtk_widget_destroy),
238                         NULL);
239
240         str = g_strdup_printf("Default dir: %s", get_default_dir());
241         settings_data->label = gtk_label_new(str);
242         label_def_format = gtk_label_new("Default format");
243         
244         btn_chdir = gtk_button_new_with_label("Change dir");
245         
246         g_signal_connect(G_OBJECT(btn_chdir), "clicked", 
247                         G_CALLBACK(cb_chdir),
248                         settings_data);
249         
250         gtk_widget_set_size_request(btn_chdir, 40, 40);
251         
252         gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "WAV");
253         gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "PCM A-law");
254         gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "iLBC");
255         
256         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), settings_data->label, FALSE, FALSE, 0);
257         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), btn_chdir, FALSE, FALSE, 0);
258         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), label_def_format, FALSE, FALSE, 5);
259         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), GTK_WIDGET(settings_data->format_combobox), FALSE, FALSE, 0);
260
261         if (settings_priv->default_filter == FORMAT_ILBC)
262           gtk_combo_box_set_active(settings_data->format_combobox, 2);
263         if (settings_priv->default_filter == FORMAT_WAV)
264           gtk_combo_box_set_active(settings_data->format_combobox, 0);
265         if (settings_priv->default_filter == FORMAT_PCMA)
266           gtk_combo_box_set_active(settings_data->format_combobox, 1);
267
268
269         g_signal_connect(G_OBJECT(settings_data->format_combobox), "changed",
270                        G_CALLBACK(cb_format_changed), settings_data);
271     
272         gtk_widget_show_all(settings_data->window);
273                 
274         res = gtk_dialog_run(GTK_DIALOG(settings_data->window));
275
276         if(res == RESP_OK)
277         {
278                 set_default_dir(settings_priv->default_dir);
279                 set_default_filter(settings_priv->default_filter);
280                 printf("ok");
281         } else {
282                 printf("cancel");
283         }       
284         
285         gtk_widget_destroy(settings_data->window);
286
287 }
288