瀏覽代碼

Update notebook and console launcher items on specs changed.

Ian Rose 6 年之前
父節點
當前提交
18cf8ce821

+ 1 - 0
packages/console-extension/package.json

@@ -41,6 +41,7 @@
     "@jupyterlab/rendermime": "^0.19.1",
     "@phosphor/algorithm": "^1.1.2",
     "@phosphor/coreutils": "^1.3.0",
+    "@phosphor/disposable": "^1.1.2",
     "@phosphor/properties": "^1.1.2",
     "@phosphor/widgets": "^1.6.0"
   },

+ 33 - 19
packages/console-extension/src/index.ts

@@ -40,6 +40,8 @@ import { find } from '@phosphor/algorithm';
 
 import { ReadonlyJSONObject } from '@phosphor/coreutils';
 
+import { DisposableSet } from '@phosphor/disposable';
+
 import { DockLayout, Menu } from '@phosphor/widgets';
 
 import foreign from './foreign';
@@ -154,26 +156,38 @@ async function activateConsole(
   // Add a launcher item if the launcher is available.
   if (launcher) {
     manager.ready.then(() => {
-      const specs = manager.specs;
-      if (!specs) {
-        return;
-      }
-      let baseUrl = PageConfig.getBaseUrl();
-      for (let name in specs.kernelspecs) {
-        let rank = name === specs.default ? 0 : Infinity;
-        let kernelIconUrl = specs.kernelspecs[name].resources['logo-64x64'];
-        if (kernelIconUrl) {
-          let index = kernelIconUrl.indexOf('kernelspecs');
-          kernelIconUrl = baseUrl + kernelIconUrl.slice(index);
+      let disposables: DisposableSet | null = null;
+      const onSpecsChanged = () => {
+        if (disposables) {
+          disposables.dispose();
+          disposables = null;
         }
-        launcher.add({
-          command: CommandIDs.create,
-          args: { isLauncher: true, kernelPreference: { name } },
-          category: 'Console',
-          rank,
-          kernelIconUrl
-        });
-      }
+        const specs = manager.specs;
+        if (!specs) {
+          return;
+        }
+        disposables = new DisposableSet();
+        let baseUrl = PageConfig.getBaseUrl();
+        for (let name in specs.kernelspecs) {
+          let rank = name === specs.default ? 0 : Infinity;
+          let kernelIconUrl = specs.kernelspecs[name].resources['logo-64x64'];
+          if (kernelIconUrl) {
+            let index = kernelIconUrl.indexOf('kernelspecs');
+            kernelIconUrl = baseUrl + kernelIconUrl.slice(index);
+          }
+          disposables.add(
+            launcher.add({
+              command: CommandIDs.create,
+              args: { isLauncher: true, kernelPreference: { name } },
+              category: 'Console',
+              rank,
+              kernelIconUrl
+            })
+          );
+        }
+      };
+      onSpecsChanged();
+      manager.specsChanged.connect(onSpecsChanged);
     });
   }
 

+ 0 - 7
packages/launcher/src/index.tsx

@@ -75,13 +75,6 @@ export interface ILauncher {
  * LauncherItems, which the Launcher will render.
  */
 export class LauncherModel extends VDomModel implements ILauncher {
-  /**
-   * Create a new launcher model.
-   */
-  constructor() {
-    super();
-  }
-
   /**
    * Add a command item to the launcher, and trigger re-render event for parent
    * widget.

+ 1 - 0
packages/notebook-extension/package.json

@@ -44,6 +44,7 @@
     "@jupyterlab/services": "^3.2.1",
     "@jupyterlab/statusbar": "^0.7.1",
     "@phosphor/coreutils": "^1.3.0",
+    "@phosphor/disposable": "^1.1.2",
     "@phosphor/messaging": "^1.2.2",
     "@phosphor/widgets": "^1.6.0"
   },

+ 34 - 17
packages/notebook-extension/src/index.ts

@@ -27,6 +27,8 @@ import {
 
 import { UUID } from '@phosphor/coreutils';
 
+import { DisposableSet } from '@phosphor/disposable';
+
 import { IFileBrowserFactory } from '@jupyterlab/filebrowser';
 
 import { ILauncher } from '@jupyterlab/launcher';
@@ -625,24 +627,39 @@ function activateNotebookHandler(
   // Add a launcher item if the launcher is available.
   if (launcher) {
     services.ready.then(() => {
-      const specs = services.specs;
-      const baseUrl = PageConfig.getBaseUrl();
-
-      for (let name in specs.kernelspecs) {
-        let rank = name === specs.default ? 0 : Infinity;
-        let kernelIconUrl = specs.kernelspecs[name].resources['logo-64x64'];
-        if (kernelIconUrl) {
-          let index = kernelIconUrl.indexOf('kernelspecs');
-          kernelIconUrl = baseUrl + kernelIconUrl.slice(index);
+      let disposables: DisposableSet | null = null;
+      const onSpecsChanged = () => {
+        if (disposables) {
+          disposables.dispose();
+          disposables = null;
         }
-        launcher.add({
-          command: CommandIDs.createNew,
-          args: { isLauncher: true, kernelName: name },
-          category: 'Notebook',
-          rank,
-          kernelIconUrl
-        });
-      }
+        const specs = services.specs;
+        if (!specs) {
+          return;
+        }
+        disposables = new DisposableSet();
+        const baseUrl = PageConfig.getBaseUrl();
+
+        for (let name in specs.kernelspecs) {
+          let rank = name === specs.default ? 0 : Infinity;
+          let kernelIconUrl = specs.kernelspecs[name].resources['logo-64x64'];
+          if (kernelIconUrl) {
+            let index = kernelIconUrl.indexOf('kernelspecs');
+            kernelIconUrl = baseUrl + kernelIconUrl.slice(index);
+          }
+          disposables.add(
+            launcher.add({
+              command: CommandIDs.createNew,
+              args: { isLauncher: true, kernelName: name },
+              category: 'Notebook',
+              rank,
+              kernelIconUrl
+            })
+          );
+        }
+      };
+      onSpecsChanged();
+      services.specsChanged.connect(onSpecsChanged);
     });
   }