|
1 | 1 | import queue |
2 | 2 | import sys |
| 3 | +from functools import wraps |
3 | 4 | from typing import Optional, NamedTuple, Callable |
4 | 5 | import os.path |
5 | 6 |
|
|
10 | 11 |
|
11 | 12 | from electrum.i18n import _ |
12 | 13 | from electrum.logging import Logger |
| 14 | +from electrum.util import EventListener, event_listener |
13 | 15 |
|
14 | 16 | _cached_font_ids: dict[str, int] = {} |
15 | 17 |
|
@@ -190,3 +192,33 @@ def stop(self): |
190 | 192 | self.tasks.put(None) # in case the thread is still waiting on the queue |
191 | 193 | self.exit() |
192 | 194 | self.wait() |
| 195 | + |
| 196 | + |
| 197 | +class QtEventListener(EventListener): |
| 198 | + qt_callback_signal = pyqtSignal(tuple) |
| 199 | + |
| 200 | + def register_callbacks(self): |
| 201 | + self.qt_callback_signal.connect(self.on_qt_callback_signal) |
| 202 | + EventListener.register_callbacks(self) |
| 203 | + |
| 204 | + def unregister_callbacks(self): |
| 205 | + try: |
| 206 | + self.qt_callback_signal.disconnect() |
| 207 | + except (RuntimeError, TypeError): # wrapped Qt object might be deleted |
| 208 | + # "TypeError: disconnect() failed between 'qt_callback_signal' and all its connections" |
| 209 | + pass |
| 210 | + EventListener.unregister_callbacks(self) |
| 211 | + |
| 212 | + def on_qt_callback_signal(self, args): |
| 213 | + func = args[0] |
| 214 | + return func(self, *args[1:]) |
| 215 | + |
| 216 | + |
| 217 | +# decorator for members of the QtEventListener class |
| 218 | +def qt_event_listener(func): |
| 219 | + func = event_listener(func) |
| 220 | + |
| 221 | + @wraps(func) |
| 222 | + def decorator(self, *args): |
| 223 | + self.qt_callback_signal.emit((func,) + args) |
| 224 | + return decorator |
0 commit comments