diff finch/gntsound.c @ 19160:fbecc35c23bb

Profiles now work with the new layout
author Eric Polino <aluink@pidgin.im>
date Thu, 12 Jul 2007 23:37:35 +0000
parents 67fc276e5332
children 4521c558796e
line wrap: on
line diff
--- a/finch/gntsound.c	Thu Jul 12 21:49:27 2007 +0000
+++ b/finch/gntsound.c	Thu Jul 12 23:37:35 2007 +0000
@@ -281,7 +281,7 @@
 	mute_login_sounds_timeout = purple_timeout_add_seconds(10, unmute_login_sounds_cb, NULL);
 }
 
-static void *
+void *
 finch_sound_get_handle()
 {
 	static int handle;
@@ -619,6 +619,13 @@
 	purple_prefs_set_string(FINCH_PREFS_ROOT "/sound/actprofile",name);
 }
 
+gboolean
+finch_sound_profile_exists(const char *name){
+	gchar * tmp;
+	gboolean ret = purple_prefs_exists(tmp = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s",name));
+	g_free(tmp);
+	return ret;
+}
 
 static void
 save_cb(GntWidget *button, gpointer win)
@@ -775,9 +782,8 @@
 		g_free(boolpref);
 	}
 
-	/* Can someone double check to make sure there isn't a leak in the way I'm keeping
-	 * track of thest profile suggests in the entry.  Thanks!
-	 */
+	gnt_tree_set_selected(GNT_TREE(pref_dialog->profiles),(gchar *)finch_sound_get_active_profile());
+
 	gnt_widget_draw(pref_dialog->window);
 }
 
@@ -794,31 +800,52 @@
 prof_del_cb(GntWidget *button, gpointer null)
 {
 
-	const gchar * profile = gnt_entry_get_text(GNT_ENTRY(pref_dialog->profiles));
-	gchar * pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s",profile);
+	gchar * profile = gnt_tree_get_selection_data(GNT_TREE(pref_dialog->profiles));
+	gchar * pref;
 
 	if(!strcmp(profile,DEFAULT_PROFILE))
 		return;
 
+	pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s",profile);
 	purple_prefs_remove(pref);
 	g_free(pref);
 
-	g_free(pref_dialog->original_profile);
-	pref_dialog->original_profile = g_strdup(DEFAULT_PROFILE);
+	if(!strcmp(pref_dialog->original_profile,profile)){
+		g_free(pref_dialog->original_profile);
+		pref_dialog->original_profile = g_strdup(DEFAULT_PROFILE);
+	}
+
+	gnt_tree_remove(GNT_TREE(pref_dialog->profiles),profile);
 
 	reload_pref_window(DEFAULT_PROFILE);
 }
 
 static void
-prof_add_cb(GntEntry *entry, gpointer null)
+prof_add_cb(GntButton *button, GntEntry * entry)
 {
 	const char * profile = gnt_entry_get_text(entry);
-	
+	GntTreeRow * row;
+	if(!finch_sound_profile_exists(profile)){
+		gpointer key = g_strdup(profile);
+		row = gnt_tree_create_row(GNT_TREE(pref_dialog->profiles),profile);
+		gnt_tree_add_row_after(GNT_TREE(pref_dialog->profiles),key,
+														row,
+														NULL,NULL);
+		gnt_entry_set_text(entry,"");
+		gnt_tree_set_selected(GNT_TREE(pref_dialog->profiles),key);
+	}
+
 	reload_pref_window(profile);
 
 }
 
 static void
+prof_load_cb(GntTree *tree, gpointer oldkey, gpointer newkey, gpointer null)
+{
+	reload_pref_window(newkey);
+}
+
+static void
 cancel_cb(GntButton *button, gpointer win)
 {
 	finch_sound_set_active_profile(pref_dialog->original_profile);
@@ -837,6 +864,7 @@
 	GntWidget *win;
 
 	gint i;
+	GList *itr,*list;
 
 	if(pref_dialog) {
 		gnt_window_present(pref_dialog->window);
@@ -860,6 +888,16 @@
 	box = gnt_vbox_new(FALSE);
 	gnt_box_add_widget(GNT_BOX(box),gnt_label_new_with_format(_("Profiles"),GNT_TEXT_FLAG_BOLD));
 	pref_dialog->profiles = tree = gnt_tree_new();
+	gnt_tree_set_hash_fns(GNT_TREE(tree), g_str_hash, g_str_equal, g_free);
+	gnt_tree_set_compare_func(GNT_TREE(tree),(GCompareFunc)g_ascii_strcasecmp);
+	g_signal_connect(G_OBJECT(tree),"selection-changed",G_CALLBACK(prof_load_cb),NULL);
+
+	itr = list = finch_sound_get_profiles();
+	for(;itr;itr = itr->next){
+		gnt_tree_add_row_after(GNT_TREE(tree),itr->data,gnt_tree_create_row(GNT_TREE(tree),itr->data),NULL,NULL);
+	}
+	g_list_free(list);
+
 	gnt_box_add_widget(GNT_BOX(box),tree);
 
 	pref_dialog->new_profile = entry = gnt_entry_new("");
@@ -867,7 +905,7 @@
 
 	tmpbox = gnt_hbox_new(FALSE);
 	button = gnt_button_new("Add");
-	g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(prof_add_cb),NULL);
+	g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(prof_add_cb),entry);
 	gnt_box_add_widget(GNT_BOX(tmpbox),button);
 	button = gnt_button_new("Delete");
 	g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(prof_del_cb),NULL);