From a80c0f4969a994655ccb18c55f8ce936abcc61f7 Mon Sep 17 00:00:00 2001
From: Ben Reynwar <ben@reynwar.net>
Date: Fri, 8 Mar 2013 20:30:47 -0700
Subject: wxgui: Enabling uninstalled python imports.

---
 gr-wxgui/python/wxgui/forms/converters.py | 154 ++++++++++++++++++++++++++++++
 1 file changed, 154 insertions(+)
 create mode 100644 gr-wxgui/python/wxgui/forms/converters.py

(limited to 'gr-wxgui/python/wxgui/forms/converters.py')

diff --git a/gr-wxgui/python/wxgui/forms/converters.py b/gr-wxgui/python/wxgui/forms/converters.py
new file mode 100644
index 0000000000..db14d2752c
--- /dev/null
+++ b/gr-wxgui/python/wxgui/forms/converters.py
@@ -0,0 +1,154 @@
+#
+# Copyright 2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import eng_notation
+import math
+
+class abstract_converter(object):
+	def external_to_internal(self, v):
+		"""
+		Convert from user specified value to value acceptable to underlying primitive.
+		The underlying primitive usually expects strings.
+		"""
+		raise NotImplementedError
+	def internal_to_external(self, s):
+		"""
+		Convert from underlying primitive value to user specified value.
+		The underlying primitive usually expects strings.
+		"""
+		raise NotImplementedError
+	def help(self):
+		return "Any string is acceptable"
+
+class identity_converter(abstract_converter):
+	def external_to_internal(self,v):
+		return v
+	def internal_to_external(self, s):
+		return s
+
+########################################################################
+# Commonly used converters
+########################################################################
+class chooser_converter(abstract_converter):
+	"""
+	Convert between a set of possible choices and an index.
+	Used in the chooser base and all sub-classes.
+	"""
+	def __init__(self, choices):
+		#choices must be a list because tuple does not have .index() in python2.5
+		self._choices = list(choices)
+	def external_to_internal(self, choice):
+		return self._choices.index(choice)
+	def internal_to_external(self, index):
+		return self._choices[index]
+	def help(self):
+		return 'Enter a possible value in choices: "%s"'%str(self._choices)
+
+class bool_converter(abstract_converter):
+	"""
+	The internal representation is boolean.
+	The external representation is specified.
+	Used in the check box form.
+	"""
+	def __init__(self, true, false):
+		self._true = true
+		self._false = false
+	def external_to_internal(self, v):
+		if v == self._true: return True
+		if v == self._false: return False
+		raise Exception, 'Value "%s" is not a possible option.'%v
+	def internal_to_external(self, v):
+		if v: return self._true
+		else: return self._false
+	def help(self):
+		return "Value must be in (%s, %s)."%(self._true, self._false)
+
+class eval_converter(abstract_converter):
+	"""
+	A catchall converter when int and float are not enough.
+	Evaluate the internal representation with python's eval().
+	Possible uses, set a complex number, constellation points.
+	Used in text box.
+	"""
+	def __init__(self, formatter=lambda x: '%s'%(x)):
+		self._formatter = formatter
+	def external_to_internal(self, v):
+		return self._formatter(v)
+	def internal_to_external(self, s):
+		return eval(s)
+	def help(self):
+		return "Value must be evaluatable by python's eval."
+
+class str_converter(abstract_converter):
+	def __init__(self, formatter=lambda x: '%s'%(x)):
+		self._formatter = formatter
+	def external_to_internal(self, v):
+		return self._formatter(v)
+	def internal_to_external(self, s):
+		return str(s)
+
+class int_converter(abstract_converter):
+	def __init__(self, formatter=lambda x: '%d'%round(x)):
+		self._formatter = formatter
+	def external_to_internal(self, v):
+		return self._formatter(v)
+	def internal_to_external(self, s):
+		return int(s, 0)
+	def help(self):
+		return "Enter an integer.  Leading 0x indicates hex"
+
+class float_converter(abstract_converter):
+	def __init__(self, formatter=eng_notation.num_to_str):
+		self._formatter = formatter
+	def external_to_internal(self, v):
+		return self._formatter(v)
+	def internal_to_external(self, s):
+		return eng_notation.str_to_num(s)
+	def help(self):
+		return "Enter a float with optional scale suffix.  E.g., 100.1M"
+
+class slider_converter(abstract_converter):
+	"""
+	Scale values to and from the slider.
+	"""
+	def __init__(self, minimum, maximum, num_steps, cast):
+		assert minimum < maximum
+		assert num_steps > 0
+		self._offset = minimum
+		self._scaler = float(maximum - minimum)/num_steps
+		self._cast = cast
+	def external_to_internal(self, v):
+		return (v - self._offset)/self._scaler
+	def internal_to_external(self, v):
+		return self._cast(v*self._scaler + self._offset)
+	def help(self):
+		return "Value should be within slider range"
+
+class log_slider_converter(slider_converter):
+	def __init__(self, min_exp, max_exp, num_steps, base):
+		assert min_exp < max_exp
+		assert num_steps > 0
+		self._base = base
+		slider_converter.__init__(self, minimum=min_exp, maximum=max_exp, num_steps=num_steps, cast=float)
+	def external_to_internal(self, v):
+		return slider_converter.external_to_internal(self, math.log(v, self._base))
+	def internal_to_external(self, v):
+		return self._base**slider_converter.internal_to_external(self, v)
-- 
cgit v1.2.3