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 __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)