diff --git a/src/textual/cli/previews/keys.py b/src/textual/cli/previews/keys.py index a3b30e1620..8b027bd943 100644 --- a/src/textual/cli/previews/keys.py +++ b/src/textual/cli/previews/keys.py @@ -1,15 +1,18 @@ from rich.panel import Panel +from rich.text import Text + from textual.app import App, ComposeResult +from textual.reactive import var, Reactive from textual import events from textual.containers import Horizontal from textual.widgets import Button, Header, TextLog INSTRUCTIONS = """\ -Press some keys! +[u]Press some keys![/] -Because we want to display all the keys, ctrl+C won't quit this example. Use the Quit button below to exit the app.\ +To quit the app press [b]ctrl+c[/b] [i]twice[i] or press the Quit button below.\ """ @@ -32,6 +35,8 @@ class KeysApp(App, inherit_bindings=False): } """ + last_key: Reactive[str | None] = var(None) + def compose(self) -> ComposeResult: yield Header() yield Horizontal( @@ -42,10 +47,13 @@ def compose(self) -> ComposeResult: yield KeyLog() def on_ready(self) -> None: - self.query_one(KeyLog).write(Panel(INSTRUCTIONS), expand=True) + self.query_one(KeyLog).write(Panel(Text.from_markup(INSTRUCTIONS)), expand=True) def on_key(self, event: events.Key) -> None: self.query_one(KeyLog).write(event) + if event.key == "ctrl+c" and self.last_key == "ctrl+c": + self.exit() + self.last_key = event.key def on_button_pressed(self, event: Button.Pressed) -> None: if event.button.id == "quit": diff --git a/src/textual/events.py b/src/textual/events.py index 376d17fe7c..501dfac06b 100644 --- a/src/textual/events.py +++ b/src/textual/events.py @@ -7,7 +7,7 @@ from ._types import MessageTarget from .geometry import Offset, Size -from .keys import _get_key_aliases +from .keys import _get_key_aliases, _get_key_display from .message import Message MouseEventT = TypeVar("MouseEventT", bound="MouseEvent") diff --git a/src/textual/keys.py b/src/textual/keys.py index f2fd93ad2f..b4253c3ae1 100644 --- a/src/textual/keys.py +++ b/src/textual/keys.py @@ -228,6 +228,7 @@ class Keys(str, Enum): "backspace": "⌫", "escape": "ESC", "enter": "⏎", + "minus": "-", } diff --git a/tests/test_keys.py b/tests/test_keys.py index b0948757cb..9f13e17d17 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -1,7 +1,7 @@ import pytest from textual.app import App -from textual.keys import _character_to_key +from textual.keys import _character_to_key, _get_key_display @pytest.mark.parametrize( @@ -48,3 +48,7 @@ def action_increment(self) -> None: await pilot.press("x") await pilot.pause() assert counter == 3 + + +def test_get_key_display(): + assert _get_key_display("minus") == "-"