From 3bda0ace7c841b43e934e0e5f38c75c670761dd7 Mon Sep 17 00:00:00 2001
From: Guillaume Carmel-Archambault
 <guillaume.carmel-archambault@savoirfairelinux.com>
Date: Wed, 30 Jan 2008 17:28:23 -0500
Subject: [PATCH] GTK Ordering codec list settings

---
 sflphone-gtk/src/configwindow.c | 361 +++++++++++++++-----------------
 1 file changed, 164 insertions(+), 197 deletions(-)

diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c
index 223c95f854..5462b3590d 100644
--- a/sflphone-gtk/src/configwindow.c
+++ b/sflphone-gtk/src/configwindow.c
@@ -31,24 +31,25 @@
 /**
  * Local variables
  */
-gboolean  dialogOpen = FALSE;
+gboolean dialogOpen = FALSE;
 
-GtkListStore * accountStore;
-GtkListStore * codecStore;
-GtkListStore * audioManagerStore;
-GtkListStore * outputAudioDeviceManagerStore;
-GtkListStore * inputAudioDeviceManagerStore;
+GtkListStore *accountStore;
+GtkWidget *codecTreeView;		// View used instead of store to get access to selection
+								// instead of keeping selected codec as a variable
+GtkListStore *audioManagerStore;
+GtkListStore *outputAudioDeviceManagerStore;
+GtkListStore *inputAudioDeviceManagerStore;
 
-GtkWidget * addButton;
-GtkWidget * editButton;
-GtkWidget * deleteButton;
-GtkWidget * defaultButton;
-GtkWidget * restoreButton;
+GtkWidget *addButton;
+GtkWidget *editButton;
+GtkWidget *deleteButton;
+GtkWidget *defaultButton;
+GtkWidget *restoreButton;
 
-account_t * selectedAccount;
+GtkWidget *moveUpButton;
+GtkWidget *moveDownButton;
 
-//GtkListStore * rate_store;
-//GtkWidget * combo_box;
+account_t *selectedAccount;
 
 /**
  * Fills the treelist with accounts
@@ -91,10 +92,15 @@ config_window_fill_codec_list()
 {
 	if(dialogOpen)
 	{
+		GtkListStore *codecStore;
 		GtkTreeIter iter;
-		int i;
+		
+		// Get model of view and clear it
+		codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView)));
 		gtk_list_store_clear(codecStore);
 
+		// Insert codecs
+		int i;
 		for(i = 0; i < codec_list_get_size(); i++)
 		{
 			codec_t* c = codec_list_get_nth(i);
@@ -105,9 +111,9 @@ config_window_fill_codec_list()
 				gtk_list_store_set(codecStore, &iter,
 						0, c->is_active,		// Active
 						1, c->name,				// Name
-						2, c->sample_rate,		// Sample rate
-						3, "bandwith",			// Bandwith
-						4, "frequency",			// Frequency
+						2, c->sample_rate,		// Frequency
+						3, "bit rate",			// Bit rate
+						4, "bandwith",			// Bandwith
 						-1);
 			}
 		}
@@ -115,25 +121,13 @@ config_window_fill_codec_list()
 }
 
 /**
- * SEE deprecated
+ * TODO
  */
-/*void
-config_window_fill_rate_list()
+void
+config_window_fill_audio_manager_list()
 {
-  if(dialogOpen)
-  {
-    GtkTreeIter iter;
-    int i=0;
-    gchar** ratelist = (gchar**)dbus_get_sample_rate_list();
-    while(ratelist[i]!=NULL)
-    {
-	printf("%s\n", ratelist[i]);
-        gtk_list_store_append (rate_store, &iter);
-        gtk_list_store_set(rate_store, &iter,0,ratelist[i],-1);
-        i++;
-    }
-  }
-}*/
+	
+}
 
 /**
  * TODO
@@ -223,67 +217,137 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model)
 
 	if(selectedAccount)
 	{
-		gtk_widget_set_sensitive( GTK_WIDGET(editButton), TRUE);
-		gtk_widget_set_sensitive( GTK_WIDGET(deleteButton), TRUE); 
-		gtk_widget_set_sensitive( GTK_WIDGET(defaultButton), TRUE);
+		gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE);
+		gtk_widget_set_sensitive(GTK_WIDGET(deleteButton), TRUE);
+		gtk_widget_set_sensitive(GTK_WIDGET(defaultButton), TRUE);
 	}
 	g_print("select");
 }
 
+/**
+ * Toggle move buttons on if a codec is selected, off elsewise
+ */
 static void
