class _DelimitedDetectorWidget(_DetectorWidget): def _initUI(self): # Widgets self._rb_delimited = QRadioButton('Delimited') self._rb_delimited.setChecked(False) self._lbl_elevation = QLabel("Elevation") self._lbl_elevation.setStyleSheet("color: blue") self._txt_elevation = _AngleRangeWidget(_DelimitedDetector.elevation_rad) self._txt_elevation.setEnabled(False) self._txt_elevation.setRequired(False) self._lbl_azimuth = QLabel('Azimuth') self._lbl_azimuth.setStyleSheet("color: blue") self._txt_azimuth = _AngleRangeWidget(_DelimitedDetector.azimuth_rad) self._txt_azimuth.setEnabled(False) self._txt_azimuth.setRequired(False) self._rb_annular = QRadioButton('Annular') self._rb_annular.setChecked(True) self._lbl_takeoffangle = QLabel('Take-off angle') self._lbl_takeoffangle.setStyleSheet("color: blue") param_takeoffangle = \ AngleParameter(validators=range_validator(0.0, HALFPI), doc='Take-off angle from the x-y plane') param_takeoffangle._name = 'takeoffangle' self._txt_takeoffangle = AngleParameterWidget(param_takeoffangle) self._lbl_opening = QLabel('Opening') self._lbl_opening.setStyleSheet("color: blue") param_opening = \ AngleParameter(validators=range_validator(0.0, HALFPI, False), doc='Opening angle from the take-off angle (above and below)') param_opening._name = 'opening' self._txt_opening = AngleParameterWidget(param_opening) # Layouts layout = _DetectorWidget._initUI(self) layout.addRow(self._rb_delimited) sublayout = QFormLayout() sublayout.setContentsMargins(10, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS sublayout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) sublayout.addRow(self._lbl_elevation, self._txt_elevation) sublayout.addRow(self._lbl_azimuth, self._txt_azimuth) layout.addRow(sublayout) layout.addRow(self._rb_annular) sublayout = QFormLayout() sublayout.setContentsMargins(10, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS sublayout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) sublayout.addRow(self._lbl_takeoffangle, self._txt_takeoffangle) sublayout.addRow(self._lbl_opening, self._txt_opening) layout.addRow(sublayout) # Signals self._rb_delimited.toggled.connect(self._onToggle) self._rb_annular.toggled.connect(self._onToggle) return layout def _onToggle(self): state = self._rb_delimited.isChecked() self._txt_elevation.setEnabled(state) self._txt_azimuth.setEnabled(state) self._txt_elevation.setRequired(state) self._txt_azimuth.setRequired(state) self._txt_takeoffangle.setEnabled(not state) self._txt_opening.setEnabled(not state) self._txt_takeoffangle.setRequired(not state) self._txt_opening.setRequired(not state) def _getElevationValues(self): if self._rb_delimited.isChecked(): return self._txt_elevation.values() else: takeoffangles = self._txt_takeoffangle.values() openings = self._txt_opening.values() elevations = [] for takeoffangle, opening in product(takeoffangles, openings): elevation = (takeoffangle - opening, takeoffangle + opening) elevations.append(elevation) return elevations def _getAzimuthValues(self): if self._rb_delimited.isChecked(): return self._txt_azimuth.values() else: return [(0.0, TWOPI)] def setValue(self, value): self._rb_delimited.setChecked(True) self._txt_elevation.setValues(value.elevation_rad) self._txt_azimuth.setValues(value.azimuth_rad) self._txt_takeoffangle.setValues([]) self._txt_opening.setValues([]) def setReadOnly(self, state): _DetectorWidget.setReadOnly(self, state) style = 'color: none' if state else 'color: blue' self._rb_delimited.setEnabled(not state) self._rb_annular.setEnabled(not state) self._lbl_elevation.setStyleSheet(style) self._txt_elevation.setReadOnly(state) self._lbl_azimuth.setStyleSheet(style) self._txt_azimuth.setReadOnly(state) self._lbl_takeoffangle.setStyleSheet(style) self._txt_takeoffangle.setReadOnly(state) self._lbl_opening.setStyleSheet(style) self._txt_opening.setReadOnly(state)