def __change_element(self): """Shows dialog to change selection element. """ dialog = ElementSelectionDialog() # Only disable these once, not if you cancel after selecting once. if self.element_button.text() == "Select": self.isotope_radio.setEnabled(False) self.standard_mass_radio.setEnabled(False) self.standard_mass_label.setEnabled(False) # If element was selected, proceed to enable appropriate fields. if dialog.element: self.element_button.setText(dialog.element) self.__enable_element_fields(dialog.element) self.__set_color_button_color(dialog.element) self.tmp_element = dialog.element if self.isotope_combobox.count() == 0: self.isotopeInfoLabel.setVisible(True) iv.set_input_field_red(self.isotope_combobox) self.setMinimumHeight(243) else: self.isotopeInfoLabel.setVisible(False) self.isotope_combobox.setStyleSheet("background-color: %s" % "None") self.setMinimumHeight(200) self.__check_if_settings_ok()
def __change_type_to_erd(self): """Change sample settings to ERD mode. """ # Put RBS information to sample settings. self.sample_isotope_combobox.clear() self.sample_element_button.setText(self.rbs_element_button.text()) self.sample_isotope_radio.setChecked( self.rbs_isotope_radio.isChecked()) self.sample_isotope_combobox.setEnabled( self.rbs_isotope_radio.isChecked()) self.sample_standard_mass_radio.setChecked( self.rbs_standard_mass_radio.isChecked()) self.sample_standard_mass_label.setText( self.rbs_standard_mass_label.text()) current_isotope = None if self.rbs_element_button.text() != "Select": if self.sample_isotope_radio.isChecked(): data = self.rbs_isotope_combobox.currentData() if data: current_isotope = data["element"].isotope self.sampleIsotopeInfoLabel.setVisible(False) self.sample_isotope_combobox.setStyleSheet( "background-color: %s" % "None") else: iv.set_input_field_red(self.sample_isotope_combobox) self.sampleIsotopeInfoLabel.setVisible(True) else: if self.rbsIsotopeInfoLabel.isVisible(): iv.set_input_field_red(self.sample_isotope_combobox) self.sampleIsotopeInfoLabel.setVisible(True) else: self.sample_isotope_combobox.setStyleSheet( "background-color: %s" % "None") self.sampleIsotopeInfoLabel.setVisible(False) self.__enable_element_fields(self.rbs_element_button.text(), self.sample_isotope_combobox, self.sample_isotope_radio, self.sample_standard_mass_radio, self.sample_standard_mass_label, current_isotope=current_isotope) if self.sample_element_button.text() == "Select": self.sample_standard_mass_label.setEnabled(False) self.sample_standard_mass_radio.setEnabled(False) self.sample_isotope_radio.setEnabled(False) self.colorButton.setStyleSheet("") # Clear style self.colorButton.setText("Automatic") # Clear RBS area. self.rbs_element_button.setText("Select") self.rbs_standard_mass_label.setText("0") self.rbs_isotope_combobox.clear() # Switch to this by default. self.rbs_standard_mass_radio.setChecked(True) if current_isotope: self.__set_isotope_weight_factor(self.sample_isotope_combobox) self.groupBox_rbs.setEnabled(False) self.groupBox_rbs.setVisible(False) self.groupBox_sample.setEnabled(True) self.groupBox_sample.setVisible(True)
def __init__(self, target): """ Initialize the dialog. Args: target: Target object. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_target_info.ui", self) self.target = target self.okPushButton.clicked.connect(self.__accept_settings) self.cancelPushButton.clicked.connect(self.close) self.fields_are_valid = False iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit, qwidget=self)) self.nameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameLineEdit)) self.nameLineEdit.setEnabled(False) self.name = "" self.nameLineEdit.setText(target.name) self.descriptionLineEdit.setPlainText(target.description) self.description = "" self.isOk = False self.dateLabel.setText(time.strftime("%c %z %Z", time.localtime( target.modification_time))) self.__close = True self.exec_()
def __check_if_settings_ok(self): """Check that all the settings are okay. Return: True if the settings are okay and false if some required fields are empty. """ settings_ok = True help_sum = 0 elem_widgets = self.get_element_widgets() # Check if 'scrollArea' is empty (no elements). if not elem_widgets: iv.set_input_field_red(self.scrollArea) settings_ok = False # Check that the element specific settings are okay. for widget in elem_widgets: elem = widget.get_selected_element() if elem is None: settings_ok = False else: help_sum += elem.amount if isclose(help_sum, 1.0, rel_tol=1e-6) or isclose(help_sum, 100.0, rel_tol=1e-6): for widget in elem_widgets: iv.set_input_field_white(widget.amount_spinbox) self.amount_mismatch = False else: for widget in elem_widgets: iv.set_input_field_red(widget.amount_spinbox) settings_ok = False self.amount_mismatch = True self.fields_are_valid = settings_ok
def __init__(self, tmp_foils, tmp_index, icon_manager): """ Initializes the Foil Dialog. Args: tmp_foils: Foil object list. tmp_index: Index of the Foil object in tmp_foils. icon_manager: Icon manager for TargetCompositionWidget. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_composition_dialog.ui", self) self.icon_manager = icon_manager self.foils = tmp_foils self.index = tmp_index self.tmp_foil = copy.deepcopy(tmp_foils[tmp_index]) self.foil_type = None self.foil_type_changed = False # Add foil types to combobox. self.typeComboBox.addItem("circular") self.typeComboBox.addItem("rectangular") self.dimension_edits = [] self.first_dimension_edit = QtWidgets.QDoubleSpinBox() self.first_dimension_edit.setMinimum(0.01) self.first_dimension_edit.setMaximumWidth(9999.99) self.first_dimension_edit.setMaximumWidth(70) self.locale = QLocale.c() self.first_dimension_edit.setLocale(self.locale) self.second_dimension_edit = None self.dimension_label = QtWidgets.QLabel("Diameter (mm):") self.transmissionEdit.setLocale(self.locale) self.dimension_edits.append(self.first_dimension_edit) self.dimensionLayout.addWidget(self.dimension_label) self.dimensionLayout.addWidget(self.dimension_edits[0]) self.fields_are_valid = False iv.set_input_field_red(self.nameEdit) self.nameEdit.textChanged.connect( lambda: iv.check_text(self.nameEdit, qwidget=self)) self.nameEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameEdit)) self.show_parameters() # This widget adds itself into the matplotlib_layout self.composition = FoilCompositionWidget(self, self.tmp_foil, self.icon_manager) self.typeComboBox.currentIndexChanged.connect(self._change_dimensions) self.cancelButton.clicked.connect(self.close) self.okButton.clicked.connect(self._save_foil_info_and_close) self.__close = True self.exec_()
def __init__(self, recoil_element: RecoilElement, colormap, element_simulation: ElementSimulation): """Inits a recoil info dialog. Args: recoil_element: A RecoilElement object. colormap: Colormap for elements. element_simulation: Element simulation that has the recoil element. """ super().__init__() self.recoil_element = recoil_element self.element_simulation = element_simulation self.tmp_color = QColor(self.recoil_element.color) self.colormap = colormap value = self.recoil_element.reference_density self.scientific_spinbox = ScientificSpinBox(value=value, minimum=0.01, maximum=9.99e23) uic.loadUi(gutils.get_ui_dir() / "ui_recoil_info_dialog.ui", self) self.okPushButton.clicked.connect(self.__accept_settings) self.cancelPushButton.clicked.connect(self.close) self.colorPushButton.clicked.connect(self.__change_color) self.fields_are_valid = True iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit, qwidget=self)) self.nameLineEdit.textEdited.connect(self.__validate) self.name = recoil_element.name self.description = recoil_element.description self.formLayout.insertRow( 4, QtWidgets.QLabel(r"Reference density [at./cm<sup>3</sup>]:"), self.scientific_spinbox) self.formLayout.removeRow(self.widget) self.description = recoil_element.description self.isOk = False self.dateLabel.setText( time.strftime( "%c %z %Z", time.localtime(self.recoil_element.modification_time))) title = f"Recoil element: " \ f"{self.recoil_element.element.get_prefix()}" self.infoGroupBox.setTitle(title) self.__set_color_button_color(self.recoil_element.element.symbol) self.exec_()
def __init__(self, element_simulation: ElementSimulation, preset_folder=None): """ Initializes the widget. Args: element_simulation: Element simulation object. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_request_simulation_settings.ui", self) # By default, disable the widget, so caller has to enable it. Without # this, name and description fields would always be enabled when the # widget loads. self.setEnabled(False) self.element_simulation = element_simulation self.set_spinbox_maximums() gutils.fill_combobox(self.modeComboBox, SimulationMode) gutils.fill_combobox(self.typeOfSimulationComboBox, SimulationType) self.fields_are_valid = False iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit, qwidget=self)) self.nameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameLineEdit)) self.nameLineEdit.setEnabled(False) locale = QLocale.c() self.minimumScatterAngleDoubleSpinBox.setLocale(locale) self.minimumMainScatterAngleDoubleSpinBox.setLocale(locale) self.minimumEnergyDoubleSpinBox.setLocale(locale) self.__original_property_values = {} self.set_properties( name=self.element_simulation.name, description=self.element_simulation.description, modification_time=self.element_simulation.modification_time, **self.element_simulation.get_settings()) if preset_folder is not None: self.preset_widget = PresetWidget.add_preset_widget( preset_folder / "simulation", "sim", lambda w: self.layout().insertWidget(0, w), save_callback=self.save_properties_to_file, load_callback=self.load_properties_from_file) else: self.preset_widget = None
def validate(self): """Validates the contents of the Widget, setting background colors and error messages if necessary. """ valid_selection = bool(self.get_element()) self._isotope_input.setEnabled(valid_selection) if valid_selection: self._isotope_input.setStyleSheet("background-color: %s" % "None") if self._info_label is not None: self._info_label.setText("") else: iv.set_input_field_red(self._isotope_input) self._symbol_input.setText("Select") if self._info_label is not None: self._info_label.setText( IsotopeSelectionWidget.MISSING_ISOTOPE_TXT) if self._parent is not None: self._parent.fields_are_valid = False
def __change_element(self, button, isotope_combobox, standard_mass_label, standard_mass_radio, isotope_radio, isotope_info_label, sample=True): """Shows dialog to change selection element. Args: button: QtWidgets.QPushButton (button to select element) isotope_combobox: QtWidgets.QComboBox isotope_radio: QtGui.QRadioButton standard_mass_radio: QtGui.QRadioButton standard_mass_label: QtWidgets.QLabel isotope_info_label: Label that shows if element doesn't have any natural isotopes. sample: Whether the element is from sample or rbs. """ # TODO implement or remove sample parameter dialog = ElementSelectionDialog() # Only disable these once, not if you cancel after selecting once. if button.text() == "Select": isotope_radio.setEnabled(False) standard_mass_radio.setEnabled(False) standard_mass_label.setEnabled(False) # If element was selected, proceed to enable appropriate fields. if dialog.element: button.setText(dialog.element) self.__enable_element_fields(dialog.element, isotope_combobox, isotope_radio, standard_mass_radio, standard_mass_label) if isotope_combobox.count() == 0: isotope_info_label.setVisible(True) iv.set_input_field_red(isotope_combobox) else: isotope_info_label.setVisible(False) isotope_combobox.setStyleSheet("background-color: %s" % "None")
def __init__(self, value=0.0, minimum=0.0, maximum=math.inf, decimal_places=17, show_btns=True): """ Initializes the spinbox. Args: value: value of spinbox minimum: minimum allowed value maximum: maximum allowed value decimal_places: maximum number of decimals to show show_btns: Whether buttons that increase or decrease the value are shown. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_scientific_spinbox_widget.ui", self) self._value = Decimal(str(value)) self.minimum = minimum self.maximum = maximum if decimal_places < 1: self._decimal_places = 1 elif decimal_places > 17: self._decimal_places = 17 else: self._decimal_places = decimal_places self.scientificLineEdit: QtWidgets.QLineEdit self._validator = ScientificValidator( self.minimum, self.maximum, self._decimal_places, self, accepted=lambda: iv.set_input_field_white(self.scientificLineEdit), intermediate=lambda: iv.set_input_field_yellow(self. scientificLineEdit), invalid=lambda: iv.set_input_field_red(self.scientificLineEdit)) self.scientificLineEdit.setValidator(self._validator) self.set_value(self._value) if show_btns: self.upButton.clicked.connect( lambda *_: self._step_adjustment(self._up_step)) self.downButton.clicked.connect( lambda *_: self._step_adjustment(self._down_step)) else: self.upButton.hide() self.downButton.hide()
def __init__(self, samples): """Inits a new sample dialog. Args: samples: List of samples. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_new_sample.ui", self) self.createButton.clicked.connect(self.__create_sample) self.cancelButton.clicked.connect(self.close) self.name = "" self.description = "" self.samples = samples self.__close = True iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit)) self.nameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameLineEdit)) self.exec_()
def __init__(self, parent): """Inits energy spectrum dialog. Args: parent: Ibasoft class object. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_new_request.ui", self) self.parent = parent self.folder = None # Temporary for browsing folder self.directory = None self.requestDirectoryLineEdit.setText( str(self.parent.settings.get_request_directory())) # Connect buttons self.pushOk.clicked.connect(self.__create_request) self.pushCancel.clicked.connect(self.close) self.browseFolderButton.clicked.connect(self.__browser_folder) iv.set_input_field_red(self.requestNameLineEdit) self.requestNameLineEdit.textChanged.connect( lambda: iv.check_text(self.requestNameLineEdit)) self.requestNameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.requestNameLineEdit)) self.requestDirectoryLineEdit.textChanged.connect( lambda: iv.check_text(self.requestDirectoryLineEdit)) self.__close = True if platform.system() == "Darwin": self.requestNameLineEdit.setMinimumWidth(310) self.requestDirectoryLineEdit.setMinimumWidth(234) self.exec_()
def __init__(self, samples): """Inits a new simulation dialog. Args: samples: Samples of request. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_new_simulation.ui", self) # Add existing samples to view. self.samples = samples for sample in samples: self.samplesComboBox.addItem("Sample " + "%02d" % sample.serial_number + " " + sample.name) if not samples: iv.set_input_field_red(self.samplesComboBox) self.addSampleButton.clicked.connect(self.__add_sample) self.pushCreate.clicked.connect(self.__create_simulation) self.pushCancel.clicked.connect(self.close) self.name = None self.sample = None self.__close = True iv.set_input_field_red(self.simulationNameLineEdit) self.simulationNameLineEdit.textChanged.connect( lambda: iv.check_text(self.simulationNameLineEdit)) self.simulationNameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.simulationNameLineEdit)) if platform.system() == "Darwin": self.samplesComboBox.setMinimumWidth(157) self.exec_()
def change_element(self): """Opens element selection dialog and loads selected element's isotopes to the combobox. """ dialog = ElementSelectionDialog() if dialog.element: self.beamIonButton.setText(dialog.element) # TODO use IsotopeSelectionWidget gutils.load_isotopes(dialog.element, self.isotopeComboBox) # Check if no isotopes if self.isotopeComboBox.count() == 0: self.isotopeInfoLabel.setVisible(True) self.fields_are_valid = False iv.set_input_field_red(self.isotopeComboBox) self.beam_selection_ok.emit(False) else: self.isotopeInfoLabel.setVisible(False) iv.check_text(self.nameLineEdit, qwidget=self) self.isotopeComboBox.setStyleSheet( "background-color: %s" % "None") self.beam_selection_ok.emit(True) else: self.beam_selection_ok.emit(False)
def __init__(self, samples, directory): """Inits a load measurement dialog. Args: samples: Samples of request. directory: Directory where to open the file browser. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_new_measurement.ui", self) self.browseButton.clicked.connect(self.__browse_files) self.addSampleButton.clicked.connect(self.__add_sample) self.loadButton.clicked.connect(self.__load_measurement) self.cancelButton.clicked.connect(self.close) self.name = "" self.sample = None self.directory = directory self.filename = "" self.samples = samples self.__close = True for sample in samples: self.samplesComboBox.addItem("Sample " + "%02d" % sample.serial_number + " " + sample.name) if not samples: iv.set_input_field_red(self.samplesComboBox) iv.set_input_field_red(self.pathLineEdit) self.pathLineEdit.textChanged.connect( lambda: iv.check_text(self.pathLineEdit)) iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit)) self.nameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameLineEdit)) self.exec_()
def __init__(self, tab, layer=None, modify=False, simulation=None, first_layer=False): """Inits a layer dialog. Args: tab: A SimulationTabWidget layer: Layer object to be modified. None if creating a new layer. modify: If dialog is used to modify a layer. simulation: A Simulation object. first_layer: Whether the dialog is used to add the first layer. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_layer_dialog.ui", self) self.tab = tab self.layer = layer self.ok_pressed = False self.simulation = simulation self.amount_mismatch = True self.fields_are_valid = True iv.set_input_field_red(self.nameEdit) self.nameEdit.textChanged.connect( lambda: iv.check_text(self.nameEdit, self)) self.nameEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameEdit)) # Connect buttons to events self.addElementButton.clicked.connect(self.__add_element_layout) self.okButton.clicked.connect(self.__save_layer) self.cancelButton.clicked.connect(self.close) self.thicknessEdit.setMinimum(0.01) self.densityEdit.setMinimum(0.01) self.__original_properties = {} if self.layer: self.__show_layer_info() else: self.__add_element_layout() if first_layer: self.groupBox_2.hide() self.__close = True self.thicknessEdit.setLocale(QLocale.c()) self.densityEdit.setLocale(QLocale.c()) if modify: self.groupBox_2.hide() self.placement_under = True if platform.system() == "Darwin": self.setMinimumWidth(450) if platform.system() == "Linux": self.setMinimumWidth(470) self.exec_()
def __change_type_to_rbs(self): """Change sample settings to RBS mode. """ self.rbs_isotope_combobox.clear() current_isotope = None # Put current sample settings to RBS if self.sample_element_button.text() != "Select": self.rbs_element_button.setText(self.sample_element_button.text()) self.rbs_isotope_radio.setChecked( self.sample_isotope_radio.isChecked()) self.rbs_isotope_combobox.setEnabled( self.sample_isotope_radio.isChecked()) self.rbs_standard_mass_radio.setChecked( self.sample_standard_mass_radio.isChecked()) if self.sample_isotope_radio.isChecked(): data = self.sample_isotope_combobox.currentData() if data: current_isotope = data["element"].isotope self.rbsIsotopeInfoLabel.setVisible(False) self.rbs_isotope_combobox.setStyleSheet( "background-color: %s" % "None") else: current_isotope = None iv.set_input_field_red(self.rbs_isotope_combobox) self.rbsIsotopeInfoLabel.setVisible(True) else: if self.sampleIsotopeInfoLabel.isVisible(): current_isotope = None iv.set_input_field_red(self.rbs_isotope_combobox) self.rbsIsotopeInfoLabel.setVisible(True) else: self.rbsIsotopeInfoLabel.setVisible(False) self.rbs_isotope_combobox.setStyleSheet( "background-color: %s" % "None") self.__enable_element_fields(self.sample_element_button.text(), self.rbs_isotope_combobox, self.rbs_isotope_radio, self.rbs_standard_mass_radio, self.rbs_standard_mass_label, current_isotope=current_isotope) # Put Scatter Element settings to dialog else: if self.selection.element_scatter != "": self.rbs_element_button.setText( self.selection.element_scatter.symbol) else: self.rbs_element_button.setText("Select") if self.selection.element_scatter and \ self.selection.element_scatter.isotope: self.rbs_isotope_radio.setChecked(True) self.rbs_isotope_combobox.setEnabled(True) self.rbs_standard_mass_radio.setChecked(False) current_isotope = self.selection.element_scatter.isotope else: self.rbs_isotope_radio.setChecked(False) self.rbs_isotope_combobox.setEnabled(False) if self.selection.element_scatter: self.rbs_standard_mass_radio.setChecked(True) else: self.rbs_standard_mass_radio.setChecked(False) self.__enable_element_fields(self.rbs_element_button.text(), self.rbs_isotope_combobox, self.rbs_isotope_radio, self.rbs_standard_mass_radio, self.rbs_standard_mass_label, current_isotope=current_isotope) self.sample_standard_mass_radio.setEnabled(False) self.sample_standard_mass_label.setEnabled(False) self.sample_isotope_radio.setChecked(True) self.sample_isotope_radio.setEnabled(False) self.sample_isotope_combobox.setEnabled(False) self.__set_color_button_color(self.rbs_element_button.text()) if current_isotope: self.__set_isotope_weight_factor(self.rbs_isotope_combobox) self.groupBox_sample.setEnabled(False) self.groupBox_sample.setVisible(False) self.groupBox_rbs.setEnabled(True) self.groupBox_rbs.setVisible(True)
def __init__(self, obj: Union[Measurement, Simulation], preset_folder=None): """Initializes the widget. Args: obj: object that uses these settings, either a Measurement or a Simulation. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_measurement_settings_tab.ui", self) self.fluenceDoubleSpinBox = ScientificSpinBox() image = gf.get_root_dir() / "images" / "measurement_setup_angles.png" pixmap = QtGui.QPixmap(str(image)) self.picture.setScaledContents(True) self.picture.setPixmap(pixmap) self.obj = obj self.__original_property_values = {} locale = QLocale.c() self.energyDoubleSpinBox.setLocale(locale) self.energyDistDoubleSpinBox.setLocale(locale) self.spotSizeXdoubleSpinBox.setLocale(locale) self.spotSizeYdoubleSpinBox.setLocale(locale) self.divergenceDoubleSpinBox.setLocale(locale) self.currentDoubleSpinBox.setLocale(locale) self.timeDoubleSpinBox.setLocale(locale) self.runChargeDoubleSpinBox.setLocale(locale) self.targetThetaDoubleSpinBox.setLocale(locale) self.detectorThetaDoubleSpinBox.setLocale(locale) self.detectorFiiDoubleSpinBox.setLocale(locale) self.targetFiiDoubleSpinBox.setLocale(locale) # Fii angles are currently not used so disable their spin boxes self.detectorFiiDoubleSpinBox.setEnabled(False) self.targetFiiDoubleSpinBox.setEnabled(False) gutils.fill_combobox(self.profileComboBox, Profile) # Copy of measurement's/simulation's run or default run # TODO should default run also be copied? if not self.obj.run: self.tmp_run = self.obj.request.default_run else: self.tmp_run = copy.deepcopy(self.obj.run) self.isotopeInfoLabel.setVisible(False) self.beamIonButton.clicked.connect(self.change_element) self.fields_are_valid = False iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit, qwidget=self)) self.nameLineEdit.textEdited.connect(self.__validate) self.nameLineEdit.setEnabled(False) self.run_form_layout: QtWidgets.QFormLayout self.run_form_layout.insertRow(3, "Fluence", self.fluenceDoubleSpinBox) self.fluenceDoubleSpinBox.scientificLineEdit.setContextMenuPolicy( Qt.ActionsContextMenu) self.actionMultiply = QtWidgets.QAction( self.fluenceDoubleSpinBox.scientificLineEdit) self.actionMultiply.triggered.connect(self.__multiply_fluence) self.fluenceDoubleSpinBox.scientificLineEdit.addAction( self.actionMultiply) self.actionUndo = QtWidgets.QAction( self.fluenceDoubleSpinBox.scientificLineEdit) self.actionUndo.setText("Undo multiply") self.actionUndo.triggered.connect(self.__undo_fluence) self.actionUndo.setEnabled(bool(self.tmp_run.previous_fluence)) self.fluenceDoubleSpinBox.scientificLineEdit.addAction(self.actionUndo) self.clipboard = QGuiApplication.clipboard() self._ratio = None self.clipboard.changed.connect(self.__update_multiply_action) self.__update_multiply_action() self.energyDoubleSpinBox.setToolTip("Energy set in MeV with.") if preset_folder is not None: self.preset_widget = PresetWidget.add_preset_widget( preset_folder / "measurement", "mea", lambda w: self.layout().insertWidget(0, w), save_callback=self.save_properties_to_file, load_callback=self.load_properties_from_file ) else: self.preset_widget = None self.show_settings()
def __init__(self, obj: Detector, request: Request, icon_manager, run=None): """Initializes a DetectorSettingsWidget object. Args: obj: a Detector object. request: Which request it belongs to. icon_manager: IconManager object. run: Run object. None if detector is default detector. """ super().__init__() uic.loadUi(gutils.get_ui_dir() / "ui_request_detector_settings.ui", self) self.obj = obj self.request = request self.icon_manager = icon_manager self.run = run self.__original_properties = {} # Temporary foils list which holds all the information given in the # foil dialog # If user presses ok or apply, these values will be saved into # request's default detector self.tmp_foil_info = [] # List of foil indexes that are timing foils self.tof_foils = [] # Add foil widgets and foil objects self.detector_structure_widgets = [] self.foils_layout = self._add_default_foils(self.obj) self.detectorScrollAreaContents.layout().addLayout(self.foils_layout) self.newFoilButton.clicked.connect( lambda: self._add_new_foil(self.foils_layout)) self.addEfficiencyButton.clicked.connect(self.__add_efficiency) self.removeEfficiencyButton.clicked.connect(self.__remove_efficiency) self.plotEfficiencyButton.clicked.connect(self.__plot_efficiency) self.efficiencyListWidget.itemSelectionChanged.connect( self._enable_remove_btn) self._enable_remove_btn() # Calibration settings # TODO: Require saving affected cuts if beam setting has been changed self.executeCalibrationButton.clicked.connect( self.__open_calibration_dialog) self.executeCalibrationButton.setEnabled( not self.request.samples.measurements.is_empty()) gutils.fill_combobox(self.typeComboBox, DetectorType) self.fields_are_valid = False iv.set_input_field_red(self.nameLineEdit) self.nameLineEdit.textChanged.connect( lambda: iv.check_text(self.nameLineEdit, qwidget=self)) self.nameLineEdit.textEdited.connect( lambda: iv.sanitize_file_name(self.nameLineEdit)) self.nameLineEdit.setEnabled(False) locale = QLocale.c() self.timeResSpinBox.setLocale(locale) self.virtualSizeXSpinBox.setLocale(locale) self.virtualSizeYSpinBox.setLocale(locale) self.angleSlopeLineEdit.setLocale(locale) self.angleOffsetLineEdit.setLocale(locale) # Create scientific spinboxes for tof slope and tof offset self.formLayout_2.removeRow(self.slopeLineEdit) self.formLayout_2.removeRow(self.offsetLineEdit) self.scientific_tof_slope = ScientificSpinBox(minimum=-math.inf, maximum=math.inf) self.scientific_tof_offset = ScientificSpinBox(minimum=-math.inf, maximum=math.inf) self.formLayout_2.insertRow(0, "ToF slope [s/channel]:", self.scientific_tof_slope) self.formLayout_2.insertRow(1, "ToF offset[s]:", self.scientific_tof_offset) if platform.system() == "Darwin": self.scientific_tof_offset.scientificLineEdit.setFixedWidth(170) self.scientific_tof_slope.scientificLineEdit.setFixedWidth(170) # Save as and load self.saveButton.clicked.connect(self.__save_file) self.loadButton.clicked.connect(self.__load_file) self.show_settings()