value_element.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from typing import Any, Callable, Dict, Literal, Optional
  2. import justpy as jp
  3. from ..binding import BindableProperty, bind_from, bind_to
  4. from ..events import ValueChangeEventArguments, handle_event
  5. from .element import Element
  6. class ValueElement(Element):
  7. value = BindableProperty(on_change=lambda sender, value: handle_event(
  8. sender.change_handler, ValueChangeEventArguments(sender=sender, socket=None, value=value)))
  9. def __init__(self, view: jp.HTMLBaseComponent, *, value: Any, on_change: Optional[Callable]) -> None:
  10. super().__init__(view)
  11. self.change_handler = on_change
  12. self.value = value
  13. self.bind_value_to(self.view, 'value', forward=self.value_to_view)
  14. def value_to_view(self, value):
  15. return value
  16. def set_value(self, value) -> None:
  17. self.value = value
  18. def handle_change(self, msg: Dict) -> Literal[False]:
  19. self.value = msg['value']
  20. self.update()
  21. return False
  22. def bind_value_to(self, target_object, target_name, *, forward=lambda x: x):
  23. bind_to(self, 'value', target_object, target_name, forward=forward)
  24. return self
  25. def bind_value_from(self, target_object, target_name, *, backward=lambda x: x):
  26. bind_from(self, 'value', target_object, target_name, backward=backward)
  27. return self
  28. def bind_value(self, target_object, target_name, *, forward=lambda x: x, backward=lambda x: x):
  29. bind_from(self, 'value', target_object, target_name, backward=backward)
  30. bind_to(self, 'value', target_object, target_name, forward=forward)
  31. return self