1
0

value_element.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import justpy as jp
  2. from typing import Any, Callable
  3. import traceback
  4. from binding import BindableProperty
  5. from .element import Element
  6. from ..utils import EventArguments
  7. class ValueElement(Element):
  8. value = BindableProperty()
  9. def __init__(self,
  10. view: jp.HTMLBaseComponent,
  11. *,
  12. value: Any,
  13. on_change: Callable,
  14. ):
  15. super().__init__(view)
  16. self.on_change = on_change
  17. self.value = value
  18. self.value.bind_to(self.view.value, forward=self.value_to_view)
  19. def value_to_view(self, value):
  20. return value
  21. def handle_change(self, msg):
  22. self.value = msg['value']
  23. if self.on_change is not None:
  24. try:
  25. try:
  26. self.on_change()
  27. except TypeError:
  28. self.on_change(EventArguments(self, **msg))
  29. except Exception:
  30. traceback.print_exc()
  31. def bind_value_to(self, target, forward=lambda x: x):
  32. self.value.bind_to(target, forward=forward, nesting=1)
  33. return self
  34. def bind_value_from(self, target, backward=lambda x: x):
  35. self.value.bind_from(target, backward=backward, nesting=1)
  36. return self
  37. def bind_value(self, target, forward=lambda x: x, backward=lambda x: x):
  38. self.value.bind(target, forward=forward, backward=backward, nesting=1)
  39. return self