#-----------------------------------------------------------------------------# 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 slider widgets.'''#-----------------------------------------------------------------------------# Boilerplate#-----------------------------------------------------------------------------from__future__importannotationsimportlogging# isort:skiplog=logging.getLogger(__name__)#-----------------------------------------------------------------------------# Imports#-----------------------------------------------------------------------------# Standard library importsimportnumbersimporttypingastpfromdatetimeimportdate,datetime# Bokeh importsfrom...core.has_propsimportabstractfrom...core.propertiesimport(Bool,Color,Datetime,Either,Enum,Float,Instance,Int,NonNullable,Nullable,Override,Readonly,String,Tuple,)from...core.validationimporterrorfrom...core.validation.errorsimportEQUAL_SLIDER_START_ENDfrom..formattersimportTickFormatterfrom.widgetimportWidget#-----------------------------------------------------------------------------# Globals and constants#-----------------------------------------------------------------------------__all__=('AbstractSlider','Slider','RangeSlider','DateSlider','DateRangeSlider','DatetimeRangeSlider',)#-----------------------------------------------------------------------------# Dev API#-----------------------------------------------------------------------------
[docs]@abstractclassAbstractSlider(Widget):""" """def__init__(self,**kwargs)->None:if'start'inkwargsand'end'inkwargs:ifkwargs['start']==kwargs['end']:raiseValueError("Slider 'start' and 'end' cannot be equal.")if"value"inkwargsand"value_throttled"notinkwargs:kwargs["value_throttled"]=kwargs["value"]super().__init__(**kwargs)orientation=Enum("horizontal","vertical",help=""" Orient the slider either horizontally (default) or vertically. """)title=Nullable(String,default="",help=""" Slider's label. """)show_value=Bool(default=True,help=""" Whether or not show slider's value. """)format=Either(String,Instance(TickFormatter),help=""" """)direction=Enum("ltr","rtl",help=""" """)tooltips=Bool(default=True,help=""" """)bar_color=Color(default="#e6e6e6",help=""" """)@error(EQUAL_SLIDER_START_END)def_check_missing_dimension(self):ifhasattr(self,'start')andhasattr(self,'end'):ifself.start==self.end:returnf"{self!s} with title {self.title!s}"
#-----------------------------------------------------------------------------# General API#-----------------------------------------------------------------------------
[docs]classSlider(AbstractSlider):""" Slider-based number selection widget. """start=NonNullable(Float,help=""" The minimum allowable value. """)end=NonNullable(Float,help=""" The maximum allowable value. """)value=NonNullable(Float,help=""" Initial or selected value. """)value_throttled=Readonly(NonNullable(Float),help=""" Initial or selected value, throttled according to report only on mouseup. """)step=Float(default=1,help=""" The step between consecutive values. """)format=Override(default="0[.]00")
[docs]classRangeSlider(AbstractSlider):""" Range-slider based number range selection widget. """value=NonNullable(Tuple(Float,Float),help=""" Initial or selected range. """)value_throttled=Readonly(NonNullable(Tuple(Float,Float)),help=""" Initial or selected value, throttled according to report only on mouseup. """)start=NonNullable(Float,help=""" The minimum allowable value. """)end=NonNullable(Float,help=""" The maximum allowable value. """)step=Float(default=1,help=""" The step between consecutive values. """)format=Override(default="0[.]00")
[docs]classDateSlider(AbstractSlider):""" Slider-based date selection widget. """@propertydefvalue_as_datetime(self)->datetime|None:''' Convenience property to retrieve the value as a datetime object. Added in version 2.0 '''ifself.valueisNone:returnNoneifisinstance(self.value,numbers.Number):returndatetime.utcfromtimestamp(self.value/1000)returnself.value@propertydefvalue_as_date(self)->date|None:''' Convenience property to retrieve the value as a date object. Added in version 2.0 '''ifself.valueisNone:returnNoneifisinstance(self.value,numbers.Number):dt=datetime.utcfromtimestamp(self.value/1000)returndate(*dt.timetuple()[:3])returnself.valuevalue=NonNullable(Datetime,help=""" Initial or selected value. """)value_throttled=Readonly(NonNullable(Datetime),help=""" Initial or selected value, throttled to report only on mouseup. """)start=NonNullable(Datetime,help=""" The minimum allowable value. """)end=NonNullable(Datetime,help=""" The maximum allowable value. """)step=Int(default=1,help=""" The step between consecutive values. """)format=Override(default="%d %b %Y")
[docs]classDateRangeSlider(AbstractSlider):""" Slider-based date range selection widget. """@propertydefvalue_as_datetime(self)->tp.Tuple[datetime,datetime]|None:''' Convenience property to retrieve the value tuple as a tuple of datetime objects. Added in version 1.1 '''ifself.valueisNone:returnNonev1,v2=self.valueifisinstance(v1,numbers.Number):d1=datetime.utcfromtimestamp(v1/1000)else:d1=v1ifisinstance(v2,numbers.Number):d2=datetime.utcfromtimestamp(v2/1000)else:d2=v2returnd1,d2@propertydefvalue_as_date(self)->tp.Tuple[date,date]|None:''' Convenience property to retrieve the value tuple as a tuple of date objects. Added in version 1.1 '''ifself.valueisNone:returnNonev1,v2=self.valueifisinstance(v1,numbers.Number):dt=datetime.utcfromtimestamp(v1/1000)d1=date(*dt.timetuple()[:3])else:d1=v1ifisinstance(v2,numbers.Number):dt=datetime.utcfromtimestamp(v2/1000)d2=date(*dt.timetuple()[:3])else:d2=v2returnd1,d2value=NonNullable(Tuple(Datetime,Datetime),help=""" Initial or selected range. """)value_throttled=Readonly(NonNullable(Tuple(Datetime,Datetime)),help=""" Initial or selected value, throttled to report only on mouseup. """)start=NonNullable(Datetime,help=""" The minimum allowable value. """)end=NonNullable(Datetime,help=""" The maximum allowable value. """)step=Int(default=1,help=""" The step between consecutive values. """)format=Override(default="%d %b %Y")
[docs]classDatetimeRangeSlider(AbstractSlider):""" Slider-based datetime range selection widget. """# explicit __init__ to support Init signaturesdef__init__(self,*args,**kwargs)->None:super().__init__(*args,**kwargs)@propertydefvalue_as_datetime(self)->tp.Tuple[datetime,datetime]|None:''' Convenience property to retrieve the value tuple as a tuple of datetime objects. '''ifself.valueisNone:returnNonev1,v2=self.valueifisinstance(v1,numbers.Number):d1=datetime.utcfromtimestamp(v1/1000)else:d1=v1ifisinstance(v2,numbers.Number):d2=datetime.utcfromtimestamp(v2/1000)else:d2=v2returnd1,d2value=NonNullable(Tuple(Datetime,Datetime),help=""" Initial or selected range. """)value_throttled=Readonly(NonNullable(Tuple(Datetime,Datetime)),help=""" Initial or selected value, throttled to report only on mouseup. """)start=NonNullable(Datetime,help=""" The minimum allowable value. """)end=NonNullable(Datetime,help=""" The maximum allowable value. """)step=Int(default=3_600_000,help=""" The step between consecutive values, in units of milliseconds. Default is one hour. """)format=Override(default="%d %b %Y %H:%M:%S")