From 72e59aad2617adc195c50e2bfc46e7da7be46a89 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Wed, 28 Sep 2022 12:24:28 +0100 Subject: [PATCH] new input control --- sandbox/will/input.py | 8 +++++--- src/textual/message_pump.py | 8 ++++++-- src/textual/reactive.py | 1 + src/textual/timer.py | 11 +++++++++++ src/textual/widget.py | 9 ++++++--- src/textual/widgets/__init__.py | 1 + src/textual/widgets/__init__.pyi | 1 + 7 files changed, 31 insertions(+), 8 deletions(-) diff --git a/sandbox/will/input.py b/sandbox/will/input.py index 861ce005a..aaca5b04b 100644 --- a/sandbox/will/input.py +++ b/sandbox/will/input.py @@ -1,5 +1,5 @@ from textual.app import App -from textual.widgets import TextInput +from textual.widgets import Input class InputApp(App): @@ -11,7 +11,9 @@ class InputApp(App): """ def compose(self): - yield TextInput(initial="foo") + yield Input("foo") -app = InputApp() +if __name__ == "__main__": + app = InputApp() + app.run() diff --git a/src/textual/message_pump.py b/src/textual/message_pump.py index 2eb201317..be52cc165 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -522,20 +522,24 @@ class MessagePump(metaclass=MessagePumpMeta): return False # TODO: Does dispatch_key belong on message pump? - async def dispatch_key(self, event: events.Key) -> None: + async def dispatch_key(self, event: events.Key) -> bool: """Dispatch a key event to method. This method will call the method named 'key_' if it exists. Args: event (events.Key): A key event. + + Returns: + bool: True if key was handled, otherwise False. """ key_method = getattr(self, f"key_{event.key_name}", None) or getattr( self, f"_key_{event.key_name}", None ) if key_method is not None: await invoke(key_method, event) - event.prevent_default() + return True + return False async def on_timer(self, event: events.Timer) -> None: event.prevent_default() diff --git a/src/textual/reactive.py b/src/textual/reactive.py index 53694076a..41480495c 100644 --- a/src/textual/reactive.py +++ b/src/textual/reactive.py @@ -184,6 +184,7 @@ class Reactive(Generic[ReactiveType]): compute_method = getattr(obj, f"compute_{compute}") except AttributeError: continue + value = await invoke(compute_method) setattr(obj, compute, value) diff --git a/src/textual/timer.py b/src/textual/timer.py index d99a016da..edbc6e594 100644 --- a/src/textual/timer.py +++ b/src/textual/timer.py @@ -71,6 +71,7 @@ class Timer: self._skip = skip self._active = Event() self._task: Task | None = None + self._reset: bool = False if not pause: self._active.set() @@ -116,6 +117,10 @@ class Timer: """ self._active.clear() + def reset(self) -> None: + self._active.set() + self._reset = True + def resume(self) -> None: """Resume a paused timer.""" self._active.set() @@ -144,8 +149,14 @@ class Timer: wait_time = max(0, next_timer - now) if wait_time: await _clock.sleep(wait_time) + count += 1 await self._active.wait() + if self._reset: + start = _clock.get_time_no_wait() + count = 0 + self._reset = False + continue try: await self._tick(next_timer=next_timer, count=count) except EventTargetGone: diff --git a/src/textual/widget.py b/src/textual/widget.py index 7fb137dc8..c247cb941 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -1808,12 +1808,15 @@ class Widget(DOMNode): await self.broker_event("click", event) async def _on_key(self, event: events.Key) -> None: + await self.handle_key(event) + + async def handle_key(self, event: events.Key) -> bool: try: binding = self._bindings.get_key(event.key) except NoBinding: - await self.dispatch_key(event) - else: - await self.action(binding.action) + return await self.dispatch_key(event) + await self.action(binding.action) + return True def _on_compose(self, event: events.Compose) -> None: widgets = self.compose() diff --git a/src/textual/widgets/__init__.py b/src/textual/widgets/__init__.py index df9fc54e6..fc057be7f 100644 --- a/src/textual/widgets/__init__.py +++ b/src/textual/widgets/__init__.py @@ -20,6 +20,7 @@ __all__ = [ "Pretty", "Static", "TextInput", + "Input", "TextLog", "TreeControl", "Welcome", diff --git a/src/textual/widgets/__init__.pyi b/src/textual/widgets/__init__.pyi index 530227341..ef43fff3a 100644 --- a/src/textual/widgets/__init__.pyi +++ b/src/textual/widgets/__init__.pyi @@ -7,6 +7,7 @@ from ._header import Header as Header from ._placeholder import Placeholder as Placeholder from ._pretty import Pretty as Pretty from ._static import Static as Static +from ._input import Input as Input from ._text_input import TextInput as TextInput from ._text_log import TextLog as TextLog from ._tree_control import TreeControl as TreeControl