From e382fc14b1155f1be2df848c0c12a597f63ce559 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 5 May 2022 10:36:59 +0100 Subject: [PATCH] add new can_focus_children attribute --- sandbox/uber.py | 7 ------- src/textual/app.py | 2 +- src/textual/widget.py | 6 +++++- tests/test_focus.py | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sandbox/uber.py b/sandbox/uber.py index 0eb90cdbd..8363866cb 100644 --- a/sandbox/uber.py +++ b/sandbox/uber.py @@ -23,12 +23,6 @@ class BasicApp(App): async def on_mount(self): """Build layout here.""" - uber2 = Widget() - uber2.add_children( - Widget(id="uber2-child1"), - Widget(id="uber2-child2"), - ) - first_child = Placeholder(id="child1", classes="list-item") uber1 = Widget( Placeholder(id="child1", classes="list-item"), Placeholder(id="child2", classes="list-item"), @@ -38,7 +32,6 @@ class BasicApp(App): Placeholder(classes="list-item"), ) self.mount(uber1=uber1) - await first_child.focus() async def on_key(self, event: events.Key) -> None: await self.dispatch_key(event) diff --git a/src/textual/app.py b/src/textual/app.py index c909740da..6192e458f 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -224,7 +224,7 @@ class App(Generic[ReturnType], DOMNode): if node is None: pop() else: - if node.is_container and node.can_focus: + if node.is_container and node.can_focus_children: push(iter(node.focusable_children)) else: if node.can_focus: diff --git a/src/textual/widget.py b/src/textual/widget.py index 1630537ac..7bd885d9c 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -65,6 +65,7 @@ class RenderCache(NamedTuple): class Widget(DOMNode): can_focus: bool = False + can_focus_children: bool = True CSS = """ """ @@ -347,9 +348,12 @@ class Widget(DOMNode): x=self.scroll_target_x + self.container_size.width, animate=animate ) - def __init_subclass__(cls, can_focus: bool = True) -> None: + def __init_subclass__( + cls, can_focus: bool = True, can_focus_children: bool = True + ) -> None: super().__init_subclass__() cls.can_focus = can_focus + cls.can_focus_children = can_focus_children def __rich_repr__(self) -> rich.repr.Result: yield "id", self.id, None diff --git a/tests/test_focus.py b/tests/test_focus.py index db57cace1..c9fa8bcd7 100644 --- a/tests/test_focus.py +++ b/tests/test_focus.py @@ -7,7 +7,7 @@ class Focusable(Widget, can_focus=True): pass -class NonFocusable(Widget, can_focus=False): +class NonFocusable(Widget, can_focus=False, can_focus_children=False): pass