added default dir&format settings
[maemo-recorder] / src / settings.c
diff --git a/src/settings.c b/src/settings.c
new file mode 100755 (executable)
index 0000000..9659a55
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * settings.c
+ * GConf settings
+ * 
+ * Copyright (C) 2006 Nokia Corporation
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <gtk/gtk.h>
+#include <hildon-widgets/hildon-caption.h>
+#include <stdlib.h>
+#include <string.h>
+#include <osso-log.h>
+#include <hildon-fm/hildon-widgets/hildon-file-chooser-dialog.h>
+
+#include "maemo-recorder.h"
+#include "settings.h"
+
+#define GCONF_PATH                      "/apps/maemo-recorder/settings"
+#define KEY_DEFAULT_DIR                  GCONF_PATH "/default_dir"
+#define KEY_DEFAULT_FILTER              GCONF_PATH "/default_filter"
+
+typedef struct _SettingsPriv SettingsPriv;
+
+struct _SettingsPriv
+{
+        GConfClient *gconf;
+        gchar* default_dir;
+       gint default_filter;    
+};
+
+SettingsPriv *settings_priv;
+
+typedef struct _SettingsData SettingsData;
+
+struct _SettingsData
+{
+       AppData* appdata;
+       GtkWidget* label;
+       GtkWidget* window;
+       GtkComboBox *format_combobox;   
+};
+
+SettingsData *settings_data;
+
+static gboolean load_settings();
+
+static void set_default()
+{
+    gchar* str;
+
+    str = g_strdup_printf("/home/user/MyDocs/.sounds");
+    gconf_client_set_string(
+           settings_priv->gconf,
+           KEY_DEFAULT_DIR,
+           str,
+           NULL);
+    settings_priv->default_dir = str;
+
+    gconf_client_set_int(
+          settings_priv->gconf,
+          KEY_DEFAULT_FILTER,
+          FORMAT_ILBC,
+          NULL);
+    settings_priv->default_filter = FORMAT_ILBC;
+}
+
+gint get_default_filter()
+{
+    load_settings();
+    return settings_priv->default_filter;
+}
+
+void set_default_filter( gint filter )
+{
+        gconf_client_set_int(
+                        settings_priv->gconf,
+                        KEY_DEFAULT_FILTER,
+                        filter,
+                        NULL);
+        settings_priv->default_filter = filter;
+       
+}
+
+gchar* get_default_dir()
+{
+    load_settings();
+    return settings_priv->default_dir;
+}
+
+void set_default_dir(gchar* selected)
+{
+    gconf_client_set_string(
+                        settings_priv->gconf,
+                        KEY_DEFAULT_DIR,
+                        selected,
+                        NULL);
+}
+
+static void cb_format_changed(gpointer data)
+{
+   gint active;
+
+   active = gtk_combo_box_get_active(settings_data->format_combobox);
+   switch (active)
+   {
+       case 0:
+               settings_priv->default_filter = FORMAT_WAV;
+               break;
+       case 1:
+               settings_priv->default_filter = FORMAT_PCMA;
+               break;
+       case 2:
+               settings_priv->default_filter = FORMAT_ILBC;
+               break;
+       default:
+               break;
+       
+   }
+}
+
+static void cb_chdir(gpointer data)
+{
+    GtkWidget* dialog = NULL;
+    gchar *selected = NULL;
+
+    g_assert(settings_data);
+
+    /* create dialog */
+    dialog = GTK_WIDGET(hildon_file_chooser_dialog_new(
+              GTK_WINDOW(settings_data->window),
+              GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER));
+
+    /* show it */
+    gtk_widget_show_all(dialog);
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
+    {
+        selected = g_strdup_printf("Default dir: %s", 
+               gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
+       gtk_label_set_text(GTK_LABEL(settings_data->label), selected);
+       settings_priv->default_dir = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
+    }
+
+    gtk_widget_destroy(dialog);
+
+}
+
+static gboolean load_settings()
+{
+    settings_priv->default_dir = gconf_client_get_string( 
+                settings_priv->gconf,
+                KEY_DEFAULT_DIR,
+                NULL);
+
+    settings_priv->default_filter = gconf_client_get_int(
+               settings_priv->gconf,
+               KEY_DEFAULT_FILTER,
+               NULL);
+
+    if ( settings_priv->default_dir && settings_priv->default_filter )
+        return TRUE;
+    else
+       return FALSE;
+    
+}
+
+GConfClient *init_settings(gint argc, gchar *argv[])
+{
+    GError *err = NULL;
+    settings_priv = g_new0(SettingsPriv, 1);
+    settings_data = g_new0(SettingsData, 1);
+    gconf_init(argc, argv, &err);
+    if(err)
+    {
+        ULOG_ERR("Unable to initialize gconf");
+        set_default();
+        return NULL;
+    }
+    settings_priv->gconf = gconf_client_get_default();
+    if(!settings_priv->gconf)
+    {
+        ULOG_ERR("Unable to initialize gconf");
+        set_default();
+        return NULL;
+    }
+
+    gconf_client_add_dir(settings_priv->gconf, GCONF_PATH,
+        GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+    if(!load_settings())
+    {
+        ULOG_ERR("Unable to load all settings");
+        set_default();
+        return settings_priv->gconf;
+    }
+    
+    return settings_priv->gconf;
+}
+
+void edit_settings(GtkWidget* widget, AppData *data)
+{
+       GtkWidget* btn_chdir;
+       GtkWidget* label_def_format;
+       gint res;
+       gchar* str;
+
+       load_settings();
+
+       settings_data->appdata = data;
+       
+       settings_data->window = gtk_dialog_new_with_buttons("Settings", 
+                       GTK_WINDOW(data->mainView),
+                       GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
+                       "OK", RESP_OK,
+                       "Cancel", RESP_CANCEL,
+                       NULL, NULL);
+       
+       settings_data->format_combobox = GTK_COMBO_BOX(gtk_combo_box_new_text());
+       
+        g_signal_connect(G_OBJECT(settings_data->window),
+                        "delete_event",
+                        G_CALLBACK(gtk_widget_destroy),
+                        NULL);
+
+       str = g_strdup_printf("Default dir: %s", get_default_dir());
+       settings_data->label = gtk_label_new(str);
+       label_def_format = gtk_label_new("Default format");
+       
+       btn_chdir = gtk_button_new_with_label("Change dir");
+       
+       g_signal_connect(G_OBJECT(btn_chdir), "clicked", 
+                       G_CALLBACK(cb_chdir),
+                       settings_data);
+       
+       gtk_widget_set_size_request(btn_chdir, 40, 40);
+       
+       gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "WAV");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "PCM A-law");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(settings_data->format_combobox), "iLBC");
+       
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), settings_data->label, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), btn_chdir, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), label_def_format, FALSE, FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(settings_data->window)->vbox), GTK_WIDGET(settings_data->format_combobox), FALSE, FALSE, 0);
+
+       if (settings_priv->default_filter == FORMAT_ILBC)
+         gtk_combo_box_set_active(settings_data->format_combobox, 2);
+       if (settings_priv->default_filter == FORMAT_WAV)
+         gtk_combo_box_set_active(settings_data->format_combobox, 0);
+        if (settings_priv->default_filter == FORMAT_PCMA)
+          gtk_combo_box_set_active(settings_data->format_combobox, 1);
+
+
+       g_signal_connect(G_OBJECT(settings_data->format_combobox), "changed",
+                      G_CALLBACK(cb_format_changed), settings_data);
+    
+       gtk_widget_show_all(settings_data->window);
+               
+       res = gtk_dialog_run(GTK_DIALOG(settings_data->window));
+
+       if(res == RESP_OK)
+       {
+               set_default_dir(settings_priv->default_dir);
+               set_default_filter(settings_priv->default_filter);
+               printf("ok");
+       } else {
+               printf("cancel");
+       }       
+       
+        gtk_widget_destroy(settings_data->window);
+
+}
+