Allow replacement of the root node data when clearing the tree

This commit is contained in:
Dave Pearson
2023-02-01 13:44:53 +00:00
parent ff7f2488f8
commit 78f49f0ab2
2 changed files with 27 additions and 3 deletions

View File

@@ -560,18 +560,20 @@ class Tree(Generic[TreeDataType], ScrollView, can_focus=True):
label = self.render_label(node, NULL_STYLE, NULL_STYLE) label = self.render_label(node, NULL_STYLE, NULL_STYLE)
return label.cell_len return label.cell_len
def clear(self, label: TextType | None = None) -> None: def clear(self, label: TextType | None = None, data: TreeDataType = ...) -> None:
"""Clear all nodes under root. """Clear all nodes under root.
Args: Args:
label: An optional new label for the root node. If not provided label: An optional new label for the root node. If not provided
the current root node's label will be used. the current root node's label will be used.
data: Optional new data for the root node. If not provided the
current root node's data will be used.
""" """
self._line_cache.clear() self._line_cache.clear()
self._tree_lines_cached = None self._tree_lines_cached = None
self._current_id = 0 self._current_id = 0
root_label = self.root._label if label is None else label root_label = self.root._label if label is None else label
root_data = self.root.data root_data = self.root.data if data is ... else data
self.root = TreeNode( self.root = TreeNode(
self, self,
None, None,

View File

@@ -56,7 +56,29 @@ async def test_tree_new_label_clear() -> None:
async with TreeClearApp().run_test() as pilot: async with TreeClearApp().run_test() as pilot:
tree = pilot.app.query_one(VerseTree) tree = pilot.app.query_one(VerseTree)
assert len(tree.root.children) > 1 assert len(tree.root.children) > 1
pilot.app.query_one(VerseTree).clear("Jiangyin") pilot.app.query_one(VerseTree).clear(label="Jiangyin")
assert len(tree.root.children) == 0 assert len(tree.root.children) == 0
assert str(tree.root.label) == "Jiangyin" assert str(tree.root.label) == "Jiangyin"
assert isinstance(tree.root.data, VerseStar) assert isinstance(tree.root.data, VerseStar)
async def test_tree_new_data_clear() -> None:
"""Clearing a tree with data should keep the old label and use the new data."""
async with TreeClearApp().run_test() as pilot:
tree = pilot.app.query_one(VerseTree)
assert len(tree.root.children) > 1
pilot.app.query_one(VerseTree).clear(data=VersePlanet())
assert len(tree.root.children) == 0
assert str(tree.root.label) == "White Sun"
assert isinstance(tree.root.data, VersePlanet)
async def test_tree_new_labal_and_data_clear() -> None:
"""Clearing a tree with label and data should replace the label and data."""
async with TreeClearApp().run_test() as pilot:
tree = pilot.app.query_one(VerseTree)
assert len(tree.root.children) > 1
pilot.app.query_one(VerseTree).clear(label="Jiangyin", data=VersePlanet())
assert len(tree.root.children) == 0
assert str(tree.root.label) == "Jiangyin"
assert isinstance(tree.root.data, VersePlanet)