mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
- App `title` and `sub_title` attributes can be set to any type https://github.com/Textualize/textual/issues/2521
|
||||
- Using `Widget.move_child` where the target and the child being moved are the same is now a no-op https://github.com/Textualize/textual/issues/1743
|
||||
- Calling `dismiss` on a screen that is not at the top of the stack now raises an exception https://github.com/Textualize/textual/issues/2575
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ class ScreenError(Exception):
|
||||
|
||||
|
||||
class ScreenStackError(ScreenError):
|
||||
"""Raised when attempting to pop the last screen from the stack."""
|
||||
"""Raised when trying to manipulate the screen stack incorrectly."""
|
||||
|
||||
|
||||
class CssPathError(Exception):
|
||||
|
||||
@@ -28,6 +28,7 @@ from ._callback import invoke
|
||||
from ._compositor import Compositor, MapGeometry
|
||||
from ._context import visible_screen_stack
|
||||
from ._types import CallbackType
|
||||
from .app import ScreenStackError
|
||||
from .binding import Binding
|
||||
from .css.match import match
|
||||
from .css.parse import parse_selectors
|
||||
@@ -771,6 +772,10 @@ class Screen(Generic[ScreenResultType], Widget):
|
||||
Args:
|
||||
result: The optional result to be passed to the result callback.
|
||||
|
||||
Raises:
|
||||
ScreenStackError: If trying to dismiss a screen that is not at the top of
|
||||
the stack.
|
||||
|
||||
Note:
|
||||
If the screen was pushed with a callback, the callback will be
|
||||
called with the given result and then a call to
|
||||
@@ -778,6 +783,10 @@ class Screen(Generic[ScreenResultType], Widget):
|
||||
no callback was provided calling this method is the same as
|
||||
simply calling [`App.pop_screen`][textual.app.App.pop_screen].
|
||||
"""
|
||||
if self is not self.app.screen:
|
||||
raise ScreenStackError(
|
||||
f"Can't dismiss screen {self} that's not at the top of the stack."
|
||||
)
|
||||
if result is not self._NoResult and self._result_callbacks:
|
||||
self._result_callbacks[-1](cast(ScreenResultType, result))
|
||||
self.app.pop_screen()
|
||||
|
||||
@@ -192,3 +192,17 @@ async def test_auto_focus():
|
||||
assert app.focused is None
|
||||
app.pop_screen()
|
||||
assert app.focused.id == "two"
|
||||
|
||||
|
||||
async def test_dismiss_non_top_screen():
|
||||
class MyApp(App[None]):
|
||||
async def key_p(self) -> None:
|
||||
self.bottom, top = Screen(), Screen()
|
||||
await self.push_screen(self.bottom)
|
||||
await self.push_screen(top)
|
||||
|
||||
app = MyApp()
|
||||
async with app.run_test() as pilot:
|
||||
await pilot.press("p")
|
||||
with pytest.raises(ScreenStackError):
|
||||
app.bottom.dismiss()
|
||||
|
||||
Reference in New Issue
Block a user