def test_GIVEN_stream_group_that_has_ev42_advanced_option_WHEN_filling_in_existing_field_widget_THEN_ev42_group_box_is_shown( file, qtbot): group = file.create_group("stream2") group.attrs["NX_class"] = "NCstream" vlen_str = h5py.special_dtype(vlen=str) group.create_dataset("writer_module", dtype=vlen_str, data="ev42") group.create_dataset("topic", dtype=vlen_str, data="topic1") group.create_dataset("source", dtype=vlen_str, data="source1") group.create_dataset(ADC_PULSE_DEBUG, dtype=bool, data=True) wrapper = NexusWrapper() wrapper.load_file(file, file) instrument = Instrument(wrapper, {}) widget = FieldWidget(instrument=instrument) qtbot.addWidget(widget) update_existing_stream_field(group, widget) # this would usually be done outside of the update_existing_stream_field widget.name = get_name_of_node(group) assert widget.streams_widget.ev42_advanced_group_box.isEnabled() generated_group = widget.streams_widget.get_stream_group() assert generated_group["writer_module"][()] == group["writer_module"][()] assert generated_group["topic"][()] == group["topic"][()] assert generated_group["source"][()] == group["source"][()] assert generated_group[ADC_PULSE_DEBUG][()] == group[ADC_PULSE_DEBUG][()]
def __update_existing_dataset_field(field: Dataset, new_ui_field: FieldWidget): new_ui_field.name = field.name new_ui_field.dtype = ValueTypes.STRING if not field.type else field.type new_ui_field.value = field.values # type: ignore new_ui_field.attrs = field units = field.attributes.get_attribute_value(CommonAttrs.UNITS) new_ui_field.units = units
def test_GIVEN_stream_group_that_has_f142_advanced_option_WHEN_filling_in_existing_field_widget_THEN_f142_group_box_is_shown( file, qtbot, nexus_wrapper): group = file.create_group("stream1") group.attrs["NX_class"] = "NCstream" vlen_str = h5py.special_dtype(vlen=str) group.create_dataset("writer_module", dtype=vlen_str, data="f142") group.create_dataset("type", dtype=vlen_str, data="byte") group.create_dataset("topic", dtype=vlen_str, data="topic1") group.create_dataset("source", dtype=vlen_str, data="source1") group.create_dataset(NEXUS_INDICES_INDEX_EVERY_MB, dtype=int, data=1) wrapper = nexus_wrapper wrapper.load_file(file, file) instrument = Instrument(wrapper, {}) widget = FieldWidget(instrument=instrument) qtbot.addWidget(widget) update_existing_stream_field(group, widget) # this would usually be done outside of the update_existing_stream_field widget.name = get_name_of_node(group) assert widget.streams_widget.f142_advanced_group_box.isEnabled() generated_group = widget.streams_widget.get_stream_group() assert generated_group["writer_module"][()] == group["writer_module"][()] assert generated_group["topic"][()] == group["topic"][()] assert generated_group["type"][()] == group["type"][()] assert generated_group["source"][()] == group["source"][()] assert (generated_group[NEXUS_INDICES_INDEX_EVERY_MB][( )] == group[NEXUS_INDICES_INDEX_EVERY_MB][()])
def update_existing_link_field(field: h5py.SoftLink, new_ui_field: FieldWidget): """ Fill in a UI link field for an existing link in the component :param field: The link field in the component group :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType.link.value new_ui_field.value = field.parent.get(field.name, getlink=True).path
def update_existing_array_field(field: h5py.Dataset, new_ui_field: FieldWidget): """ Fill in a UI array field for an existing array field in the component group :param value: The array dataset's value to copy to the UI fields list model :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType.array_dataset.value new_ui_field.dtype = field.dtype new_ui_field.value = field[()]
def setupUi(self, Transformation, instrument): Transformation.setObjectName("Transformation") Transformation.resize(361, 171) self.frame_layout = QVBoxLayout(Transformation) self.frame_layout.setContentsMargins(4, 4, 4, 4) self.main_layout = QVBoxLayout() self.main_layout.setSpacing(4) self.name_layout = QHBoxLayout() self.name_layout.setSpacing(-1) self.name_label = QLabel("Name", Transformation) self._make_text_bold(self.name_label) self.name_layout.addWidget(self.name_label) self.name_line_edit = QLineEdit(Transformation) self.name_layout.addWidget(self.name_line_edit) self.main_layout.addLayout(self.name_layout) self._add_line() self.vector_label = QLabel("", Transformation) self._make_text_bold(self.vector_label) self.main_layout.addWidget(self.vector_label) self._set_up_vector_box(Transformation) self._add_line() self.value_label = QLabel("") self._make_text_bold(self.value_label) self.main_layout.addWidget(self.value_label) self.magnitude_widget = FieldWidget(hide_name_field=True, instrument=instrument) self.magnitude_widget.setFrameShape(QFrame.NoFrame) self.magnitude_widget.setMinimumHeight(40) self.main_layout.addWidget(self.magnitude_widget) self.ui_placeholder_layout = QFormLayout() self.value_spinbox = QDoubleSpinBox(Transformation) self.value_spinbox.setToolTip("Placeholder value for 3D view to use") self.value_spinbox.setDecimals(8) self.value_spinbox.setMaximumSize(QSize(100, 16777215)) self.ui_placeholder_layout.addRow("Value to use in 3D view:", self.value_spinbox) self.main_layout.addLayout(self.ui_placeholder_layout) self.set_spinbox_ranges() self.frame_layout.addLayout(self.main_layout) self.retranslateUi(Transformation) QMetaObject.connectSlotsByName(Transformation)
def add_field(self) -> FieldWidget: item = QListWidgetItem() field = FieldWidget( self.possible_fields, self.fieldsListWidget, self.instrument ) field.something_clicked.connect(partial(self.select_field, item)) self.nx_class_changed.connect(field.field_name_edit.update_possible_fields) item.setSizeHint(field.sizeHint()) self.fieldsListWidget.addItem(item) self.fieldsListWidget.setItemWidget(item, field) return field
def test_ui_field_GIVEN_field_does_not_have_units_filled_in_ui_WHEN_getting_field_group_THEN_units_are_not_saved( qtbot, ): listwidget = QListWidget() field = FieldWidget(None, POSSIBLE_FIELDS, listwidget) field_name = "test" field.name = field_name field.value_line_edit.setText("1") qtbot.addWidget(field) group = field.value assert not group.attributes.contains_attribute("units")
def test_ui_field_GIVEN_field_does_not_have_units_filled_in_ui_WHEN_getting_field_group_THEN_units_are_not_saved( qtbot, ): listwidget = QListWidget() field = FieldWidget(["test"], listwidget) field_name = "test" field.name = field_name field.value_line_edit.setText("1") qtbot.addWidget(field) group = field.value assert "units" not in group.attrs
def test_ui_stream_field_GIVEN_f142_is_selected_WHEN_combo_is_changed_THEN_value_units_edit_is_shown( qtbot, ): listwidget = QListWidget() field = FieldWidget(["test"], listwidget) field_name = "test" field.name = field_name stream_fields_widget = StreamFieldsWidget(field) qtbot.addWidget(stream_fields_widget) stream_fields_widget.schema_combo.currentTextChanged.emit("f142") assert stream_fields_widget.value_units_edit.isEnabled() assert stream_fields_widget.value_units_label.isEnabled()
def test_ui_field_GIVEN_field_has_units_filled_in_ui_WHEN_getting_field_group_THEN_units_are_stored_in_attrs( qtbot, ): listwidget = QListWidget() field = FieldWidget(None, POSSIBLE_FIELDS, listwidget) field_name = "test" field.name = field_name field.value_line_edit.setText("1") qtbot.addWidget(field) units = "m" field.units = units group = field.value assert group.attributes.contains_attribute("units") assert group.attributes.get_attribute_value("units") == units
def update_existing_scalar_field(field: h5py.Dataset, new_ui_field: FieldWidget): """ Fill in a UI scalar field for an existing scalar field in the component group :param field: The dataset to copy into the value line edit :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType.scalar_dataset.value dtype = field.dtype if "S" in str(dtype): dtype = h5py.special_dtype(vlen=str) new_ui_field.value = field[()] else: new_ui_field.value = field[()] new_ui_field.dtype = dtype
def update_existing_scalar_field(field: Dataset, new_ui_field: FieldWidget): """ Fill in a UI scalar field for an existing scalar field in the component group :param field: The dataset to copy into the value line edit :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType(FieldType.scalar_dataset.value) __update_existing_dataset_field(field, new_ui_field)
def update_existing_array_field(field: Dataset, new_ui_field: FieldWidget): """ Fill in a UI array field for an existing array field in the component group :param field: The dataset to copy to the UI fields list model :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType(FieldType.array_dataset.value) __update_existing_dataset_field(field, new_ui_field)
def test_ui_stream_field_GIVEN_f142_is_selected_WHEN_advanced_options_are_clicked_THEN_f142_group_box_is_shown( qtbot, ): listwidget = QListWidget() field = FieldWidget(["test"], listwidget) field_name = "test" field.name = field_name stream_fields_widget = StreamFieldsWidget(field) stream_fields_widget.schema_combo.setCurrentText("f142") qtbot.addWidget(stream_fields_widget) stream_fields_widget.f142_advanced_group_box.setVisible = Mock() stream_fields_widget._show_advanced_options(True) stream_fields_widget.f142_advanced_group_box.setVisible.assert_called_once_with( True)
def setup_ui(self, transformation): self.main_layout = QVBoxLayout() self.main_layout.setSpacing(4) self.frame_layout = QVBoxLayout(transformation) self.frame_layout.setContentsMargins(4, 4, 4, 4) self.name_layout = QHBoxLayout() self.name_layout.setSpacing(-1) self.name_label = QLabel("Name", transformation) self._make_text_bold(self.name_label) self.name_line_edit = QLineEdit(transformation) self.vector_label = QLabel("", transformation) self._make_text_bold(self.vector_label) self.value_label = QLabel("") self._make_text_bold(self.value_label) self.magnitude_widget = FieldWidget( node_parent=transformation.transformation_parent, hide_name_field=True, show_only_f142_stream=True, ) self.magnitude_widget.setFrameShape(QFrame.NoFrame) self.magnitude_widget.setMinimumHeight(40) self.ui_placeholder_layout = QFormLayout() self.value_spinbox = QDoubleSpinBox(transformation) self.value_spinbox.setToolTip("Placeholder value for 3D view to use") self.value_spinbox.setDecimals(8) self.value_spinbox.setMaximumSize(QSize(100, 16777215)) self.ui_placeholder_layout.addRow( "Value to use in 3D view:", self.value_spinbox ) self.setup_name_layout() self.setup_vector_layout(transformation) self.setup_value_and_magnitude() self.set_spinbox_ranges() self.frame_layout.addLayout(self.main_layout) self.retranslate_ui(transformation) QMetaObject.connectSlotsByName(transformation)
def test_ui_field_GIVEN_field_has_units_filled_in_ui_WHEN_getting_field_group_THEN_units_are_stored_in_attrs( qtbot, ): nexus_wrapper = NexusWrapper("test_ui_fields_units") instrument = Instrument(nexus_wrapper, NX_CLASS_DEFINITIONS) listwidget = QListWidget() field = FieldWidget(["test"], listwidget, instrument=instrument) field_name = "test" field.name = field_name field.value_line_edit.setText("1") qtbot.addWidget(field) units = "m" field.units = units group = field.value assert "units" in group.attrs assert group.attrs["units"] == units
def update_existing_stream_field(field: h5py.Dataset, new_ui_field: FieldWidget): """ Fill in a UI stream field for an existing stream field in the component group :param field: The dataset to copy into the value line edit :param new_ui_field: The new UI field to fill in with existing data """ new_ui_field.field_type = FieldType.kafka_stream.value new_ui_field.streams_widget.update_existing_stream_info(field)
def __init__(self, module, parent: QWidget, model: Model): super().__init__( module.writer_module.upper() if module.writer_module == STATIC_DATASETS else module.writer_module, parent, ) layout = QVBoxLayout() self.field_widget = FieldWidget(module.parent_node, parent_dataset=module) self.field_widget.field_type_combo.setEnabled(False) self.module = module self.model = model self._set_existing_items() layout.addWidget(self.field_widget) self.setLayout(layout)
class Ui_Transformation(object): def setupUi(self, Transformation, instrument): Transformation.setObjectName("Transformation") Transformation.resize(361, 171) self.frame_layout = QVBoxLayout(Transformation) self.frame_layout.setContentsMargins(4, 4, 4, 4) self.main_layout = QVBoxLayout() self.main_layout.setSpacing(4) self.name_layout = QHBoxLayout() self.name_layout.setSpacing(-1) self.name_label = QLabel("Name", Transformation) self._make_text_bold(self.name_label) self.name_layout.addWidget(self.name_label) self.name_line_edit = QLineEdit(Transformation) self.name_layout.addWidget(self.name_line_edit) self.main_layout.addLayout(self.name_layout) self._add_line() self.vector_label = QLabel("", Transformation) self._make_text_bold(self.vector_label) self.main_layout.addWidget(self.vector_label) self._set_up_vector_box(Transformation) self._add_line() self.value_label = QLabel("") self._make_text_bold(self.value_label) self.main_layout.addWidget(self.value_label) self.magnitude_widget = FieldWidget(hide_name_field=True, instrument=instrument) self.magnitude_widget.setFrameShape(QFrame.NoFrame) self.magnitude_widget.setMinimumHeight(40) self.main_layout.addWidget(self.magnitude_widget) self.ui_placeholder_layout = QFormLayout() self.value_spinbox = QDoubleSpinBox(Transformation) self.value_spinbox.setToolTip("Placeholder value for 3D view to use") self.value_spinbox.setDecimals(8) self.value_spinbox.setMaximumSize(QSize(100, 16777215)) self.ui_placeholder_layout.addRow("Value to use in 3D view:", self.value_spinbox) self.main_layout.addLayout(self.ui_placeholder_layout) self.set_spinbox_ranges() self.frame_layout.addLayout(self.main_layout) self.retranslateUi(Transformation) QMetaObject.connectSlotsByName(Transformation) def _add_line(self): line = QFrame() line.setFrameShape((QFrame.HLine)) line.setFrameShadow(QFrame.Sunken) self.main_layout.addWidget(line) @staticmethod def _make_text_bold(label: QLabel): font = label.font() font.setBold(True) label.setFont(font) def _set_up_vector_box(self, Transformation): self.xyz_layout = QHBoxLayout() self.x_layout = QFormLayout() self.x_spinbox = QDoubleSpinBox(Transformation) self.x_layout.addRow("x:", self.x_spinbox) self.xyz_layout.addLayout(self.x_layout) self.y_layout = QFormLayout() self.y_spinbox = QDoubleSpinBox(Transformation) self.y_layout.addRow("y:", self.y_spinbox) self.xyz_layout.addLayout(self.y_layout) self.z_layout = QFormLayout() self.z_spinbox = QDoubleSpinBox(Transformation) self.z_layout.addRow("z:", self.z_spinbox) self.xyz_layout.addLayout(self.z_layout) self.main_layout.addLayout(self.xyz_layout) def set_spinbox_ranges(self): self.spinboxes = [ self.x_spinbox, self.y_spinbox, self.z_spinbox, self.value_spinbox, ] for spinbox in self.spinboxes: spinbox.setRange(-10000000, 10000000) spinbox.setDecimals(5) def retranslateUi(self, Transformation): Transformation.setWindowTitle( QApplication.translate("Transformation", "GroupBox", None, -1)) Transformation.setTitle( QApplication.translate("Transformation", "Translation", None, -1))