mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Fix for empty ListView bindings not firing (#2281)
* Fix bindings not firing when ListView is empty * Regression test for empty ListView bindings not working * Update changelog
This commit is contained in:
@@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Changed signature of Driver. Technically a breaking change, but unlikely to affect anyone.
|
- Changed signature of Driver. Technically a breaking change, but unlikely to affect anyone.
|
||||||
- Breaking change: Timer.start is now private, and returns No
|
- Breaking change: Timer.start is now private, and returns No
|
||||||
@@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fixed order styles are applied in DataTable - allows combining of renderable styles and component classes https://github.com/Textualize/textual/pull/2272
|
- Fixed order styles are applied in DataTable - allows combining of renderable styles and component classes https://github.com/Textualize/textual/pull/2272
|
||||||
|
- Fix empty ListView preventing bindings from firing https://github.com/Textualize/textual/pull/2281
|
||||||
|
|
||||||
|
|
||||||
## [0.19.1] - 2023-04-10
|
## [0.19.1] - 2023-04-10
|
||||||
|
|||||||
@@ -2149,7 +2149,7 @@ class App(Generic[ReturnType], DOMNode):
|
|||||||
action_target = getattr(self, destination)
|
action_target = getattr(self, destination)
|
||||||
implicit_destination = True
|
implicit_destination = True
|
||||||
else:
|
else:
|
||||||
action_target = default_namespace or self
|
action_target = default_namespace if default_namespace is not None else self
|
||||||
action_name = target
|
action_name = target
|
||||||
|
|
||||||
handled = await self._dispatch_action(action_target, action_name, params)
|
handled = await self._dispatch_action(action_target, action_name, params)
|
||||||
|
|||||||
@@ -1,19 +1,26 @@
|
|||||||
from textual.app import App, ComposeResult
|
from textual.app import App, ComposeResult
|
||||||
|
from textual.binding import Binding
|
||||||
from textual.widgets import Label, ListItem, ListView
|
from textual.widgets import Label, ListItem, ListView
|
||||||
|
|
||||||
|
|
||||||
class MyListView(ListView):
|
class MyListView(ListView):
|
||||||
"""Test child class of a ListView."""
|
"""Test child class of a ListView."""
|
||||||
|
|
||||||
|
BINDINGS = [Binding(key="s", action="set", description="Set")]
|
||||||
|
|
||||||
def __init__(self, items: int = 0) -> None:
|
def __init__(self, items: int = 0) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._items = items
|
self._items = items
|
||||||
|
self.action_fired = False
|
||||||
|
|
||||||
def compose(self) -> ComposeResult:
|
def compose(self) -> ComposeResult:
|
||||||
"""Compose the child widgets."""
|
"""Compose the child widgets."""
|
||||||
for n in range(self._items):
|
for n in range(self._items):
|
||||||
yield ListItem(Label(f"This is item {n}"))
|
yield ListItem(Label(f"This is item {n}"))
|
||||||
|
|
||||||
|
def action_set(self) -> None:
|
||||||
|
self.action_fired = True
|
||||||
|
|
||||||
|
|
||||||
class ListViewApp(App[None]):
|
class ListViewApp(App[None]):
|
||||||
"""ListView test app."""
|
"""ListView test app."""
|
||||||
@@ -43,3 +50,11 @@ async def test_populated_inherited_list_view() -> None:
|
|||||||
assert pilot.app.query_one(MyListView).index == 0
|
assert pilot.app.query_one(MyListView).index == 0
|
||||||
await pilot.press("down")
|
await pilot.press("down")
|
||||||
assert pilot.app.query_one(MyListView).index == 1
|
assert pilot.app.query_one(MyListView).index == 1
|
||||||
|
|
||||||
|
|
||||||
|
async def test_actions_work_when_list_view_empty() -> None:
|
||||||
|
"""Regression test for https://github.com/Textualize/textual/issues/2265"""
|
||||||
|
async with ListViewApp().run_test() as pilot:
|
||||||
|
await pilot.press("tab", "s")
|
||||||
|
list_view = pilot.app.query_one(MyListView)
|
||||||
|
assert list_view.action_fired
|
||||||
|
|||||||
Reference in New Issue
Block a user