Skip to content

Commit b5f58d2

Browse files
committed
collapsible update
1 parent c302077 commit b5f58d2

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

src/textual/widgets/_collapsible.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from textual.app import ComposeResult
55
from textual.binding import Binding
66
from textual.containers import Container
7+
from textual.content import Content, ContentText
78
from textual.css.query import NoMatches
89
from textual.message import Message
910
from textual.reactive import reactive
@@ -47,23 +48,21 @@ class CollapsibleTitle(Static, can_focus=True):
4748
"""
4849

4950
collapsed = reactive(True)
50-
label = reactive("Toggle")
51+
label: reactive[ContentText] = reactive(Content("Toggle"))
5152

5253
def __init__(
5354
self,
5455
*,
55-
label: str,
56+
label: ContentText,
5657
collapsed_symbol: str,
5758
expanded_symbol: str,
5859
collapsed: bool,
5960
) -> None:
6061
super().__init__()
6162
self.collapsed_symbol = collapsed_symbol
6263
self.expanded_symbol = expanded_symbol
63-
self.label = label
64+
self.label = Content.from_text(label)
6465
self.collapsed = collapsed
65-
self._collapsed_label = f"{collapsed_symbol} {label}"
66-
self._expanded_label = f"{expanded_symbol} {label}"
6766

6867
class Toggle(Message):
6968
"""Request toggle."""
@@ -77,19 +76,21 @@ def action_toggle_collapsible(self) -> None:
7776
"""Toggle the state of the parent collapsible."""
7877
self.post_message(self.Toggle())
7978

80-
def _watch_label(self, label: str) -> None:
81-
self._collapsed_label = f"{self.collapsed_symbol} {label}"
82-
self._expanded_label = f"{self.expanded_symbol} {label}"
79+
def validate_label(self, label: ContentText) -> Content:
80+
return Content.from_text(label)
81+
82+
def _update_label(self) -> None:
83+
assert isinstance(self.label, Content)
8384
if self.collapsed:
84-
self.update(self._collapsed_label)
85+
self.update(Content.assemble(self.collapsed_symbol, " ", self.label))
8586
else:
86-
self.update(self._expanded_label)
87+
self.update(Content.assemble(self.expanded_symbol, " ", self.label))
88+
89+
def _watch_label(self) -> None:
90+
self._update_label()
8791

8892
def _watch_collapsed(self, collapsed: bool) -> None:
89-
if collapsed:
90-
self.update(self._collapsed_label)
91-
else:
92-
self.update(self._expanded_label)
93+
self._update_label()
9394

9495

9596
class Collapsible(Widget):

tests/test_content.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,21 @@ def test_assemble():
220220
]
221221

222222

223-
def test_escape():
223+
@pytest.mark.parametrize(
224+
"markup,plain",
225+
[
226+
("\\[", "["),
227+
("\\[foo", "[foo"),
228+
("\\[foo]", "[foo]"),
229+
("\\[/foo", "[/foo"),
230+
("\\[/foo]", "[/foo]"),
231+
("\\[]", "[]"),
232+
],
233+
)
234+
def test_escape(markup: str, plain: str) -> None:
224235
"""Test that escaping the first square bracket."""
225-
content = Content.from_markup("\\[bold]Not really bold")
226-
assert content.plain == "[bold]Not really bold"
236+
content = Content.from_markup(markup)
237+
assert content.plain == plain
227238
assert content.spans == []
228239

229240

0 commit comments

Comments
 (0)