[Goodies-commits] r6233 - xfce4-radio-plugin/branches/newpresets/panel-plugin

Stefan Ott cockroach at xfce.org
Sun Nov 30 07:25:22 CET 2008


Author: cockroach
Date: 2008-11-30 06:25:22 +0000 (Sun, 30 Nov 2008)
New Revision: 6233

Modified:
   xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.c
   xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.h
Log:
Committed patch


Modified: xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.c
===================================================================
--- xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.c	2008-11-30 06:24:01 UTC (rev 6232)
+++ xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.c	2008-11-30 06:25:22 UTC (rev 6233)
@@ -15,13 +15,14 @@
  *
  * 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.
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
+#define DEBUG 1
 #include <ctype.h>
 #include <string.h>
 #include <unistd.h>
@@ -32,6 +33,7 @@
 #include <libxfcegui4/dialogs.h>
 #include <libxfcegui4/xfce-exec.h>
 #include <libxfce4util/libxfce4util.h>
+#include <gdk/gdkkeysyms.h>
 
 static int
 radio_get_signal (int fd)
@@ -82,23 +84,30 @@
 	}
 }
 
+static gboolean
+find_preset_by_freq (GtkTreeModel *model, gint search_freq,
+						GtkTreeIter *search_iter);
+
 static void
 update_tooltip (radio_gui* data)
 {
 	GtkWidget* ebox = data->ebox;
+	GtkTreeIter iter;
+	gchar *name;
 
-	char *text = malloc(1024);
-	strcpy (text, _("Not tuned"));
-	radio_preset* preset = find_preset_by_freq (data->freq, data);
-
-	if (preset) {
-		sprintf(text, "Tuned to %s", preset->name);
-	} else {
-		sprintf(text, "Tuned to %5.1f", (float) data->freq / 100);
+	GtkTreeModel *presets = GTK_TREE_MODEL (data->presets);
+	if (find_preset_by_freq (presets, data->freq, &iter))
+	{
+		gtk_tree_model_get (presets, &iter, 0, &name, -1);
 	}
-	gtk_tooltips_set_tip (data->tooltips, ebox, text, NULL);
+	else
+	{
+		name = g_strdup_printf ("%5.1f", (float) data->freq / 100);
+	}
 
-	free (text);
+	gtk_tooltips_set_tip (data->tooltips, ebox, name, NULL);
+
+	g_free (name);
 }
 
 static void
@@ -231,30 +240,101 @@
 	}
 }
 
-#define make_preset_finder(name, arg, comparison)			\
-	static radio_preset*						\
-	find_preset_by_##name (arg, radio_gui* data)			\
+#define make_preset_finder(name, arg, search_arg, get_col, get_var,	\
+						free, comparison)	\
+	static gboolean							\
+	find_preset_by_##name (GtkTreeModel *model,			\
+			search_arg,					\
+			GtkTreeIter *search_iter)			\
 	{								\
-		radio_preset* preset = data->presets;			\
-		while (preset != NULL) {				\
+		arg;							\
+		GtkTreeIter iter;					\
+		gboolean valid;						\
+		valid = gtk_tree_model_get_iter_first (model, &iter);	\
+		while (valid)						\
+		{							\
+			gtk_tree_model_get (model, &iter,		\
+					get_col, get_var, -1);		\
 			if (comparison) {				\
-				return preset;				\
+				*search_iter = iter;			\
+				return TRUE;				\
 			}						\
-			preset = preset->next;				\
+			free;						\
+			valid = gtk_tree_model_iter_next (model, &iter);\
 		}							\
-		return NULL;						\
-	}
+		return FALSE;						\
+	}								\
 
-make_preset_finder(name, const char* name, strcmp (preset->name, name) == 0);
-make_preset_finder(freq, int freq, preset->freq == freq);
 
+make_preset_finder (freq, gint freq, gint search_freq, 1, &freq, freq = 0,
+							freq == search_freq);
+make_preset_finder (name, gchar *name, const gchar *search_name, 0, &name,
+				g_free(name), strcmp (name, search_name) == 0);
+
 static gboolean
 add_before (radio_preset* a, radio_preset* b)
 {
 	return (b == NULL || strcmp (a->name, b->name) < 0);
 }
 
