Skip to content

Commit fb6fc06

Browse files
authored
Merge pull request #4769 from Textualize/hide-send-all
Send Hide messages when toggling visibility
2 parents 158e0b3 + 921702b commit fb6fc06

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/textual/_compositor.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ def _arrange_root(
559559
map: CompositorMap = {}
560560
widgets: set[Widget] = set()
561561
add_new_widget = widgets.add
562+
invisible_widgets: set[Widget] = set()
563+
add_new_invisible_widget = invisible_widgets.add
562564
layer_order: int = 0
563565

564566
no_clip = size.region
@@ -595,6 +597,8 @@ def add_widget(
595597

596598
if visible:
597599
add_new_widget(widget)
600+
else:
601+
add_new_invisible_widget(widget)
598602
styles_offset = styles.offset
599603
layout_offset = (
600604
styles_offset.resolve(region.size, clip.size)
@@ -740,6 +744,7 @@ def add_widget(
740744
True,
741745
NULL_SPACING,
742746
)
747+
widgets -= invisible_widgets
743748
return map, widgets
744749

745750
@property

tests/test_widget_visibility.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from textual.app import App, ComposeResult
2+
from textual.widgets import Label
3+
4+
5+
async def test_hide() -> None:
6+
"""Check that setting visibility produces Hide messages."""
7+
# https://github.com/Textualize/textual/issues/3460
8+
visibility: list[bool] = []
9+
10+
class ShowHideLabel(Label):
11+
def on_show(self) -> None:
12+
visibility.append(True)
13+
14+
def on_hide(self) -> None:
15+
visibility.append(False)
16+
17+
class ShowHideApp(App[None]):
18+
BINDINGS = [("space", "toggle_label")]
19+
20+
def compose(self) -> ComposeResult:
21+
yield ShowHideLabel("Here I am")
22+
23+
def action_toggle_label(self) -> None:
24+
self.query_one(ShowHideLabel).visible = not self.query_one(
25+
ShowHideLabel
26+
).visible
27+
28+
app = ShowHideApp()
29+
async with app.run_test() as pilot:
30+
assert visibility == [True]
31+
await pilot.press("space")
32+
assert visibility == [True, False]
33+
await pilot.press("space")
34+
assert visibility == [True, False, True]

0 commit comments

Comments
 (0)