From 39a9de8477956a0b9f82fa6722c17412a4ce5fe2 2014-01-16 10:55:59 From: Jonathan Frederic Date: 2014-01-16 10:55:59 Subject: [PATCH] Added system that allows js to be required by widgets. --- diff --git a/IPython/html/widgets/base.py b/IPython/html/widgets/base.py index 83a73aa..0d3dd95 100644 --- a/IPython/html/widgets/base.py +++ b/IPython/html/widgets/base.py @@ -8,7 +8,7 @@ import os import IPython from IPython.kernel.comm import Comm from IPython.config import LoggingConfigurable -from IPython.utils.traitlets import Unicode, Dict +from IPython.utils.traitlets import Unicode, Dict, List from IPython.display import Javascript, display from IPython.utils.py3compat import string_types @@ -18,6 +18,7 @@ class Widget(LoggingConfigurable): ### Public declarations target_name = Unicode('widget') default_view_name = Unicode() + js_requirements = List() ### Private/protected declarations @@ -122,6 +123,10 @@ class Widget(LoggingConfigurable): if not view_name: view_name = self.default_view_name + # Require traitlet specified widget js + for requirement in self.js_requirements: + self._require_js(requirement) + # Create a comm. if self.comm is None: self.comm = Comm(target_name=self.target_name) @@ -154,4 +159,17 @@ class Widget(LoggingConfigurable): pass # Eat errors, nom nom nom self.comm.send({"method": "update", "state": state}) - \ No newline at end of file + + ### Private methods + + def _require_js(self, js_path): + # Since we are loading requirements that must be loaded before this call + # returns, preform async js load. + display(Javascript(data=""" +$.ajax({ + url: '{0}', + async: false, + dataType: "script", + timeout: 1000, // Wait a maximum of one second for the script to load. +}); + """.format(js_path))) \ No newline at end of file diff --git a/IPython/html/widgets/container.py b/IPython/html/widgets/container.py index d83a44a..9b81d17 100644 --- a/IPython/html/widgets/container.py +++ b/IPython/html/widgets/container.py @@ -1,11 +1,12 @@ import os from base import Widget -from IPython.utils.traitlets import Unicode +from IPython.utils.traitlets import Unicode, List from IPython.utils.javascript import display_all_js class ContainerWidget(Widget): target_name = Unicode('container_widget') default_view_name = Unicode('ContainerView') + js_requirements = List(["notebook/js/widgets/container.js"]) _keys = [] diff --git a/IPython/html/widgets/float_range.py b/IPython/html/widgets/float_range.py index 3227b52..3a03ea7 100644 --- a/IPython/html/widgets/float_range.py +++ b/IPython/html/widgets/float_range.py @@ -1,12 +1,13 @@ import os from base import Widget -from IPython.utils.traitlets import Unicode, Float, Bool +from IPython.utils.traitlets import Unicode, Float, Bool, List from IPython.utils.javascript import display_all_js class FloatRangeWidget(Widget): target_name = Unicode('FloatRangeWidgetModel') default_view_name = Unicode('FloatSliderView') + js_requirements = List(["notebook/js/widgets/float_range.js"]) _keys = ['value', 'step', 'max', 'min', 'disabled', 'orientation'] value = Float(0.0) diff --git a/IPython/html/widgets/int_range.py b/IPython/html/widgets/int_range.py index 541565c..b35ca75 100644 --- a/IPython/html/widgets/int_range.py +++ b/IPython/html/widgets/int_range.py @@ -1,12 +1,13 @@ import os from base import Widget -from IPython.utils.traitlets import Unicode, Int, Bool +from IPython.utils.traitlets import Unicode, Int, Bool, List from IPython.utils.javascript import display_all_js class IntRangeWidget(Widget): target_name = Unicode('IntRangeWidgetModel') default_view_name = Unicode('IntSliderView') + js_requirements = List(["notebook/js/widgets/int_range.js"]) _keys = ['value', 'step', 'max', 'min', 'disabled', 'orientation'] value = Int(0) diff --git a/IPython/html/widgets/selection.py b/IPython/html/widgets/selection.py index 2406fe9..3f6d856 100644 --- a/IPython/html/widgets/selection.py +++ b/IPython/html/widgets/selection.py @@ -7,6 +7,7 @@ from IPython.utils.javascript import display_all_js class SelectionWidget(Widget): target_name = Unicode('SelectionWidgetModel') default_view_name = Unicode('DropdownView') + js_requirements = List(["notebook/js/widgets/selection.js"]) _keys = ['value', 'values', 'disabled'] value = Unicode() diff --git a/IPython/html/widgets/string.py b/IPython/html/widgets/string.py index b268057..1f76429 100644 --- a/IPython/html/widgets/string.py +++ b/IPython/html/widgets/string.py @@ -1,12 +1,13 @@ import os from base import Widget -from IPython.utils.traitlets import Unicode, Bool +from IPython.utils.traitlets import Unicode, Bool, List from IPython.utils.javascript import display_all_js class StringWidget(Widget): target_name = Unicode('StringWidgetModel') default_view_name = Unicode('TextboxView') + js_requirements = List(["notebook/js/widgets/string.js"]) _keys = ['value', 'row_count', 'disabled'] value = Unicode()