Source code for menpowidgets.abstract
import ipywidgets
[docs]class MenpoWidget(ipywidgets.FlexBox):
r"""
Base class for defining a Menpo widget.
The widget has a `selected_values` trait that can be used in order to
inspect any changes that occur to its children. It also has functionality
for adding, removing, replacing or calling the handler callback function of
the `selected_values` trait.
Parameters
----------
children : `list` of `ipywidgets`
The `list` of `ipywidgets` objects to be set as children in the
`ipywidgets.FlexBox`.
trait : `traitlets.TraitType` subclass
The type of the `selected_values` object that gets added as a trait
in the widget. Possible options from `traitlets` are {``Int``, ``Float``,
``Dict``, ``List``, ``Tuple``}.
trait_initial_value : `int` or `float` or `dict` or `list` or `tuple`
The initial value of the `selected_values` trait.
render_function : `callable` or ``None``, optional
The render function that behaves as a callback handler of the
`selected_values` trait for the `change` event. Its signature can be
``render_function()`` or ``render_function(change)``, where ``change``
is a `dict` with the following keys:
- ``owner`` : the `HasTraits` instance
- ``old`` : the old value of the modified trait attribute
- ``new`` : the new value of the modified trait attribute
- ``name`` : the name of the modified trait attribute.
- ``type`` : ``'change'``
If ``None``, then nothing is added.
orientation : {``'horizontal'``, ``'vertical'``}, optional
The orientation of the `ipywidgets.FlexBox`.
align : {``'start'``, ``'center'``, ``'end'``}, optional
The alignment of the children of the `ipywidgets.FlexBox`.
"""
def __init__(self, children, trait, trait_initial_value,
render_function=None, orientation='vertical', align='start'):
# Create box object
super(MenpoWidget, self).__init__(children=children)
self.orientation = orientation
self.align = align
# Add trait for selected values
selected_values = trait(default_value=trait_initial_value)
selected_values_trait = {'selected_values': selected_values}
self.add_traits(**selected_values_trait)
self.selected_values = trait_initial_value
# Set render function
self._render_function = None
self.add_render_function(render_function)
[docs] def add_render_function(self, render_function):
r"""
Method that adds the provided `render_function()` as a callback handler
to the `selected_values` trait of the widget. The given function is
also stored in `self._render_function`.
Parameters
----------
render_function : `callable` or ``None``, optional
The render function that behaves as a callback handler of the
`selected_values` trait for the `change` event. Its signature can be
``render_function()`` or ``render_function(change)``, where
``change`` is a `dict` with the following keys:
- ``owner`` : the `HasTraits` instance
- ``old`` : the old value of the modified trait attribute
- ``new`` : the new value of the modified trait attribute
- ``name`` : the name of the modified trait attribute.
- ``type`` : ``'change'``
If ``None``, then nothing is added.
"""
self._render_function = render_function
if self._render_function is not None:
self.observe(self._render_function, names='selected_values',
type='change')
[docs] def remove_render_function(self):
r"""
Method that removes the current `self._render_function()` as a callback
handler to the `selected_values` trait of the widget and sets
``self._render_function = None``.
"""
if self._render_function is not None:
self.unobserve(self._render_function, names='selected_values',
type='change')
self._render_function = None
[docs] def replace_render_function(self, render_function):
r"""
Method that replaces the current `self._render_function()` with the
given `render_function()` as a callback handler to the `selected_values`
trait of the widget.
Parameters
----------
render_function : `callable` or ``None``, optional
The render function that behaves as a callback handler of the
`selected_values` trait for the `change` event. Its signature can be
``render_function()`` or ``render_function(change)``, where
``change`` is a `dict` with the following keys:
- ``owner`` : the `HasTraits` instance
- ``old`` : the old value of the modified trait attribute
- ``new`` : the new value of the modified trait attribute
- ``name`` : the name of the modified trait attribute.
- ``type`` : ``'change'``
If ``None``, then nothing is added.
"""
# remove old function
self.remove_render_function()
# add new function
self.add_render_function(render_function)
[docs] def call_render_function(self, old_value, new_value, type_value='change'):
r"""
Method that calls the existing `render_function()` callback handler.
Parameters
----------
old_value : `int` or `float` or `dict` or `list` or `tuple`
The old `selected_values` value.
new_value : `int` or `float` or `dict` or `list` or `tuple`
The new `selected_values` value.
type_value : `str`, optional
The trait event type.
"""
if self._render_function is not None:
change_dict = {'type': 'change', 'old': old_value,
'name': type_value, 'new': new_value,
'owner': self.__str__()}
self._render_function(change_dict)