value_element.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from typing import Any, Callable, Dict, Optional
  2. import justpy as jp
  3. from ..binding import BindableProperty, bind_from, bind_to
  4. from ..events import ValueChangeEventArguments, handle_event
  5. from ..task_logger import create_task
  6. from .element import Element
  7. class ValueElement(Element):
  8. value = BindableProperty(
  9. on_change=lambda sender, value: handle_event(sender.change_handler,
  10. ValueChangeEventArguments(sender=sender, value=value)))
  11. def __init__(self, view: jp.HTMLBaseComponent, *, value: Any, on_change: Optional[Callable]):
  12. super().__init__(view)
  13. self.change_handler = on_change
  14. self.value = value
  15. self.bind_value_to(self.view, 'value', forward=self.value_to_view)
  16. def value_to_view(self, value):
  17. return value
  18. def handle_change(self, msg: Dict):
  19. self.value = msg['value']
  20. create_task(self.view.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