ソースを参照

Refactor uses of readywidget

Steven Silvester 7 年 前
コミット
7ed39869ae

+ 8 - 1
packages/cells/src/widget.ts

@@ -156,7 +156,7 @@ const RENDER_TIMEOUT = 1000;
  * A base cell widget.
  */
 export
-class Cell extends Widget {
+class Cell extends Widget implements RenderMime.IReadyWidget {
   /**
    * Construct a new base cell widget.
    */
@@ -245,6 +245,13 @@ class Cell extends Widget {
     this.update();
   }
 
+  /**
+   * A promise that resolves when the widget renders for the first time.
+   */
+  get ready(): Promise<void> {
+    return Promise.resolve(undefined);
+  }
+
   /**
    * Set the prompt for the widget.
    */

+ 1 - 1
packages/csvviewer/src/widget.ts

@@ -57,7 +57,7 @@ const RENDER_TIMEOUT = 1000;
  * A viewer for CSV tables.
  */
 export
-class CSVViewer extends Widget implements DocumentRegistry.IWidget {
+class CSVViewer extends Widget implements DocumentRegistry.IReadyWidget {
   /**
    * Construct a new CSV viewer.
    */

+ 1 - 1
packages/docregistry/src/default.ts

@@ -272,7 +272,7 @@ class Base64ModelFactory extends TextModelFactory {
  * The default implemetation of a widget factory.
  */
 export
-abstract class ABCWidgetFactory<T extends DocumentRegistry.IWidget, U extends DocumentRegistry.IModel> implements DocumentRegistry.IWidgetFactory<T, U> {
+abstract class ABCWidgetFactory<T extends DocumentRegistry.IReadyWidget, U extends DocumentRegistry.IModel> implements DocumentRegistry.IWidgetFactory<T, U> {
   /**
    * Construct a new `ABCWidgetFactory`.
    */

+ 8 - 8
packages/docregistry/src/registry.ts

@@ -37,6 +37,11 @@ import {
   IChangedArgs as IChangedArgsGeneric, PathExt, IModelDB
 } from '@jupyterlab/coreutils';
 
+import {
+  RenderMime
+} from '@jupyterlab/rendermime';
+
+
 /* tslint:disable */
 /**
  * The document registry token.
@@ -822,18 +827,13 @@ namespace DocumentRegistry {
    * A widget for a document.
    */
   export
-  interface IWidget extends Widget {
-    /**
-     * A promise that resolves when the document is ready.
-     */
-    ready: Promise<void>;
-  }
+  interface IReadyWidget extends RenderMime.IReadyWidget { }
 
   /**
    * The interface for a widget factory.
    */
   export
-  interface IWidgetFactory<T extends IWidget, U extends IModel> extends IDisposable, IWidgetFactoryOptions {
+  interface IWidgetFactory<T extends IReadyWidget, U extends IModel> extends IDisposable, IWidgetFactoryOptions {
     /**
      * A signal emitted when a widget is created.
      */
@@ -852,7 +852,7 @@ namespace DocumentRegistry {
    * A type alias for a standard widget factory.
    */
   export
-  type WidgetFactory = IWidgetFactory<IWidget, IModel>;
+  type WidgetFactory = IWidgetFactory<IReadyWidget, IModel>;
 
   /**
    * An interface for a widget extension.

+ 10 - 2
packages/fileeditor/src/widget.ts

@@ -13,6 +13,10 @@ import {
   CodeEditor, IEditorServices, IEditorMimeTypeService, CodeEditorWrapper
 } from '@jupyterlab/codeeditor';
 
+import {
+  PromiseDelegate
+} from '@phosphor/coreutils';
+
 
 /**
  * The class name added to a dirty widget.
@@ -29,7 +33,7 @@ const EDITOR_CLASS = 'jp-FileEditor';
  * A document widget for editors.
  */
 export
-class FileEditor extends CodeEditorWrapper implements DocumentRegistry.IWidget {
+class FileEditor extends CodeEditorWrapper implements DocumentRegistry.IReadyWidget {
   /**
    * Construct a new editor widget.
    */
@@ -77,7 +81,7 @@ class FileEditor extends CodeEditorWrapper implements DocumentRegistry.IWidget {
    * A promise that resolves when the file editor is ready.
    */
   get ready(): Promise<void> {
-    return this._context.ready;
+    return this._ready.promise;
   }
 
   /**
@@ -101,6 +105,9 @@ class FileEditor extends CodeEditorWrapper implements DocumentRegistry.IWidget {
     // Wire signal connections.
     contextModel.stateChanged.connect(this._onModelStateChanged, this);
     contextModel.contentChanged.connect(this._onContentChanged, this);
+
+    // Resolve the ready promise.
+    this._ready.resolve(undefined);
   }
 
   /**
@@ -163,6 +170,7 @@ class FileEditor extends CodeEditorWrapper implements DocumentRegistry.IWidget {
 
   protected _context: DocumentRegistry.Context;
   private _mimeTypeService: IEditorMimeTypeService;
+  private _ready = new PromiseDelegate<void>();
 }
 
 

+ 21 - 7
packages/imageviewer/src/widget.ts

@@ -5,6 +5,10 @@ import {
   ABCWidgetFactory, DocumentRegistry
 } from '@jupyterlab/docregistry';
 
+import {
+  PromiseDelegate
+} from '@phosphor/coreutils';
+
 import {
   Message
 } from '@phosphor/messaging';
@@ -24,7 +28,7 @@ const IMAGE_CLASS = 'jp-ImageViewer';
  * A widget for images.
  */
 export
-class ImageViewer extends Widget implements DocumentRegistry.IWidget {
+class ImageViewer extends Widget implements DocumentRegistry.IReadyWidget {
   /**
    * Construct a new image widget.
    */
@@ -38,9 +42,10 @@ class ImageViewer extends Widget implements DocumentRegistry.IWidget {
     context.pathChanged.connect(this._onTitleChanged, this);
 
     context.ready.then(() => {
-      this.update();
+      this._render();
       context.model.contentChanged.connect(this.update, this);
       context.fileChanged.connect(this.update, this);
+      this._ready.resolve(void 0);
     });
   }
 
@@ -55,7 +60,7 @@ class ImageViewer extends Widget implements DocumentRegistry.IWidget {
    * A promise that resolves when the image viewer is ready.
    */
   get ready(): Promise<void> {
-    return this._context.ready;
+    return this._ready.promise;
   }
 
   /**
@@ -91,10 +96,7 @@ class ImageViewer extends Widget implements DocumentRegistry.IWidget {
     if (this.isDisposed || !context.isReady) {
       return;
     }
-    let cm = context.contentsModel;
-    let content = context.model.toString();
-    let src = `data:${cm.mimetype};${cm.format},${content}`;
-    this.node.querySelector('img').setAttribute('src', src);
+    this._render();
   }
 
   /**
@@ -111,8 +113,20 @@ class ImageViewer extends Widget implements DocumentRegistry.IWidget {
     this.title.label = this._context.path.split('/').pop();
   }
 
+  /**
+   * Render the widget content.
+   */
+  private _render(): void {
+    let context = this._context;
+    let cm = context.contentsModel;
+    let content = context.model.toString();
+    let src = `data:${cm.mimetype};${cm.format},${content}`;
+    this.node.querySelector('img').setAttribute('src', src);
+  }
+
   private _context: DocumentRegistry.Context;
   private _scale = 1;
+  private _ready = new PromiseDelegate<void>();
 }
 
 

+ 2 - 2
packages/markdownviewer/src/widget.ts

@@ -45,7 +45,7 @@ const RENDER_TIMEOUT = 1000;
  * A widget for rendered markdown.
  */
 export
-class MarkdownViewer extends Widget implements DocumentRegistry.IWidget {
+class MarkdownViewer extends Widget implements DocumentRegistry.IReadyWidget {
   /**
    * Construct a new markdown widget.
    */
@@ -122,7 +122,7 @@ class MarkdownViewer extends Widget implements DocumentRegistry.IWidget {
   /**
    * Render the markdown content.
    */
-  private _render(): RenderMime.IWidget {
+  private _render(): RenderMime.IReadyWidget {
     let context = this._context;
     let model = context.model;
     let layout = this.layout as PanelLayout;

+ 2 - 8
packages/notebook/src/panel.ts

@@ -30,10 +30,6 @@ import {
   IClientSession, Toolbar
 } from '@jupyterlab/apputils';
 
-import {
-  MarkdownCell
-} from '@jupyterlab/cells';
-
 import {
   IEditorMimeTypeService
 } from '@jupyterlab/codeeditor';
@@ -82,7 +78,7 @@ const DIRTY_CLASS = 'jp-mod-dirty';
  * kernel on the context.
  */
 export
-class NotebookPanel extends Widget implements DocumentRegistry.IWidget {
+class NotebookPanel extends Widget implements DocumentRegistry.IReadyWidget {
   /**
    * Construct a new notebook panel.
    */
@@ -142,9 +138,7 @@ class NotebookPanel extends Widget implements DocumentRegistry.IWidget {
     return this._context.ready.then(() => {
       let promises: Promise<void>[] = [];
       each(this.notebook.widgets, widget => {
-        if (widget instanceof MarkdownCell) {
-          promises.push(widget.ready);
-        }
+        promises.push(widget.ready);
       });
       return Promise.all(promises).then(() => undefined);
     });

+ 8 - 8
packages/rendermime/src/renderers.ts

@@ -27,7 +27,7 @@ class HTMLRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedHTML(options);
   }
 
@@ -60,7 +60,7 @@ class ImageRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedImage(options);
   }
 
@@ -94,7 +94,7 @@ class TextRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedText(options);
   }
 
@@ -130,7 +130,7 @@ class JavaScriptRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedJavaScript(options);
   }
 
@@ -166,7 +166,7 @@ class SVGRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedSVG(options);
   }
 
@@ -202,7 +202,7 @@ class PDFRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedPDF(options);
   }
 
@@ -235,7 +235,7 @@ class LatexRenderer implements RenderMime.IRenderer  {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedLatex(options);
   }
 
@@ -268,7 +268,7 @@ class MarkdownRenderer implements RenderMime.IRenderer {
   /**
    * Render the transformed mime bundle.
    */
-  render(options: RenderMime.IRenderOptions): RenderMime.IWidget {
+  render(options: RenderMime.IRenderOptions): RenderMime.IReadyWidget {
     return new RenderedMarkdown(options);
   }
 

+ 4 - 4
packages/rendermime/src/rendermime.ts

@@ -102,7 +102,7 @@ class RenderMime {
    * Renders the model using the preferred mime type.  See
    * [[preferredMimeType]].
    */
-  render(model: RenderMime.IMimeModel): RenderMime.IWidget {
+  render(model: RenderMime.IMimeModel): RenderMime.IReadyWidget {
     let mimeType = this.preferredMimeType(model);
     if (!mimeType) {
       return this._handleError(model);
@@ -211,7 +211,7 @@ class RenderMime {
   /**
    * Return a widget for an error.
    */
-  private _handleError(model: RenderMime.IMimeModel): RenderMime.IWidget {
+  private _handleError(model: RenderMime.IMimeModel): RenderMime.IReadyWidget {
    let errModel = new MimeModel({
       data: {
         'application/vnd.jupyter.stderr': 'Unable to render data'
@@ -366,7 +366,7 @@ namespace RenderMime {
    * A rendered widget.
    */
   export
-  interface IWidget extends Widget {
+  interface IReadyWidget extends Widget {
     /**
      * A promise that resolves when the widget is ready.
      */
@@ -395,7 +395,7 @@ namespace RenderMime {
      *
      * @param options - The options used to render the data.
      */
-    render(options: IRenderOptions): IWidget;
+    render(options: IRenderOptions): IReadyWidget;
 
     /**
      * Whether the renderer will sanitize the data given the render options.

+ 1 - 1
packages/rendermime/src/widgets.ts

@@ -88,7 +88,7 @@ const PDF_CLASS = 'jp-RenderedPDF';
  * A widget for displaying any widget whoes representation is rendered HTML
  * */
 export
-class RenderedHTMLCommon extends Widget implements RenderMime.IWidget {
+class RenderedHTMLCommon extends Widget implements RenderMime.IReadyWidget {
   /* Construct a new rendered HTML common widget.*/
   constructor(options: RenderMime.IRenderOptions) {
     super();