dialog.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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.
  9. By default it is non-modal.
  10. To make it modal, set `.props('persistent')` on the dialog element.
  11. :param value: whether the dialog is already opened (default: `False`)
  12. """
  13. view = jp.QDialog(value=value, input=self._on_input, temp=False)
  14. self._submitted: Optional[asyncio.Event] = None
  15. self._result: Any = None
  16. super().__init__(view)
  17. def open(self) -> None:
  18. self.view.value = True
  19. self.update()
  20. def close(self) -> None:
  21. self.view.value = False
  22. self.update()
  23. def __await__(self):
  24. self._submitted = asyncio.Event()
  25. self._submitted.clear()
  26. self._result = None
  27. self.open()
  28. yield from self.view.update().__await__()
  29. yield from self._submitted.wait().__await__()
  30. self.close()
  31. return self._result
  32. def submit(self, result: Any) -> bool:
  33. self._result = result
  34. self._submitted.set()
  35. return False
  36. def _on_input(self, *_) -> bool:
  37. self._result = None
  38. if self._submitted is not None:
  39. self._submitted.set()
  40. self.update()
  41. return False