diff --git a/frappy/gui/connection.py b/frappy/gui/connection.py index 35cfa3c..4741234 100644 --- a/frappy/gui/connection.py +++ b/frappy/gui/connection.py @@ -72,9 +72,7 @@ class QSECNode(QObject): return self.modules[module]['parameters'][parameter] def setParameter(self, module, parameter, value): - # TODO: change the widgets for complex types to no longer use strings - datatype = self.conn.modules[module]['parameters'][parameter]['datatype'] - self.conn.setParameter(module, parameter, datatype.from_string(value)) + self.conn.setParameter(module, parameter, value) def getParameter(self, module, parameter): return self.conn.getParameter(module, parameter, True) diff --git a/frappy/gui/inputwidgets.py b/frappy/gui/inputwidgets.py new file mode 100644 index 0000000..ae9eaf5 --- /dev/null +++ b/frappy/gui/inputwidgets.py @@ -0,0 +1,62 @@ +from frappy.gui.qt import QCheckBox, QComboBox, QLineEdit, pyqtSignal + +from frappy.datatypes import BoolType, EnumType + +# ArrayOf, BLOBType, FloatRange, IntRange, StringType, StructOf, TextType, TupleOf + + +def get_input_widget(datatype, parent=None): + return { + EnumType: EnumInput, + BoolType: BoolInput, + }.get(datatype.__class__, GenericInput)(datatype, parent) + + +class GenericInput(QLineEdit): + submitted = pyqtSignal() + def __init__(self, datatype, parent=None): + super().__init__(parent) + self.datatype = datatype + self.setPlaceholderText('new value') + self.returnPressed.connect(self.submit) + + def get_input(self): + return self.datatype.from_string(self.text()) + + def submit(self): + self.submitted.emit() + + +class EnumInput(QComboBox): + submitted = pyqtSignal() + def __init__(self, datatype, parent=None): + super().__init__(parent) + self.setPlaceholderText('choose value') + self.datatype = datatype + + self._map = {} + self._revmap = {} + for idx, member in enumerate(datatype._enum.members): + self._map[idx] = member + self._revmap[member.name] = idx + self._revmap[member.value] = idx + self.addItem(member.name, member.value) + + def get_input(self): + return self._map[self.currentIndex()].value + + def submit(self): + self.submitted.emit() + + +class BoolInput(QCheckBox): + submitted = pyqtSignal() + def __init__(self, datatype, parent=None): + super().__init__(parent) + self.datatype = datatype + + def get_input(self): + return self.checkState() + + def submit(self): + self.submitted.emit() diff --git a/frappy/gui/modulewidget.py b/frappy/gui/modulewidget.py index f539ebd..503f971 100644 --- a/frappy/gui/modulewidget.py +++ b/frappy/gui/modulewidget.py @@ -27,6 +27,7 @@ from frappy.gui.qt import QColor, QDialog, QHBoxLayout, QIcon, QLabel, \ from frappy.gui.util import Colors, loadUi from frappy.gui.valuewidgets import get_widget +from frappy.gui.inputwidgets import get_input_widget class CommandDialog(QDialog): @@ -316,16 +317,16 @@ class ModuleWidget(QWidget): def _addRWParam(self, param, row): nameLabel = AnimatedLabel(param) display = QLineEdit() - inputEdit = QLineEdit() + props = self._node.getProperties(self._name, param) + inputEdit = get_input_widget(props.get('datatype')) submitButton = QPushButton('set') submitButton.setIcon(QIcon(':/icons/submit')) - inputEdit.setPlaceholderText('new value') p = display.palette() p.setColor(display.backgroundRole(), Colors.palette.window().color()) display.setPalette(p) submitButton.pressed.connect(lambda: self._button_pressed(param)) - inputEdit.returnPressed.connect(lambda: self._button_pressed(param)) + inputEdit.submitted.connect(lambda param=param: self._button_pressed(param)) self._paramDisplays[param] = display self._paramInputs[param] = inputEdit self._paramWidgets[param] = [nameLabel, display, inputEdit, submitButton] @@ -442,7 +443,7 @@ class ModuleWidget(QWidget): self.paramDetails.emit(self._name, param) def _button_pressed(self, param): - target = self._paramInputs[param].text() + target = self._paramInputs[param].get_input() try: self._node.setParameter(self._name, param, target) except Exception as e: diff --git a/frappy/gui/qt.py b/frappy/gui/qt.py index 7c671e3..46ba0f3 100644 --- a/frappy/gui/qt.py +++ b/frappy/gui/qt.py @@ -46,7 +46,7 @@ try: QScrollArea, QSizePolicy, QSpacerItem, QSpinBox, QStyle, \ QStyleOptionTab, QStylePainter, QTabBar, QTabWidget, QTextEdit, \ QToolButton, QTreeView, QTreeWidget, QTreeWidgetItem, QVBoxLayout, \ - QWidget + QWidget,QSlider import frappy.gui.resources_qt6 @@ -66,6 +66,6 @@ except ImportError as e: QRadioButton, QScrollArea, QShortcut, QSizePolicy, QSpacerItem, \ QSpinBox, QStyle, QStyleOptionTab, QStylePainter, QTabBar, \ QTabWidget, QTextEdit, QToolButton, QTreeView, QTreeWidget, \ - QTreeWidgetItem, QVBoxLayout, QWidget + QTreeWidgetItem, QVBoxLayout, QWidget, QSlider import frappy.gui.resources_qt5