|
@@ -1,12 +1,16 @@
|
|
|
-from typing import Any, Callable, List, Literal, Optional
|
|
|
+from typing import Any, Callable, Dict, Iterator, List, Literal, Optional, Set
|
|
|
|
|
|
+from typing_extensions import Self
|
|
|
+
|
|
|
+from .. import globals # pylint: disable=redefined-builtin
|
|
|
from ..element import Element
|
|
|
from ..events import GenericEventArguments, ValueChangeEventArguments, handle_event
|
|
|
|
|
|
|
|
|
class Tree(Element):
|
|
|
|
|
|
- def __init__(self, nodes: List, *,
|
|
|
+ def __init__(self,
|
|
|
+ nodes: List[Dict], *,
|
|
|
node_key: str = 'id',
|
|
|
label_key: str = 'label',
|
|
|
children_key: str = 'children',
|
|
@@ -31,6 +35,7 @@ class Tree(Element):
|
|
|
:param on_expand: callback which is invoked when the node expansion changes
|
|
|
:param on_tick: callback which is invoked when a node is ticked or unticked
|
|
|
:param tick_strategy: whether and how to use checkboxes ("leaf", "leaf-filtered" or "strict"; default: ``None``)
|
|
|
+ :param default_expand_all: whether to expand all nodes by default (default: ``False``)
|
|
|
"""
|
|
|
super().__init__('q-tree')
|
|
|
self._props['nodes'] = nodes
|
|
@@ -62,3 +67,43 @@ class Tree(Element):
|
|
|
update_prop('ticked', e.args)
|
|
|
handle_event(on_tick, ValueChangeEventArguments(sender=self, client=self.client, value=e.args))
|
|
|
self.on('update:ticked', handle_ticked)
|
|
|
+
|
|
|
+ def expand(self, node_keys: Optional[List[str]] = None) -> Self:
|
|
|
+ """Expand the given nodes.
|
|
|
+
|
|
|
+ :param node_keys: list of node keys to expand (default: all nodes)
|
|
|
+ """
|
|
|
+ self._props['expanded'][:] = self._find_node_keys(node_keys).union(self._props['expanded'])
|
|
|
+ self.update()
|
|
|
+ return self
|
|
|
+
|
|
|
+ def collapse(self, node_keys: Optional[List[Dict]] = None) -> Self:
|
|
|
+ """Collapse the given nodes.
|
|
|
+
|
|
|
+ :param node_keys: list of node keys to collapse (default: all nodes)
|
|
|
+ """
|
|
|
+ self._props['expanded'][:] = set(self._props['expanded']).difference(self._find_node_keys(node_keys))
|
|
|
+ self.update()
|
|
|
+ return self
|
|
|
+
|
|
|
+ def _find_node_keys(self, node_keys: Optional[List[str]] = None) -> Set[str]:
|
|
|
+ if node_keys is not None:
|
|
|
+ return set(node_keys)
|
|
|
+
|
|
|
+ CHILDREN_KEY = self._props['children-key']
|
|
|
+ NODE_KEY = self._props['node-key']
|
|
|
+
|
|
|
+ def iterate_nodes(nodes: List[Dict]) -> Iterator[Dict]:
|
|
|
+ for node in nodes:
|
|
|
+ yield node
|
|
|
+ yield from iterate_nodes(node.get(CHILDREN_KEY, []))
|
|
|
+ return {node[NODE_KEY] for node in iterate_nodes(self._props['nodes'])}
|
|
|
+
|
|
|
+ def props(self, add: Optional[str] = None, *, remove: Optional[str] = None) -> Self:
|
|
|
+ super().props(add, remove=remove)
|
|
|
+ if 'default-expand-all' in self._props:
|
|
|
+ # https://github.com/zauberzeug/nicegui/issues/1385
|
|
|
+ del self._props['default-expand-all']
|
|
|
+ globals.log.warning('The prop "default_expand_all" is not supported by `ui.tree`.\n'
|
|
|
+ 'Use ".expand()" instead.')
|
|
|
+ return self
|