You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.4 KiB
51 lines
1.4 KiB
import asyncio |
|
from typing import Any, Optional |
|
|
|
from .mixins.value_element import ValueElement |
|
|
|
|
|
class Dialog(ValueElement): |
|
|
|
def __init__(self, *, value: bool = False) -> None: |
|
"""Dialog |
|
|
|
Creates a dialog. |
|
By default it is dismissible by clicking or pressing ESC. |
|
To make it persistent, set `.props('persistent')` on the dialog element. |
|
|
|
:param value: whether the dialog should be opened on creation (default: `False`) |
|
""" |
|
super().__init__(tag='q-dialog', value=value, on_value_change=None) |
|
self._result: Any = None |
|
self._submitted: Optional[asyncio.Event] = None |
|
|
|
@property |
|
def submitted(self) -> asyncio.Event: |
|
if self._submitted is None: |
|
self._submitted = asyncio.Event() |
|
return self._submitted |
|
|
|
def open(self) -> None: |
|
self.value = True |
|
|
|
def close(self) -> None: |
|
self.value = False |
|
|
|
def __await__(self): |
|
self._result = None |
|
self.submitted.clear() |
|
self.open() |
|
yield from self.submitted.wait().__await__() # pylint: disable=no-member |
|
result = self._result |
|
self.close() |
|
return result |
|
|
|
def submit(self, result: Any) -> None: |
|
self._result = result |
|
self.submitted.set() |
|
|
|
def on_value_change(self, value: Any) -> None: |
|
super().on_value_change(value) |
|
if not self.value: |
|
self._result = None |
|
self.submitted.set()
|
|
|