diff --git a/IPython/html/widgets/__init__.py b/IPython/html/widgets/__init__.py index 2e93522..8766356 100644 --- a/IPython/html/widgets/__init__.py +++ b/IPython/html/widgets/__init__.py @@ -1,4 +1,4 @@ -from .widget import Widget, DOMWidget, CallbackDispatcher +from .widget import Widget, DOMWidget, CallbackDispatcher, register from .widget_bool import Checkbox, ToggleButton from .widget_button import Button diff --git a/IPython/html/widgets/widget.py b/IPython/html/widgets/widget.py index 0f0c61b..0eccf42 100644 --- a/IPython/html/widgets/widget.py +++ b/IPython/html/widgets/widget.py @@ -75,12 +75,26 @@ def _show_traceback(method): ip.showtraceback() return m + +def register(key=None): + """Returns a decorator registering a widget class in the widget registry. + If no key is provided, the class name is used as a key. A key is + provided for each core IPython widget so that the frontend can use + this key regardless of the language of the kernel""" + def wrap(widget): + l = key if key is not None else widget.__module__ + widget.__name__ + Widget.widget_types[l] = widget + return widget + return wrap + + class Widget(LoggingConfigurable): #------------------------------------------------------------------------- # Class attributes #------------------------------------------------------------------------- _widget_construction_callback = None widgets = {} + widget_types = {} @staticmethod def on_widget_constructed(callback): diff --git a/IPython/html/widgets/widget_bool.py b/IPython/html/widgets/widget_bool.py index 57a78d0..bd39e21 100644 --- a/IPython/html/widgets/widget_bool.py +++ b/IPython/html/widgets/widget_bool.py @@ -13,7 +13,7 @@ Represents a boolean using a widget. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, Bool, CaselessStrEnum from IPython.utils.warn import DeprecatedClass @@ -27,11 +27,13 @@ class _Bool(DOMWidget): disabled = Bool(False, help="Enable or disable user changes.", sync=True) +@register('IPython.Checkbox') class Checkbox(_Bool): """Displays a boolean `value`.""" _view_name = Unicode('CheckboxView', sync=True) +@register('IPython.ToggleButton') class ToggleButton(_Bool): """Displays a boolean `value`.""" diff --git a/IPython/html/widgets/widget_box.py b/IPython/html/widgets/widget_box.py index e2bf081..ca9c626 100644 --- a/IPython/html/widgets/widget_box.py +++ b/IPython/html/widgets/widget_box.py @@ -6,10 +6,11 @@ Represents a container that can be used to group other widgets. # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, Tuple, TraitError, Int, CaselessStrEnum from IPython.utils.warn import DeprecatedClass +@register('IPython.Box') class Box(DOMWidget): """Displays multiple widgets in a group.""" _view_name = Unicode('BoxView', sync=True) @@ -44,6 +45,7 @@ class Box(DOMWidget): child._handle_displayed() +@register('IPython.Popup') class Popup(Box): """Displays multiple widgets in an in page popup div.""" _view_name = Unicode('PopupView', sync=True) @@ -52,6 +54,7 @@ class Popup(Box): button_text = Unicode(sync=True) +@register('IPython.FlexBox') class FlexBox(Box): """Displays multiple widgets using the flexible box model.""" _view_name = Unicode('FlexBoxView', sync=True) diff --git a/IPython/html/widgets/widget_button.py b/IPython/html/widgets/widget_button.py index 012c999..e91f3d2 100644 --- a/IPython/html/widgets/widget_button.py +++ b/IPython/html/widgets/widget_button.py @@ -14,13 +14,14 @@ click events on the button and trigger backend code when the clicks are fired. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget import DOMWidget, CallbackDispatcher +from .widget import DOMWidget, CallbackDispatcher, register from IPython.utils.traitlets import Unicode, Bool, CaselessStrEnum from IPython.utils.warn import DeprecatedClass #----------------------------------------------------------------------------- # Classes #----------------------------------------------------------------------------- +@register('IPython.Button') class Button(DOMWidget): """Button widget. diff --git a/IPython/html/widgets/widget_float.py b/IPython/html/widgets/widget_float.py index 923acff..01395ec 100644 --- a/IPython/html/widgets/widget_float.py +++ b/IPython/html/widgets/widget_float.py @@ -13,7 +13,7 @@ Represents an unbounded float using a widget. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, CFloat, Bool, CaselessStrEnum, Tuple from IPython.utils.warn import DeprecatedClass @@ -43,14 +43,17 @@ class _BoundedFloat(_Float): self.value = min(max(new, self.min), self.max) +@register('IPython.FloatText') class FloatText(_Float): _view_name = Unicode('FloatTextView', sync=True) +@register('IPython.BoundedFloatText') class BoundedFloatText(_BoundedFloat): _view_name = Unicode('FloatTextView', sync=True) +@register('IPython.FloatSlider') class FloatSlider(_BoundedFloat): _view_name = Unicode('FloatSliderView', sync=True) orientation = CaselessStrEnum(values=['horizontal', 'vertical'], @@ -61,6 +64,7 @@ class FloatSlider(_BoundedFloat): slider_color = Unicode(sync=True) +@register('IPython.FloatProgress') class FloatProgress(_BoundedFloat): _view_name = Unicode('ProgressView', sync=True) @@ -163,6 +167,7 @@ class _BoundedFloatRange(_FloatRange): self.lower = low +@register('IPython.FloatRangeSlider') class FloatRangeSlider(_BoundedFloatRange): _view_name = Unicode('FloatSliderView', sync=True) orientation = CaselessStrEnum(values=['horizontal', 'vertical'], diff --git a/IPython/html/widgets/widget_image.py b/IPython/html/widgets/widget_image.py index f8ff8d4..40968f0 100644 --- a/IPython/html/widgets/widget_image.py +++ b/IPython/html/widgets/widget_image.py @@ -15,13 +15,14 @@ Represents an image in the frontend using a widget. #----------------------------------------------------------------------------- import base64 -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, CUnicode, Bytes from IPython.utils.warn import DeprecatedClass #----------------------------------------------------------------------------- # Classes #----------------------------------------------------------------------------- +@register('IPython.Image') class Image(DOMWidget): """Displays an image as a widget. diff --git a/IPython/html/widgets/widget_int.py b/IPython/html/widgets/widget_int.py index 6cdbf29..582ae03 100644 --- a/IPython/html/widgets/widget_int.py +++ b/IPython/html/widgets/widget_int.py @@ -13,7 +13,7 @@ Represents an unbounded int using a widget. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, CInt, Bool, CaselessStrEnum, Tuple from IPython.utils.warn import DeprecatedClass @@ -56,16 +56,19 @@ class _BoundedInt(_Int): if new > self.max: raise ValueError("setting min > max") +@register('IPython.IntText') class IntText(_Int): """Textbox widget that represents a int.""" _view_name = Unicode('IntTextView', sync=True) +@register('IPython.BoundedIntText') class BoundedIntText(_BoundedInt): """Textbox widget that represents a int bounded by a minimum and maximum value.""" _view_name = Unicode('IntTextView', sync=True) +@register('IPython.IntSlider') class IntSlider(_BoundedInt): """Slider widget that represents a int bounded by a minimum and maximum value.""" _view_name = Unicode('IntSliderView', sync=True) @@ -77,6 +80,7 @@ class IntSlider(_BoundedInt): slider_color = Unicode(sync=True) +@register('IPython.IntProgress') class IntProgress(_BoundedInt): """Progress bar that represents a int bounded by a minimum and maximum value.""" _view_name = Unicode('ProgressView', sync=True) @@ -176,6 +180,7 @@ class _BoundedIntRange(_IntRange): self.upper = high self.lower = low +@register('IPython.IntRangeSlider') class IntRangeSlider(_BoundedIntRange): _view_name = Unicode('IntSliderView', sync=True) orientation = CaselessStrEnum(values=['horizontal', 'vertical'], diff --git a/IPython/html/widgets/widget_selection.py b/IPython/html/widgets/widget_selection.py index d3dc362..79e61e2 100644 --- a/IPython/html/widgets/widget_selection.py +++ b/IPython/html/widgets/widget_selection.py @@ -17,7 +17,7 @@ Represents an enumeration using a widget. from collections import OrderedDict from threading import Lock -from .widget import DOMWidget +from .widget import DOMWidget, register from IPython.utils.traitlets import Unicode, List, Bool, Any, Dict, TraitError, CaselessStrEnum from IPython.utils.py3compat import unicode_type from IPython.utils.warn import DeprecatedClass @@ -114,6 +114,7 @@ class _Selection(DOMWidget): self.value_lock.release() +@register('IPython.ToggleButtons') class ToggleButtons(_Selection): """Group of toggle buttons that represent an enumeration. Only one toggle button can be toggled at any point in time.""" @@ -124,7 +125,7 @@ class ToggleButtons(_Selection): default_value='', allow_none=True, sync=True, help="""Use a predefined styling for the buttons.""") - +@register('IPython.Dropdown') class Dropdown(_Selection): """Allows you to select a single item from a dropdown.""" _view_name = Unicode('DropdownView', sync=True) @@ -134,13 +135,15 @@ class Dropdown(_Selection): default_value='', allow_none=True, sync=True, help="""Use a predefined styling for the buttons.""") - +@register('IPython.RadioButtons') class RadioButtons(_Selection): """Group of radio buttons that represent an enumeration. Only one radio button can be toggled at any point in time.""" _view_name = Unicode('RadioButtonsView', sync=True) + +@register('IPython.Select') class Select(_Selection): """Listbox that only allows one item to be selected at any given time.""" _view_name = Unicode('SelectView', sync=True) diff --git a/IPython/html/widgets/widget_selectioncontainer.py b/IPython/html/widgets/widget_selectioncontainer.py index 729090b..42adec0 100644 --- a/IPython/html/widgets/widget_selectioncontainer.py +++ b/IPython/html/widgets/widget_selectioncontainer.py @@ -14,7 +14,7 @@ pages. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget_box import Box +from .widget_box import Box, register from IPython.utils.traitlets import Unicode, Dict, CInt from IPython.utils.warn import DeprecatedClass @@ -51,12 +51,13 @@ class _SelectionContainer(Box): else: return None - +@register('IPython.Accordion') class Accordion(_SelectionContainer): """Displays children each on a separate accordion page.""" _view_name = Unicode('AccordionView', sync=True) +@register('IPython.Tab') class Tab(_SelectionContainer): """Displays children each on a separate accordion tab.""" _view_name = Unicode('TabView', sync=True) diff --git a/IPython/html/widgets/widget_string.py b/IPython/html/widgets/widget_string.py index 26b06cc..30245a2 100644 --- a/IPython/html/widgets/widget_string.py +++ b/IPython/html/widgets/widget_string.py @@ -13,7 +13,7 @@ Represents a unicode string using a widget. #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- -from .widget import DOMWidget, CallbackDispatcher +from .widget import DOMWidget, CallbackDispatcher, register from IPython.utils.traitlets import Unicode, Bool from IPython.utils.warn import DeprecatedClass @@ -28,17 +28,20 @@ class _String(DOMWidget): placeholder = Unicode("", help="Placeholder text to display when nothing has been typed", sync=True) +@register('IPython.HTML') class HTML(_String): """Renders the string `value` as HTML.""" _view_name = Unicode('HTMLView', sync=True) +@register('IPython.Latex') class Latex(_String): """Renders math inside the string `value` as Latex (requires $ $ or $$ $$ and similar latex tags).""" _view_name = Unicode('LatexView', sync=True) +@register('IPython.Textarea') class Textarea(_String): """Multiline text area widget.""" _view_name = Unicode('TextareaView', sync=True) @@ -47,6 +50,7 @@ class Textarea(_String): self.send({"method": "scroll_to_bottom"}) +@register('IPython.Text') class Text(_String): """Single line textbox widget.""" _view_name = Unicode('TextView', sync=True)