瀏覽代碼

Add state restoration for mime renderer documents

Steven Silvester 7 年之前
父節點
當前提交
38ddb60680
共有 2 個文件被更改,包括 42 次插入17 次删除
  1. 41 16
      packages/rendermime-extension/src/index.ts
  2. 1 1
      packages/vega/package.json

+ 41 - 16
packages/rendermime-extension/src/index.ts

@@ -6,15 +6,15 @@ import {
 } from '@phosphor/algorithm';
 
 import {
-  JupyterLabPlugin, JupyterLab
+  ILayoutRestorer, JupyterLabPlugin, JupyterLab
 } from '@jupyterlab/application';
 
 import {
-  ICommandLinker
+  ICommandLinker, InstanceTracker
 } from '@jupyterlab/apputils';
 
 import {
-  IDocumentRegistry, MimeRendererFactory
+  IDocumentRegistry, MimeRenderer, MimeRendererFactory
 } from '@jupyterlab/docregistry';
 
 import {
@@ -39,19 +39,8 @@ const rendermimePlugin: JupyterLabPlugin<IRenderMime> = {
  */
 const docRegistryPlugin: JupyterLabPlugin<void> = {
   id: 'jupyter.services.mimerender-documents',
-  requires: [IRenderMime, IDocumentRegistry],
-  activate: (app: JupyterLab, rendermime: IRenderMime, registry: IDocumentRegistry) => {
-      each(RenderMime.getExtensions(), item => {
-          if (item.widgetFactoryOptions) {
-            registry.addWidgetFactory(new MimeRendererFactory({
-              mimeType: item.mimeType,
-              renderTimeout: item.renderTimeout,
-              rendermime,
-              ...item.widgetFactoryOptions,
-            }));
-          }
-      });
-    },
+  requires: [IRenderMime, IDocumentRegistry, ILayoutRestorer],
+  activate: activateWidgetFactories,
   autoStart: true
 };
 
@@ -84,3 +73,39 @@ function activateRendermime(app: JupyterLab, linker: ICommandLinker, registry: I
 
   return rendermime;
 };
+
+
+/**
+ * Activate the widget factories plugin.
+ */
+function activateWidgetFactories(app: JupyterLab, rendermime: IRenderMime, registry: IDocumentRegistry, restorer: ILayoutRestorer) {
+  each(RenderMime.getExtensions(), item => {
+    if (!item.widgetFactoryOptions) {
+      return;
+    }
+    let factory = new MimeRendererFactory({
+      mimeType: item.mimeType,
+      renderTimeout: item.renderTimeout,
+      rendermime,
+      ...item.widgetFactoryOptions,
+    });
+    registry.addWidgetFactory(factory);
+
+    const factoryName = item.widgetFactoryOptions.name;
+    const namespace = `${factoryName}-renderer`;
+    const tracker = new InstanceTracker<MimeRenderer>({ namespace });
+
+    // Handle state restoration.
+    restorer.restore(tracker, {
+      command: 'file-operations:open',
+      args: widget => ({ path: widget.context.path, factory: factoryName }),
+      name: widget => widget.context.path
+    });
+
+    factory.widgetCreated.connect((sender, widget) => {
+      // Notify the instance tracker if restore data needs to update.
+      widget.context.pathChanged.connect(() => { tracker.save(widget); });
+      tracker.add(widget);
+    });
+  });
+}

+ 1 - 1
packages/vega/package.json

@@ -26,7 +26,7 @@
   },
   "devDependencies": {
     "rimraf": "^2.5.2",
-    "typescript": "^2.2.1"
+    "typescript": "~2.3.1"
   },
   "scripts": {
     "build": "tsc",