-codec_active_toggled(GtkCellRendererToggle * renderer, gchar * path, GtkListStore * store)
+select_codec(GtkTreeSelection *selection, GtkTreeModel *model)
 {
 	GtkTreeIter iter;
-	GValue val;
+	
+	if(!gtk_tree_selection_get_selected(selection, &model, &iter))
+	{
+		gtk_widget_set_sensitive(GTK_WIDGET(moveUpButton), FALSE);
+		gtk_widget_set_sensitive(GTK_WIDGET(moveDownButton), FALSE);
+	}
+	else
+	{
+		gtk_widget_set_sensitive(GTK_WIDGET(moveUpButton), TRUE);
+		gtk_widget_set_sensitive(GTK_WIDGET(moveDownButton), TRUE);
+	}
 }
 
 /**
- * TODO Change for tree model and tree selection as in precedent function
+ * SEE not working
  */
 static void
-select_codec(GtkTreeSelection * selection, GtkTreeModel * model)
+codec_active_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeView)
 {
-	GtkTreeIter iter;
+/*	GtkTreeIter iter;
+	GtkTreePath *treePath;
+	GtkTreeModel *model;
+	gboolean visible;
+
+	// Get path of clicked codec active toggle box
+	treePath = gtk_tree_path_new_from_string(path);
+	model = gtk_tree_view_get_model(treeView);
+	gtk_tree_model_get_iter(model, &iter, treePath);
+
+	// Get value at iteration
+	gtk_tree_model_get(model, &iter,
+			0, &visible
+			-1);
 	
-	if(!gtk_tree_selection_get_selected(selection, &model, &iter))
-	{
-		return;
-	}
-	//guint item = gtk_combo_box_get_active(wid);
-	/* now we want this selected codec to be used as the preferred codec */
-	/* ie first in the list in the user config */
-	//codec_set_prefered_order(item);
-	//dbus_set_prefered_codec(codec_list_get_nth(0)->name);  
+	visible = !visible;
+	
+	// Toggle active value
+	gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
+			0, visible,
+			-1);
+
+	gtk_tree_path_free(treePath);*/
 }
 
 /**
  * Move codec in list depending on direction and selected codec
  */
 static void
-moveCodec(gboolean moveUp, GtkListStore * codecListStore)
+moveCodec(gboolean moveUp, gpointer data)
 {
-	// TODO
-	printf("Button pressed");
+	GtkTreeIter iter;
+	GtkTreeIter *iter2;
+	GtkTreeView *treeView;
+	GtkTreeModel *model;
+	GtkTreeSelection *selection;
+	GtkTreePath *treePath;
+	gchar *path;
+	
+	// Get view, model and selection of codec store
+	treeView = GTK_TREE_VIEW(data);
+	model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView));
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+	
+	// Find selected iteration and create a copy
+	gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter);
+	iter2 = gtk_tree_iter_copy(&iter);
+	
+	// Find path of iteration
+	path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter);
+	treePath = gtk_tree_path_new_from_string(path);
+
+	// Depending on button direction get new path
+	if(moveUp)
+		gtk_tree_path_prev(treePath);
+	else
+		gtk_tree_path_next(treePath);
+	gtk_tree_model_get_iter(model, &iter, treePath);
+	
+	// Swap iterations if valid
+	if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter))
+		gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2);
+	
+	// Scroll to new position
+	gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0);
+	
+	// Free resources
+	gtk_tree_path_free(treePath);
+	gtk_tree_iter_free(iter2);
+	g_free(path);
+	
+	// TODO Perpetuate changes to the deamon
+	/* Update the gconf key
+	codecs_data = gm_codecs_list_to_gm_conf_list (GTK_WIDGET (data));
+
+	gm_conf_set_string_list (AUDIO_CODECS_KEY "list", codecs_data);
+
+	g_slist_foreach (codecs_data, (GFunc) g_free, NULL);
+	g_slist_free (codecs_data);
+	*/
 }
 
 /**
  * Called from move up codec button signal
  */
