Bläddra i källkod

Editor: Implemented DataTransferItemList support.

Mr.doob 5 år sedan
förälder
incheckning
0a30e350c0
4 ändrade filer med 114 tillägg och 18 borttagningar
  1. 11 1
      editor/index.html
  2. 14 17
      editor/js/Loader.js
  3. 88 0
      editor/js/LoaderUtils.js
  4. 1 0
      editor/sw.js

+ 11 - 1
editor/index.html

@@ -174,7 +174,17 @@
 
 				event.preventDefault();
 
-				editor.loader.loadFiles( event.dataTransfer.files );
+				// DataTransferItemList supports folders
+
+				if ( event.dataTransfer.items ) {
+
+					editor.loader.loadItemList( event.dataTransfer.items );
+
+				} else {
+
+					editor.loader.loadFiles( event.dataTransfer.files );
+
+				}
 
 			}, false );
 

+ 14 - 17
editor/js/Loader.js

@@ -23,17 +23,29 @@ import { VRMLLoader } from '../../examples/jsm/loaders/VRMLLoader.js';
 import { AddObjectCommand } from './commands/AddObjectCommand.js';
 import { SetSceneCommand } from './commands/SetSceneCommand.js';
 
+import { LoaderUtils } from './LoaderUtils.js';
+
 var Loader = function ( editor ) {
 
 	var scope = this;
 
 	this.texturePath = '';
 
-	this.loadFiles = function ( files ) {
+	this.loadItemList = function ( items ) {
+
+		LoaderUtils.getFilesFromItemList( items, function ( files, filesMap ) {
+
+			scope.loadFiles( files, filesMap );
+
+		} );
+
+	};
+
+	this.loadFiles = function ( files, filesMap ) {
 
 		if ( files.length > 0 ) {
 
-			var filesMap = createFileMap( files );
+			var filesMap = filesMap || LoaderUtils.createFilesMap( files );
 
 			var manager = new THREE.LoadingManager();
 			manager.setURLModifier( function ( url ) {
@@ -566,21 +578,6 @@ var Loader = function ( editor ) {
 
 	}
 
-	function createFileMap( files ) {
-
-		var map = {};
-
-		for ( var i = 0; i < files.length; i ++ ) {
-
-			var file = files[ i ];
-			map[ file.name ] = file;
-
-		}
-
-		return map;
-
-	}
-
 	function handleZIP( contents ) {
 
 		var zip = new JSZip( contents );

+ 88 - 0
editor/js/LoaderUtils.js

@@ -0,0 +1,88 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+var LoaderUtils = {
+
+	createFilesMap: function ( files ) {
+
+		var map = {};
+
+		for ( var i = 0; i < files.length; i ++ ) {
+
+			var file = files[ i ];
+			map[ file.name ] = file;
+
+		}
+
+		return map;
+
+	},
+
+	getFilesFromItemList: function ( items, onDone ) {
+
+		// TOFIX: setURLModifier() breaks when the file being loaded is not in root
+
+		var itemsCount = 0;
+		var itemsTotal = 0;
+
+		var files = [];
+		var filesMap = {};
+
+		function onEntryHandled() {
+
+			itemsCount ++;
+
+			if ( itemsCount === itemsTotal ) {
+
+				onDone( files, filesMap );
+
+			}
+
+		}
+
+		function handleEntry( entry ) {
+
+			if ( entry.isDirectory ) {
+
+				var reader = entry.createReader();
+				reader.readEntries( function ( entries ) {
+
+					for ( var i = 0; i < entries.length; i ++ ) {
+
+						handleEntry( entries[ i ] );
+
+					}
+
+					onEntryHandled( entry );
+
+				} );
+
+			} else if ( entry.isFile ) {
+
+				entry.file( function ( file ) {
+
+					files.push( file );
+
+					filesMap[ entry.fullPath.substr( 1 ) ] = file;
+					onEntryHandled();
+
+				} );
+
+			}
+
+			itemsTotal ++;
+
+		}
+
+		for ( var i = 0; i < items.length; i ++ ) {
+
+			handleEntry( items[ i ].webkitGetAsEntry() );
+
+		}
+
+	}
+
+};
+
+export { LoaderUtils };

+ 1 - 0
editor/sw.js

@@ -101,6 +101,7 @@ const assets = [
 	'./js/Config.js',
 	'./js/History.js',
 	'./js/Loader.js',
+	'./js/LoaderUtils.js',
 	'./js/Menubar.js',
 	'./js/Menubar.File.js',
 	'./js/Menubar.Edit.js',