Source code for plopp.widgets.checkboxes

# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2023 Scipp contributors (https://github.com/scipp)

from html import escape

import ipywidgets as ipw


[docs] class Checkboxes(ipw.HBox, ipw.ValueWidget): """ Widget providing a list of checkboxes, along with a button to toggle them all. Parameters ---------- entries: List of strings to create the names for the different checkboxes. description: Global description for all the checkboxes. value: Default value to set all the checkboxes to. toggle_all_button: Whether to add a button to toggle all checkboxes at once. """
[docs] def __init__( self, entries: list[str], description: str = "", value: bool = True, toggle_all_button: bool = True, ): self.checkboxes = {} self._lock = False self.description = ipw.Label(value=description) for key in entries: chbx = ipw.Checkbox( value=value, description=f"{escape(key)}", indent=False, layout={"width": "initial"}, ) chbx.observe(self._on_subwidget_change, names="value") self.checkboxes[key] = chbx to_hbox = [ self.description, ipw.HBox( list(self.checkboxes.values()), layout=ipw.Layout(flex_flow='row wrap') ), ] if len(self.checkboxes) > 1 and toggle_all_button: # Add a master button to control all checkboxes in one go self.toggle_all_button = ipw.ToggleButton( value=value, description="Toggle all", layout={"width": "initial"} ) self.toggle_all_button.observe(self._toggle_all, names="value") to_hbox.insert(1, self.toggle_all_button) self._on_subwidget_change() super().__init__(to_hbox)
def _toggle_all(self, change: dict): self._lock = True for chbx in self.checkboxes.values(): chbx.value = change["new"] self._lock = False self._on_subwidget_change() def _on_subwidget_change(self, _=None): """ The value is a dict containing one entry per checkbox, giving the checkbox's value. """ if self._lock: return self.value = {key: chbx.value for key, chbx in self.checkboxes.items()}