Source code for prsctrl_gui.task.settings.measurement

from PyQt6.QtWidgets import QDoubleSpinBox, QGridLayout, QLabel, QVBoxLayout, QWidget
from prsctrl.measurement.settings import MeasurementParameters
from devctrl.gui.widgets.settings import FieldWidget, Field, FieldWidgetChoice, FieldWidgetFloat, FieldWidgetUnion
from devctrl.utility.settings_db import SettingsDb
from typing import Literal, Optional
from ..tasks import MeasurementTask
from ...app_state import sample_db, power_calibration_db, setup_info_db

[docs] class InnerWavelengthEnergyInputWidget(FieldWidget[tuple]): """ TODO: add support for list, connect to energies_eV... this will be difficult. """
[docs] def __init__(self, value: tuple, field: Optional[Field] = None, parent: Optional[QWidget] = None, which: Literal["eV", "nm"]="eV", **metadata): super().__init__(value, field, parent, **metadata) if not len(value) == 3: raise ValueError(f"Argument 'value' must be a tuple of length 3 (start, stop, step), but has length {len(value)}: '{value}'") layout = QGridLayout() layout.addWidget(QLabel(self.tr("Start")), 0, 0) layout.addWidget(QLabel(self.tr("Stop")), 0, 1) layout.addWidget(QLabel(self.tr("Step")), 0, 2) start, stop, step = value self.w_start = FieldWidgetFloat(start, valid=(0.1, 6) if which == "eV" else (100, 2000)) self.w_stop = FieldWidgetFloat(stop, valid=(0.1, 6) if which == "eV" else (100, 2000)) self.w_step = FieldWidgetFloat(step, valid=(0.00001, 999)) layout.addWidget(self.w_start, 1, 0) layout.addWidget(self.w_stop, 1, 1) layout.addWidget(self.w_step, 1, 2) self.setLayout(layout)
[docs] def get_value(self) -> tuple|list|None: return (self.w_start.get_value(), self.w_stop.get_value(), self.w_step.get_value())
[docs] def set_value(self, value): if isinstance(value, tuple): if not len(value) == 3: raise ValueError(f"Argument 'value' must be a tuple of length 3 (start, stop, step), but has length {len(value)}: '{value}'") self.w_start.set_value(value[0]) self.w_stop.set_value(value[1]) self.w_step.set_value(value[2]) else: raise ValueError(f"Argument 'value' must be a tuple of length 3 (start, stop, step), but is {type(value)}: '{value}'")
[docs] def set_editable(self, editable: bool): self.w_start.set_editable(editable) self.w_stop.set_editable(editable) self.w_step.set_editable(editable)
[docs] class EnergyInputWidget(InnerWavelengthEnergyInputWidget):
[docs] def __init__(self, value: Optional[tuple], field: Optional[Field] = None, parent: Optional[QWidget] = None, **metadata): if value is None: value = (1.5, 3.0, 0.1) super().__init__(value, field, parent, which="eV", **metadata)
[docs] class WavelengthInputWidget(InnerWavelengthEnergyInputWidget):
[docs] def __init__(self, value: Optional[tuple], field: Optional[Field] = None, parent: Optional[QWidget] = None, which: Literal["eV", "nm"]="eV", **metadata): if value is None: value = (800, 420, 2) super().__init__(value, field, parent, which="nm", **metadata)
# FieldWidget.add_field_override(MeasurementParameters, "wavelengths_nm", WavelengthInputWidget) # FieldWidget.add_field_override(MeasurementParameters, "energies_eV", EnergyInputWidget)
[docs] class SettingsDbKey(FieldWidgetChoice): """Input for the key of a :py:class:`.SettingsDb`."""
[docs] def __init__(self, db: SettingsDb, value: str, field: Optional[Field] = None, parent: Optional[QWidget] = None, editable: bool=False, **metadata): self.db = db self.db.e_value_changed.connect(self._db_updated) self.db.e_value_removed.connect(self._db_updated) keys = sorted(list(self.db.keys())) metadata["values_editable"] = editable FieldWidgetChoice.__init__(self, value, field, parent, choices=keys, **metadata)
[docs] def _db_updated(self, *args): keys = sorted(list(self.db.keys())) self.update_choices(keys)
[docs] def __del__(self): """Disconnect the events/signals""" # TODO: figure out how to disconnect self.db.e_value_changed.disconnect(self._db_updated) self.db.e_value_removed.disconnect(self._db_updated) super().deleteLater()
[docs] class SampleKey(SettingsDbKey):
[docs] def __init__(self, value: str, field: Optional[Field] = None, parent: Optional[QWidget] = None, **metadata): db = sample_db.get() SettingsDbKey.__init__(self, db, value, field, parent, editable=True, **metadata)
[docs] class PowerCalibrationKey(SettingsDbKey):
[docs] def __init__(self, value: str, field: Optional[Field] = None, parent: Optional[QWidget] = None, **metadata): db = power_calibration_db.get() SettingsDbKey.__init__(self, db, value, field, parent, editable=True, **metadata)
[docs] class SetupInfoKey(SettingsDbKey):
[docs] def __init__(self, value: str, field: Optional[Field] = None, parent: Optional[QWidget] = None, **metadata): db = setup_info_db.get() SettingsDbKey.__init__(self, db, value, field, parent, editable=True, **metadata)
# FieldWidget.add_field_override(PrsGuiSettings, "sample_key", SampleKey) # FieldWidget.add_field_override(PrsGuiSettings, "power_calibration_key", PowerCalibrationKey) # FieldWidget.add_field_override(PrsGuiSettings, "setup_info_key", SetupInfoKey) FieldWidget.add_field_override(MeasurementTask, "sample_key", SampleKey) FieldWidget.add_field_override(MeasurementTask, "power_calibration_key", PowerCalibrationKey) FieldWidget.add_field_override(MeasurementTask, "setup_info_key", SetupInfoKey)