Forráskód Böngészése

Merge pull request #2911 from bghgary/files-input-recursion

Support directory recursion in FilesInput class
David Catuhe 7 éve
szülő
commit
359dd2d854
1 módosított fájl, 22 hozzáadás és 30 törlés
  1. 22 30
      src/Tools/babylon.filesInput.ts

+ 22 - 30
src/Tools/babylon.filesInput.ts

@@ -89,30 +89,29 @@
             this.loadFiles(eventDrop);
         }
 
-        private _handleFolderDrop(entry: any, files: Array<any>, callback: () => void): void {
-            var reader = entry.createReader(),
- 			relativePath = entry.fullPath.replace(/^\//, "").replace(/(.+?)\/?$/, "$1/");
- 			reader.readEntries((fileEntries) => {
-                var remaining = fileEntries.length;
-                for (let fileEntry of fileEntries) {
-                    if (fileEntry.isFile) { // We only support one level
-                        fileEntry.file(function(file) {
+        private _traverseFolder(folder: any, files: Array<any>, remaining: { count: number }, callback: () => void) {
+            var reader = folder.createReader();
+            var relativePath = folder.fullPath.replace(/^\//, "").replace(/(.+?)\/?$/, "$1/");
+            reader.readEntries(entries => {
+                remaining.count += entries.length;
+                for (let entry of entries) {
+                    if (entry.isFile) {
+                        entry.file(file => {
                             file.correctName = relativePath + file.name;
                             files.push(file);
-            
-                            remaining--;
 
-                            if (remaining === 0) {
+                            if (--remaining.count === 0) {
                                 callback();
                             }
                         });
-                    } else {
-                        remaining--;
-
-                        if (remaining === 0) {
-                            callback();
-                        }
                     }
+                    else if (entry.isDirectory) {
+                        this._traverseFolder(entry, files, remaining, callback);
+                    }
+                }
+
+                if (--remaining.count) {
+                    callback();
                 }
             });
         }
@@ -159,7 +158,6 @@
             }
 
             if (this._filesToLoad && this._filesToLoad.length > 0) {
-        
                 let files = [];
                 let folders = [];
                 var items = event.dataTransfer ? event.dataTransfer.items : null;
@@ -171,17 +169,17 @@
                     let entry;
 
                     fileToLoad.correctName = name;
-                    
+
                     if (items) {
                         let item = items[i];
                         if (item.getAsEntry) {
                             entry = item.getAsEntry();
                         } else if (item.webkitGetAsEntry) {
                             entry = item.webkitGetAsEntry();
-                        }                     
+                        }
                     }
 
-                    if (!entry) {    
+                    if (!entry) {
                         files.push(fileToLoad);
                     } else {
                         if (entry.isDirectory) {
@@ -195,16 +193,10 @@
                 if (folders.length === 0) {
                     this._processFiles(files);
                 } else {
-                    var remaining = folders.length;
-
-                    // Extract folder content
+                    var remaining = { count: folders.length };
                     for (var folder of folders) {
-                        this._handleFolderDrop(folder, files, () => {
-                            remaining--;
-
-                            if (remaining === 0) {
-                                this._processFiles(files);
-                            }
+                        this._traverseFolder(folder, files, remaining, () => {
+                            this._processFiles(files);
                         });
                     }
                 }