-static gboolean
+// TODO: what's this?
+static gint
+get_two_digit (const gint big_number)
+{
+	gint base = 10, a = 0, b = 0, number = big_number, num;
+	while (1) {
+		num = number % base;
+		b = a;
+		a = num;
+		number = (number - num) / base;
+		if (number == 0)
+			return a * base + b;
+	}
+}
+
+// TODO: figure out what the decimals variable does exactly
+parse_freq (const gchar *const_freq_char)
+{
+	gint mult, decimal_int;
+	gchar *freq_char = g_strdup (const_freq_char);
+
+	gint freq_int = 100 * atoi (freq_char);
+
+	gchar *decimals = strstr (freq_char, ".");
+	if (decimals) {
+		decimals++;
+	} else {
+		// Запятая тоже может использоваться для разделения целой и
+		// десятичной части в других локалях, например в русской.
+		//
+		// Google translate says:
+		// "Comma also can be used to divide a whole and decimal part
+		// in other locale, for example, in Russian." which seems to
+		// make sense :)
+		decimals = strstr (freq_char, ",");
+		if (decimals) {
+			decimals++;
+		} else {
+			decimals = "0";
+		}
+	}
+
+	if (decimals != '\0' && decimals[1] != '\0' && decimals[2] != '\0') {
+		decimals[2] = '\0';
+	}
+	decimal_int = atoi (decimals);
+	if ((decimal_int > 9) && (decimal_int < 99)) {
+		mult = 1;
+	} else {
+		mult = 10;
+	}
+	freq_int += mult * decimal_int;
+
+	g_free (freq_char);
+	return freq_int;
+}
+
+/*static gboolean
 append_to_presets (radio_preset* new_preset, radio_gui* data)
 {
 	radio_preset *preset = data->presets, *prev;
@@ -281,9 +361,9 @@
 		}
 	}
 	return FALSE;
-}
+}*/
 
-static radio_preset *
+/*static radio_preset *
 pop_preset (radio_preset *target, radio_gui *data)
 {
 	radio_preset *preset = data->presets, *prev;
@@ -302,9 +382,9 @@
 		preset = preset->next;
 	}
 	return NULL;
-}
+}*/
 
-static void
+/*static void
 rename_preset (GtkEditable* menu_item, void *pointer)
 {
 	radio_gui* data = (radio_gui*) pointer;
@@ -334,9 +414,9 @@
 	gtk_widget_destroy (dialog);
 	update_tooltip (data);
 	write_config (data->plugin, data);
-}
+}*/
 
-static void
+/*static void
 add_preset_dialog (GtkEditable* menu_item, void *pointer)
 {
 	radio_gui* data = (radio_gui*) pointer;
@@ -374,7 +454,7 @@
 		}
 	}
 	gtk_widget_destroy (dialog);
-}
+}*/
 
 static gboolean
 parse_freq_and_tune (const char* freq_char, radio_gui* data)
@@ -422,7 +502,7 @@
 	for (;;) {
 		retval = gtk_dialog_run (GTK_DIALOG (dialog));
 
-		if (	retval == GTK_RESPONSE_CANCEL ||
+		if (	retval == GTK_RESPONSE_CANCEL || 
 			retval == GTK_RESPONSE_DELETE_EVENT ||
 			retval == GTK_RESPONSE_NONE) {
 				break;
@@ -446,8 +526,9 @@
 	char *file;
 	XfceRc *rc;
 
-	file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG,
-						RADIO_CONFIG_FILE, TRUE);
+	//take data from a clearly defined place RADIO_CONFIG
+	file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RADIO_CONFIG, TRUE);
+
 	if (G_UNLIKELY (!file))
 		return NULL;
 
@@ -458,47 +539,18 @@
 }
 
 static void
