Skip to content

Commit ecd4165

Browse files
authored
Merge pull request #6304 from Textualize/reduce-style-updates
Reduce style updates
2 parents ee090c8 + 1c3e2f9 commit ecd4165

File tree

6 files changed

+27
-16
lines changed

6 files changed

+27
-16
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [6.12.0] - 2025-01-02
9+
10+
### Fixed
11+
12+
- Fixed unnecessary style update when popping screens, which may have caused noticable pauses changing screens (with a lot of widgets) https://github.com/Textualize/textual/pull/6304
13+
14+
### Changed
15+
16+
- Promoted private `_update_styes` to `update_node_styles` https://github.com/Textualize/textual/pull/6304
17+
818
## [6.11.0] - 2025-12-18
919

1020
### Added

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "textual"
3-
version = "6.11.0"
3+
version = "6.12.0"
44
homepage = "https://github.com/Textualize/textual"
55
repository = "https://github.com/Textualize/textual"
66
documentation = "https://textual.textualize.io/"

src/textual/app.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3045,9 +3045,9 @@ def _set_mouse_over(
30453045
if hover_widget is not None:
30463046
hover_widget.mouse_hover = True
30473047
if hover_widget._has_hover_style:
3048-
hover_widget._update_styles()
3048+
hover_widget.update_node_styles()
30493049
if current_hover_over is not None and current_hover_over._has_hover_style:
3050-
current_hover_over._update_styles()
3050+
current_hover_over.update_node_styles()
30513051
self.hover_over = hover_widget
30523052

30533053
def _update_mouse_over(self, screen: Screen) -> None:
@@ -4247,7 +4247,7 @@ def post_mount() -> None:
42474247

42484248
def _watch_app_focus(self, focus: bool) -> None:
42494249
"""Respond to changes in app focus."""
4250-
self.screen._update_styles()
4250+
self.screen.update_node_styles()
42514251
if focus:
42524252
# If we've got a last-focused widget, if it still has a screen,
42534253
# and if the screen is still the current screen and if nothing

src/textual/dom.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def __set__(self, obj: DOMNode, classes: str | Iterable[str]) -> None:
125125
class_names = set(classes)
126126
check_identifiers("class name", *class_names)
127127
obj._classes = class_names
128-
obj._update_styles()
128+
obj.update_node_styles()
129129

130130

131131
@rich.repr.auto
@@ -1733,10 +1733,10 @@ def set_classes(self, classes: str | Iterable[str]) -> Self:
17331733
self.classes = classes
17341734
return self
17351735

1736-
def _update_styles(self) -> None:
1736+
def update_node_styles(self) -> None:
17371737
"""Request an update of this node's styles.
17381738
1739-
Should be called whenever CSS classes / pseudo classes change.
1739+
Called by Textual whenever CSS classes / pseudo classes change.
17401740
"""
17411741
try:
17421742
self.app.update_styles(self)
@@ -1759,7 +1759,7 @@ def add_class(self, *class_names: str, update: bool = True) -> Self:
17591759
if old_classes == self._classes:
17601760
return self
17611761
if update:
1762-
self._update_styles()
1762+
self.update_node_styles()
17631763
return self
17641764

17651765
def remove_class(self, *class_names: str, update: bool = True) -> Self:
@@ -1778,7 +1778,7 @@ def remove_class(self, *class_names: str, update: bool = True) -> Self:
17781778
if old_classes == self._classes:
17791779
return self
17801780
if update:
1781-
self._update_styles()
1781+
self.update_node_styles()
17821782
return self
17831783

17841784
def toggle_class(self, *class_names: str) -> Self:
@@ -1795,7 +1795,7 @@ def toggle_class(self, *class_names: str) -> Self:
17951795
self._classes.symmetric_difference_update(class_names)
17961796
if old_classes == self._classes:
17971797
return self
1798-
self._update_styles()
1798+
self.update_node_styles()
17991799
return self
18001800

18011801
def has_pseudo_class(self, class_name: str) -> bool:

src/textual/screen.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1441,7 +1441,8 @@ def _on_screen_resume(self) -> None:
14411441

14421442
if self.is_attached:
14431443
self._compositor_refresh()
1444-
self.app.stylesheet.update(self)
1444+
if self.stack_updates == 1:
1445+
self.app.stylesheet.update(self)
14451446
self._refresh_layout(size)
14461447
self.refresh()
14471448

src/textual/widget.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,11 +1445,11 @@ def update_styles(children: list[DOMNode]) -> None:
14451445
# we need to update both odd/even, first-of-type/last-of-type and first-child/last-child
14461446
for child in children:
14471447
if child._has_order_style or child._has_odd_or_even:
1448-
child._update_styles()
1448+
child.update_node_styles()
14491449
else:
14501450
for child in children:
14511451
if child._has_order_style:
1452-
child._update_styles()
1452+
child.update_node_styles()
14531453

14541454
self.call_later(update_styles, self.displayed_children)
14551455
await_mount = AwaitMount(self, mounted)
@@ -4026,7 +4026,7 @@ def post_render(
40264026

40274027
def watch_has_focus(self, _has_focus: bool) -> None:
40284028
"""Update from CSS if has focus state changes."""
4029-
self._update_styles()
4029+
self.update_node_styles()
40304030

40314031
def watch_disabled(self, disabled: bool) -> None:
40324032
"""Update the styles of the widget and its children when disabled is toggled."""
@@ -4046,7 +4046,7 @@ def watch_disabled(self, disabled: bool) -> None:
40464046
except (ScreenStackError, NoActiveAppError, NoScreen):
40474047
pass
40484048

4049-
self._update_styles()
4049+
self.update_node_styles()
40504050

40514051
def _size_updated(
40524052
self, size: Size, virtual_size: Size, container_size: Size, layout: bool = True
@@ -4475,7 +4475,7 @@ def _check_refresh(self) -> None:
44754475
else:
44764476
if self._refresh_styles_required:
44774477
self._refresh_styles_required = False
4478-
self.call_later(self._update_styles)
4478+
self.call_later(self.update_node_styles)
44794479
if self._scroll_required:
44804480
self._scroll_required = False
44814481
if not self._layout_required:

0 commit comments

Comments
 (0)