diff audacious/equalizer.c @ 2215:0264fabf471d trunk

[svn] equalizer.c: port from GtkCTree to GtkTreeView. Patch by external contributer Michael Farber <01mf02 -at- gmail.com>
author kiyoshi
date Tue, 26 Dec 2006 02:36:33 -0800
parents 73aec9382028
children a14a871be06b
line wrap: on
line diff
--- a/audacious/equalizer.c	Mon Dec 25 14:50:15 2006 -0800
+++ b/audacious/equalizer.c	Tue Dec 26 02:36:33 2006 -0800
@@ -68,9 +68,9 @@
 static GtkWidget *equalizerwin_load_window = NULL;
 static GtkWidget *equalizerwin_load_auto_window = NULL;
 static GtkWidget *equalizerwin_save_window = NULL;
-static GtkWidget *equalizerwin_save_entry;
+static GtkWidget *equalizerwin_save_entry = NULL;
 static GtkWidget *equalizerwin_save_auto_window = NULL;
-static GtkWidget *equalizerwin_save_auto_entry;
+static GtkWidget *equalizerwin_save_auto_entry = NULL;
 static GtkWidget *equalizerwin_delete_window = NULL;
 static GtkWidget *equalizerwin_delete_auto_window = NULL;
 
@@ -1157,6 +1157,50 @@
     return list;
 }
 
+static void
+equalizerwin_delete_selected_presets(GtkTreeView *view, gchar *filename)
+{
+	gchar *text;
+
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model = gtk_tree_view_get_model(view);
+
+	/*
+	 * first we are making a list of the selected rows, then we convert this
+	 * list into a list of GtkTreeRowReferences, so that when you delete an
+	 * item you can still access the other items
+	 * finally we iterate through all GtkTreeRowReferences, convert them to
+	 * GtkTreeIters and delete those one after the other
+	 */
+
+	GList *list = gtk_tree_selection_get_selected_rows(selection, &model);
+	GList *rrefs = NULL;
+	GList *litr;
+
+	for (litr = list; litr; litr = litr->next)
+	{
+		GtkTreePath *path = litr->data;
+		rrefs = g_list_append(rrefs, gtk_tree_row_reference_new(model, path));
+	}
+
+	for (litr = rrefs; litr; litr = litr->next)
+	{
+		GtkTreeRowReference *ref = litr->data;
+		GtkTreePath *path = gtk_tree_row_reference_get_path(ref);
+		GtkTreeIter iter;
+		gtk_tree_model_get_iter(model, &iter, path);
+
+		gtk_tree_model_get(model, &iter, 0, &text, -1);
+
+		if (filename == "eq.preset")
+			equalizer_presets = equalizerwin_delete_preset(equalizer_presets, text, filename);
+		else if (filename == "eq.auto_preset")
+			equalizer_auto_presets = equalizerwin_delete_preset(equalizer_auto_presets, text, filename);
+
+		gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+	}
+}
+
 
 static GList *
 import_winamp_eqf(VFSFile * file)
@@ -1245,79 +1289,66 @@
 }
 
 static void
-equalizerwin_save_select(GtkCList * clist, gint row,
-                         gint column, GdkEventButton * event, gpointer data)
+equalizerwin_save_select(GtkTreeView *treeview, GtkTreePath *path,
+						 GtkTreeViewColumn *col, gpointer data)
 {
     gchar *text;
 
-    gtk_clist_get_text(clist, row, 0, &text);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_entry), text);
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_save_ok(NULL, NULL);
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_entry), text);
+			equalizerwin_save_ok(NULL, NULL);
 
+			g_free(text);
+		}
+	}
 }
 
 static void
-equalizerwin_load_ok(GtkWidget * widget, gpointer data)
+equalizerwin_load_ok(GtkWidget *widget, gpointer data)
 {
     gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
+
+	GtkTreeView* view = GTK_TREE_VIEW(data);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_presets, text);
-    }
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			equalizerwin_load_preset(equalizer_presets, text);
+
+			g_free(text);
+		}
+	}
     gtk_widget_destroy(equalizerwin_load_window);
 }
 
 static void
-equalizerwin_load_apply(GtkWidget * widget, gpointer data)
+equalizerwin_load_select(GtkTreeView *treeview, GtkTreePath *path,
+						 GtkTreeViewColumn *col, gpointer data)
 {
-    gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
-
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_presets, text);
-    }
-}
-
-
-static void
-equalizerwin_load_select(GtkCList * widget, gint row,
-                         gint column, GdkEventButton * event, gpointer data)
-{
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_load_ok(NULL, widget);
+	equalizerwin_load_ok(NULL, treeview);
 }
 
 static void
-equalizerwin_delete_delete(GtkWidget * widget, gpointer data)
+equalizerwin_delete_delete(GtkWidget *widget, gpointer data)
 {
-    gchar *text;
-    GList *list, *next;
-    GtkCList *clist = GTK_CLIST(data);
-
-    g_return_if_fail(clist != NULL);
-
-    list = clist->selection;
-    gtk_clist_freeze(clist);
-    while (list) {
-        next = g_list_next(list);
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(list->data), 0, &text);
-        equalizer_auto_presets =
-            equalizerwin_delete_preset(equalizer_presets, text, "eq.preset");
-        gtk_clist_remove(clist, GPOINTER_TO_INT(list->data));
-        list = next;
-    }
-    gtk_clist_thaw(clist);
+	equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.preset");
 }
 
 static void
