SF.net SVN: geany:[3375] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Dec 15 13:02:30 UTC 2008


Revision: 3375
          http://geany.svn.sourceforge.net/geany/?rev=3375&view=rev
Author:   ntrel
Date:     2008-12-15 13:02:29 +0000 (Mon, 15 Dec 2008)

Log Message:
-----------
Use Stash radio button prefs instead of RadioPrefEntry.
Add stash_group_add_radio_buttons().

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/keyfile.c
    trunk/src/prefs.c
    trunk/src/stash.c
    trunk/src/stash.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-12-13 11:36:05 UTC (rev 3374)
+++ trunk/ChangeLog	2008-12-15 13:02:29 UTC (rev 3375)
@@ -1,3 +1,10 @@
+2008-12-15  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/prefs.c, src/stash.c, src/stash.h, src/keyfile.c:
+   Use Stash radio button prefs instead of RadioPrefEntry.
+   Add stash_group_add_radio_buttons().
+
+
 2008-12-11  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * src/plugins.c, src/toolbar.c:

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2008-12-13 11:36:05 UTC (rev 3374)
+++ trunk/src/keyfile.c	2008-12-15 13:02:29 UTC (rev 3375)
@@ -134,8 +134,12 @@
 		"indent_hard_tab_width", 8);
 	stash_group_add_integer(group, (gint*)&editor_prefs.indentation->auto_indent_mode,
 		"indent_mode", GEANY_AUTOINDENT_CURRENTCHARS);
-	stash_group_add_integer(group, (gint*)&editor_prefs.indentation->type,
-		"indent_type", GEANY_INDENT_TYPE_TABS);
+	stash_group_add_radio_buttons(group, (gint*)&editor_prefs.indentation->type,
+		"indent_type", GEANY_INDENT_TYPE_TABS,
+		"radio_indent_spaces", GEANY_INDENT_TYPE_SPACES,
+		"radio_indent_tabs", GEANY_INDENT_TYPE_TABS,
+		"radio_indent_both", GEANY_INDENT_TYPE_BOTH,
+		NULL);
 	stash_group_add_integer(group, (gint*)&editor_prefs.autocompletion_max_entries,
 		"autocompletion_max_entries", GEANY_MAX_AUTOCOMPLETE_WORDS);
 

Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c	2008-12-13 11:36:05 UTC (rev 3374)
+++ trunk/src/prefs.c	2008-12-15 13:02:29 UTC (rev 3375)
@@ -137,45 +137,6 @@
 }
 
 
-typedef struct RadioPrefEntry
-{
-	const gchar *widget_name;
-	gpointer setting;
-	gint value;
-}
-RadioPrefEntry;
-
-static void radio_prefs_foreach(PrefCallbackAction action)
-{
-	guint i;
-	RadioPrefEntry items[] =
-	{
-		{"radio_indent_spaces", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_SPACES},
-		{"radio_indent_tabs", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_TABS},
-		{"radio_indent_both", &editor_prefs.indentation->type, GEANY_INDENT_TYPE_BOTH}
-	};
-
-	for (i = 0; i < G_N_ELEMENTS(items); i++)
-	{
-		RadioPrefEntry *pe = &items[i];
-		GtkWidget *widget = lookup_widget(ui_widgets.prefs_dialog, pe->widget_name);
-		gint *setting = pe->setting;
-
-		switch (action)
-		{
-			case PREF_DISPLAY:
-				if (*setting == pe->value)
-					gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
-				break;
-			case PREF_UPDATE:
-				if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
-					*setting = pe->value;
-				break;
-		}
-	}
-}
-
-
 static void combo_prefs_foreach(PrefCallbackAction action)
 {
 	guint i;
@@ -209,7 +170,6 @@
  * runtime setting fields like EditorPrefs::indentation->width. */
 PrefItemsCallback pref_item_callbacks[] = {
 	spin_prefs_foreach,
-	radio_prefs_foreach,
 	combo_prefs_foreach
 };
 

Modified: trunk/src/stash.c
===================================================================
--- trunk/src/stash.c	2008-12-13 11:36:05 UTC (rev 3374)
+++ trunk/src/stash.c	2008-12-15 13:02:29 UTC (rev 3375)
@@ -47,6 +47,7 @@
 	gpointer default_value;
 	GType widget_type;			/* e.g. GTK_TYPE_TOGGLE_BUTTON */
 	gpointer widget_id;			/* can be GtkWidget or gchararray */
+	gpointer fields;			/* extra fields */
 };
 
 struct GeanyPrefGroup
@@ -56,7 +57,14 @@
 	gboolean write_once;		/* only write settings if they don't already exist */
 };
 
+typedef struct EnumWidget
+{
+	gpointer widget_id;
+	gint enum_id;
+}
+EnumWidget;
 
