Source code for pymodaq.extensions.sequencer.utilities.elements.repeat

from typing import Any

from serializall import SerializableFactory

from qtpy import QtCore

from pymodaq.utils.managers.modules import ModuleType
from pymodaq_data import DataToExport
from pymodaq_gui.parameter.pymodaq_ptypes.itemselect import ItemSelect
from pymodaq_gui.utils.widgets import SpinBox
from pymodaq.extensions.sequencer.utilities.element_factory import SeqEltBase, SeqEltFactory, ElementError
from pymodaq.extensions.sequencer.utilities.widget_with_toolbar import WidgetWithToolbar
from qt_themes import get_theme
from pymodaq.utils.managers.modules_manager import ModulesManager

ser_factory = SerializableFactory()

[docs] @SerializableFactory.register_decorator() @SeqEltFactory.register_elt() class RepeatElt(SeqEltBase): elt_name = 'repeat' children_allowed = True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._n_repeat: int = 3 self._ind_execute = 0 def initialize_element(self): self._ind_execute = 0 def do_things_with_dashboard(self): pass @property def n_repeat(self) -> int: return self._n_repeat @n_repeat.setter def n_repeat(self, value: int): self._n_repeat = value def _create_widget(self, base_widget:WidgetWithToolbar) -> WidgetWithToolbar: spinbox = SpinBox(parent=base_widget, int=True, value=self.n_repeat) base_widget.add_widget_top(spinbox) spinbox.sigValueChanged.connect(self.set_repeat_from_spinbox) base_widget.give_focus_to(spinbox) return base_widget def set_repeat_from_spinbox(self, spinbox: SpinBox): self.n_repeat = spinbox.value() def _execute(self, dte: DataToExport=None): if self._ind_execute < self.n_repeat: """ This will execute the children state and its bundled elements n_repeat times""" self._ind_execute += 1 self.children_signal.emit() else: self._ind_execute = 0 self.done_signal.emit()
[docs] def to_dict_custom(self) -> dict[str, Any]: """ adds attribute to a dict in order to produce a human readable representation/configuration for this element to be reimplemented """ return {'n_repeat': self.n_repeat}
[docs] def from_dict_custom(self, dict_config: dict[str, Any]): """ Create/set the custom part of the element to finish initialization using setters, attribute assignment or methods """ self.n_repeat = dict_config.pop('n_repeat')
def _eq(self, other: 'RepeatElt'): """ Custom method to reimplement to assert two elements are equals""" return self.n_repeat == other.n_repeat def __repr__(self): return f'{super().__repr__()} - {self.n_repeat}'
[docs] def check_set_is_valid(self): """ Check the validity of the element Will be called before executing the element. Try to make sure the element is valid or return None if the user may do something! """ if not (self.n_repeat >= 1): raise ElementError(f'Element {self}: at least one repetition required')