Browse Source

untangled IFileType vs FileType mess in DocumentRegistry

- first commit since 30d390acad for which jlab successfully builds

- still need to actually test out/run the code, see how many things the
    recent changes to icon handling broke
telamonian 5 năm trước cách đây
mục cha
commit
65cdd2af78

+ 2 - 2
packages/csvviewer-extension/src/index.ts

@@ -130,7 +130,7 @@ function activateCsv(
     if (ft) {
       widget.title.iconClass = ft.iconClass!;
       widget.title.iconLabel = ft.iconLabel!;
-      widget.title.iconRenderer = ft.iconRenderer!;
+      widget.title.iconRenderer = ft.icon!;
     }
     // Set the theme for the new widget.
     widget.content.style = style;
@@ -210,7 +210,7 @@ function activateTsv(
     if (ft) {
       widget.title.iconClass = ft.iconClass!;
       widget.title.iconLabel = ft.iconLabel!;
-      widget.title.iconRenderer = ft.iconRenderer!;
+      widget.title.iconRenderer = ft.icon!;
     }
     // Set the theme for the new widget.
     widget.content.style = style;

+ 6 - 3
packages/docregistry/src/mimedocument.ts

@@ -264,7 +264,10 @@ export class MimeDocumentFactory extends ABCWidgetFactory<MimeDocument> {
     this._rendermime = options.rendermime;
     this._renderTimeout = options.renderTimeout || 1000;
     this._dataType = options.dataType || 'string';
-    this._fileType = options.primaryFileType;
+
+    // resolve the passed in IFileType to a FileType
+    const ft = options.primaryFileType;
+    this._fileType = ft ? DocumentRegistry.FileType.resolve(ft) : ft;
   }
 
   /**
@@ -289,7 +292,7 @@ export class MimeDocumentFactory extends ABCWidgetFactory<MimeDocument> {
 
     content.title.iconClass = ft?.iconClass ?? '';
     content.title.iconLabel = ft?.iconLabel ?? '';
-    content.title.iconRenderer = ft?.iconRenderer!;
+    content.title.iconRenderer = ft?.icon!;
 
     const widget = new MimeDocument({ content, context });
 
@@ -299,7 +302,7 @@ export class MimeDocumentFactory extends ABCWidgetFactory<MimeDocument> {
   private _rendermime: IRenderMimeRegistry;
   private _renderTimeout: number;
   private _dataType: 'string' | 'json';
-  private _fileType: DocumentRegistry.IFileType | undefined;
+  private _fileType: DocumentRegistry.FileType | undefined;
 }
 
 /**

+ 114 - 108
packages/docregistry/src/registry.ts

@@ -64,11 +64,11 @@ export class DocumentRegistry implements IDisposable {
     }
     this._modelFactories['text'] = factory || new TextModelFactory();
 
-    let fts = options.initialFileTypes || DocumentRegistry.defaultFileTypes;
-    fts.forEach(ft => {
-      let value = new DocumentRegistry.FileType(ft);
-      this._fileTypes.push(value);
-    });
+    let fts =
+      options.initialFileTypes?.map(ft =>
+        DocumentRegistry.FileType.resolve(ft)
+      ) || DocumentRegistry.defaultFileTypes;
+    fts.forEach(ft => this._fileTypes.push(ft));
   }
 
   /**
@@ -287,7 +287,7 @@ export class DocumentRegistry implements IDisposable {
       ...DocumentRegistry.fileTypeDefaults,
       ...fileType
     };
-    this._fileTypes.push(new DocumentRegistry.FileType(value));
+    this._fileTypes.push(DocumentRegistry.FileType.resolve(value));
 
     this._changed.emit({
       type: 'fileType',
@@ -1215,6 +1215,14 @@ export namespace DocumentRegistry {
    * A wrapper for IFileTypes
    */
   export class FileType implements IFileType {
+    static resolve(ft: Partial<IFileType>): FileType {
+      if (ft instanceof FileType) {
+        return ft;
+      }
+
+      return new FileType(ft);
+    }
+
     constructor(options: Partial<IFileType>) {
       Object.assign(this, fileTypeDefaults, options);
 
@@ -1224,10 +1232,6 @@ export namespace DocumentRegistry {
       }
     }
 
-    get iconRenderer(): JLIcon.IRenderer | null {
-      return this.icon?.renderer ?? null;
-    }
-
     readonly name: string;
     readonly mimeTypes: ReadonlyArray<string>;
     readonly extensions: ReadonlyArray<string>;
@@ -1304,107 +1308,109 @@ export namespace DocumentRegistry {
   /**
    * The default file types used by the document registry.
    */
-  export const defaultFileTypes: ReadonlyArray<Partial<IFileType>> = [
+  export const defaultFileTypes: ReadonlyArray<FileType> = [
     defaultTextFileType,
     defaultNotebookFileType,
     defaultDirectoryFileType,
-    {
-      name: 'markdown',
-      displayName: 'Markdown File',
-      extensions: ['.md'],
-      mimeTypes: ['text/markdown'],
-      icon: markdownIcon
-    },
-    {
-      name: 'python',
-      displayName: 'Python File',
-      extensions: ['.py'],
-      mimeTypes: ['text/x-python'],
-      icon: pythonIcon
-    },
-    {
-      name: 'json',
-      displayName: 'JSON File',
-      extensions: ['.json'],
-      mimeTypes: ['application/json'],
-      icon: jsonIcon
-    },
-    {
-      name: 'csv',
-      displayName: 'CSV File',
-      extensions: ['.csv'],
-      mimeTypes: ['text/csv'],
-      icon: spreadsheetIcon
-    },
-    {
-      name: 'tsv',
-      displayName: 'TSV File',
-      extensions: ['.tsv'],
-      mimeTypes: ['text/csv'],
-      icon: spreadsheetIcon
-    },
-    {
-      name: 'r',
-      displayName: 'R File',
-      mimeTypes: ['text/x-rsrc'],
-      extensions: ['.r'],
-      icon: rKernelIcon
-    },
-    {
-      name: 'yaml',
-      displayName: 'YAML File',
-      mimeTypes: ['text/x-yaml', 'text/yaml'],
-      extensions: ['.yaml', '.yml'],
-      icon: yamlIcon
-    },
-    {
-      name: 'svg',
-      displayName: 'Image',
-      mimeTypes: ['image/svg+xml'],
-      extensions: ['.svg'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    },
-    {
-      name: 'tiff',
-      displayName: 'Image',
-      mimeTypes: ['image/tiff'],
-      extensions: ['.tif', '.tiff'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    },
-    {
-      name: 'jpeg',
-      displayName: 'Image',
-      mimeTypes: ['image/jpeg'],
-      extensions: ['.jpg', '.jpeg'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    },
-    {
-      name: 'gif',
-      displayName: 'Image',
-      mimeTypes: ['image/gif'],
-      extensions: ['.gif'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    },
-    {
-      name: 'png',
-      displayName: 'Image',
-      mimeTypes: ['image/png'],
-      extensions: ['.png'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    },
-    {
-      name: 'bmp',
-      displayName: 'Image',
-      mimeTypes: ['image/bmp'],
-      extensions: ['.bmp'],
-      icon: imageIcon,
-      fileFormat: 'base64'
-    }
+    ...[
+      {
+        name: 'markdown',
+        displayName: 'Markdown File',
+        extensions: ['.md'],
+        mimeTypes: ['text/markdown'],
+        icon: markdownIcon
+      },
+      {
+        name: 'python',
+        displayName: 'Python File',
+        extensions: ['.py'],
+        mimeTypes: ['text/x-python'],
+        icon: pythonIcon
+      },
+      {
+        name: 'json',
+        displayName: 'JSON File',
+        extensions: ['.json'],
+        mimeTypes: ['application/json'],
+        icon: jsonIcon
+      },
+      {
+        name: 'csv',
+        displayName: 'CSV File',
+        extensions: ['.csv'],
+        mimeTypes: ['text/csv'],
+        icon: spreadsheetIcon
+      },
+      {
+        name: 'tsv',
+        displayName: 'TSV File',
+        extensions: ['.tsv'],
+        mimeTypes: ['text/csv'],
+        icon: spreadsheetIcon
+      },
+      {
+        name: 'r',
+        displayName: 'R File',
+        mimeTypes: ['text/x-rsrc'],
+        extensions: ['.r'],
+        icon: rKernelIcon
+      },
+      {
+        name: 'yaml',
+        displayName: 'YAML File',
+        mimeTypes: ['text/x-yaml', 'text/yaml'],
+        extensions: ['.yaml', '.yml'],
+        icon: yamlIcon
+      },
+      {
+        name: 'svg',
+        displayName: 'Image',
+        mimeTypes: ['image/svg+xml'],
+        extensions: ['.svg'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      },
+      {
+        name: 'tiff',
+        displayName: 'Image',
+        mimeTypes: ['image/tiff'],
+        extensions: ['.tif', '.tiff'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      },
+      {
+        name: 'jpeg',
+        displayName: 'Image',
+        mimeTypes: ['image/jpeg'],
+        extensions: ['.jpg', '.jpeg'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      },
+      {
+        name: 'gif',
+        displayName: 'Image',
+        mimeTypes: ['image/gif'],
+        extensions: ['.gif'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      },
+      {
+        name: 'png',
+        displayName: 'Image',
+        mimeTypes: ['image/png'],
+        extensions: ['.png'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      },
+      {
+        name: 'bmp',
+        displayName: 'Image',
+        mimeTypes: ['image/bmp'],
+        extensions: ['.bmp'],
+        icon: imageIcon,
+        fileFormat: 'base64'
+      }
+    ].map(ft => new FileType(ft as Partial<IFileType>))
   ];
 }
 

+ 3 - 3
packages/filebrowser/src/listing.ts

@@ -1839,7 +1839,7 @@ export namespace DirListing {
       const modified = DOMUtils.findElement(node, ITEM_MODIFIED_CLASS);
 
       // render the icon svg node
-      if (fileType?.iconRenderer) {
+      if (fileType?.icon) {
         iconContainer.className = classes(
           ITEM_ICON_CLASS,
           iconStyle({
@@ -1848,7 +1848,7 @@ export namespace DirListing {
           })
         );
 
-        fileType.iconRenderer.render(iconContainer);
+        fileType.icon.render(iconContainer);
       } else if (fileType?.iconClass) {
         iconContainer.className = classes(ITEM_ICON_CLASS, fileType.iconClass);
 
@@ -1864,7 +1864,7 @@ export namespace DirListing {
           })
         );
 
-        fileIcon.renderer.render(iconContainer);
+        fileIcon.render(iconContainer);
       }
 
       let hoverText = 'Name: ' + model.name;

+ 4 - 4
packages/htmlviewer-extension/src/index.tsx

@@ -48,15 +48,15 @@ function activateHTMLViewer(
   restorer: ILayoutRestorer | null
 ): IHTMLViewerTracker {
   // Add an HTML file type to the docregistry.
-  const ft: DocumentRegistry.IFileType = {
+  const ft = new DocumentRegistry.FileType({
     name: 'html',
     contentType: 'file',
     fileFormat: 'text',
     displayName: 'HTML File',
     extensions: ['.html'],
     mimeTypes: ['text/html'],
-    iconRenderer: html5Icon
-  };
+    icon: html5Icon
+  });
   app.docRegistry.addFileType(ft);
 
   // Create a new viewer factory.
@@ -97,7 +97,7 @@ function activateHTMLViewer(
 
     widget.title.iconClass = ft.iconClass ?? '';
     widget.title.iconLabel = ft.iconLabel ?? '';
-    widget.title.iconRenderer = ft.iconRenderer!;
+    widget.title.iconRenderer = ft.icon!;
   });
 
   // Add a command to trust the active HTML document,

+ 1 - 1
packages/imageviewer-extension/src/index.ts

@@ -107,7 +107,7 @@ function activate(
     if (types.length > 0) {
       widget.title.iconClass = types[0].iconClass ?? '';
       widget.title.iconLabel = types[0].iconLabel ?? '';
-      widget.title.iconRenderer = types[0].iconRenderer!;
+      widget.title.iconRenderer = types[0].icon!;
     }
   });
 

+ 6 - 3
packages/markdownviewer/src/widget.ts

@@ -294,8 +294,11 @@ export class MarkdownViewerFactory extends ABCWidgetFactory<MarkdownDocument> {
    */
   constructor(options: MarkdownViewerFactory.IOptions) {
     super(Private.createRegistryOptions(options));
-    this._fileType = options.primaryFileType;
     this._rendermime = options.rendermime;
+
+    // resolve the passed in IFileType to a FileType
+    const ft = options.primaryFileType;
+    this._fileType = ft ? DocumentRegistry.FileType.resolve(ft) : ft;
   }
 
   /**
@@ -311,13 +314,13 @@ export class MarkdownViewerFactory extends ABCWidgetFactory<MarkdownDocument> {
     const content = new MarkdownViewer({ context, renderer });
     content.title.iconClass = this._fileType?.iconClass ?? '';
     content.title.iconLabel = this._fileType?.iconLabel ?? '';
-    content.title.iconRenderer = this._fileType?.iconRenderer!;
+    content.title.iconRenderer = this._fileType?.icon!;
     const widget = new MarkdownDocument({ content, context });
 
     return widget;
   }
 
-  private _fileType: DocumentRegistry.IFileType | undefined;
+  private _fileType: DocumentRegistry.FileType | undefined;
   private _rendermime: IRenderMimeRegistry;
 }
 

+ 1 - 1
packages/notebook-extension/src/index.ts

@@ -582,7 +582,7 @@ function activateNotebookHandler(
     // Set up the title icon
     widget.title.iconClass = ft?.iconClass ?? '';
     widget.title.iconLabel = ft?.iconLabel ?? '';
-    widget.title.iconRenderer = ft?.iconRenderer!;
+    widget.title.iconRenderer = ft?.icon!;
 
     // Notify the widget tracker if restore data needs to update.
     widget.context.pathChanged.connect(() => {

+ 1 - 1
packages/ui-components/src/icon/tabbarsvg.ts

@@ -46,7 +46,7 @@ export namespace TabBarSvg {
       return (hpass(
         'div',
         { className },
-        closeIcon.renderer
+        closeIcon
       ) as unknown) as VirtualElement;
     }
   }