1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
from __future__ import annotations
import inspect
import logging
import threading
from typing import Any, Callable, TYPE_CHECKING
from typing_extensions import Self
if TYPE_CHECKING:
from typing import type_check_only
logger = logging.getLogger('pywebview')
class EventContainer:
_serializable = False
if TYPE_CHECKING:
@type_check_only
def __getattr__(self, __name: str) -> Event:
...
@type_check_only
def __setattr__(self, __name: str, __value: Event) -> None:
...
class Event:
def __init__(self, window, should_lock: bool = False) -> None:
self._items: list[Callable[..., Any]] = []
self._should_lock = should_lock
self._event = threading.Event()
self._window = window
def set(self, *args: Any, **kwargs: Any) -> bool:
def execute():
for func in self._items:
try:
if len(inspect.signature(func).parameters.values()) == 0:
value = func()
elif 'window' in inspect.signature(func).parameters:
value = func(self._window, *args, **kwargs)
else:
value = func(*args, **kwargs)
return_values.add(value)
except Exception as e:
logger.exception(e)
return_values: set[Any] = set()
if len(self._items):
if self._should_lock:
execute()
else:
t = threading.Thread(target=execute)
t.start()
false_values = [v for v in return_values if v is False]
self._event.set()
return len(false_values) != 0
def is_set(self) -> bool:
return self._event.is_set()
def wait(self, timeout: float | None = None) -> bool:
return self._event.wait(timeout)
def clear(self) -> None:
return self._event.clear()
def __add__(self, item: Callable[..., Any]) -> Self:
self._items.append(item)
return self
def __sub__(self, item: Callable[..., Any]) -> Self:
self._items.remove(item)
return self
def __iadd__(self, item: Callable[..., Any]) -> Self:
self._items.append(item)
return self
def __isub__(self, item: Callable[..., Any]) -> Self:
self._items.remove(item)
return self
def __len__(self) -> int:
return len(self._items)
|