mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge branch 'main' into auto-focus-improv
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -774,6 +774,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
|
||||
@@ -781,6 +785,12 @@ 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:
|
||||
from .app import ScreenStackError
|
||||
|
||||
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()
|
||||
|
||||
@@ -207,3 +207,17 @@ async def test_auto_focus_skips_non_focusable_widgets():
|
||||
async with app.run_test():
|
||||
assert app.focused is not None
|
||||
assert isinstance(app.focused, Button)
|
||||
|
||||
|
||||
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