|
25 | 25 | TypeVar, |
26 | 26 | Union, |
27 | 27 | cast, |
| 28 | + Callable, |
28 | 29 | ) |
29 | 30 | from weakref import WeakSet, WeakValueDictionary |
30 | 31 |
|
@@ -228,7 +229,7 @@ class App(Generic[ReturnType], DOMNode): |
228 | 229 | } |
229 | 230 | """ |
230 | 231 |
|
231 | | - SCREENS: dict[str, Screen] = {} |
| 232 | + SCREENS: dict[str, Screen | Callable[[], Screen]] = {} |
232 | 233 | _BASE_PATH: str | None = None |
233 | 234 | CSS_PATH: CSSPathType = None |
234 | 235 | TITLE: str | None = None |
@@ -330,7 +331,7 @@ def __init__( |
330 | 331 | self._registry: WeakSet[DOMNode] = WeakSet() |
331 | 332 |
|
332 | 333 | self._installed_screens: WeakValueDictionary[ |
333 | | - str, Screen |
| 334 | + str, Screen | Callable[[], Screen] |
334 | 335 | ] = WeakValueDictionary() |
335 | 336 | self._installed_screens.update(**self.SCREENS) |
336 | 337 |
|
@@ -998,12 +999,15 @@ def get_screen(self, screen: Screen | str) -> Screen: |
998 | 999 | next_screen = self._installed_screens[screen] |
999 | 1000 | except KeyError: |
1000 | 1001 | raise KeyError(f"No screen called {screen!r} installed") from None |
| 1002 | + if callable(next_screen): |
| 1003 | + next_screen = next_screen() |
| 1004 | + self._installed_screens[screen] = next_screen |
1001 | 1005 | else: |
1002 | 1006 | next_screen = screen |
1003 | 1007 | return next_screen |
1004 | 1008 |
|
1005 | 1009 | def _get_screen(self, screen: Screen | str) -> tuple[Screen, AwaitMount]: |
1006 | | - """Get an installed screen and a await mount object. |
| 1010 | + """Get an installed screen and an AwaitMount object. |
1007 | 1011 |
|
1008 | 1012 | If the screen isn't running, it will be registered before it is run. |
1009 | 1013 |
|
@@ -1558,7 +1562,7 @@ async def _close_all(self) -> None: |
1558 | 1562 |
|
1559 | 1563 | # Close pre-defined screens |
1560 | 1564 | for screen in self.SCREENS.values(): |
1561 | | - if screen._running: |
| 1565 | + if isinstance(screen, Screen) and screen._running: |
1562 | 1566 | await self._prune_node(screen) |
1563 | 1567 |
|
1564 | 1568 | # Close any remaining nodes |
|
0 commit comments