1
0

element.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import justpy as jp
  2. import asyncio
  3. from ..utils import handle_exceptions, provide_arguments
  4. class Element:
  5. wp: None
  6. view_stack = []
  7. bindings = []
  8. def __init__(self, view: jp.HTMLBaseComponent):
  9. self.parent_view = self.view_stack[-1]
  10. self.parent_view.add(view)
  11. view.add_page(self.wp)
  12. self.view = view
  13. def set_classes(self, classes: str):
  14. self.view.classes = classes
  15. return self
  16. def add_classes(self, classes: str):
  17. self.view.classes += ' ' + classes
  18. return self
  19. def set_style(self, style: str):
  20. self.view.style = style
  21. return self
  22. def add_style(self, style: str):
  23. self.view.style += ' ' + style
  24. return self
  25. def bind(self, view_attribute, model, model_attribute, interval, transform):
  26. async def loop():
  27. while True:
  28. model_value = transform(getattr(model, model_attribute))
  29. if getattr(self.view, view_attribute) != model_value:
  30. print("Update view", view_attribute, 'to', model_value,
  31. '/ was:', getattr(self.view, view_attribute))
  32. setattr(self.view, view_attribute, model_value)
  33. await self.parent_view.update()
  34. await asyncio.sleep(interval)
  35. self.bindings.append(loop())
  36. def bind_text(self, model, attribute, interval=0.1, transform=lambda x: x):
  37. self.bind('text', model, attribute, interval, transform)
  38. def bind_value(self, model, attribute, interval=0.1, transform=lambda x: x):
  39. self.bind('value', model, attribute, interval, transform)
  40. def update_model(_, event):
  41. model_value = transform(getattr(model, attribute))
  42. if model_value != transform(float(event.value)):
  43. print("Update model", attribute, 'to', event.value, '/ was:', model_value)
  44. setattr(model, attribute, event.value)
  45. self.view.on('change', handle_exceptions(update_model))