From ea3d96e7ed8a629130816ddc153b46830cc7de35 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 28 May 2021 12:55:11 -0400 Subject: [PATCH] Accept arbitrary QEvent subscriptions via a set --- piker/ui/_event.py | 26 +++++++++++++++----------- piker/ui/_search.py | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/piker/ui/_event.py b/piker/ui/_event.py index ac66417f..c3d919dc 100644 --- a/piker/ui/_event.py +++ b/piker/ui/_event.py @@ -30,7 +30,7 @@ class EventCloner(QtCore.QObject): for later async processing. """ - + _event_types: set[QEvent] = set() _send_chan: trio.abc.SendChannel = None def eventFilter( @@ -39,14 +39,11 @@ class EventCloner(QtCore.QObject): ev: QEvent, ) -> None: - if ev.type() in { - QEvent.KeyPress, - # QEvent.KeyRelease, - }: - # TODO: is there a global setting for this? - if ev.isAutoRepeat(): - ev.ignore() - return False + if ev.type() in self._event_types: + + # TODO: what's the right way to allow this? + # if ev.isAutoRepeat(): + # ev.ignore() # XXX: we unpack here because apparently doing it # after pop from the mem chan isn't showing the same @@ -59,7 +56,7 @@ class EventCloner(QtCore.QObject): txt = ev.text() # run async processing - self._send_chan.send_nowait((key, mods, txt)) + self._send_chan.send_nowait((ev, key, mods, txt)) # never intercept the event return False @@ -69,7 +66,11 @@ class EventCloner(QtCore.QObject): async def open_key_stream( source_widget: QtGui.QWidget, - event_type: QEvent = QEvent.KeyPress, + event_types: set[QEvent] = {QEvent.KeyPress}, + + # TODO: should we offer some kinda option for toggling releases? + # would it require a channel per event type? + # QEvent.KeyRelease, ) -> trio.abc.ReceiveChannel: @@ -78,10 +79,13 @@ async def open_key_stream( kc = EventCloner() kc._send_chan = send + kc._event_types = event_types + source_widget.installEventFilter(kc) try: yield recv + finally: await send.aclose() source_widget.removeEventFilter(kc) diff --git a/piker/ui/_search.py b/piker/ui/_search.py index 96e76478..61ee4a75 100644 --- a/piker/ui/_search.py +++ b/piker/ui/_search.py @@ -825,7 +825,7 @@ async def handle_keyboard_input( ) ) - async for key, mods, txt in recv_chan: + async for event, key, mods, txt in recv_chan: log.debug(f'key: {key}, mods: {mods}, txt: {txt}')