-static void
-moveCodecUp(GtkListStore * codecListStore)
+void
+moveCodecUp(GtkButton *button, gpointer data)
 {
-	moveCodec(TRUE, codecListStore);
-	printf("Button pressed");
+	moveCodec(TRUE, data);
 }
 
 /**
- * Called from move up codec button signal
+ * Called from move down codec button signal
  */
 static void
-moveCodecDown(GtkListStore * codecListStore)
+moveCodecDown(GtkButton *button, gpointer data)
 {
-	moveCodec(FALSE, codecListStore);
-	printf("Button pressed");
+	moveCodec(FALSE, data);
 }
 
 /**
@@ -313,6 +377,7 @@ bold_if_default_account(GtkTreeViewColumn *col,
 void
 default_codecs(GtkWidget* widget, gpointer data)
 {
+	GtkListStore *codecStore;
 	int i = 0;
 	int j = 0;
 	gint * new_order;
@@ -343,8 +408,9 @@ default_codecs(GtkWidget* widget, gpointer data)
 		}
 		printf("new_order[%i]=%i\n", i,j);
 		i++;
-	} 
-	gtk_list_store_reorder(codecStore, new_order);  
+	}
+	codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView)));
+	gtk_list_store_reorder(codecStore, new_order);
 }
 
 /**
@@ -353,17 +419,14 @@ default_codecs(GtkWidget* widget, gpointer data)
 GtkWidget*
 create_codec_table()
 {
-	GtkWidget * ret;
-	GtkWidget * scrolledWindow;
-	GtkWidget * buttonBox;
-	GtkWidget * moveUpButton;
-	GtkWidget * moveDownButton;
+	GtkWidget *ret;
+	GtkWidget *scrolledWindow;
+	GtkWidget *buttonBox;
 	
-	GtkWidget * treeView;
-	GtkCellRenderer * renderer;
-	GtkTreeSelection * treeSelection;
-	GtkTreeViewColumn * treeViewColumn;
-	GtkTreeIter iter;
+	GtkListStore *codecStore;
+	GtkCellRenderer *renderer;
+	GtkTreeSelection *treeSelection;
+	GtkTreeViewColumn *treeViewColumn;
 	
 	ret = gtk_hbox_new(FALSE, 10);
 	gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
@@ -376,61 +439,65 @@ create_codec_table()
 	codecStore = gtk_list_store_new(5,
 			G_TYPE_BOOLEAN,		// Active
 			G_TYPE_STRING,		// Name
-			G_TYPE_INT,			// Bit rate
-			G_TYPE_STRING,		// Bandwith
-			G_TYPE_STRING		// Frequency
+			G_TYPE_STRING,		// Frequency
+			G_TYPE_STRING,		// Bit rate
+			G_TYPE_STRING		// Bandwith
 			);
 	
-	treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore));
+	// Create codec tree view with list store
+	codecTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore));
 	
-	treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+	// Get tree selection manager
+	treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(codecTreeView));
 	g_signal_connect(G_OBJECT(treeSelection), "changed",
 			G_CALLBACK (select_codec),
-			codecStore);			// TODO ONLY for disabling or enabling move buttons
+			codecStore);
 	
 	// Active column
 	renderer = gtk_cell_renderer_toggle_new();
 	treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", 0, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
-	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), codecStore);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), codecTreeView);
 	
 	// TODO toggle on clicked
 	
 	// Name column
 	renderer = gtk_cell_renderer_text_new();
 	treeViewColumn = gtk_tree_view_column_new_with_attributes("Name", renderer, "markup", 1, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
 	
 	// Bit rate column
 	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes("Bit rate", renderer, "text", 2, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
+	treeViewColumn = gtk_tree_view_column_new_with_attributes("Frequency", renderer, "text", 2, NULL);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
 	
 	// Bandwith column
 	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes("Bandwith", renderer, "text", 3, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
+	treeViewColumn = gtk_tree_view_column_new_with_attributes("Bitrate", renderer, "text", 3, NULL);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
 	
 	// Frequency column
 	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes("Frequency", renderer, "text", 4, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
+	treeViewColumn = gtk_tree_view_column_new_with_attributes("Bandwidth", renderer, "text", 4, NULL);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
 	
 	g_object_unref(G_OBJECT(codecStore));
-	gtk_container_add(GTK_CONTAINER(scrolledWindow), treeView);
+	gtk_container_add(GTK_CONTAINER(scrolledWindow), codecTreeView);
 	
 	// Create button box
 	buttonBox = gtk_vbox_new(FALSE, 0);
 	gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);
 	gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
 	
-	moveUpButton = gtk_button_new_with_label("Move up");
+	moveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+	gtk_widget_set_sensitive(GTK_WIDGET(moveUpButton), FALSE);
 	gtk_box_pack_start(GTK_BOX(buttonBox), moveUpButton, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(moveUpButton), "clicked", G_CALLBACK(moveCodecUp), codecStore);
+	g_signal_connect(G_OBJECT(moveUpButton), "clicked", G_CALLBACK(moveCodecUp), codecTreeView);
 	
-	moveDownButton = gtk_button_new_with_label("Move down");
+	moveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+	gtk_widget_set_sensitive(GTK_WIDGET(moveDownButton), FALSE);
 	gtk_box_pack_start(GTK_BOX(buttonBox), moveDownButton, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(moveDownButton), "clicked", G_CALLBACK(moveCodecDown), codecStore);
+	g_signal_connect(G_OBJECT(moveDownButton), "clicked", G_CALLBACK(moveCodecDown), codecTreeView);
 	
 	config_window_fill_codec_list();
 
@@ -569,7 +636,6 @@ create_audio_tab ()
 	GtkWidget * codecLabel;
 	GtkWidget * codecBox;
 	
-	GtkWidget * attributeBox;
 	GtkWidget * titleLabel;
 	GtkWidget * comboBox;
 	GtkWidget * refreshButton;
@@ -594,11 +660,12 @@ create_audio_tab ()
 	gtk_widget_show(codecBox);
 	
 	// TODO Create margin instead of column
+	// Also change 3 buttons for one detect button
     
     // Main device widget
 	deviceTable = gtk_table_new(4, 3, FALSE);
 	gtk_table_set_col_spacing(GTK_TABLE(deviceTable), 0, 40);
-	gtk_box_set_spacing(GTK_BOX(deviceTable), 0); 				// SEE GAIM_HIG_BOX_SPACE
+	gtk_box_set_spacing(GTK_BOX(deviceTable), 0);
 	gtk_box_pack_start(GTK_BOX(deviceBox), deviceTable, TRUE, TRUE, 0);
 	gtk_widget_show(deviceTable);
 	
@@ -697,101 +764,6 @@ create_audio_tab ()
 	return ret;
 }
 
-/**
- * Main video tab creation
- * Temporary code that was in audio tab before
- */
-/*GtkWidget*
-create_video_tab ()
-{
-	GtkWidget * ret;
-	GtkWidget * label;
-	GtkWidget * codecBox;
-	GtkWidget * rate_box;
-	//GtkWidget * image; 
-	GtkWidget * hbox1;
-	//GtkTreeIter iter;
-	GtkCellRenderer *renderer;
-
-	ret = gtk_vbox_new(FALSE, 10);
-	gtk_container_set_border_width (GTK_CONTAINER (ret), 10);
-	
-	label = gtk_label_new("Set your video preferences.");
-    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
-    gtk_box_pack_start(GTK_BOX(ret), label, FALSE, FALSE, 0);
-    gtk_widget_show(label);
-	
-	codecBox = gtk_hbutton_box_new();
-	gtk_box_set_spacing(GTK_BOX(codecBox), 10); //GAIM_HIG_BOX_SPACE
-	gtk_button_box_set_layout(GTK_BUTTON_BOX(codecBox), GTK_BUTTONBOX_SPREAD);
-	gtk_box_pack_start(GTK_BOX(ret), codecBox, FALSE, FALSE, 0);
-	gtk_widget_show (codecBox);
- 
-	hbox1 = gtk_label_new("Codec:");
-	gtk_misc_set_alignment(GTK_MISC(hbox1), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(codecBox), hbox1, FALSE, FALSE, 0);
-	gtk_widget_show(hbox1);
-	codec_store = gtk_list_store_new(1, G_TYPE_STRING);
-	
-  	combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL (codec_store));
-	gtk_label_set_mnemonic_widget(GTK_LABEL(hbox1), combo_box);
-	renderer = gtk_cell_renderer_text_new();
-	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), renderer, TRUE);
-	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), renderer, "text",0,NULL);
-	gtk_box_pack_start(GTK_BOX(codecBox), combo_box, FALSE, FALSE,0);
-
-	
-	g_signal_connect (G_OBJECT (combo_box), "changed",
-                        G_CALLBACK (select_codec),
-                        NULL);
-	gtk_widget_show(combo_box);
-
-	restoreButton = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
-	gtk_box_pack_start(GTK_BOX(codecBox), restoreButton, FALSE, FALSE,10);
-	//g_signal_connect(G_OBJECT(restoreButton), "clicked", G_CALLBACK(default_codecs), NULL);
-	gtk_widget_show(restoreButton);
- 		
-	codecBox = gtk_hbutton_box_new();
-	gtk_box_set_spacing(GTK_BOX(codecBox), 10); //GAIM_HIG_BOX_SPACE
-	gtk_button_box_set_layout(GTK_BUTTON_BOX(codecBox), GTK_BUTTONBOX_SPREAD);
-	gtk_box_pack_start(GTK_BOX(ret), codecBox, FALSE, FALSE, 0);
-	gtk_widget_show (codecBox);
- 
-	hbox1 = gtk_label_new("Sample Rate:");
-        gtk_misc_set_alignment(GTK_MISC(hbox1), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(codecBox), hbox1, FALSE, FALSE, 0);
-	gtk_widget_show(hbox1);
-	rate_store = gtk_list_store_new(1, G_TYPE_STRING);
-	
-  	rate_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(rate_store));
-	gtk_label_set_mnemonic_widget(GTK_LABEL(hbox1), rate_box);
-	renderer = gtk_cell_renderer_text_new();
-	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(rate_box), renderer, TRUE);
-	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(rate_box), renderer, "text",0,NULL);
-	gtk_box_pack_start(GTK_BOX(codecBox), rate_box, FALSE, FALSE,0);
-
-	
-	//g_signal_connect (G_OBJECT (combo_box), "changed",
-          //              G_CALLBACK (select_codec),
-            //            NULL);
-	gtk_widget_show(rate_box);
-	restoreButton = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
-	gtk_box_pack_start(GTK_BOX(codecBox), restoreButton, FALSE, FALSE,0);
-	//g_signal_connect(G_OBJECT(restoreButton), "clicked", G_CALLBACK(default_codecs), NULL);
-	gtk_widget_show(restoreButton);
-		
-	
-	gtk_widget_show_all(ret);
-	config_window_fill_codec_list();
-	config_window_fill_rate_list();
-	gtk_combo_box_set_active(GTK_COMBO_BOX(rate_box), 0);
-	//gtk_combo_box_set_active(rate_box, 0);
-
-	return ret;
-}*/
-
 /**
  * Show configuration window with tabs
  */
@@ -831,11 +803,6 @@ show_config_window ()
 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new("Audio Settings"));
 	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
 
-	// Video tab
-/*	tab = create_video_tab();
-	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new("Video Settings"));
-	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
-*/
 	gtk_dialog_run(dialog);
 
 	dialogOpen = FALSE;
-- 
GitLab