4afcc7397aaf4c651f877c77ce4b441f151c535d
[maemo-recorder] / src / settings.c
1 /* vim: set sts=4 sw=4 et: */
2 /*
3  * settings.c
4  * GConf settings
5  * 
6  * Copyright (C) 2006 Nokia Corporation
7  *
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16  * for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  *
22  */
23
24 #include <gtk/gtk.h>
25 #include <glib/gi18n-lib.h>
26 #include <locale.h>
27 #include <hildon/hildon-defines.h>
28 #include <hildon/hildon-caption.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <osso-log.h>
32 #include <hildon-fm-2/hildon/hildon-file-chooser-dialog.h>
33
34 #include "maemo-recorder.h"
35 #include "settings.h"
36
37 #define GCONF_PATH          "/apps/maemo-recorder/settings"
38 #define KEY_DEFAULT_DIR     GCONF_PATH "/default_dir"
39 #define KEY_DEFAULT_FILTER  GCONF_PATH "/default_filter"
40
41 typedef struct _SettingsPriv SettingsPriv;
42
43 struct _SettingsPriv
44 {
45     GConfClient *gconf;
46     gchar *default_dir;
47     gint default_filter;
48 };
49
50 static SettingsPriv *settings_priv;
51
52 typedef struct _SettingsData SettingsData;
53
54 struct _SettingsData
55 {
56     AppData *appdata;
57     GtkWidget *dir_entry;
58     GtkWidget *window;
59     GtkWidget *format_combobox;
60 };
61
62 static SettingsData *settings_data;
63
64 static gboolean load_settings(void);
65
66 static void
67 reset_defaults()
68 {
69     gchar *str;
70
71     str = g_strdup_printf("/home/user/MyDocs/.sounds");
72     gconf_client_set_string(settings_priv->gconf, KEY_DEFAULT_DIR, str, NULL);
73     g_free(settings_priv->default_dir);
74     settings_priv->default_dir = str;
75
76     gconf_client_set_int(settings_priv->gconf,
77                          KEY_DEFAULT_FILTER, FORMAT_WAV, NULL);
78     settings_priv->default_filter = FORMAT_WAV;
79 }
80
81 gint
82 get_default_filter()
83 {
84     load_settings();
85     return settings_priv->default_filter;
86 }
87
88 void
89 set_default_filter(gint filter)
90 {
91     gconf_client_set_int(settings_priv->gconf,
92                          KEY_DEFAULT_FILTER, filter, NULL);
93     settings_priv->default_filter = filter;
94
95 }
96
97 gchar *
98 get_default_dir()
99 {
100     load_settings();
101     return settings_priv->default_dir;
102 }
103
104 void
105 set_default_dir(gchar * selected)
106 {
107     gconf_client_set_string(settings_priv->gconf,
108                             KEY_DEFAULT_DIR, selected, NULL);
109 }
110
111 static void
112 cb_format_changed(gpointer data)
113 {
114     gint active;
115
116     active =
117         gtk_combo_box_get_active(GTK_COMBO_BOX
118                                  (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 static void
136 cb_chdir(gpointer data)
137 {
138     GtkWidget *dialog = NULL;
139
140     g_assert(settings_data);
141
142     /* create dialog */
143     dialog =
144         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         g_free(settings_priv->default_dir);
154         settings_priv->default_dir =
155             g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
156         gtk_label_set_text(GTK_LABEL(settings_data->dir_entry),
157                            settings_priv->default_dir);
158     }
159
160     gtk_widget_destroy(dialog);
161
162 }
163
164 static gboolean
165 load_settings()
166 {
167     g_free(settings_priv->default_dir);
168     settings_priv->default_dir = gconf_client_get_string(settings_priv->gconf,
169                                                          KEY_DEFAULT_DIR,
170                                                          NULL);
171
172     settings_priv->default_filter = gconf_client_get_int(settings_priv->gconf,
173                                                          KEY_DEFAULT_FILTER,
174                                                          NULL);
175
176     if (settings_priv->default_dir && settings_priv->default_filter)
177         return TRUE;
178     else
179         return FALSE;
180
181 }
182
183 GConfClient *
184 settings_init(gint argc, gchar * argv[])
185 {
186     GError *err = NULL;
187
188     settings_priv = g_new0(SettingsPriv, 1);
189     settings_data = g_new0(SettingsData, 1);
190
191     gconf_init(argc, argv, &err);
192
193     if (err)
194     {
195         ULOG_ERR("Unable to initialize gconf");
196         reset_defaults();
197         return NULL;
198     }
199
200     settings_priv->gconf = gconf_client_get_default();
201
202     if (!settings_priv->gconf)
203     {
204         ULOG_ERR("Unable to initialize gconf");
205         reset_defaults();
206         return NULL;
207     }
208
209     gconf_client_add_dir(settings_priv->gconf, GCONF_PATH,
210                          GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
211
212     if (!load_settings())
213     {
214         ULOG_ERR("Unable to load all settings");
215         reset_defaults();
216         return settings_priv->gconf;
217     }
218
219     return settings_priv->gconf;
220 }
221
222 void
223 settings_edit(GtkWidget * widget, AppData * data)
224 {
225     GtkWidget *vbox;
226     GtkWidget *btn_chdir;
227     GtkWidget *alignment;
228     GtkWidget *caption;
229     GtkSizeGroup *group;
230     gint res;
231
232     load_settings();
233
234     settings_data->appdata = data;
235
236     settings_data->window = gtk_dialog_new_with_buttons(_("Settings"),
237                                                         GTK_WINDOW(data->
238                                                                    mainView),
239                                                         GTK_DIALOG_MODAL |
240                                                         GTK_DIALOG_DESTROY_WITH_PARENT
241                                                         |
242                                                         GTK_DIALOG_NO_SEPARATOR,
243                                                         _("OK"),
244                                                         GTK_RESPONSE_OK,
245                                                         _("Cancel"),
246                                                         GTK_RESPONSE_CANCEL,
247                                                         NULL, NULL);
248
249     g_signal_connect(G_OBJECT(settings_data->window),
250                      "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
251
252     group = GTK_SIZE_GROUP(gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL));
253     vbox = gtk_vbox_new(FALSE, HILDON_MARGIN_DEFAULT);
254     gtk_container_set_border_width(GTK_CONTAINER(vbox),
255                                    HILDON_MARGIN_DEFAULT);
256     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(settings_data->window)->vbox),
257                       vbox);
258
259     /* with the format combo on top and directory thing at the bottom it looks cleaner */
260
261     /* format combo */
262     settings_data->format_combobox = gtk_combo_box_new_text();
263
264     gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox),
265                               FORMAT_NAME_WAV);
266     gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox),
267                               FORMAT_NAME_PCMA);
268     gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox),
269                               FORMAT_NAME_ILBC);
270
271     switch (settings_priv->default_filter)
272     {
273         case FORMAT_WAV:
274             gtk_combo_box_set_active(GTK_COMBO_BOX
275                                      (settings_data->format_combobox), 0);
276             break;
277
278         case FORMAT_PCMA:
279             gtk_combo_box_set_active(GTK_COMBO_BOX
280                                      (settings_data->format_combobox), 1);
281             break;
282
283         case FORMAT_ILBC:
284         default:
285             gtk_combo_box_set_active(GTK_COMBO_BOX
286                                      (settings_data->format_combobox), 2);
287             break;
288     }
289
290     g_signal_connect(G_OBJECT(settings_data->format_combobox), "changed",
291                      G_CALLBACK(cb_format_changed), settings_data);
292
293     caption = hildon_caption_new(group, _("Default recording format:"),
294                                  settings_data->format_combobox, NULL,
295                                  HILDON_CAPTION_OPTIONAL);
296
297     gtk_box_pack_start(GTK_BOX(vbox), caption, FALSE, FALSE, 0);
298
299     /* save directory */
300     /* GtkEntry looks worse because the text get ellipsized */
301     settings_data->dir_entry = gtk_label_new(get_default_dir());
302
303     /*
304     gtk_editable_set_editable(GTK_EDITABLE(settings_data->dir_entry), FALSE);
305
306     gtk_entry_set_text(GTK_ENTRY(settings_data->dir_entry), get_default_dir());
307     */
308
309     /* In maemo world it seems to "folder", not "directory" =( */
310     caption = hildon_caption_new(group, _("Default save folder:"),
311                                  settings_data->dir_entry, NULL,
312                                  HILDON_CAPTION_OPTIONAL);
313
314     gtk_box_pack_start(GTK_BOX(vbox), caption, FALSE, FALSE, 0);
315
316     /* browse button */
317     btn_chdir = gtk_button_new_with_label(_("Browse"));
318     alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0);
319
320     gtk_container_add(GTK_CONTAINER(alignment), btn_chdir);
321     gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
322
323     g_signal_connect(G_OBJECT(btn_chdir), "clicked",
324                      G_CALLBACK(cb_chdir), settings_data);
325
326     /*
327     gtk_widget_set_size_request(btn_chdir, 40, 40);
328     */
329
330     gtk_widget_show_all(settings_data->window);
331     res = gtk_dialog_run(GTK_DIALOG(settings_data->window));
332
333     if (res == GTK_RESPONSE_OK)
334     {
335         set_default_dir(settings_priv->default_dir);
336         set_default_filter(settings_priv->default_filter);
337         ULOG_DEBUG("ok");
338     }
339     else
340     {
341         ULOG_DEBUG("cancel");
342     }
343
344     gtk_widget_destroy(settings_data->window);
345 }