Skip to content

Commit 0b323fe

Browse files
authored
Merge branch 'main' into in-band-resize
2 parents f2fa5ce + d8ba63d commit 0b323fe

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

src/textual/app.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,9 @@ def __init__(
789789
self._resize_event: events.Resize | None = None
790790
"""A pending resize event, sent on idle."""
791791

792+
self._css_update_count: int = 0
793+
"""Incremented when CSS is invalidated."""
794+
792795
if self.ENABLE_COMMAND_PALETTE:
793796
for _key, binding in self._bindings:
794797
if binding.action in {"command_palette", "app.command_palette"}:
@@ -1192,6 +1195,10 @@ def get_css_variables(self) -> dict[str, str]:
11921195
variables = design.generate()
11931196
return variables
11941197

1198+
def _invalidate_css(self) -> None:
1199+
"""Invalidate CSS, so it will be refreshed."""
1200+
self._css_update_count += 1
1201+
11951202
def watch_dark(self, dark: bool) -> None:
11961203
"""Watches the dark bool.
11971204
@@ -1201,16 +1208,19 @@ def watch_dark(self, dark: bool) -> None:
12011208
self.set_class(dark, "-dark-mode", update=False)
12021209
self.set_class(not dark, "-light-mode", update=False)
12031210
self._refresh_truecolor_filter(self.ansi_theme)
1211+
self._invalidate_css()
12041212
self.call_next(self.refresh_css)
12051213

12061214
def watch_ansi_theme_dark(self, theme: TerminalTheme) -> None:
12071215
if self.dark:
12081216
self._refresh_truecolor_filter(theme)
1217+
self._invalidate_css()
12091218
self.call_next(self.refresh_css)
12101219

12111220
def watch_ansi_theme_light(self, theme: TerminalTheme) -> None:
12121221
if not self.dark:
12131222
self._refresh_truecolor_filter(theme)
1223+
self._invalidate_css()
12141224
self.call_next(self.refresh_css)
12151225

12161226
@property
@@ -2206,7 +2216,9 @@ def _init_mode(self, mode: str) -> AwaitMount:
22062216
screen, await_mount = self._get_screen(new_screen)
22072217
stack.append(screen)
22082218
self._load_screen_css(screen)
2209-
self.refresh_css()
2219+
if screen._css_update_count != self._css_update_count:
2220+
self.refresh_css()
2221+
22102222
screen.post_message(events.ScreenResume())
22112223
else:
22122224
# Mode is not defined
@@ -2251,7 +2263,8 @@ def switch_mode(self, mode: str) -> AwaitMount:
22512263
await_mount = AwaitMount(self.screen, [])
22522264

22532265
self._current_mode = mode
2254-
self.refresh_css()
2266+
if self.screen._css_update_count != self._css_update_count:
2267+
self.refresh_css()
22552268
self.screen._screen_resized(self.size)
22562269
self.screen.post_message(events.ScreenResume())
22572270

@@ -3368,6 +3381,7 @@ def refresh_css(self, animate: bool = True) -> None:
33683381
stylesheet.update(self.app, animate=animate)
33693382
try:
33703383
self.screen._refresh_layout(self.size)
3384+
self.screen._css_update_count = self._css_update_count
33713385
except ScreenError:
33723386
pass
33733387
# The other screens in the stack will need to know about some style
@@ -3376,6 +3390,7 @@ def refresh_css(self, animate: bool = True) -> None:
33763390
for screen in self.screen_stack:
33773391
if screen != self.screen:
33783392
stylesheet.update(screen, animate=animate)
3393+
screen._css_update_count = self._css_update_count
33793394

33803395
def _display(self, screen: Screen, renderable: RenderableType | None) -> None:
33813396
"""Display a renderable within a sync.

src/textual/screen.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ def __init__(
267267
self.bindings_updated_signal: Signal[Screen] = Signal(self, "bindings_updated")
268268
"""A signal published when the bindings have been updated"""
269269

270+
self._css_update_count = -1
271+
"""Track updates to CSS."""
272+
270273
@property
271274
def is_modal(self) -> bool:
272275
"""Is the screen modal?"""

0 commit comments

Comments
 (0)