From bff10f318f458e74155f23d3567fcec946518ee0 2014-12-29 07:59:12 From: Min RK Date: 2014-12-29 07:59:12 Subject: [PATCH] load kernel js, css, logo on spec_changed event Ensures kernel.js is always loaded. It wasn't being loaded when creating a new notebook with a particular kernel because `change_kernel` wasn't being called. Only the `spec_changed` event is triggered by all the various ways a kernel can be loaded, so load kernel stuff on that event. --- diff --git a/IPython/html/static/notebook/js/kernelselector.js b/IPython/html/static/notebook/js/kernelselector.js index 3cd13d3..cd3535b 100644 --- a/IPython/html/static/notebook/js/kernelselector.js +++ b/IPython/html/static/notebook/js/kernelselector.js @@ -54,37 +54,32 @@ define([ change_kernel_submenu.append(ks_submenu_entry); } }; - - KernelSelector.prototype.change_kernel = function(kernel_name) { - /** - * TODO, have a methods to set kernel spec directly ? - **/ - if (kernel_name === this.current_selection) { - return; + + KernelSelector.prototype._spec_changed = function (event, ks) { + /** event handler for spec_changed */ + + // update selection + this.current_selection = ks.name; + + // load logo + var logo_img = this.element.find("img.current_kernel_logo"); + $("#kernel_indicator").find('.kernel_indicator_name').text(ks.spec.display_name); + if (ks.resources['logo-64x64']) { + logo_img.attr("src", ks.resources['logo-64x64']); + logo_img.show(); + } else { + logo_img.hide(); } - var ks = this.kernelspecs[kernel_name]; + // load kernel css var css_url = ks.resources['kernel.css']; if (css_url) { $('#kernel-css').attr('href', css_url); } else { $('#kernel-css').attr('href', ''); } - - try { - this.notebook.start_session(kernel_name); - } catch (e) { - if (e.name === 'SessionAlreadyStarting') { - console.log("Cannot change kernel while waiting for pending session start."); - } else { - // unhandled error - throw e; - } - // only trigger spec_changed if change was successful - return; - } - this.events.trigger('spec_changed.Kernel', ks); + // load kernel js if (ks.resources['kernel.js']) { require([ks.resources['kernel.js']], function (kernel_mod) { @@ -100,7 +95,31 @@ define([ } ); } + }; + KernelSelector.prototype.change_kernel = function (kernel_name) { + /** + * TODO, have a methods to set kernel spec directly ? + **/ + if (kernel_name === this.current_selection) { + return; + } + var ks = this.kernelspecs[kernel_name]; + + try { + this.notebook.start_session(kernel_name); + } catch (e) { + if (e.name === 'SessionAlreadyStarting') { + console.log("Cannot change kernel while waiting for pending session start."); + } else { + // unhandled error + throw e; + } + // only trigger spec_changed if change was successful + return; + } + console.log('spec', kernel_name, ks); + this.events.trigger('spec_changed.Kernel', ks); }; KernelSelector.prototype.lock_switch = function() { @@ -112,19 +131,9 @@ define([ KernelSelector.prototype.bind_events = function() { var that = this; - var logo_img = this.element.find("img.current_kernel_logo"); - this.events.on('spec_changed.Kernel', function(event, data) { - that.current_selection = data.name; - $("#kernel_indicator").find('.kernel_indicator_name').text(data.spec.display_name); - if (data.resources['logo-64x64']) { - logo_img.attr("src", data.resources['logo-64x64']); - logo_img.show(); - } else { - logo_img.hide(); - } - }); + this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this)); - this.events.on('kernel_created.Session', function(event, data) { + this.events.on('kernel_created.Session', function (event, data) { if (data.kernel.name !== that.current_selection) { // If we created a 'python' session, we only know if it's Python // 3 or 2 on the server's reply, so we fire the event again to @@ -134,6 +143,7 @@ define([ } }); + var logo_img = this.element.find("img.current_kernel_logo"); logo_img.on("load", function() { logo_img.show(); });