-equalizerwin_save_auto_ok(GtkWidget * widget, gpointer data)
+equalizerwin_save_auto_ok(GtkWidget *widget, gpointer data)
 {
     const gchar *text;
 
@@ -1330,64 +1361,62 @@
 }
 
 static void
-equalizerwin_save_auto_select(GtkCList * clist, gint row,
-                              gint column,
-                              GdkEventButton * event, gpointer data)
+equalizerwin_save_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+							  GtkTreeViewColumn *col, gpointer data)
 {
     gchar *text;
 
-    gtk_clist_get_text(clist, row, 0, &text);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry), text);
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_save_auto_ok(NULL, NULL);
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry), text);
+			equalizerwin_save_auto_ok(NULL, NULL);
 
+			g_free(text);
+		}
+	}
 }
 
 static void
-equalizerwin_load_auto_ok(GtkWidget * widget, gpointer data)
+equalizerwin_load_auto_ok(GtkWidget *widget, gpointer data)
 {
     gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
+
+	GtkTreeView *view = GTK_TREE_VIEW(data);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_auto_presets, text);
-    }
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			equalizerwin_load_preset(equalizer_auto_presets, text);
+
+			g_free(text);
+		}
+	}
     gtk_widget_destroy(equalizerwin_load_auto_window);
 }
 
 static void
-equalizerwin_load_auto_select(GtkWidget * widget, gint row,
-                              gint column,
-                              GdkEventButton * event, gpointer data)
+equalizerwin_load_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+							  GtkTreeViewColumn *col, gpointer data)
 {
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_load_auto_ok(NULL, widget);
+	equalizerwin_load_auto_ok(NULL, treeview);
 }
 
 static void
-equalizerwin_delete_auto_delete(GtkWidget * widget, gpointer data)
+equalizerwin_delete_auto_delete(GtkWidget *widget, gpointer data)
 {
-    gchar *text;
-    GList *list, *next;
-    GtkCList *clist = GTK_CLIST(data);
-
-    g_return_if_fail(clist != NULL);
-
-    list = clist->selection;
-    gtk_clist_freeze(clist);
-    while (list) {
-        next = g_list_next(list);
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(list->data), 0, &text);
-        equalizer_auto_presets =
-            equalizerwin_delete_preset(equalizer_auto_presets, text,
-                                       "eq.auto_preset");
-        gtk_clist_remove(clist, GPOINTER_TO_INT(list->data));
-        list = next;
-    }
-    gtk_clist_thaw(clist);
+	equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.auto_preset");
 }
 
 
@@ -1585,20 +1614,26 @@
 
 
 static GtkWidget *
-equalizerwin_create_list_window(GList * preset_list,
-                                const gchar * title,
-                                GtkWidget ** window,
+equalizerwin_create_list_window(GList *preset_list,
+                                const gchar *title,
+                                GtkWidget **window,
                                 GtkSelectionMode sel_mode,
-                                GtkWidget ** entry,
-                                const gchar * btn2_stock_name,
-                                const gchar * btn1_stock_name,
-                                GCallback btn2_func,
+                                GtkWidget **entry,
+                                const gchar *action_name,
+                                GCallback action_func,
                                 GCallback select_row_func)
 {
-    GtkWidget *vbox, *scrolled_window, *bbox, *btn1, *btn2, *btn3, *clist;
-    gchar *preset_text[1];
+    GtkWidget *vbox, *scrolled_window, *bbox, *button_cancel, *button_action, *view;
     GList *node;
 
+	GtkListStore *store;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	GtkCellRenderer *renderer;
+	GtkTreeSelection *selection;
+
+
+
     *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(*window), title);
     gtk_window_set_type_hint(GTK_WINDOW(*window), GDK_WINDOW_TYPE_HINT_DIALOG);
@@ -1617,27 +1652,39 @@
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
-    preset_text[0] = _("Presets");
-    clist = gtk_clist_new_with_titles(1, preset_text);
-    if (select_row_func)
-        g_signal_connect(clist, "select_row",
-                         G_CALLBACK(select_row_func), NULL);
-    gtk_clist_column_titles_passive(GTK_CLIST(clist));
-    gtk_clist_set_selection_mode(GTK_CLIST(clist), sel_mode);
+
+	/* fill the store with the names of all available presets */
+	store = gtk_list_store_new(1, G_TYPE_STRING);
+	for (node = preset_list; node; node = g_list_next(node))
+	{
+		gtk_list_store_append(store, &iter);
+		gtk_list_store_set(store, &iter,
+						   0, ((EqualizerPreset*)node->data)->name,
+						   -1);
+	}
+	model = GTK_TREE_MODEL(store);
+
 
-    for (node = preset_list; node; node = g_list_next(node)) {
-        gtk_clist_append(GTK_CLIST(clist),
-                         &((EqualizerPreset *) node->data)->name);
-    }
-    gtk_clist_set_compare_func(GTK_CLIST(clist), equalizerwin_list_sort_func);
-    gtk_clist_sort(GTK_CLIST(clist));
+	view = gtk_tree_view_new();
+	renderer = gtk_cell_renderer_text_new();
+	gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1,
+												_("Presets"), renderer,
+												"text", 0, NULL);
+	gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
+	g_object_unref(model);
 
