dialog.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import asyncio
  2. from typing import Any, Optional
  3. import justpy as jp
  4. from .group import Group
  5. class Dialog(Group):
  6. def __init__(self, *, value: bool = False):
  7. """Dialog
  8. Creates a dialog. By default it is non-modal. To make it modal, set `.props('persistent')` on the dialog object.
  9. :param value: whether the dialog is already opened (default: `False`)
  10. """
  11. view = jp.QDialog(value=value, input=self._on_input, temp=False)
  12. self._submitted: Optional[asyncio.Event] = None
  13. self._result: Any = None
  14. super().__init__(view)
  15. def open(self) -> None:
  16. self.view.value = True
  17. self.update()
  18. def close(self) -> None:
  19. self.view.value = False
  20. self.update()
  21. def __await__(self):
  22. self._submitted = asyncio.Event()
  23. self._submitted.clear()
  24. self._result = None
  25. self.open()
  26. yield from self.view.update().__await__()
  27. yield from self._submitted.wait().__await__()
  28. self.close()
  29. return self._result
  30. def submit(self, result: Any) -> bool:
  31. self._result = result
  32. self._submitted.set()
  33. return False
  34. def _on_input(self, *_) -> bool:
  35. self._result = None
  36. if self._submitted is not None:
  37. self._submitted.set()
  38. self.update()
  39. return False