Source code for plopp.core.helpers
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2023 Scipp contributors (https://github.com/scipp)
from collections.abc import Callable
from typing import Any
from .node_class import Node
[docs]
def node(func: Callable) -> Callable:
"""
Create a :class:`Node` from a callable.
This can also be used as a decorator.
Parameters
----------
func:
The callable to create the :class:`Node`.
"""
def make_node(*args: Any, **kwargs: Any) -> None:
return Node(func, *args, **kwargs)
return make_node
[docs]
def widget_node(widget) -> Node:
"""
Create a node from a widget. When data is requested from it, it will return the
``.value`` attribute of the supplied widget.
In addition, all of its children will be notified when the ``value`` of the widget
changes.
Parameters
----------
widget:
The widget used to construct the node. This can be a widget from the
``ipywidgets`` library, or a custom widget.
"""
n = Node(func=lambda: widget.value)
n.name = f'Widget <{type(widget).__name__}: {type(widget.value).__name__}>'
# TODO: Our custom widgets have a '_plopp_observe' method instead of 'observe'
# because inheriting from VBox causes errors when overriding the 'observe' method
# (see https://bit.ly/3SggPVS).
observe_func = (
widget._plopp_observe_ if hasattr(widget, '_plopp_observe_') else widget.observe
)
observe_func(n.notify_children, names="value")
return n