-remove_preset (GtkEditable* menu_item, void *pointer)
+select_preset (GtkEditable* menu_item, radio_gui *data)
 {
-	radio_gui* data = (radio_gui*) pointer;
-	radio_preset *preset;
-
-	preset = pop_preset (find_preset_by_freq (data->freq, data), data);
-
-	XfceRc *rc;
-	if ((rc = get_config_rc ())) {
-		char buf[6];
-		sprintf(buf, "%d", preset->freq);
-
-		// TODO: only delete the entry - seems broken
-		//xfce_rc_set_group	(rc, "presets");
-		//xfce_rc_delete_entry	(rc, buf, TRUE);
-		xfce_rc_delete_group (rc, "presets", FALSE);
-
-		if (xfce_rc_has_entry (rc, buf)) {
-			printf("dammit, failed\n");
-		}
-
-		xfce_rc_close (rc);
+	GtkWidget* label = gtk_bin_get_child (GTK_BIN (menu_item));
+	const gchar* text = gtk_label_get_text (GTK_LABEL (label));
+	GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+	GtkTreeIter iter;
+	if (find_preset_by_name (presets, text, &iter)) {
+		gtk_tree_model_get (presets, &iter, 1, &data->freq, -1);
+		radio_tune (data);
 	}
-
-	free (preset);
-
-	// TODO: becomes unneccessary as soon as the above TODO has been fixed
-	write_config (data->plugin, data);
 }
 
-static void
-select_preset (GtkEditable* menu_item, void *pointer)
-{
-	radio_gui* data = (radio_gui*) pointer;
-	GtkWidget* label = gtk_bin_get_child (GTK_BIN (menu_item));
-	const char* text = gtk_label_get_text (GTK_LABEL (label));
-	radio_preset* preset = find_preset_by_name (text, data);
-	data->freq = preset->freq;
-	radio_tune (data);
-}
-
 static gboolean
 mouse_click (GtkWidget* src, GdkEventButton *event, radio_gui* data)
 {
@@ -521,16 +573,21 @@
 		gtk_container_add (GTK_CONTAINER (menu), separator);
 		gtk_widget_set_sensitive (separator, FALSE);
 
-		radio_preset* preset = data->presets;
-		while (preset != NULL) {
-			item = gtk_menu_item_new_with_label (preset->name);
+		gchar *name;
+		GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+		GtkTreeIter iter;
+
+		gboolean valid = gtk_tree_model_get_iter_first (presets, &iter);
+		while (valid)
+		{
+			gtk_tree_model_get (presets, &iter, 0, &name, -1);
+			item = gtk_menu_item_new_with_label (name);
 			gtk_widget_show (item);
-			gtk_menu_append (menu, item);
+			g_free (name);
+			gtk_menu_shell_append (GTK_MENU_SHELL(menu), item);
 			g_signal_connect (GTK_WIDGET (item), "activate",
 					G_CALLBACK (select_preset), data);
-			gtk_widget_set_sensitive (item, preset->freq !=
-								data->freq);
-			preset = preset->next;
+			valid = gtk_tree_model_iter_next (presets, &iter);
 		}
 
 		separator = gtk_separator_menu_item_new ();
@@ -538,34 +595,6 @@
 		gtk_container_add (GTK_CONTAINER (menu), separator);
 		gtk_widget_set_sensitive (separator, FALSE);
 
-		radio_preset* current = find_preset_by_freq (data->freq, data);
-
-		item = gtk_menu_item_new_with_label (_("Add preset"));
-		gtk_widget_show (item);
-		gtk_menu_append (menu, item);
-		g_signal_connect (GTK_WIDGET (item), "activate",
-					G_CALLBACK (add_preset_dialog), data);
-		gtk_widget_set_sensitive (item, current == NULL);
-
-		item = gtk_menu_item_new_with_label (_("Delete active preset"));
-		gtk_widget_show (item);
-		gtk_menu_append (menu, item);
-		g_signal_connect (GTK_WIDGET (item), "activate",
-					G_CALLBACK (remove_preset), data);
-		gtk_widget_set_sensitive (item, current != NULL);
-
-		item = gtk_menu_item_new_with_label (_("Rename active preset"));
-		gtk_widget_show (item);
-		gtk_menu_append (menu, item);
-		g_signal_connect (GTK_WIDGET (item), "activate",
-					G_CALLBACK (rename_preset), data);
-		gtk_widget_set_sensitive (item, current != NULL);
-
-		separator = gtk_separator_menu_item_new ();
-		gtk_widget_show (separator);
-		gtk_container_add (GTK_CONTAINER (menu), separator);
-		gtk_widget_set_sensitive (separator, FALSE);
-
 		item = gtk_menu_item_new_with_label (_("Tune to frequency"));
 		gtk_widget_show (item);
 		gtk_menu_append (menu, item);
@@ -589,65 +618,51 @@
 	update_label (data);
 	update_signal_bar (data);
 
-	write_config (data->plugin, data);
+	write_config (data, FALSE);
 }
 
 static void
-tune_to_prev_preset (radio_gui* data)
-{
-	radio_preset *preset = data->presets, *prev;
-
-	if (preset->freq == data->freq) {
-		while (preset->next != NULL) {
-			preset = preset->next;
-		}
-		data->freq = preset->freq;
-	} else {
-		prev = preset;
-		while (preset != NULL) {
-			if (preset->freq == data->freq) {
-				data->freq = prev->freq;
-			}
-			prev = preset;
-			preset = preset->next;
-		}
-	}
-	radio_tune (data);
-}
-
-static void
 mouse_scroll(GtkWidget* src, GdkEventScroll *event, radio_gui* data)
 {
-	if (data->on) {
-		int direction = event->direction == GDK_SCROLL_UP ? -1 : 1;
-		if (data->scroll == CHANGE_FREQ) {
-			data->freq += direction * FREQ_STEP;
-			if (data->freq > FREQ_MAX) data->freq = FREQ_MIN;
-			if (data->freq < FREQ_MIN) data->freq = FREQ_MAX;
+	GtkTreePath *path;
+	GtkTreeIter iter, iter1;
+	GtkTreeModel *presets;
+	if (!data->on) 
+		return;
+	int direction = event->direction == GDK_SCROLL_UP ? -1 : 1;
+	if (data->scroll == CHANGE_FREQ) {
+		data->freq += direction * FREQ_STEP;
+		if (data->freq > FREQ_MAX) data->freq = FREQ_MIN;
+		if (data->freq < FREQ_MIN) data->freq = FREQ_MAX;
+		radio_tune (data);
+	} else if (data->scroll == CHANGE_PRESET) {
+		presets = GTK_TREE_MODEL(data->presets);
+		if (!find_preset_by_freq (presets, data->freq, &iter)) {
+			// tune to first preset, if it exists
+			if (!gtk_tree_model_get_iter_first (presets, &iter))
+				return;
+			gtk_tree_model_get (presets, &iter,
+					1, &data->freq, -1);
 			radio_tune (data);
-		} else if (data->scroll == CHANGE_PRESET) {
-			radio_preset* preset = find_preset_by_freq
-							(data->freq, data);
-			if (preset) {
-				// preset found
-				if (direction == 1) {
-					// tune to next preset
-					preset = preset->next == NULL ?
-						data->presets :	preset->next;
-					data->freq = preset->freq;
-					radio_tune (data);
-				} else {
-					tune_to_prev_preset (data);
-				}
-			} else {
-				// tune to first preset, if it exists
-				preset = data->presets;
-				if (preset) {
-					data->freq = preset->freq;
-					radio_tune (data);
-				}
-			}
+			return;
 		}
+		// preset found
+		if (direction == 1) {
+			if (!gtk_tree_model_iter_next (presets, &iter))
+				return;
+			gtk_tree_model_get (presets, &iter,
+					1, &data->freq, -1);
+			radio_tune (data);
+		} else {
+			path = gtk_tree_model_get_path (presets, &iter);
+			if (!gtk_tree_path_prev (path))
+				return;
+			gtk_tree_model_get_iter (presets, &iter1, path);
+			gtk_tree_path_free (path);
+			gtk_tree_model_get (presets, &iter1,
+					1, &data->freq, -1);
+			radio_tune (data);
+		}
 	}
 }
 
@@ -689,14 +704,15 @@
 static void
 free_presets (radio_gui *data)
 {
-	radio_preset *preset = data->presets;
+	g_object_unref (data->presets);
+/*	radio_preset *preset = data->presets;
 
 	while (preset != NULL) {
 		free(preset);
 		preset = preset->next;
 	}
 
-	data->presets = NULL;
+	data->presets = NULL;*/
 }
 
 static void
@@ -744,6 +760,7 @@
 	plugin_data->show_signal = TRUE;
 	plugin_data->auto_update_display = TRUE;
 	plugin_data->presets = NULL;
+	plugin_data->presets = NULL;
 	plugin_data->scroll = CHANGE_FREQ;
 	plugin_data->signal_timeout_id = 0;
 	plugin_data->radio_timeout_id = g_timeout_add(2000,
@@ -817,12 +834,169 @@
 {
 	gtk_widget_destroy (dialog);
 	xfce_panel_plugin_unblock_menu (data->plugin);
-	write_config (data->plugin, data);
+	write_config (data, TRUE);
 }
 
 static void
+cell_float_to_text_cb (	GtkTreeViewColumn *tree_column,
+			GtkCellRenderer *cell,
+			GtkTreeModel *tree_model,
+			GtkTreeIter *iter,
+			gpointer data)
+{
+	gint f;
+	gchar *text;
+
+	/* Get the double value from the model. */
+	gtk_tree_model_get (tree_model, iter, 1, &f, -1);
+	/* Now we can format the value ourselves. */
+	text = g_strdup_printf ("%.2f", f / 100.0);
+	g_object_set (cell, "text", text, NULL);
+	g_free (text);
+}
+
+static void
+add_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+
+	radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+	gtk_tree_selection_get_selected (selection, &model, &iter);
+	gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+	gtk_list_store_set    (GTK_LIST_STORE(model), &iter, 
+				0, _("unnamed"), 
+				1, data->freq, -1);
+	gtk_tree_selection_select_iter (selection, &iter);
+	write_config (data, TRUE);
+}
+
+static void 
+del_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+
+	radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+	if (gtk_tree_selection_get_selected (selection, &model, &iter)){
+		if(gtk_list_store_remove(GTK_LIST_STORE(model), &iter)){
+			gtk_tree_selection_select_iter(selection,&iter);
+		}
+	}
+	write_config (data, TRUE);
+	update_tooltip (data);
+}
+
+static void 
+up_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+
+	radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+	{
+		GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
+		if (gtk_tree_path_prev (path))
+		{
+			GtkTreeIter iter1 = iter;
+			gtk_tree_model_get_iter (model, &iter1, path);
+			gtk_list_store_swap (GTK_LIST_STORE (model), 
+					&iter, &iter1);
+		}
+		gtk_tree_path_free (path);
+	}
+	write_config (data, TRUE);
+	/*    
+	 *  update_tooltip берет первое попавшееся значение из нескольких 
+	 *  с одной и той же частотой, а при перемещении записи вверх или 
+	 *  вниз может измениться первое попавшееся значение. 
+	 */   
+	update_tooltip (data);
+}
+
+static void 
+down_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+
+	radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+	{
+		GtkTreeIter iter1 = iter;
+		if (gtk_tree_model_iter_next (model, &iter1))
+		{
+			gtk_list_store_swap (GTK_LIST_STORE (model),
+					&iter, &iter1);
+		}
+	}
+	write_config (data, TRUE);
+	//Читай комментарий выше
+	update_tooltip (data);
+}
+
+static gboolean 
+list_view_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, 
+			      GtkTreeSelection *data)
+{
+	if (event->keyval == GDK_Delete)
+		del_button_clicked_cb(widget, data);
+	if (event->keyval == GDK_Insert)
+		add_button_clicked_cb(widget, data);
+	
+	return FALSE;
+}
+
+static void 
+name_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path_str,
+		    gchar *new_val, radio_gui *data)
+{
+	GtkTreeIter iter;
+	gboolean valid;
+	
+	GtkListStore *presets = data->presets;
+	valid = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(presets),
+			&iter, path_str);
+	g_return_if_fail (valid == TRUE);
+
+	gtk_list_store_set (presets, &iter, 0, new_val, -1);
+	write_config (data, TRUE);
+	update_tooltip (data);
+}	
+
+static void 
+freq_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path_str,
+		gchar *new_val, radio_gui *data)
+{
+	GtkTreeIter iter;
+	gboolean valid;
+	gint value;
+	
+	value = parse_freq (new_val);
+	//value = g_strtod (new_val, NULL) * 100;
+	
+	if (value < FREQ_MIN) value = FREQ_MIN;
+	if (value > FREQ_MAX) value = FREQ_MAX;
+	
+	GtkListStore *presets = data->presets;
+	valid = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(presets),
+			&iter, path_str);
+	g_return_if_fail (valid == TRUE);
+
+	gtk_list_store_set (presets, &iter, 1, value, -1);
+	write_config (data, TRUE);
+	update_tooltip (data);
+}
+
+static void
 radio_plugin_create_options (XfcePanelPlugin *plugin, radio_gui *data)
 {
+	DBG("%f", data->freq);
 	GtkWidget *table;
 	GtkWidget *label;
 	GtkWidget *hbox;
@@ -840,6 +1014,18 @@
 	GSList *scroll_group = NULL;		// scroll action:
 	GtkWidget *frequency_button;		//  - change frequency
 	GtkWidget *preset_button;		//  - change preset
+	GtkWidget *preset_box;
+	GtkWidget *button_box;
+	GtkWidget *notebook;
+	GtkWidget *label_properties;
+	GtkWidget *label_presets;
+	GtkWidget *scrolled_window;
+	GtkWidget *list_view;
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	GtkCellRenderer *cellrenderer;
+	GtkTreeViewColumn *list_column;
+	GtkListStore *list_store;
 
 	xfce_panel_plugin_block_menu (plugin);
 
@@ -855,11 +1041,101 @@
 	g_signal_connect (dialog, "response",
 			G_CALLBACK (radio_plugin_dialog_response), data);
 
+	list_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(data->presets));
+	gtk_widget_set_size_request(list_view, 200, 150);
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
+	gtk_widget_show(list_view);
+
+	cellrenderer = gtk_cell_renderer_text_new();
+	g_object_set (G_OBJECT (cellrenderer),
+		      "mode", GTK_CELL_RENDERER_MODE_EDITABLE, \
+		      "editable", TRUE, NULL);
+	list_column = gtk_tree_view_column_new_with_attributes
+			(NULL, cellrenderer, "text", 0, NULL);
+	gtk_tree_view_column_set_min_width(list_column, 300);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+	g_signal_connect(GTK_OBJECT(cellrenderer), "edited", 
+			GTK_SIGNAL_FUNC(name_cell_edited_cb), (gpointer)data);
+
+	cellrenderer = gtk_cell_renderer_text_new();
+	g_object_set (G_OBJECT (cellrenderer),
+		      "mode", GTK_CELL_RENDERER_MODE_EDITABLE, \
+		      "editable", TRUE, \
+		      "xalign", 1.0f, NULL);
+	list_column = gtk_tree_view_column_new_with_attributes
+			(NULL, cellrenderer, "text", 1, NULL);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+	gtk_tree_view_column_set_cell_data_func (list_column, cellrenderer,
+						 cell_float_to_text_cb, 
+						 NULL, NULL);
+	g_signal_connect(GTK_OBJECT(cellrenderer), "edited", 
+			GTK_SIGNAL_FUNC(freq_cell_edited_cb), (gpointer)data);
+
+	button_box = gtk_hbox_new(FALSE, 0);
+
+	GtkWidget *add_button  = gtk_button_new_from_stock(GTK_STOCK_ADD);
+	GtkWidget *del_button  = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+	GtkWidget *up_button   = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+	GtkWidget *down_button = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+	
+	gtk_box_pack_end(GTK_BOX(button_box), del_button, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(button_box), up_button,  FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(button_box), down_button,FALSE, FALSE, 0);
+	
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
+	gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+
+	g_object_set_data(G_OBJECT(selection), "data", data);
+
+	g_signal_connect(GTK_OBJECT(add_button), "clicked", 
+		GTK_SIGNAL_FUNC( add_button_clicked_cb), selection);
+	g_signal_connect(GTK_OBJECT(del_button), "clicked", 
+		GTK_SIGNAL_FUNC( del_button_clicked_cb), selection);
+	g_signal_connect(GTK_OBJECT(up_button), "clicked", 
+		GTK_SIGNAL_FUNC(up_button_clicked_cb), selection);
+	g_signal_connect(GTK_OBJECT(down_button), "clicked", 
+		GTK_SIGNAL_FUNC(down_button_clicked_cb), selection);
+	g_signal_connect(GTK_OBJECT(list_view), "key-press-event", 
+		GTK_SIGNAL_FUNC(list_view_key_press_event_cb), selection);
+	//g_signal_connect(selection, "changed", 
+	//	GTK_SIGNAL_FUNC(selection_changed_cb), (gpointer)prefs);
+
+	//g_signal_connect(GTK_OBJECT(list_view), "cursor-changed", GTK_SIGNAL_FUNC(list_view_cursor_changed_cb), (gpointer)list_view);
+
+	scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+	gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
+					    GTK_SHADOW_IN); 
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 
+					GTK_POLICY_AUTOMATIC,
+					GTK_POLICY_AUTOMATIC);
+	gtk_widget_show(scrolled_window);
+	
+	preset_box = gtk_vbox_new(FALSE, 4);
+	gtk_box_pack_start(GTK_BOX(preset_box), scrolled_window, 
+			   TRUE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(preset_box), button_box,
+			   FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER(preset_box), 4);
+	gtk_widget_show_all (preset_box);
+
 	table = gtk_table_new(4, 2, FALSE);
