gnome-scan r696 - in trunk: . modules/gsane



Author: bersace
Date: Mon Dec 15 19:53:14 2008
New Revision: 696
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=696&view=rev

Log:
Added double enum support.

Modified:
   trunk/ChangeLog
   trunk/modules/gsane/gsane-option-handler-generic.c
   trunk/modules/gsane/gsane-option-handler.c

Modified: trunk/modules/gsane/gsane-option-handler-generic.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler-generic.c	(original)
+++ trunk/modules/gsane/gsane-option-handler-generic.c	Mon Dec 15 19:53:14 2008
@@ -181,10 +181,9 @@
 	}
 }
 
-static void
-gsane_option_handler_generic_handle_int_list_option(GSaneOptionHandler *handler, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group)
+static GSList*
+gsane_option_handler_generic_enum_list_int_values(GSaneOptionHandler *handler, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group)
 {
-	GSaneOptionHandlerGeneric* self = GSANE_OPTION_HANDLER_GENERIC(handler);
 	GSList *list = NULL;
 	gint count = desc->constraint.word_list[0];
 	gint i, intval;
@@ -205,19 +204,40 @@
 		gnome_scan_enum_value_init(evalue, value, g_strdup_printf("%i", intval), NULL);
 		list = g_slist_append(list, evalue);
 	}
+	g_free(values);
+	return list;
+}
 
-	/* retrieve default value */
-	evalue = gsane_option_handler_get_enum(handler, desc, n, list, NULL);
-	/* instanciate value */
-	self->priv->option = GNOME_SCAN_OPTION(gnome_scan_option_enum_new(desc->name, S_(desc->title), S_(desc->desc), group, SANE_GETTEXT_PACKAGE,
-									  evalue, list, GNOME_SCAN_OPTION_HINT_SECONDARY));
+static GSList*
+gsane_option_handler_generic_enum_list_double_values(GSaneOptionHandler *handler, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group)
+{
+	GSList *list = NULL;
+	gint count = desc->constraint.word_list[0];
+	gint i;
+	gdouble doubleval;
+	GValue *value, *values = g_new0(GValue, count);
+	GnomeScanEnumValue *evalue, *evalues = g_new0(GnomeScanEnumValue, count);
+
+	for(i = 0; i < count; i++) {
+		value = values + i;
+		evalue = evalues + i;
+		doubleval = SANE_UNFIX(desc->constraint.word_list[i+1]);
+		g_value_init(value, G_TYPE_DOUBLE);
+		g_value_set_double(value, doubleval);
+		gnome_scan_enum_value_init(evalue, value, g_strdup_printf("%.2f", doubleval), NULL);
+		list = g_slist_append(list, evalue);
+	}
 	g_free(values);
+	return list;
 }
 
+
 static void
 gsane_option_handler_generic_handle_list_option(GSaneOptionHandler *handler, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group)
 {
 	GSaneOptionHandlerGeneric* self = GSANE_OPTION_HANDLER_GENERIC(handler);
+	GSList *values = NULL;
+	GnomeScanEnumValue* default_value;
 	gint array_length;
 
 	switch(desc->type) {
@@ -226,16 +246,26 @@
 		if (array_length > 1)
 			g_debug("Ignoring int enum array option %s", desc->name);
 		else
-			gsane_option_handler_generic_handle_int_list_option(handler, n, desc, group);
+			values = gsane_option_handler_generic_enum_list_int_values(handler, n, desc, group);
+		break;
+	case SANE_TYPE_FIXED:
+		array_length = desc->size/sizeof(SANE_Fixed);
+		if (array_length > 1)
+			g_debug("Ignoring double enum array option %s", desc->name);
+		else
+			values = gsane_option_handler_generic_enum_list_double_values(handler, n, desc, group);
 		break;
 	default:
 		g_debug("\toption %d : <unhandled> %s", n, desc->name);
 		break;
 	}
 
-	if (!self->priv->option)
+	if (!values)
 		return;
 
+	default_value = gsane_option_handler_get_enum(handler, desc, n, values, NULL);
+	self->priv->option = GNOME_SCAN_OPTION(gnome_scan_option_enum_new(desc->name, S_(desc->title), S_(desc->desc), group, SANE_GETTEXT_PACKAGE,
+									  default_value, values, GNOME_SCAN_OPTION_HINT_SECONDARY));
 	g_signal_connect_swapped(self->priv->option, "notify::value", G_CALLBACK(gsane_option_handler_generic_enum_option_value_changed), self);
 }
 

Modified: trunk/modules/gsane/gsane-option-handler.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.c	(original)
+++ trunk/modules/gsane/gsane-option-handler.c	Mon Dec 15 19:53:14 2008
@@ -212,24 +212,28 @@
 GnomeScanEnumValue*
 gsane_option_handler_get_enum(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, GSList* values, GError **error)
 {
-	gint intval, testval;
+	gint intval;
+	gdouble doubleval;
 	GSList* iter;
 	GnomeScanEnumValue* evalue;
-	GValue *value;
 
 	switch(desc->type) {
 	case SANE_TYPE_INT:
 		intval = gsane_option_handler_get_int(self, desc, index, error);
 		for (iter = values; iter; iter = iter->next) {
 			evalue = iter->data;
-			value = evalue->value;
-			testval = g_value_get_int(value);
-			if (testval == intval) {
+			if (g_value_get_int(evalue->value) == intval)
 				return evalue;
-			}
 		}
 		return values->data;
 		break;
+	case SANE_TYPE_FIXED:
+		doubleval = gsane_option_handler_get_double(self, desc, index, error);
+		for (iter = values; iter; iter = iter->next) {
+			evalue = iter->data;
+			if (g_value_get_double(evalue->value) == doubleval)
+				return evalue;
+		}
 	default:
 		break;
 	}
@@ -240,6 +244,16 @@
 void
 gsane_option_handler_set_enum(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, GnomeScanEnumValue* value, GError **error)
 {
+	switch(desc->type) {
+	case SANE_TYPE_INT:
+		gsane_option_handler_set_int(self, desc, index, g_value_get_double(value->value), error);
+		break;
+	case SANE_TYPE_FIXED:
+		gsane_option_handler_set_double(self, desc, index, g_value_get_double(value->value), error);
+		break;
+	default:
+		break;
+	}
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]