+
 typedef enum SettingAction
 {
 	SETTING_READ,
@@ -177,6 +185,15 @@
 
 void stash_group_free(GeanyPrefGroup *group)
 {
+	GeanyPrefEntry *entry;
+
+	foreach_array(GeanyPrefEntry, entry, group->entries)
+	{
+		if (entry->widget_type == GTK_TYPE_RADIO_BUTTON)
+			g_free(entry->fields);
+		else
+			g_assert(entry->fields == NULL);
+	}
 	g_array_free(group->entries, TRUE);
 	g_free(group);
 }
@@ -192,7 +209,7 @@
 add_pref(GeanyPrefGroup *group, GType type, gpointer setting,
 		const gchar *key_name, gpointer default_value)
 {
-	GeanyPrefEntry entry = {type, setting, key_name, default_value, G_TYPE_NONE, NULL};
+	GeanyPrefEntry entry = {type, setting, key_name, default_value, G_TYPE_NONE, NULL, NULL};
 	GArray *array = group->entries;
 
 	g_array_append_val(array, entry);
@@ -265,23 +282,88 @@
 }
 
 
+static GtkWidget *
+get_widget(GtkWidget *owner, gpointer widget_id)
+{
+	GtkWidget *widget = widget_id;
+
+	if (owner)
+	{
+		const gchar *widget_name = widget_id;
+
+		widget = lookup_widget(owner, widget_name);
+	}
+	if (!GTK_IS_WIDGET(widget))
+	{
+		g_warning("Unknown widget in %s!", G_GNUC_FUNCTION);
+		return NULL;
+	}
+	return widget;
+}
+
+
+static void handle_radio_button(GtkWidget *widget, gint enum_id, gboolean *setting,
+		PrefAction action)
+{
+	switch (action)
+	{
+		case PREF_DISPLAY:
+			if (*setting == enum_id)
+				gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
+			break;
+		case PREF_UPDATE:
+			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+				*setting = enum_id;
+			break;
+	}
+}
+
+
+static void handle_radio_buttons(GtkWidget *owner, EnumWidget *fields,
+		gboolean *setting,
+		PrefAction action)
+{
+	EnumWidget *field = fields;
+	gsize count = 0;
+	GtkWidget *widget = NULL;
+
+	while (1)
+	{
+		widget = get_widget(owner, field->widget_id);
+
+		if (!widget)
+			continue;
+
+		count++;
+		handle_radio_button(widget, field->enum_id, setting, action);
+		field++;
+		if (!field->widget_id)
+			break;
+	}
+	if (g_slist_length(gtk_radio_button_get_group(GTK_RADIO_BUTTON(widget))) != count)
+		g_warning("Missing/invalid radio button widget IDs found!");
+}
+
+
 static void pref_action(PrefAction action, GeanyPrefGroup *group, GtkWidget *owner)
 {
 	GeanyPrefEntry *entry;
 
 	foreach_array(GeanyPrefEntry, entry, group->entries)
 	{
-		GtkWidget *widget = entry->widget_id;
-		const gchar *widget_name = entry->widget_id;
+		GtkWidget *widget;
 
 		if (entry->widget_type == G_TYPE_NONE)
 			continue;
 
-		if (owner)
+		if (entry->widget_type == GTK_TYPE_RADIO_BUTTON)
 		{
-			widget = lookup_widget(owner, widget_name);
+			handle_radio_buttons(owner, entry->fields, entry->setting, action);
+			continue;
 		}
-		if (!GTK_IS_WIDGET(widget))
+
+		widget = get_widget(owner, entry->widget_id);
+		if (!widget)
 		{
 			g_warning("Unknown widget for %s::%s in %s!", group->name, entry->key_name,
 				G_GNUC_FUNCTION);
@@ -310,6 +392,8 @@
 }
 
 
+/* Used for GtkCheckButton or GtkToggleButton widgets.
+ * @see stash_group_add_radio_buttons(). */
 void stash_group_add_toggle_button(GeanyPrefGroup *group, gboolean *setting,
 		const gchar *key_name, gboolean default_value, gpointer widget_id)
 {
@@ -321,3 +405,57 @@
 }
 
 
+/* @param ... pairs of widget_id, enum_id.
+ * Example (using widget lookup strings, but widget pointers can also work):
+ * @code
+ * enum {FOO, BAR};
+ * stash_group_add_radio_buttons(group, &which_one_setting, "which_one", BAR,
+ * 	"radio_foo", FOO, "radio_bar", BAR, NULL);
+ * @endcode */
+void stash_group_add_radio_buttons(GeanyPrefGroup *group, gint *setting,
+		const gchar *key_name, gint default_value,
+		gpointer widget_id, gint enum_id, ...)
+{
+	GeanyPrefEntry *entry =
+		add_pref(group, G_TYPE_INT, setting, key_name, GINT_TO_POINTER(default_value));
+	va_list args;
+	gsize count = 1;
+	EnumWidget *item, *array;
+
+	entry->widget_type = GTK_TYPE_RADIO_BUTTON;
+
+	/* count pairs of args */
+	va_start(args, enum_id);
+	while (1)
+	{
+		gint dummy;
+
+		if (!va_arg(args, gpointer))
+			break;
+		dummy = va_arg(args, gint);
+		count++;
+	}
+	va_end(args);
+
+	array = g_new0(EnumWidget, count + 1);
+	entry->fields = array;
+
+	va_start(args, enum_id);
+	foreach_c_array(item, array, count)
+	{
+		if (item == array)
+		{
+			/* first element */
+			item->widget_id = widget_id;
+			item->enum_id = enum_id;
+		}
+		else
+		{
+			item->widget_id = va_arg(args, gpointer);
+			item->enum_id = va_arg(args, gint);
+		}
+	}
+	va_end(args);
+}
+
+

Modified: trunk/src/stash.h
===================================================================
--- trunk/src/stash.h	2008-12-13 11:36:05 UTC (rev 3374)
+++ trunk/src/stash.h	2008-12-15 13:02:29 UTC (rev 3375)
@@ -46,6 +46,10 @@
 void stash_group_add_toggle_button(GeanyPrefGroup *group, gboolean *setting,
 		const gchar *key_name, gboolean default_value, gpointer widget_id);
 
+void stash_group_add_radio_buttons(GeanyPrefGroup *group, gint *setting,
+		const gchar *key_name, gint default_value,
+		gpointer widget_id, gint enum_id, ...) G_GNUC_NULL_TERMINATED;
+
 void stash_group_load(GeanyPrefGroup *group, GKeyFile *keyfile);
 
 void stash_group_save(GeanyPrefGroup *group, GKeyFile *keyfile);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list