widget_container.py
62 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r14283 | """ContainerWidget class. | ||
Represents a container that can be used to group other widgets. | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (c) 2013, the IPython Development Team. | ||||
# | ||||
# Distributed under the terms of the Modified BSD License. | ||||
# | ||||
# The full license is in the file COPYING.txt, distributed with this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r14540 | from .widget import DOMWidget | ||
MinRK
|
r15480 | from IPython.utils.traitlets import Unicode, Tuple, TraitError | ||
Jonathan Frederic
|
r14239 | |||
Jonathan Frederic
|
r14283 | #----------------------------------------------------------------------------- | ||
# Classes | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r15475 | |||
Jonathan Frederic
|
r14540 | class ContainerWidget(DOMWidget): | ||
Jonathan Frederic
|
r14701 | _view_name = Unicode('ContainerView', sync=True) | ||
Jonathan Frederic
|
r14268 | |||
MinRK
|
r15480 | # Child widgets in the container. | ||
# Using a tuple here to force reassignment to update the list. | ||||
# When a proper notifying-list trait exists, that is what should be used here. | ||||
children = Tuple() | ||||
_children = Tuple(sync=True) | ||||
Jonathan Frederic
|
r14608 | |||
zah
|
r15446 | |||
def __init__(self, **kwargs): | ||||
super(ContainerWidget, self).__init__(**kwargs) | ||||
self.on_displayed(ContainerWidget._fire_children_displayed) | ||||
def _fire_children_displayed(self): | ||||
for child in self._children: | ||||
child._handle_displayed() | ||||
Jonathan Frederic
|
r14715 | def _children_changed(self, name, old, new): | ||
Jonathan Frederic
|
r14608 | """Validate children list. | ||
Makes sure only one instance of any given model can exist in the | ||||
Jonathan Frederic
|
r14699 | children list. | ||
An excellent post on uniqifiers is available at | ||||
http://www.peterbe.com/plog/uniqifiers-benchmark | ||||
which provides the inspiration for using this implementation. Below | ||||
I've implemented the `f5` algorithm using Python comprehensions.""" | ||||
MinRK
|
r15476 | if new is not None: | ||
Jonathan Frederic
|
r14699 | seen = {} | ||
def add_item(i): | ||||
seen[i.model_id] = True | ||||
return i | ||||
Jonathan Frederic
|
r14715 | self._children = [add_item(i) for i in new if not i.model_id in seen] | ||
Jonathan Frederic
|
r14592 | |||
Jonathan Frederic
|
r14607 | |||
Jonathan Frederic
|
r14676 | class PopupWidget(ContainerWidget): | ||
Jonathan Frederic
|
r14701 | _view_name = Unicode('PopupView', sync=True) | ||
Jonathan Frederic
|
r14608 | |||
description = Unicode(sync=True) | ||||
button_text = Unicode(sync=True) | ||||