summaryrefslogtreecommitdiff
path: root/gr-qtgui/python/qtgui/range.py
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2015-04-21 16:46:55 -0400
committerTom Rondeau <tom@trondeau.com>2015-04-22 11:26:17 -0400
commitbb8e65d506b1e28b38548649ed2cf7fa86e70762 (patch)
tree9fcd83a0f882da591aa1953b1d4951ddfaf4312d /gr-qtgui/python/qtgui/range.py
parentd8a491fde1f29e10d77f536ea1234ee96089202a (diff)
qtgui: adds Type setting for Range widget.
Can set type to Float, Int, or Long to connect to properties requiring specific data types. Defaults to Float.
Diffstat (limited to 'gr-qtgui/python/qtgui/range.py')
-rwxr-xr-xgr-qtgui/python/qtgui/range.py52
1 files changed, 35 insertions, 17 deletions
diff --git a/gr-qtgui/python/qtgui/range.py b/gr-qtgui/python/qtgui/range.py
index 168e6662c3..bb7c100ea0 100755
--- a/gr-qtgui/python/qtgui/range.py
+++ b/gr-qtgui/python/qtgui/range.py
@@ -64,13 +64,17 @@ class Range(object):
class RangeWidget(QtGui.QWidget):
- def __init__(self, ranges, slot, label, style):
+ def __init__(self, ranges, slot, label, style, astype="float"):
""" Creates the QT Range widget """
QtGui.QWidget.__init__(self)
self.range = ranges
self.style = style
+ # astype tells the block how to return the value as a standard
+ # Python type. Can be: long, int, or float.
+ types = {"float": float, "long": long, "int": int}
+
# Top-block function to call when any value changes
# Some widgets call this directly when their value changes.
# Others have intermediate functions to map the value into the right range.
@@ -80,25 +84,28 @@ class RangeWidget(QtGui.QWidget):
label = Qt.QLabel(label)
layout.addWidget(label)
+
if style == "dial":
- self.d_widget = self.Dial(self, self.range, self.notifyChanged)
+ self.d_widget = self.Dial(self, self.range, self.notifyChanged, types[astype])
elif style == "slider":
- self.d_widget = self.Slider(self, self.range, self.notifyChanged)
+ self.d_widget = self.Slider(self, self.range, self.notifyChanged, types[astype])
elif style == "counter":
# The counter widget can be directly wired to the notifyChanged slot
- self.d_widget = self.Counter(self, self.range, self.notifyChanged)
+ self.d_widget = self.Counter(self, self.range, self.notifyChanged, types[astype])
else:
# The CounterSlider needs its own internal handlers before calling notifyChanged
- self.d_widget = self.CounterSlider(self, self.range, self.notifyChanged)
+ self.d_widget = self.CounterSlider(self, self.range, self.notifyChanged, types[astype])
layout.addWidget(self.d_widget)
self.setLayout(layout)
class Dial(QtGui.QDial):
""" Creates the range using a dial """
- def __init__(self, parent, ranges, slot):
+ def __init__(self, parent, ranges, slot, astype=float):
QtGui.QDial.__init__(self, parent)
+ self.astype = astype
+
# Setup the dial
self.setRange(0, ranges.nsteps-1)
self.setSingleStep(1)
@@ -116,13 +123,15 @@ class RangeWidget(QtGui.QWidget):
def changed(self, value):
""" Handles maping the value to the right range before calling the slot. """
val = self.range.map_range(value)
- self.notifyChanged(val)
+ self.notifyChanged(self.astype(val))
class Slider(QtGui.QSlider):
""" Creates the range using a slider """
- def __init__(self, parent, ranges, slot):
+ def __init__(self, parent, ranges, slot, astype=float):
QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent)
+ self.astype = astype
+
# Setup the slider
#self.setFocusPolicy(QtCore.Qt.NoFocus)
self.setRange(0, ranges.nsteps - 1)
@@ -149,7 +158,7 @@ class RangeWidget(QtGui.QWidget):
def changed(self, value):
""" Handle the valueChanged signal and map the value into the correct range """
val = self.range.map_range(value)
- self.notifyChanged(val)
+ self.notifyChanged(self.astype(val))
def mousePressEvent(self, event):
if((event.button() == QtCore.Qt.LeftButton)):
@@ -168,9 +177,11 @@ class RangeWidget(QtGui.QWidget):
class Counter(QtGui.QDoubleSpinBox):
""" Creates the range using a counter """
- def __init__(self, parent, ranges, slot):
+ def __init__(self, parent, ranges, slot, astype=float):
QtGui.QDoubleSpinBox.__init__(self, parent)
+ self.astype = astype
+
# Setup the counter
self.setRange(ranges.min, ranges.max)
self.setValue(ranges.default)
@@ -179,18 +190,25 @@ class RangeWidget(QtGui.QWidget):
self.setDecimals(ranges.precision)
# The counter already handles floats and can be connected directly.
- self.valueChanged.connect(slot)
+ self.valueChanged.connect(self.changed)
+ self.notifyChanged = slot
+
+ def changed(self, value):
+ """ Handle the valueChanged signal by converting to the right type """
+ self.notifyChanged(self.astype(value))
class CounterSlider(QtGui.QWidget):
""" Creates the range using a counter and slider """
- def __init__(self, parent, ranges, slot):
+ def __init__(self, parent, ranges, slot, astype=float):
QtGui.QWidget.__init__(self, parent)
+ self.astype = astype
+
# Slot to call in the parent
self.notifyChanged = slot
- self.slider = RangeWidget.Slider(parent, ranges, self.sliderChanged)
- self.counter = RangeWidget.Counter(parent, ranges, self.counterChanged)
+ self.slider = RangeWidget.Slider(parent, ranges, self.sliderChanged, astype)
+ self.counter = RangeWidget.Counter(parent, ranges, self.counterChanged, astype)
# Need another horizontal layout to wrap the other widgets.
layout = Qt.QHBoxLayout()
@@ -207,8 +225,8 @@ class RangeWidget(QtGui.QWidget):
# If the counter was changed, ignore any of these events
if not self.ignoreSlider:
# Value is already float. Just set the counter
- self.counter.setValue(value)
- self.notifyChanged(value)
+ self.counter.setValue(self.astype(value))
+ self.notifyChanged(self.astype(value))
self.ignoreSlider = False
def counterChanged(self, value):
@@ -223,4 +241,4 @@ class RangeWidget(QtGui.QWidget):
self.ignoreSlider = True
self.slider.setValue(new)
- self.notifyChanged(value)
+ self.notifyChanged(self.astype(value))