angular-3d-viewer
Version:
165 lines (149 loc) • 4.24 kB
JavaScript
import { RunTasks } from '../core/taskrunner.js';
import { FileSource, GetFileExtension, GetFileName, ReadFile, RequestUrl } from '../io/fileutils.js';
/**
* File representation class for importers.
*/
export class InputFile
{
/**
* @param {string} name Name of the file.
* @param {FileSource} source Source of the file.
* @param {string|File} data If the file source is url, this must be the url string. If the file source
* is file, this must be a {@link File} object.
*/
constructor (name, source, data)
{
this.name = name;
this.source = source;
this.data = data;
}
}
export function InputFilesFromUrls (urls)
{
let inputFiles = [];
for (let url of urls) {
let fileName = GetFileName (url);
inputFiles.push (new InputFile (fileName, FileSource.Url, url));
}
return inputFiles;
}
export function InputFilesFromFileObjects (fileObjects)
{
let inputFiles = [];
for (let fileObject of fileObjects) {
let fileName = GetFileName (fileObject.name);
inputFiles.push (new InputFile (fileName, FileSource.File, fileObject));
}
return inputFiles;
}
export class ImporterFile
{
constructor (name, source, data)
{
this.name = GetFileName (name);
this.extension = GetFileExtension (name);
this.source = source;
this.data = data;
this.content = null;
}
SetContent (content)
{
this.content = content;
}
}
export class ImporterFileList
{
constructor ()
{
this.files = [];
}
FillFromInputFiles (inputFiles)
{
this.files = [];
for (let inputFile of inputFiles) {
let file = new ImporterFile (inputFile.name, inputFile.source, inputFile.data);
this.files.push (file);
}
}
ExtendFromFileList (fileList)
{
let files = fileList.GetFiles ();
for (let i = 0; i < files.length; i++) {
let file = files[i];
if (!this.ContainsFileByPath (file.name)) {
this.files.push (file);
}
}
}
GetFiles ()
{
return this.files;
}
GetContent (callbacks)
{
RunTasks (this.files.length, {
runTask : (index, onTaskComplete) => {
callbacks.onFileListProgress (index, this.files.length);
this.GetFileContent (this.files[index], {
onReady : onTaskComplete,
onProgress : callbacks.onFileLoadProgress
});
},
onReady : callbacks.onReady
});
}
ContainsFileByPath (filePath)
{
return this.FindFileByPath (filePath) !== null;
}
FindFileByPath (filePath)
{
let fileName = GetFileName (filePath).toLowerCase ();
for (let fileIndex = 0; fileIndex < this.files.length; fileIndex++) {
let file = this.files[fileIndex];
if (file.name.toLowerCase () === fileName) {
return file;
}
}
return null;
}
IsOnlyUrlSource ()
{
if (this.files.length === 0) {
return false;
}
for (let i = 0; i < this.files.length; i++) {
let file = this.files[i];
if (file.source !== FileSource.Url && file.source !== FileSource.Decompressed) {
return false;
}
}
return true;
}
AddFile (file)
{
this.files.push (file);
}
GetFileContent (file, callbacks)
{
if (file.content !== null) {
callbacks.onReady ();
return;
}
let loaderPromise = null;
if (file.source === FileSource.Url) {
loaderPromise = RequestUrl (file.data, callbacks.onProgress);
} else if (file.source === FileSource.File) {
loaderPromise = ReadFile (file.data, callbacks.onProgress);
} else {
callbacks.onReady ();
return;
}
loaderPromise.then ((content) => {
file.SetContent (content);
}).catch (() => {
}).finally (() => {
callbacks.onReady ();
});
}
}