-    gtk_container_add(GTK_CONTAINER(scrolled_window), clist);
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+	gtk_tree_selection_set_mode(selection, sel_mode);
+
+
+
+
+	gtk_container_add(GTK_CONTAINER(scrolled_window), view);
     gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
 
     if (entry) {
         *entry = gtk_entry_new();
-        g_signal_connect(*entry, "activate", btn2_func, NULL);
+        g_signal_connect(*entry, "activate", action_func, NULL);
         gtk_box_pack_start(GTK_BOX(vbox), *entry, FALSE, FALSE, 0);
     }
 
@@ -1646,19 +1693,23 @@
     gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
     gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
 
-    btn1 = gtk_button_new_from_stock(btn1_stock_name);
-    g_signal_connect_swapped(btn1, "clicked",
+    button_cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    g_signal_connect_swapped(button_cancel, "clicked",
                              G_CALLBACK(gtk_widget_destroy),
                              GTK_OBJECT(*window));
-    gtk_box_pack_start(GTK_BOX(bbox), btn1, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(bbox), button_cancel, TRUE, TRUE, 0);
+
+    button_action = gtk_button_new_from_stock(action_name);
+    g_signal_connect(button_action, "clicked", G_CALLBACK(action_func), view);
+    GTK_WIDGET_SET_FLAGS(button_action, GTK_CAN_DEFAULT);
 
-    btn2 = gtk_button_new_from_stock(btn2_stock_name);
-    g_signal_connect(btn2, "clicked", G_CALLBACK(btn2_func), clist);
-    GTK_WIDGET_SET_FLAGS(btn2, GTK_CAN_DEFAULT);
+	if (select_row_func)
+		g_signal_connect(view, "row-activated", G_CALLBACK(select_row_func), NULL);
+
         
-    gtk_box_pack_start(GTK_BOX(bbox), btn2, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(bbox), button_action, TRUE, TRUE, 0);
 
-    gtk_widget_grab_default(btn2);
+    gtk_widget_grab_default(button_action);
 
 
     gtk_widget_show_all(*window);
@@ -1749,7 +1800,7 @@
                                     Q_("Load preset"),
                                     &equalizerwin_load_window,
                                     GTK_SELECTION_SINGLE, NULL,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_load_ok),
                                     G_CALLBACK(equalizerwin_load_select));
 }
@@ -1766,7 +1817,7 @@
                                     Q_("Load auto-preset"),
                                     &equalizerwin_load_auto_window,
                                     GTK_SELECTION_SINGLE, NULL,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_load_auto_ok),
                                     G_CALLBACK(equalizerwin_load_auto_select));
 }
@@ -1835,7 +1886,7 @@
                                     &equalizerwin_save_window,
                                     GTK_SELECTION_SINGLE,
                                     &equalizerwin_save_entry,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_save_ok),
                                     G_CALLBACK(equalizerwin_save_select));
 }
@@ -1847,18 +1898,17 @@
     Playlist *playlist = playlist_get_active();
 
     if (equalizerwin_save_auto_window)
+        gtk_window_present(GTK_WINDOW(equalizerwin_save_auto_window));
+    else
         equalizerwin_create_list_window(equalizer_auto_presets,
                                         Q_("Save auto-preset"),
                                         &equalizerwin_save_auto_window,
                                         GTK_SELECTION_SINGLE,
                                         &equalizerwin_save_auto_entry,
                                         GTK_STOCK_OK,
-                                        GTK_STOCK_CANCEL,
                                         G_CALLBACK(equalizerwin_save_auto_ok),
                                         G_CALLBACK(equalizerwin_save_auto_select));
-    else
-        gtk_window_present(GTK_WINDOW(equalizerwin_save_auto_window));
-        
+
     name = playlist_get_filename(playlist, playlist_get_position(playlist));
     if (name) {
         gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry),
@@ -1921,7 +1971,6 @@
                                     &equalizerwin_delete_window,
                                     GTK_SELECTION_EXTENDED, NULL,
                                     GTK_STOCK_DELETE,
-                                    GTK_STOCK_CLOSE,
                                     G_CALLBACK(equalizerwin_delete_delete),
                                     NULL);
 }
@@ -1939,7 +1988,6 @@
                                     &equalizerwin_delete_auto_window,
                                     GTK_SELECTION_EXTENDED, NULL,
                                     GTK_STOCK_DELETE,
-                                    GTK_STOCK_CLOSE,
                                     G_CALLBACK(equalizerwin_delete_auto_delete),
                                     NULL);
 }