Ver código fonte

Merge pull request #1052 from afshin/console-close-tweak

Console kernel-switching fixes
Steven Silvester 8 anos atrás
pai
commit
85e30b5c58

+ 1 - 1
src/completer/handler.ts

@@ -155,7 +155,7 @@ class CellCompleterHandler implements IDisposable {
    * Handle a completion requested signal from an editor.
    */
   protected onCompletionRequested(editor: ICellEditorWidget, request: ICompletionRequest): void {
-    if (!this.kernel || !this._completer.model) {
+    if (!this._kernel || !this._completer.model) {
       return;
     }
     this.makeRequest(request);

+ 2 - 0
src/console/panel.ts

@@ -101,7 +101,9 @@ class ConsolePanel extends Panel {
   protected onCloseRequest(msg: Message): void {
     let session = this.content.session;
     if (!session.kernel) {
+      super.onCloseRequest(msg);
       this.dispose();
+      return;
     }
     session.kernel.getSpec().then(spec => {
       let name = spec.display_name;

+ 1 - 2
src/console/plugin.ts

@@ -354,10 +354,9 @@ function activateConsole(app: JupyterLab, services: IServiceManager, rendermime:
         };
         return selectKernel(options);
       }).then((kernelId: Kernel.IModel) => {
+        // If the user cancels, kernelId will be void and should be ignored.
         if (kernelId) {
           session.changeKernel(kernelId);
-        } else {
-          session.kernel.shutdown();
         }
       });
     }

+ 13 - 11
src/docregistry/kernelselector.ts

@@ -40,7 +40,7 @@ interface IKernelSelection {
   preferredLanguage: string;
 
   /**
-   * The optional existing kernel id.
+   * The optional existing kernel model.
    */
   kernel?: Kernel.IModel;
 
@@ -66,6 +66,11 @@ interface IPopulateOptions {
    */
   sessions: Session.IModel[];
 
+  /**
+   * The optional existing kernel model.
+   */
+  kernel?: Kernel.IModel;
+
   /**
    * The preferred kernel name.
    */
@@ -100,7 +105,7 @@ function selectKernel(options: IKernelSelection): Promise<Kernel.IModel> {
   body.appendChild(selector);
 
   // Get the current sessions, populate the kernels, and show the dialog.
-  populateKernels(selector, { specs, sessions, preferredLanguage });
+  populateKernels(selector, { specs, sessions, preferredLanguage, kernel });
   return showDialog({
     title: 'Select Kernel',
     body,
@@ -202,7 +207,8 @@ function populateKernels(node: HTMLSelectElement, options: IPopulateOptions): vo
   }
   let maxLength = 10;
 
-  let { preferredKernel, preferredLanguage, sessions, specs } = options;
+  let { preferredKernel, preferredLanguage, sessions, specs, kernel } = options;
+  let existing = kernel ? kernel.id : void 0;
 
   // Create mappings of display names and languages for kernel name.
   let displayNames: { [key: string]: string } = Object.create(null);
@@ -242,12 +248,6 @@ function populateKernels(node: HTMLSelectElement, options: IPopulateOptions): vo
   }
   // Add a separator.
   node.appendChild(createSeparatorOption(maxLength));
-  // Add the option to have no kernel.
-  let option = document.createElement('option');
-  option.text = 'None';
-  option.value = 'null';
-  node.appendChild(option);
-  node.appendChild(createSeparatorOption(maxLength));
   // Add the rest of the kernel names in alphabetical order.
   let otherNames: string[] = [];
   for (let name in specs.kernelspecs) {
@@ -268,7 +268,8 @@ function populateKernels(node: HTMLSelectElement, options: IPopulateOptions): vo
   let matchingSessions: Session.IModel[] = [];
   if (preferredLanguage) {
     for (let session of sessions) {
-      if (languages[session.kernel.name] === preferredLanguage) {
+      if (languages[session.kernel.name] === preferredLanguage &&
+          session.kernel.id !== existing) {
         matchingSessions.push(session);
       }
     }
@@ -286,7 +287,8 @@ function populateKernels(node: HTMLSelectElement, options: IPopulateOptions): vo
   // Add the other remaining sessions.
   let otherSessions: Session.IModel[] = [];
   for (let session of sessions) {
-    if (matchingSessions.indexOf(session) === -1) {
+    if (matchingSessions.indexOf(session) === -1 &&
+        session.kernel.id !== existing) {
       otherSessions.push(session);
     }
   }