Forráskód Böngészése

Show the latest kernel banner in console on restart.

Fixes #3653
Jason Grout 7 éve
szülő
commit
d54188af45
1 módosított fájl, 51 hozzáadás és 28 törlés
  1. 51 28
      packages/console/src/widget.ts

+ 51 - 28
packages/console/src/widget.ts

@@ -126,10 +126,10 @@ class CodeConsole extends Widget {
     this._content = new Panel();
     this._input = new Panel();
 
-    let contentFactory = this.contentFactory = (
+    this.contentFactory = (
       options.contentFactory || CodeConsole.defaultContentFactory
     );
-    let modelFactory = this.modelFactory = (
+    this.modelFactory = (
       options.modelFactory || CodeConsole.defaultModelFactory
     );
     this.rendermime = options.rendermime;
@@ -144,17 +144,6 @@ class CodeConsole extends Widget {
     layout.addWidget(this._content);
     layout.addWidget(this._input);
 
-    // Create the banner.
-    let model = modelFactory.createRawCell({});
-    model.value.text = '...';
-    let banner = this._banner = new RawCell({
-      model,
-      contentFactory: contentFactory
-    });
-    banner.addClass(BANNER_CLASS);
-    banner.readOnly = true;
-    this._content.addWidget(banner);
-
     // Set up the foreign iopub handler.
     this._foreignHandler = new ForeignHandler({
       session: this.session,
@@ -168,6 +157,7 @@ class CodeConsole extends Widget {
 
     this._onKernelChanged();
     this.session.kernelChanged.connect(this._onKernelChanged, this);
+    this.session.statusChanged.connect(this._onKernelStatusChanged, this);
   }
 
   /**
@@ -239,14 +229,33 @@ class CodeConsole extends Widget {
     this.update();
   }
 
+  addBanner() {
+    if (this._banner) {
+      // An old banner just becomes a normal cell now.
+      let cell = this._banner;
+      this._cells.push(this._banner);
+      cell.disposed.connect(this._onCellDisposed, this);
+    }
+    // Create the banner.
+    let model = this.modelFactory.createRawCell({});
+    model.value.text = '...';
+    let banner = this._banner = new RawCell({
+      model,
+      contentFactory: this.contentFactory
+    });
+    banner.addClass(BANNER_CLASS);
+    banner.readOnly = true;
+    this._content.addWidget(banner);
+  }
+
   /**
    * Clear the code cells.
    */
   clear(): void {
-    // Dispose all the content cells except the first, which is the banner.
-    let cells = this._content.widgets;
-    while (cells.length > 1) {
-      cells[1].dispose();
+    // Dispose all the content cells
+    let cells = this._cells;
+    while (cells.length > 0) {
+      cells.get(0).dispose();
     }
   }
 
@@ -524,9 +533,7 @@ class CodeConsole extends Widget {
    * Update the console based on the kernel info.
    */
   private _handleInfo(info: KernelMessage.IInfoReply): void {
-    let layout = this._content.layout as PanelLayout;
-    let banner = layout.widgets[0] as RawCell;
-    banner.model.value.text = info.banner;
+    this._banner.model.value.text = info.banner;
     let lang = info.language_info as nbformat.ILanguageInfoMetadata;
     this._mimetype = this._mimeTypeService.getMimeTypeByLanguage(lang);
     if (this.promptCell) {
@@ -611,19 +618,35 @@ class CodeConsole extends Widget {
    */
   private _onKernelChanged(): void {
     this.clear();
-    let kernel = this.session.kernel;
-    if (!kernel) {
-      return;
+    if (this._banner) {
+      this._banner.dispose();
+      this._banner = null;
     }
-    kernel.ready.then(() => {
-      if (this.isDisposed || !kernel || !kernel.info) {
+  }
+
+  /**
+   * Handle a change to the kernel status.
+   */
+  private _onKernelStatusChanged(): void {
+    if (this.session.status === 'connected') {
+      // we just had a kernel restart or reconnect - reset banner
+      let kernel = this.session.kernel;
+      if (!kernel) {
         return;
       }
-      this._handleInfo(kernel.info);
-    });
+      this.addBanner();
+      kernel.requestKernelInfo().then(() => {
+        if (this.isDisposed || !kernel || !kernel.info) {
+          return;
+        }
+        this._handleInfo(this.session.kernel.info);
+      }).catch(err => {
+        console.error('could not get kernel info');
+      });
+    }
   }
 
-  private _banner: RawCell;
+  private _banner: RawCell = null;
   private _cells: IObservableList<Cell>;
   private _content: Panel;
   private _executed = new Signal<this, Date>(this);