#-----------------------------------------------------------------------------# Copyright (c) 2012 - 2022, Anaconda, Inc., and Bokeh Contributors.# All rights reserved.## The full license is in the file LICENSE.txt, distributed with this software.#-----------------------------------------------------------------------------''' Various kinds of button widgets.'''#-----------------------------------------------------------------------------# Boilerplate#-----------------------------------------------------------------------------from__future__importannotationsimportlogging# isort:skiplog=logging.getLogger(__name__)#-----------------------------------------------------------------------------# Imports#-----------------------------------------------------------------------------# Standard library importsfromtypingimportTYPE_CHECKING,Callable# Bokeh importsfrom...core.enumsimportButtonTypefrom...core.has_propsimportHasProps,abstractfrom...core.propertiesimport(Bool,Either,Enum,Instance,List,Null,Nullable,Override,String,Tuple,)from...eventsimportButtonClick,MenuItemClickfrom..callbacksimportCallbackfrom.iconsimportAbstractIconfrom.widgetimportWidgetifTYPE_CHECKING:from...util.callback_managerimportEventCallback#-----------------------------------------------------------------------------# Globals and constants#-----------------------------------------------------------------------------__all__=('AbstractButton','Button','ButtonLike','Dropdown','Toggle',)#-----------------------------------------------------------------------------# Dev API#-----------------------------------------------------------------------------
[docs]@abstractclassButtonLike(HasProps):''' Shared properties for button-like widgets. '''button_type=Enum(ButtonType,help=""" A style for the button, signifying it's role. """)
[docs]@abstractclassAbstractButton(Widget,ButtonLike):''' A base class that defines common properties for all button types. '''label=String("Button",help=""" The text label for the button to display. """)icon=Nullable(Instance(AbstractIcon),help=""" An optional image appearing to the left of button's text. """)
#-----------------------------------------------------------------------------# General API#-----------------------------------------------------------------------------
[docs]classButton(AbstractButton):''' A click button. '''label=Override(default="Button")
[docs]defon_click(self,handler:EventCallback)->None:''' Set up a handler for button clicks. Args: handler (func) : handler function to call when button is clicked. Returns: None '''self.on_event(ButtonClick,handler)
[docs]defjs_on_click(self,handler:Callback)->None:''' Set up a JavaScript handler for button clicks. '''self.js_on_event(ButtonClick,handler)
[docs]classToggle(AbstractButton):''' A two-state toggle button. '''label=Override(default="Toggle")active=Bool(False,help=""" The initial state of a button. Also used to trigger ``on_click`` event handler. """)
[docs]defon_click(self,handler:Callable[[bool],None])->None:""" Set up a handler for button state changes (clicks). Args: handler (func) : handler function to call when button is toggled. Returns: None """self.on_change('active',lambdaattr,old,new:handler(new))
[docs]defjs_on_click(self,handler:Callback)->None:""" Set up a JavaScript handler for button state changes (clicks). """self.js_on_change('active',handler)
[docs]classDropdown(AbstractButton):''' A dropdown button. '''label=Override(default="Dropdown")split=Bool(default=False,help=""" """)menu=List(Either(Null,String,Tuple(String,Either(String,Instance(Callback)))),help=""" Button's dropdown menu consisting of entries containing item's text and value name. Use ``None`` as a menu separator. """)
[docs]defon_click(self,handler:EventCallback)->None:''' Set up a handler for button or menu item clicks. Args: handler (func) : handler function to call when button is activated. Returns: None '''self.on_event(ButtonClick,handler)self.on_event(MenuItemClick,handler)
[docs]defjs_on_click(self,handler:Callback)->None:''' Set up a JavaScript handler for button or menu item clicks. '''self.js_on_event(ButtonClick,handler)self.js_on_event(MenuItemClick,handler)