def __init__(self, *args, **kwargs):
# Compute selected and unselected values
options = kwargs.get('options', {})
if isinstance(options, list):
options = named_objs([(opt, opt) for opt in options])
self._reverse_lookup = {v: k for k, v in options.items()}
selected = [self._reverse_lookup[v] for v in kwargs.get('value', [])]
unselected = [k for k in options if k not in selected]
# Define whitelist and blacklist
self._lists = {False: SelectMultiple(options=unselected),
True: SelectMultiple(options=selected)}
self._lists[False].observe(self._update_selection, 'value')
self._lists[True].observe(self._update_selection, 'value')
# Define buttons
button_layout = Layout(width='50px')
self._buttons = {False: Button(description='<<', layout=button_layout),
True: Button(description='>>', layout=button_layout)}
self._buttons[False].on_click(self._apply_selection)
self._buttons[True].on_click(self._apply_selection)
# Define search
self._search = {False: Text(placeholder='Filter available options'),
True: Text(placeholder='Filter selected options')}
self._search[False].observe(self._filter_options, 'value')
self._search[True].observe(self._filter_options, 'value')
# Define Layout
no_margin = Layout(margin='0')
row_layout = Layout(margin='0', display='flex', justify_content='space-between')
search_row = HBox([self._search[False], self._search[True]])
search_row.layout = row_layout
button_box = VBox([self._buttons[True], self._buttons[False]],
layout=Layout(margin='auto 0'))
tab_row = HBox([self._lists[False], button_box, self._lists[True]])
tab_row.layout = row_layout
self._composite = VBox([search_row, tab_row], layout=no_margin)
self.observe(self._update_options, 'options')
self.observe(self._update_value, 'value')
self._selected = {False: [], True: []}
self._query = {False: '', True: ''}
super(CrossSelect, self).__init__(*args, **dict(kwargs, options=options))
评论列表
文章目录