tree.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. from typing import Callable, Optional
  2. import justpy as jp
  3. from nicegui.events import ValueChangeEventArguments, handle_event
  4. from nicegui.task_logger import create_task
  5. from .element import Element
  6. class Tree(Element):
  7. def __init__(self, nodes: list, *,
  8. node_key: str = 'id',
  9. label_key: str = 'label',
  10. children_key: str = 'children',
  11. on_select: Optional[Callable] = None):
  12. """Tree Element
  13. :param nodes: hierarchical list of node objects
  14. :param node_key: property name of each node object that holds its unique id (default: "id")
  15. :param label_key: property name of each node object that holds its label (default: "label")
  16. :param children_key: property name of each node object that holds its list of children (default: "children")
  17. :param on_click: callback which is invoked when the node selection changes
  18. """
  19. view = jp.QTree(nodes=nodes, node_key=node_key, label_key=label_key, children_key=children_key, temp=False)
  20. super().__init__(view)
  21. def process_event(view, event) -> Optional[bool]:
  22. arguments = ValueChangeEventArguments(sender=self, socket=event.get('websocket'), value=event.get('value'))
  23. return handle_event(on_select, arguments, update=self.parent_view)
  24. view.on('update:selected', process_event)
  25. view.on('update:expanded', lambda *_: create_task(view.update()))
  26. view.on('update:ticked', lambda *_: create_task(view.update()))