53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
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()
|