element.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import justpy as jp
  2. from binding.binding import BindableProperty
  3. class Element:
  4. wp: None
  5. view_stack = []
  6. visible = BindableProperty
  7. def __init__(self, view: jp.HTMLBaseComponent, design: str = '', classes: str = ''):
  8. for word in design.split():
  9. if '=' in word:
  10. setattr(view, *word.split('='))
  11. else:
  12. setattr(view, word, True)
  13. self.parent_view = self.view_stack[-1]
  14. self.parent_view.add(view)
  15. view.add_page(self.wp)
  16. self.view = view
  17. self.view.classes += ' ' + classes
  18. self.visible = True
  19. @property
  20. def visible(self):
  21. return self.visible_
  22. @visible.setter
  23. def visible(self, visible: bool):
  24. self.visible_ = visible
  25. (self.view.remove_class if self.visible_ else self.view.set_class)('hidden')
  26. def bind_visibility_to(self, target, forward=lambda x: x):
  27. self.visible.bind_to(target, forward=forward, nesting=1)
  28. return self
  29. def bind_visibility_from(self, target, backward=lambda x: x):
  30. self.visible.bind_from(target, backward=backward, nesting=1)
  31. return self
  32. def bind_visibility(self, target, forward=lambda x: x, backward=lambda x: x):
  33. self.visible.bind(target, forward=forward, backward=backward, nesting=1)
  34. return self
  35. def set_classes(self, classes: str):
  36. self.view.classes = classes
  37. return self
  38. def add_classes(self, classes: str):
  39. self.view.classes += ' ' + classes
  40. return self
  41. def set_style(self, style: str):
  42. self.view.style = style
  43. return self
  44. def add_style(self, style: str):
  45. self.view.style += ' ' + style
  46. return self