from fasthtml.components import Div from myfasthtml.controls.BaseCommands import BaseCommands from myfasthtml.controls.helpers import mk from myfasthtml.core.commands import Command from myfasthtml.core.dbmanager import DbObject from myfasthtml.core.instances import MultipleInstance class CycleState(DbObject): def __init__(self, owner, save_state): with self.initializing(): super().__init__(owner, save_state=save_state) self.state = None class Commands(BaseCommands): def cycle_state(self): return Command("CycleState", "Cycle state", self._owner, self._owner.cycle_state).htmx(target=f"#{self._id}") class CycleStateControl(MultipleInstance): def __init__(self, parent, controls: dict, _id=None, save_state=True): super().__init__(parent, _id) self._state = CycleState(self, save_state) self.controls_by_states = controls self.commands = Commands(self) # init the state if required if self._state.state is None and controls: self._state.state = next(iter(controls.keys())) def cycle_state(self): keys = list(self.controls_by_states.keys()) current_idx = keys.index(self._state.state) self._state.state = keys[(current_idx + 1) % len(keys)] return self def get_state(self): return self._state.state def render(self): return mk.mk( Div(self.controls_by_states[self._state.state], id=self._id), command=self.commands.cycle_state() ) def __ft__(self): return self.render()