From f8433e0ebbe93bf7b608157328352785818032a1 Mon Sep 17 00:00:00 2001 From: darrenburns Date: Sat, 15 Oct 2022 11:15:41 +0100 Subject: [PATCH] Get rid of string split key display, bug fix for not showing screen-level bindings (#910) --- sandbox/darren/just_a_box.py | 1 + src/textual/app.py | 6 +++--- src/textual/binding.py | 16 ++-------------- src/textual/widgets/_footer.py | 13 +++++-------- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/sandbox/darren/just_a_box.py b/sandbox/darren/just_a_box.py index d4e53d178..fa2ee364d 100644 --- a/sandbox/darren/just_a_box.py +++ b/sandbox/darren/just_a_box.py @@ -14,6 +14,7 @@ class JustABox(App): key="o,f,w", action="widget_fade_out", description="opacity fade out", + key_display="o or f or w", ), ] diff --git a/src/textual/app.py b/src/textual/app.py index 7cf010f3c..b51420313 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -325,10 +325,10 @@ class App(Generic[ReturnType], DOMNode): @property def bindings(self) -> Bindings: """Get current bindings. If no widget is focused, then the app-level bindings - are returned. If a widget is focused, then any bindings present between that widget - and the App in the DOM are merged and returned.""" + are returned. If a widget is focused, then any bindings present in the active + screen and app are merged and returned.""" if self.focused is None: - return self._bindings + return Bindings.merge([self.screen._bindings, self._bindings]) else: return Bindings.merge( node._bindings for node in reversed(self.focused.ancestors) diff --git a/src/textual/binding.py b/src/textual/binding.py index 1f52a5a10..498201c76 100644 --- a/src/textual/binding.py +++ b/src/textual/binding.py @@ -47,26 +47,14 @@ class Bindings: for binding in bindings: if isinstance(binding, Binding): binding_keys = binding.key.split(",") - - # If there's a key display, split it and associate it with the keys - key_displays = ( - binding.key_display.split(",") if binding.key_display else [] - ) - if len(binding_keys) == len(key_displays): - keys_and_displays = zip(binding_keys, key_displays) - else: - keys_and_displays = [ - (key, binding.key_display) for key in binding_keys - ] - if len(binding_keys) > 1: - for key, display in keys_and_displays: + for key in binding_keys: new_binding = Binding( key=key, action=binding.action, description=binding.description, show=binding.show, - key_display=display, + key_display=binding.key_display, allow_forward=binding.allow_forward, ) yield new_binding diff --git a/src/textual/widgets/_footer.py b/src/textual/widgets/_footer.py index cd9808713..33e12375d 100644 --- a/src/textual/widgets/_footer.py +++ b/src/textual/widgets/_footer.py @@ -2,10 +2,9 @@ from __future__ import annotations from collections import defaultdict -from rich.console import RenderableType - -from rich.text import Text import rich.repr +from rich.console import RenderableType +from rich.text import Text from .. import events from ..reactive import Reactive, watch @@ -95,14 +94,12 @@ class Footer(Widget): action_to_bindings[binding.action].append(binding) for action, bindings in action_to_bindings.items(): - key_displays = [ + binding = bindings[0] + key_display = ( binding.key.upper() if binding.key_display is None else binding.key_display - for binding in bindings - ] - key_display = "ยท".join(key_displays) - binding = bindings[0] + ) hovered = self.highlight_key == binding.key key_text = Text.assemble( (f" {key_display} ", highlight_key_style if hovered else key_style),