diff --git a/resource/editor_drop_down_list.ui b/resource/editor_drop_down_list.ui new file mode 100644 index 0000000..953f5c5 --- /dev/null +++ b/resource/editor_drop_down_list.ui @@ -0,0 +1,50 @@ + + + _widget_top + + + + 0 + 0 + 393 + 50 + + + + + 300 + 20 + + + + param drop down list + + + + 0 + + + + + + + param_name + + + + + + + + 0 + 0 + + + + + + + + + + diff --git a/setup.py b/setup.py index ef5648e..3e9cb60 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ data_files=[ ('share/' + package_name + '/resource', [ 'resource/editor_bool.ui', + 'resource/editor_drop_down_list.ui', 'resource/editor_enum.ui', 'resource/editor_number.ui', 'resource/editor_string.ui', diff --git a/src/rqt_reconfigure/param_client_widget.py b/src/rqt_reconfigure/param_client_widget.py index 99d8934..746f516 100644 --- a/src/rqt_reconfigure/param_client_widget.py +++ b/src/rqt_reconfigure/param_client_widget.py @@ -245,10 +245,18 @@ def add_editor_widgets(self, parameters, descriptors): for parameter, descriptor in zip(parameters, descriptors): if Parameter.Type(descriptor.type) not in EDITOR_TYPES: continue + + if len(descriptor.additional_constraints) > 0 and descriptor.additional_constraints[0] == "\n": + editor_widget = EDITOR_TYPES["DROP_DOWN_LIST"]( + self._param_client, parameter, descriptor + ) + + else: + editor_widget = EDITOR_TYPES[parameter.type_]( + self._param_client, parameter, descriptor + ) + logging.debug('Adding editor widget for {}'.format(parameter.name)) - editor_widget = EDITOR_TYPES[Parameter.Type(descriptor.type)]( - self._param_client, parameter, descriptor - ) self._editor_widgets[parameter.name] = editor_widget editor_widget.display(self.grid) diff --git a/src/rqt_reconfigure/param_editors.py b/src/rqt_reconfigure/param_editors.py index 3342b23..ed72745 100644 --- a/src/rqt_reconfigure/param_editors.py +++ b/src/rqt_reconfigure/param_editors.py @@ -150,6 +150,39 @@ def update_local(self, value): self._update_signal.emit(value) +class DropDownListEditor(EditorWidget): + _update_signal = Signal(int) + + def __init__(self, *args, **kwargs): + super(DropDownListEditor, self).__init__(*args, **kwargs) + ui_ddl = os.path.join( + package_path, 'share', 'rqt_reconfigure', 'resource', + 'editor_drop_down_list.ui' + ) + loadUi(ui_ddl, self) + + self.contraints = self.descriptor.additional_constraints.split("\n")[1:] + self.drop_down_items = [] + + for item in self.contraints: + t = item.split(",") + self.drop_down_items.append(t[1]) + + self._paramval_drop_down_list.addItems(self.drop_down_items) + self._paramval_drop_down_list.setCurrentIndex(self.parameter.value) + + self._update_signal.connect(self._paramval_drop_down_list.setCurrentIndex) + + self._paramval_drop_down_list.currentIndexChanged.connect(self.index_changed) + + def index_changed(self, index): + self.update(int(index)) + + def update_local(self, value): + super(DropDownListEditor, self).update_local(value) + self._update_signal.emit(value) + + class StringEditor(EditorWidget): _update_signal = Signal(str) @@ -310,7 +343,7 @@ def __init__(self, *args, **kwargs): ) loadUi(ui_num, self) - if len(self.descriptor.floating_point_range) > 0: + if(len(self.descriptor.floating_point_range) > 0): # Handle unbounded doubles nicely self._min = float(self.descriptor.floating_point_range[0].from_value) self._min_val_label.setText(str(self._min)) @@ -514,9 +547,5 @@ def _set_to_empty(self): Parameter.Type.INTEGER: IntegerEditor, Parameter.Type.DOUBLE: DoubleEditor, Parameter.Type.STRING: StringEditor, - Parameter.Type.BOOL_ARRAY: ArrayEditor, - Parameter.Type.BYTE_ARRAY: ArrayEditor, - Parameter.Type.INTEGER_ARRAY: ArrayEditor, - Parameter.Type.DOUBLE_ARRAY: ArrayEditor, - Parameter.Type.STRING_ARRAY: ArrayEditor, + "DROP_DOWN_LIST": DropDownListEditor, }