diff --git a/src/nqrduck_spectrometer/base_spectrometer_view.py b/src/nqrduck_spectrometer/base_spectrometer_view.py index 3834345..72cf6ec 100644 --- a/src/nqrduck_spectrometer/base_spectrometer_view.py +++ b/src/nqrduck_spectrometer/base_spectrometer_view.py @@ -53,25 +53,8 @@ class BaseSpectrometerView(ModuleView): setting_label = QLabel(setting.name) setting_label.setMinimumWidth(200) - # Depending on the setting type we add different widgets to the view - if isinstance(setting, FloatSetting) or isinstance(setting, IntSetting) or isinstance(setting, StringSetting): - edit_widget = QLineEdit(str(setting.value)) - edit_widget.setMinimumWidth(100) - # Connect the editingFinished signal to the on_value_changed slot of the setting - edit_widget.editingFinished.connect(lambda x=edit_widget, s=setting: s.on_value_changed(x.text())) - - elif isinstance(setting, BooleanSetting): - edit_widget = QCheckBox() - edit_widget.setChecked(setting.value) - edit_widget.stateChanged.connect(lambda x=edit_widget, s=setting: s.on_value_changed(x)) - - elif isinstance(setting, SelectionSetting): - edit_widget = QComboBox() - edit_widget.addItems(setting.options) - edit_widget.setCurrentText(setting.value) - edit_widget.currentTextChanged.connect(lambda x=edit_widget, s=setting: s.on_value_changed(x)) + edit_widget = setting.get_widget() - # Add a icon that can be used as a tooltip if setting.description is not None: logger.debug("Adding tooltip to setting: %s", setting.name) diff --git a/src/nqrduck_spectrometer/settings.py b/src/nqrduck_spectrometer/settings.py index 36a3e07..2ae4bb5 100644 --- a/src/nqrduck_spectrometer/settings.py +++ b/src/nqrduck_spectrometer/settings.py @@ -1,6 +1,7 @@ import logging import ipaddress from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot +from PyQt6.QtWidgets import QLineEdit, QComboBox, QCheckBox logger = logging.getLogger(__name__) @@ -23,6 +24,20 @@ class Setting(QObject): def get_setting(self): return float(self.value) + def get_widget(self): + """Return a widget for the setting. + The default widget is simply a QLineEdit. + This method can be overwritten by subclasses to return a different widget. + + Returns: + QLineEdit: A QLineEdit widget that can be used to change the setting. + + """ + widget = QLineEdit(str(self.value)) + widget.setMinimumWidth(100) + widget.editingFinished.connect(lambda x=widget, s=self: s.on_value_changed(x.text())) + return widget + class FloatSetting(Setting): """ A setting that is a Float. """ def __init__(self, name : str, default : float, description : str) -> None: @@ -40,7 +55,6 @@ class FloatSetting(Setting): except ValueError: raise ValueError("Value must be a float") self.settings_changed.emit() - class IntSetting(Setting): """ A setting that is an Integer.""" @@ -79,6 +93,18 @@ class BooleanSetting(Setting): raise ValueError("Value must be a bool") self.settings_changed.emit() + + def get_widget(self): + """Return a widget for the setting. + This returns a QCheckBox widget. + + Returns: + QCheckBox: A QCheckBox widget that can be used to change the setting. + """ + widget = QCheckBox() + widget.setChecked(self.value) + widget.stateChanged.connect(lambda x=widget, s=self: s.on_value_changed(x.text())) + class SelectionSetting(Setting): """ A setting that is a selection from a list of options.""" def __init__(self, name : str, options : list, default : str, description : str) -> None: @@ -102,6 +128,19 @@ class SelectionSetting(Setting): raise ValueError("Value must be one of the options") self.settings_changed.emit() + def get_widget(self): + """Return a widget for the setting. + This returns a QComboBox widget. + + Returns: + QComboBox: A QComboBox widget that can be used to change the setting. + """ + widget = QComboBox() + widget.addItems(self.options) + widget.setCurrentText(self.value) + widget.currentTextChanged.connect(lambda x=widget, s=self: s.on_value_changed(x.text())) + return widget + class IPSetting(Setting): """ A setting that is an IP address.""" def __init__(self, name : str, default : str, description : str) -> None: