button.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from typing import Callable, Optional
  2. import justpy as jp
  3. from ..binding import BindableProperty, bind_from, bind_to
  4. from ..events import ClickEventArguments, handle_event
  5. from .element import Element
  6. class Button(Element):
  7. text = BindableProperty()
  8. def __init__(self, text: str = '', *, on_click: Optional[Callable] = None):
  9. """Button Element
  10. :param text: the label of the button
  11. :param on_click: callback which is invoked when button is pressed
  12. """
  13. view = jp.QButton(label=text, color='primary', temp=False)
  14. super().__init__(view)
  15. self.text = text
  16. self.bind_text_to(self.view, 'label')
  17. def process_event(view, event) -> Optional[bool]:
  18. return handle_event(on_click, ClickEventArguments(sender=self, socket=event.get('websocket')))
  19. view.on('click', process_event)
  20. def set_text(self, text: str):
  21. self.text = text
  22. def bind_text_to(self, target_object, target_name, forward=lambda x: x):
  23. bind_to(self, 'text', target_object, target_name, forward=forward)
  24. return self
  25. def bind_text_from(self, target_object, target_name, backward=lambda x: x):
  26. bind_from(self, 'text', target_object, target_name, backward=backward)
  27. return self
  28. def bind_text(self, target_object, target_name, forward=lambda x: x, backward=lambda x: x):
  29. bind_from(self, 'text', target_object, target_name, backward=backward)
  30. bind_to(self, 'text', target_object, target_name, forward=forward)
  31. return self