Add property alias.

Related comment: https://github.com/Textualize/textual/pull/2540\#discussion_r1196634789
This commit is contained in:
Rodrigo Girão Serrão
2023-05-22 14:21:11 +01:00
parent ad986b127d
commit c64111bcb5

View File

@@ -592,6 +592,18 @@ class App(Generic[ReturnType], DOMNode):
""" """
return self._screen_stacks[self._current_mode].copy() return self._screen_stacks[self._current_mode].copy()
@property
def _screen_stack(self) -> list[Screen]:
"""A reference to the current screen stack.
Note:
Consider using [`screen_stack`][textual.app.App.screen_stack] instead.
Returns:
A reference to the current screen stack.
"""
return self._screen_stacks[self._current_mode]
def exit( def exit(
self, result: ReturnType | None = None, message: RenderableType | None = None self, result: ReturnType | None = None, message: RenderableType | None = None
) -> None: ) -> None:
@@ -737,7 +749,7 @@ class App(Generic[ReturnType], DOMNode):
ScreenStackError: If there are no screens on the stack. ScreenStackError: If there are no screens on the stack.
""" """
try: try:
return self._screen_stacks[self._current_mode][-1] return self._screen_stack[-1]
except KeyError: except KeyError:
raise UnknownModeError(f"No known mode {self._current_mode!r}") from None raise UnknownModeError(f"No known mode {self._current_mode!r}") from None
except IndexError: except IndexError:
@@ -747,7 +759,7 @@ class App(Generic[ReturnType], DOMNode):
def _background_screens(self) -> list[Screen]: def _background_screens(self) -> list[Screen]:
"""A list of screens that may be visible due to background opacity (top-most first, not including current screen).""" """A list of screens that may be visible due to background opacity (top-most first, not including current screen)."""
screens: list[Screen] = [] screens: list[Screen] = []
for screen in reversed(self._screen_stacks[self._current_mode][:-1]): for screen in reversed(self._screen_stack[:-1]):
screens.append(screen) screens.append(screen)
if screen.styles.background.a == 1: if screen.styles.background.a == 1:
break break
@@ -1539,7 +1551,7 @@ class App(Generic[ReturnType], DOMNode):
Returns: Returns:
The screen that was replaced. The screen that was replaced.
""" """
if self._screen_stacks[self._current_mode]: if self._screen_stack:
self.screen.refresh() self.screen.refresh()
screen.post_message(events.ScreenSuspend()) screen.post_message(events.ScreenSuspend())
self.log.system(f"{screen} SUSPENDED") self.log.system(f"{screen} SUSPENDED")
@@ -1569,14 +1581,14 @@ class App(Generic[ReturnType], DOMNode):
f"push_screen requires a Screen instance or str; not {screen!r}" f"push_screen requires a Screen instance or str; not {screen!r}"
) )
if self._screen_stacks[self._current_mode]: if self._screen_stack:
self.screen.post_message(events.ScreenSuspend()) self.screen.post_message(events.ScreenSuspend())
self.screen.refresh() self.screen.refresh()
next_screen, await_mount = self._get_screen(screen) next_screen, await_mount = self._get_screen(screen)
next_screen._push_result_callback( next_screen._push_result_callback(
self.screen if self._screen_stacks[self._current_mode] else None, callback self.screen if self._screen_stack else None, callback
) )
self._screen_stacks[self._current_mode].append(next_screen) self._screen_stack.append(next_screen)
next_screen.post_message(events.ScreenResume()) next_screen.post_message(events.ScreenResume())
self.log.system(f"{self.screen} is current (PUSHED)") self.log.system(f"{self.screen} is current (PUSHED)")
return await_mount return await_mount
@@ -1592,12 +1604,10 @@ class App(Generic[ReturnType], DOMNode):
f"switch_screen requires a Screen instance or str; not {screen!r}" f"switch_screen requires a Screen instance or str; not {screen!r}"
) )
if self.screen is not screen: if self.screen is not screen:
previous_screen = self._replace_screen( previous_screen = self._replace_screen(self._screen_stack.pop())
self._screen_stacks[self._current_mode].pop()
)
previous_screen._pop_result_callback() previous_screen._pop_result_callback()
next_screen, await_mount = self._get_screen(screen) next_screen, await_mount = self._get_screen(screen)
self._screen_stacks[self._current_mode].append(next_screen) self._screen_stack.append(next_screen)
self.screen.post_message(events.ScreenResume()) self.screen.post_message(events.ScreenResume())
self.log.system(f"{self.screen} is current (SWITCHED)") self.log.system(f"{self.screen} is current (SWITCHED)")
return await_mount return await_mount
@@ -1669,7 +1679,7 @@ class App(Generic[ReturnType], DOMNode):
Returns: Returns:
The screen that was replaced. The screen that was replaced.
""" """
screen_stack = self._screen_stacks[self._current_mode] screen_stack = self._screen_stack
if len(screen_stack) <= 1: if len(screen_stack) <= 1:
raise ScreenStackError( raise ScreenStackError(
"Can't pop screen; there must be at least one screen on the stack" "Can't pop screen; there must be at least one screen on the stack"
@@ -2149,7 +2159,7 @@ class App(Generic[ReturnType], DOMNode):
await self._message_queue.put(None) await self._message_queue.put(None)
def refresh(self, *, repaint: bool = True, layout: bool = False) -> None: def refresh(self, *, repaint: bool = True, layout: bool = False) -> None:
if self._screen_stacks[self._current_mode]: if self._screen_stack:
self.screen.refresh(repaint=repaint, layout=layout) self.screen.refresh(repaint=repaint, layout=layout)
self.check_idle() self.check_idle()
@@ -2291,7 +2301,7 @@ class App(Generic[ReturnType], DOMNode):
if isinstance(event, events.Compose): if isinstance(event, events.Compose):
screen = Screen(id=f"_default") screen = Screen(id=f"_default")
self._register(self, screen) self._register(self, screen)
self._screen_stacks[self._current_mode].append(screen) self._screen_stack.append(screen)
screen.post_message(events.ScreenResume()) screen.post_message(events.ScreenResume())
await super().on_event(event) await super().on_event(event)