From 8d3f69a04d49d1e4e83db1c573d1232f7201aede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= <5621605+rodrigogiraoserrao@users.noreply.github.com> Date: Tue, 9 May 2023 14:57:50 +0100 Subject: [PATCH] Add auto_focus attribute to screens. --- CHANGELOG.md | 7 +++++++ src/textual/screen.py | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa2923fac..d5f95b549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). + +## Unreleased + +### Added + +- Attribute `auto_focus` to screens https://github.com/Textualize/textual/issues/2457 + ## [0.24.1] - 2023-05-08 ### Fixed diff --git a/src/textual/screen.py b/src/textual/screen.py index 34db473ef..8bc9c0532 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -30,7 +30,7 @@ from ._types import CallbackType from .binding import Binding from .css.match import match from .css.parse import parse_selectors -from .css.query import QueryType +from .css.query import NoMatches, QueryType from .dom import DOMNode from .geometry import Offset, Region, Size from .reactive import Reactive @@ -101,6 +101,12 @@ class Screen(Generic[ScreenResultType], Widget): } """ + auto_focus: str | None = "*" + """A selector to determine what to focus automatically when the screen is activated. + + The widget focused is the first that matches the given [CSS selector](/guide/queries/#query-selectors). + Set to `None` to disable auto focus. + """ focused: Reactive[Widget | None] = Reactive(None) """The focused [widget][textual.widget.Widget] or `None` for no focus.""" stack_updates: Reactive[int] = Reactive(0, repaint=False) @@ -659,6 +665,13 @@ class Screen(Generic[ScreenResultType], Widget): """Screen has resumed.""" self.stack_updates += 1 size = self.app.size + if self.auto_focus is not None and self.focused is None: + try: + to_focus = self.query(self.auto_focus).first() + except NoMatches: + pass + else: + self.set_focus(to_focus) self._refresh_layout(size, full=True) self.refresh()