+	gtk_container_set_border_width (GTK_CONTAINER(table), 4);
 	gtk_widget_show(table);
 
-	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table,
-							FALSE, TRUE, 0);
+	notebook = gtk_notebook_new ();
+	gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK(notebook), TRUE);
+	label_properties = gtk_label_new (_("Properties"));
+	label_presets =	gtk_label_new (_("Presets"));
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), preset_box, 
+				  label_presets);
+	gtk_notebook_append_page (GTK_NOTEBOOK(notebook), table,
+				  label_properties); 
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook,
+			    TRUE, TRUE, 0);
+	gtk_widget_show (notebook);
 
 	// V4L device
 	label = gtk_label_new (_("V4L device"));
@@ -1023,47 +1299,86 @@
 	gtk_widget_set_size_request (data->signal_bar, size - BORDER, BORDER);
 }
 
+// TODO: move these somewhere else
+#define DEFAULT_NAME "unnamed"
+#define PRESET_NAMES "preset_names"
+#define PRESET_FREQS "preset_freqs"
+
 static void
-write_config (XfcePanelPlugin *plugin, radio_gui *data)
+write_config_signal (XfcePanelPlugin *plugin, radio_gui *data)
 {
+	write_config (data, TRUE);
+}
+
+static void
+write_config (radio_gui *data, gboolean save_presets)
+{
 	XfceRc *rc;
-	if ((rc = get_config_rc ())) {
-		xfce_rc_set_group	(rc, "radio plugin");
+	int i;
 
-		xfce_rc_write_entry	(rc, "dev", data->device);
-		xfce_rc_write_entry	(rc, "startup_cmd",
-							data->startup_command);
-		xfce_rc_write_entry	(rc, "shutdown_cmd",
-							data->shutdown_command);
-		xfce_rc_write_int_entry (rc, "frq", data->freq);
-		xfce_rc_write_int_entry (rc, "scroll", data->scroll);
-		xfce_rc_write_bool_entry(rc, "show_signal", data->show_signal);
-		xfce_rc_write_bool_entry(rc, "update_display",
+	if (!(rc = get_config_rc ()))
+		return;
+
+	xfce_rc_set_group	(rc, "radio plugin");
+
+	xfce_rc_write_entry	(rc, "dev", data->device);
+	xfce_rc_write_entry	(rc, "startup_cmd", data->startup_command);
+	xfce_rc_write_entry	(rc, "shutdown_cmd", data->shutdown_command);
+
+	xfce_rc_write_int_entry	(rc, "frq", data->freq);
+	xfce_rc_write_int_entry	(rc, "scroll", data->scroll);
+	xfce_rc_write_bool_entry(rc, "show_signal", data->show_signal);
+	xfce_rc_write_bool_entry(rc, "update_display",
 						data->auto_update_display);
 
-		xfce_rc_set_group	(rc, "presets");
+	// TODO: why would we not want to write configs? can we only override
+	// parts of the file? find out! :)
+	if (!save_presets) {
+		xfce_rc_close (rc);
+		return;
+	}
 
-		radio_preset *preset = data->presets;
+	gchar *name;
+	gint freq;
+	GtkTreeIter iter;
+	GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+	gboolean valid = gtk_tree_model_get_iter_first (presets, &iter);
 
-		char buf[6];
-
-		while (preset != NULL) {
-			sprintf(buf, "%d", preset->freq);
-			xfce_rc_write_entry (rc, buf, preset->name);
-			preset = preset->next;
+	// TODO: 10?
+	i = 10;
+	while (valid)
+	{
+		if (i == 10) {
+			xfce_rc_delete_group (rc, PRESET_NAMES, FALSE);
+			xfce_rc_delete_group (rc, PRESET_FREQS, FALSE);
 		}
 
-		xfce_rc_close (rc);
+		// TODO: si?
+		gtk_tree_model_get (presets, &iter, 0, &name, 1, &freq, -1);
+		gchar *si = g_strdup_printf ("%d", i);
+		DBG("freq=%d, name=%s", freq, name);
+
+		xfce_rc_set_group (rc, PRESET_NAMES);
+		xfce_rc_write_entry (rc, si, name);
+		xfce_rc_set_group (rc, PRESET_FREQS);
+		xfce_rc_write_int_entry (rc, si, freq);
+
+		g_free (name);
+		g_free (si);
+		i++;
+		valid = gtk_tree_model_iter_next (presets, &iter);
 	}
+	xfce_rc_close (rc);
 }
 
 static void
 read_config (XfcePanelPlugin *plugin, radio_gui *data)
 {
 	const char *value;
+	char *file;
 	XfceRc *rc;
 
-	if (!(rc = get_config_rc (plugin)))
+	if (!(rc = get_config_rc ()))
 		return;
 
 	xfce_rc_set_group (rc, "radio plugin");
@@ -1074,40 +1389,45 @@
 	data->auto_update_display = xfce_rc_read_bool_entry
 					(rc, "update_display", TRUE);
 
-	if ((value = xfce_rc_read_entry (rc, "dev", NULL)) && *value) {
+	if ((value = xfce_rc_read_entry (rc, "dev", NULL)) && *value)
 		strncpy (data->device, value, MAX_DEVICE_NAME_LENGTH);
-	}
-	if ((value = xfce_rc_read_entry (rc, "startup_cmd", NULL)) && *value) {
+
+	if ((value = xfce_rc_read_entry (rc, "startup_cmd", NULL)) && *value)
 		strncpy (data->startup_command, value, MAX_COMMAND_LENGTH);
-	}
-	if ((value = xfce_rc_read_entry (rc, "shutdown_cmd", NULL)) && *value) {
+
+	if ((value = xfce_rc_read_entry (rc, "shutdown_cmd", NULL)) && *value)
 		strncpy (data->shutdown_command, value, MAX_COMMAND_LENGTH);
-	}
 
-	free_presets (data);
+	GtkTreeIter iter;
+	g_return_if_fail (data->presets == NULL);
+	data->presets = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+	GtkListStore *presets = data->presets;
 
-	gchar** entries = xfce_rc_get_entries (rc, "presets");
-	if (entries != NULL) {
-		gchar** entry;
-		entry = entries;
+	gchar** names = xfce_rc_get_entries (rc, PRESET_NAMES);
+	gchar** freqs = xfce_rc_get_entries (rc, PRESET_FREQS);
 
-		xfce_rc_set_group (rc, "presets");
+	if (names == NULL || freqs == NULL) {
+		xfce_rc_close (rc);
+		return;
+	}
+	gchar **ename = names;
+	gchar **efreq = freqs;
 
-		while (*entry) {
-			if ((value = xfce_rc_read_entry (rc, *entry, NULL))
-								&& *value) {
-				radio_preset *preset =
-						malloc (sizeof (radio_preset));
-				preset->next = NULL;
-//				g_free (preset->name);
-				preset->name = g_strdup(value);
-				preset->freq = atoi (*entry);
-				append_to_presets (preset, data);
-			}
-			entry++;
-		}
+	while (*ename || *efreq)
+	{
+		xfce_rc_set_group (rc, PRESET_NAMES);
+		const gchar *vname = xfce_rc_read_entry (rc, *ename,
+							_(DEFAULT_NAME));
+		xfce_rc_set_group (rc, PRESET_FREQS);
+		gint vfreq = xfce_rc_read_int_entry (rc, *efreq, FREQ_MIN);
+		DBG("freq=%d, name=%s", vfreq, vname);
+
+		gtk_list_store_append (presets, &iter);
+		gtk_list_store_set (presets, &iter, 0, vname, 1, vfreq, -1);
+		ename++; efreq++;
 	}
-	g_strfreev (entries);
+	g_strfreev (names);
+	g_strfreev (freqs);
 	xfce_rc_close (rc);
 }
 
@@ -1126,7 +1446,8 @@
 	g_signal_connect (plugin, "size-changed", G_CALLBACK
 						(radio_plugin_set_size), data);
 	g_signal_connect (plugin, "free-data", G_CALLBACK (radio_free), data);
-	g_signal_connect (plugin, "save", G_CALLBACK (write_config), data);
+	g_signal_connect (plugin, "save", G_CALLBACK (write_config_signal),
+									data);
 }
 
 XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL (radio_plugin_construct);

Modified: xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.h
===================================================================
--- xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.h	2008-11-30 06:24:01 UTC (rev 6232)
+++ xfce4-radio-plugin/branches/newpresets/panel-plugin/radio.h	2008-11-30 06:25:22 UTC (rev 6233)
@@ -42,7 +42,7 @@
 
 #define BORDER 8
 
-#define RADIO_CONFIG_FILE	"xfce4/panel/radio.rc"
+const char RADIO_CONFIG[] = "xfce4/panel/radio.rc";
 
 typedef enum {
 	CHANGE_FREQ,
@@ -76,7 +76,7 @@
 	char			device [MAX_DEVICE_NAME_LENGTH];
 	char			startup_command [MAX_COMMAND_LENGTH];
 	char			shutdown_command [MAX_COMMAND_LENGTH];
-	radio_preset*		presets;
+	GtkListStore*		presets;
 	mouse_scroll_reaction	scroll;
 
 	// this seems to be card specific and we can't seem to get the maximum
@@ -87,6 +87,7 @@
 } radio_gui;
 
 static void radio_tune (radio_gui*);
-static radio_preset* find_preset_by_freq (int, radio_gui*);
+//static radio_preset* find_preset_by_freq (int, radio_gui*);
 static void read_config (XfcePanelPlugin *, radio_gui *);
-static void write_config (XfcePanelPlugin *, radio_gui *);
+//static void write_config (XfcePanelPlugin *, radio_gui *);
+static void write_config (radio_gui *i, gboolean);




More information about the Goodies-commits mailing list