diff --git a/CHANGELOG.md b/CHANGELOG.md index d71e5a86d5..f8936b648f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,22 @@ 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/). +## [7.0.1] - 2026-01-07 + +### Added + +- Added a `refresh_styles` boolean to the `ScreenResult` message which reduces style updates when popping screens + ## [7.0.0] - 2026-01-03 ### Changed - `Node.update_node_styles` has grown a `animate` parameter +### Added + +- Added atom-one-dark and atom-one-light themes @NSPC911 https://github.com/Textualize/textual/pull/6301 + ## [6.12.0] - 2026-01-02 ### Fixed @@ -3268,6 +3278,7 @@ https://textual.textualize.io/blog/2022/11/08/version-040/#version-040 - New handler system for messages that doesn't require inheritance - Improved traceback handling +[7.0.1]: https://github.com/Textualize/textual/compare/v7.0.0...v7.0.1 [7.0.0]: https://github.com/Textualize/textual/compare/v6.11.0...v7.0.0 [6.11.0]: https://github.com/Textualize/textual/compare/v6.10.0...v6.11.0 [6.10.0]: https://github.com/Textualize/textual/compare/v6.9.0...v6.10.0 diff --git a/pyproject.toml b/pyproject.toml index 4f0ba51d03..9f140490c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "textual" -version = "7.0.0" +version = "7.0.1" homepage = "https://github.com/Textualize/textual" repository = "https://github.com/Textualize/textual" documentation = "https://textual.textualize.io/" diff --git a/src/textual/_resolve.py b/src/textual/_resolve.py index 37e5727622..3a57dacb45 100644 --- a/src/textual/_resolve.py +++ b/src/textual/_resolve.py @@ -317,13 +317,16 @@ def resolve_box_models( ) remaining_space = int(max(0, size.height - total_remaining - margin_height)) + fraction_unit = resolve_fraction_unit( [ styles for styles in widget_styles - if styles.height is not None - and styles.height.is_fraction - and styles.overlay != "screen" + if ( + styles.height is not None + and styles.height.is_fraction + and styles.overlay != "screen" + ) ], size, viewport_size, diff --git a/src/textual/app.py b/src/textual/app.py index a3d91f562d..fa16acc631 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -2979,7 +2979,9 @@ def pop_screen(self) -> AwaitComplete: previous_screen = screen_stack.pop() previous_screen._pop_result_callback() - self.screen.post_message(events.ScreenResume()) + self.screen.post_message( + events.ScreenResume(refresh_styles=previous_screen.styles.background.a < 0) + ) self.log.system(f"{self.screen} is active") async def do_pop() -> None: diff --git a/src/textual/events.py b/src/textual/events.py index b1d79d8d34..92e05a91a1 100644 --- a/src/textual/events.py +++ b/src/textual/events.py @@ -901,6 +901,7 @@ def __rich_repr__(self) -> rich.repr.Result: yield "text", self.text +@dataclass class ScreenResume(Event, bubble=False): """Sent to screen that has been made active. @@ -908,6 +909,12 @@ class ScreenResume(Event, bubble=False): - [ ] Verbose """ + refresh_styles: bool = True + """Should the resuming screen refresh its styles?""" + + def __rich_repr__(self) -> rich.repr.Result: + yield self.refresh_styles + class ScreenSuspend(Event, bubble=False): """Sent to screen when it is no longer active. diff --git a/src/textual/screen.py b/src/textual/screen.py index cc1ef9fe28..2b0a3d06b5 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -1427,7 +1427,7 @@ def _screen_resized(self, size: Size) -> None: if self.stack_updates and self.is_attached: self._refresh_layout(size) - def _on_screen_resume(self) -> None: + def _on_screen_resume(self, event: events.ScreenResume) -> None: """Screen has resumed.""" if self.app.SUSPENDED_SCREEN_CLASS: self.remove_class(self.app.SUSPENDED_SCREEN_CLASS) @@ -1441,8 +1441,10 @@ def _on_screen_resume(self) -> None: if self.is_attached: self._compositor_refresh() - self.update_node_styles(animate=False) - self._refresh_layout(size) + if event.refresh_styles: + self.update_node_styles(animate=False) + if self._size != size: + self._refresh_layout(size) self.refresh() async def _compose(self) -> None: diff --git a/src/textual/widgets/_collapsible.py b/src/textual/widgets/_collapsible.py index d836e56a40..a35d7e2eb0 100644 --- a/src/textual/widgets/_collapsible.py +++ b/src/textual/widgets/_collapsible.py @@ -21,8 +21,8 @@ class CollapsibleTitle(Static, can_focus=True): DEFAULT_CSS = """ CollapsibleTitle { width: auto; - height: auto; - padding: 0 1; + height: auto; + padding: 0 1; text-style: $block-cursor-blurred-text-style; color: $block-cursor-blurred-foreground; @@ -160,7 +160,7 @@ class Contents(Container): Contents { width: 100%; height: auto; - padding: 1 0 0 3; + padding: 1 0 0 3; } """