Selaa lähdekoodia

Allow mime documents to save

Steven Silvester 7 vuotta sitten
vanhempi
commit
1fb2ddc14c
2 muutettua tiedostoa jossa 42 lisäystä ja 2 poistoa
  1. 22 2
      packages/docregistry/src/mimedocument.ts
  2. 20 0
      packages/rendermime/src/mimemodel.ts

+ 22 - 2
packages/docregistry/src/mimedocument.ts

@@ -21,9 +21,13 @@ import {
   IRenderMime, RenderMime, MimeModel
 } from '@jupyterlab/rendermime';
 
+import {
+  ABCWidgetFactory
+} from './default';
+
 import {
   DocumentRegistry
-} from './index';
+} from './registry';
 
 
 /**
@@ -142,7 +146,8 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
     } else {
       data[this._mimeType] = model.toJSON();
     }
-    let mimeModel = new MimeModel({ data });
+    let mimeModel = new MimeModel({ data, callback: this._changeCallback });
+
     return this._renderer.renderModel(mimeModel).then(() => {
       // Handle the first render after an activation.
       if (!this._hasRendered && this.node === document.activeElement) {
@@ -159,6 +164,21 @@ class MimeDocument extends Widget implements DocumentRegistry.IReadyWidget {
     this.title.label = PathExt.basename(this._context.path);
   }
 
+  /**
+   * A bound change callback.
+   */
+  private _changeCallback = (options: IRenderMime.IMimeModel.ISetDataOptions) => {
+    if (!options.data || !options.data[this._mimeType]) {
+      return;
+    }
+    let data = options.data[this._mimeType];
+    if (typeof data === 'string') {
+      this._context.model.fromString(data);
+    } else {
+      this._context.model.fromJSON(data);
+    }
+  }
+
   private _context: DocumentRegistry.Context;
   private _monitor: ActivityMonitor<any, any> | null;
   private _renderer: IRenderMime.IRenderer;

+ 20 - 0
packages/rendermime/src/mimemodel.ts

@@ -23,6 +23,7 @@ class MimeModel implements IRenderMime.IMimeModel {
     this.trusted = !!options.trusted;
     this._data = options.data || {};
     this._metadata = options.metadata || {};
+    this._callback = options.callback || Private.noOp;
   }
 
   /**
@@ -54,8 +55,10 @@ class MimeModel implements IRenderMime.IMimeModel {
   setData(options: IRenderMime.IMimeModel.ISetDataOptions): void {
     this._data = options.data || this._data;
     this._metadata = options.metadata || this._metadata;
+    this._callback(options);
   }
 
+  private _callback: (options: IRenderMime.IMimeModel.ISetDataOptions) => void;
   private _data: ReadonlyJSONObject;
   private _metadata: ReadonlyJSONObject;
 }
@@ -76,6 +79,11 @@ namespace MimeModel {
      */
     trusted?: boolean;
 
+    /**
+     * A callback function for when the data changes.
+     */
+    callback?: (options: IRenderMime.IMimeModel.ISetDataOptions) => void;
+
     /**
      * The initial mime data.
      */
@@ -87,3 +95,15 @@ namespace MimeModel {
     metadata?: ReadonlyJSONObject;
   }
 }
+
+
+/**
+ * The namespace for module private data.
+ */
+namespace Private {
+  /**
+   * A no-op callback function.
+   */
+  export
+  function noOp() { /* no-op */}
+}