summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/hatter.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/hatter.py')
-rw-r--r--raveos-center/raveos_center/hatter.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/hatter.py b/raveos-center/raveos_center/hatter.py
new file mode 100644
index 0000000..6c7349c
--- /dev/null
+++ b/raveos-center/raveos_center/hatter.py
@@ -0,0 +1,101 @@
+import time
+
+from PyQt6.QtCore import QObject, QThreadPool, pyqtSignal
+
+
+class _Jelzo(QObject):
+ kesz = pyqtSignal(object)
+ hiba = pyqtSignal(str)
+
+
+_elo = set()
+
+
+def hatterben(fuggveny, *args, kesz=None, hiba=None):
+ jelzo = _Jelzo()
+ _elo.add(jelzo)
+
+ def vege(*_):
+ _elo.discard(jelzo)
+
+ if kesz:
+ jelzo.kesz.connect(kesz)
+ if hiba:
+ jelzo.hiba.connect(hiba)
+ jelzo.kesz.connect(vege)
+ jelzo.hiba.connect(vege)
+
+ def futas():
+ try:
+ eredmeny = fuggveny(*args)
+ except BaseException as e:
+ jelzo.hiba.emit(str(e) or type(e).__name__)
+ else:
+ jelzo.kesz.emit(eredmeny)
+
+ QThreadPool.globalInstance().start(futas)
+
+
+_tar = {}
+_futok = {}
+_generacio = {}
+
+
+def _indit(kulcs, fuggveny, args, varok):
+ generacio = _generacio.get(kulcs, 0)
+ _futok[kulcs] = {"fuggveny": fuggveny, "args": args, "varok": varok}
+
+ def vege(ertek):
+ if _generacio.get(kulcs, 0) != generacio:
+ return
+ futo = _futok.pop(kulcs, None)
+ regi = _tar.get(kulcs)
+ _tar[kulcs] = (time.monotonic(), ertek)
+ for k, _, kiszolgalva in futo["varok"] if futo else []:
+ if k and (not kiszolgalva or regi is None or regi[1] != ertek):
+ k(ertek)
+
+ def hibas(uzenet):
+ if _generacio.get(kulcs, 0) != generacio:
+ return
+ futo = _futok.pop(kulcs, None)
+ for _, h, _ in futo["varok"] if futo else []:
+ if h:
+ h(uzenet)
+
+ hatterben(fuggveny, *args, kesz=vege, hiba=hibas)
+
+
+def gyorsitott(kulcs, fuggveny, *args, kesz=None, hiba=None, kor=60):
+ meglevo = _tar.get(kulcs)
+ if meglevo and kesz:
+ kesz(meglevo[1])
+ if meglevo and time.monotonic() - meglevo[0] < kor:
+ return
+ var = (kesz, hiba, meglevo is not None)
+ if kulcs in _futok:
+ _futok[kulcs]["varok"].append(var)
+ return
+ _indit(kulcs, fuggveny, args, [var])
+
+
+def tarolt(kulcs):
+ meglevo = _tar.get(kulcs)
+ return meglevo[1] if meglevo else None
+
+
+def ervenytelenit(*kulcsok):
+ for kulcs in kulcsok or list(set(_tar) | set(_futok)):
+ _tar.pop(kulcs, None)
+ _generacio[kulcs] = _generacio.get(kulcs, 0) + 1
+ futo = _futok.pop(kulcs, None)
+ if futo:
+ _indit(kulcs, futo["fuggveny"], futo["args"], [(k, h, False) for k, h, _ in futo["varok"]])
+
+
+def leallitas(ido_ms=3000):
+ _tar.clear()
+ _futok.clear()
+ pool = QThreadPool.globalInstance()
+ pool.clear()
+ pool.waitForDone(ido_ms)