from trame.internal.app import get_app_instance
from trame.html import AbstractElement
from simput.pywebvue.modules import SimPut
# Make sure used module is available
_app = get_app_instance()
_app.enable_module(SimPut)
[docs]class Simput(AbstractElement):
"""
Simput data management component. This must be set as the root of a layout to provide children with Simput data. See simput docs |simput_link| for more info.
.. |simput_link| raw:: html
<a href="https://github.com/Kitware/py-simput" target="_blank">here</a>
:param ui_manager: See simput docs |simput_link| for more info
:param domains_manager: See simput docs |simput_link| for more info
:param prefix: Constructing a Simput component will set several variables, optionally prefixed by a namespace
:type prefix: str | None
:param query: String filtering
:type query: str
:param children: The children nested within this element
:type children: str | list[trame.html.*] | trame.html.* | None
>>> layout.root = simput.Simput(ui_manager, prefix="myForm")
"""
def __init__(
self, ui_manager, domains_manager=None, prefix=None, children=None, **kwargs
):
super().__init__("Simput", children, **kwargs)
ns = f"simput_{self._id}"
if prefix:
ns = prefix
self._simput_helper = SimPut.create_helper(
ui_manager, domains_manager, namespace=ns
)
self._attributes["wsClient"] = ':wsClient="wsClient"'
self._attributes["namespace"] = f'namespace="{ns}"'
self._attr_names += ["query"]
@property
def controller(self):
"""
Simput helper object
"""
return self._simput_helper
[docs] def apply(self, **kwargs):
"""
Flush modified properties so they can be pushed to their concrete objects
"""
self._simput_helper.apply()
[docs] def reset(self, **kwargs):
"""
Unapply properties
"""
self._simput_helper.reset()
[docs] def push(self, id=None, type=None, domains=None, proxy=None, **kwargs):
"""
Ask server to push data, ui, or constraints
"""
if proxy is not None:
id = proxy
domains = proxy
self._simput_helper.push(id=id, type=type, domains=domains)
[docs] def update(self, change_set, **kwargs):
"""
List of properties and value to update
>>> change_set = [
... {"id":"12", "name":"Radius", "value": 0.75},
... {"id": "12", "name":"Resolution", "value": 24}
... ]
"""
self._simput_helper.update(change_set)
[docs] def refresh(self, id=0, property="", **kwargs):
self._simput_helper.refresh(id, property)
@property
def changeset(self):
"""
All unapplied changesets
"""
return self._simput_helper.changeset()
@property
def has_changes(self):
"""
Does the changeset have content?
"""
return self._simput_helper.has_changes
@property
def auto_update(self):
"""
Whether to automatically apply changes
"""
return self._simput_helper.auto_update
@auto_update.setter
def auto_update(self, value):
self._simput_helper.auto_update = value
[docs]class SimputItem(AbstractElement):
"""
Simput data display component. This must be child of a Simput component to have access to Simput data. See simput docs |simput_link| for more info.
:param itemId: The simput id of the data to display
:type itemId: str
:param extract: Columns to make available from this component to its children
:type extract: list[str]
:param no_ui: Whether to show simput template UI
:type no_ui: bool
:param children: The children nested within this element
:type children: str | list[trame.html.*] | trame.html.* | None
Events
:param dirty: Function to call when itemId is changed
:type dirty: function
"""
def __init__(self, children=None, extract=[], **kwargs):
super().__init__("SimputItem", children, **kwargs)
self._attr_names += [
("itemId", ":itemId"),
"no_ui",
]
self._event_names += [
"dirty",
]
if extract:
self._attributes["prop_extract"] = f'#properties="{{{", ".join(extract)}}}"'