##// END OF EJS Templates
Code for the less magic was unnecessarily reading the entire input file twice. Redundant read removed.
Code for the less magic was unnecessarily reading the entire input file twice. Redundant read removed.

File last commit:

r19584:4863307a
r19624:8d378a70
Show More
kernelselector.js
159 lines | 5.8 KiB | application/javascript | JavascriptLexer
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
define([
'base/js/namespace',
'jquery',
'base/js/utils',
], function(IPython, $, utils) {
"use strict";
var KernelSelector = function(selector, notebook) {
this.selector = selector;
this.notebook = notebook;
Bussonnier Matthias
move setting nb.kernelselector inside kernelselector itself
r19448 this.notebook.set_kernelselector(this);
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 this.events = notebook.events;
MinRK
allow kernel_name to be undefined in js...
r18032 this.current_selection = null;
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 this.kernelspecs = {};
if (this.selector !== undefined) {
this.element = $(selector);
this.request_kernelspecs();
}
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 this.bind_events();
Thomas Kluyver
Address review comments
r17392 // Make the object globally available for user convenience & inspection
IPython.kernelselector = this;
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 Object.seal(this);
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 };
KernelSelector.prototype.request_kernelspecs = function() {
var url = utils.url_join_encode(this.notebook.base_url, 'api/kernelspecs');
Min RK
kernelspecs is a dict...
r19263 utils.promising_ajax(url).then($.proxy(this._got_kernelspecs, this));
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 };
Min RK
kernelspecs is a dict...
r19263 KernelSelector.prototype._got_kernelspecs = function(data) {
this.kernelspecs = data.kernelspecs;
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 var menu = this.element.find("#kernel_selector");
Thomas Kluyver
Add submenu under kernel for changing kernel
r17387 var change_kernel_submenu = $("#menu-change-kernel-submenu");
Min RK
kernelspecs is a dict...
r19263 var keys = Object.keys(data.kernelspecs).sort(function (a, b) {
// sort by display_name
var da = data.kernelspecs[a].display_name;
var db = data.kernelspecs[b].display_name;
if (da === db) {
return 0;
} else if (da > db) {
return 1;
} else {
return -1;
}
});
for (var i = 0; i < keys.length; i++) {
var ks = this.kernelspecs[keys[i]];
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 var ksentry = $("<li>").attr("id", "kernel-" +ks.name).append($('<a>')
.attr('href', '#')
.click($.proxy(this.change_kernel, this, ks.name))
.text(ks.display_name));
menu.append(ksentry);
Thomas Kluyver
Add submenu under kernel for changing kernel
r17387
var ks_submenu_entry = $("<li>").attr("id", "kernel-submenu-"+ks.name).append($('<a>')
.attr('href', '#')
.click($.proxy(this.change_kernel, this, ks.name))
.text(ks.display_name));
change_kernel_submenu.append(ks_submenu_entry);
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 }
};
KernelSelector.prototype.change_kernel = function(kernel_name) {
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 /**
* TODO, have a methods to set kernel spec directly ?
**/
var that = this;
Thomas Kluyver
Don't refer to global kernelselector object in Session
r17384 if (kernel_name === this.current_selection) {
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 return;
}
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 var ks = this.kernelspecs[kernel_name];
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 var new_mode_url = 'kernelspecs/'+ks.name+'/kernel';
var css_url = this.notebook.base_url+new_mode_url+'.css';
$.ajax({
type: 'HEAD',
url: css_url,
success: function(){
$('#kernel-css')
.attr('href',css_url);
},
error:function(){
Matthias Bussonnier
adresses Min comments
r19406 console.info("No custom kernel.css at URL:", css_url)
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 }
});
MinRK
avoid race condition when deleting/starting sessions...
r17649 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;
}
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 this.events.trigger('spec_changed.Kernel', ks);
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404
// load new mode kernel.js if exist
require([new_mode_url],
// if new mode has custom.js
function(new_mode){
that.lock_switch();
if(new_mode && new_mode.onload){
new_mode.onload();
} else {
Matthias Bussonnier
adresses Min comments
r19406 console.warn("The current kernel defined a kernel.js file but does not contain "+
"any asynchronous module definition. This is undefined behavior "+
Matthias Bussonnier
Fix typos, rephrase english. Thanks Kyle.
r19405 "which is not recommended");
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 }
},
function(err){
// if new mode does not have custom.js
Matthias Bussonnier
adresses Min comments
r19406 console.info("No custom kernel.css at URL:", new_mode_url)
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 }
);
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 };
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404
KernelSelector.prototype.lock_switch = function() {
Matthias Bussonnier
adresses Min comments
r19406 // should set a flag and display warning+reload if user want to
// re-change kernel. As UI discussion never finish
// making that a separate PR.
Matthias Bussonnier
Fix typos, rephrase english. Thanks Kyle.
r19405 console.warn('switching kernel is not guaranteed to work !');
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404 };
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 KernelSelector.prototype.bind_events = function() {
var that = this;
this.events.on('spec_changed.Kernel', function(event, data) {
Thomas Kluyver
Don't refer to global kernelselector object in Session
r17384 that.current_selection = data.name;
Matthias BUSSONNIER
Simplify and uniformise styling of kernel selector...
r17382 that.element.find("#current_kernel_spec").find('.kernel_name').text(data.display_name);
Bussonnier Matthias
fix logo on base_url prefix
r19584 that.element.find("#current_kernel_logo").attr("src", that.notebook.base_url+"kernelspecs/"+data.name+"/logo-64x64.png");
Thomas Kluyver
Use JS events for switching kernelspecs
r17380 });
Matthias BUSSONNIER
load the per kernel kernel.js and kernel.css...
r19404
Min RK
fix event hookup for kernel changed...
r18919 this.events.on('kernel_created.Session', function(event, data) {
if (data.kernel.name !== that.current_selection) {
Thomas Kluyver
Don't refer to global kernelselector object in Session
r17384 // 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
// set things up.
Min RK
fix event hookup for kernel changed...
r18919 var ks = that.kernelspecs[data.kernel.name];
Thomas Kluyver
Don't refer to global kernelselector object in Session
r17384 that.events.trigger('spec_changed.Kernel', ks);
}
});
Thomas Kluyver
Hide kernel logo if it's missing
r19374
var logo_img = this.element.find("#current_kernel_logo")
logo_img.on("load", function() {
logo_img.show();
});
logo_img.on("error", function() {
logo_img.hide();
});
Thomas Kluyver
Change displayed kernel name when our session is started
r17371 };
Thomas Kluyver
Allow switching kernel from the notebook UI
r17370 return {'KernelSelector': KernelSelector};
});