Browse Source

File selector improvements (#133)

* Use better working dir for FileSelectos in the props editor
* Add drag and drop to file selector in the props editor
Leonardo Jeanteur 4 years ago
parent
commit
9519b2696e
3 changed files with 53 additions and 25 deletions
  1. 23 23
      hide/comp/FileSelect.hx
  2. 22 2
      hide/comp/PropsEditor.hx
  3. 8 0
      hide/comp/SceneEditor.hx

+ 23 - 23
hide/comp/FileSelect.hx

@@ -18,7 +18,7 @@ class FileSelect extends Component {
 				ide.chooseFile(extensions, function(path) {
 				ide.chooseFile(extensions, function(path) {
 					this.path = path;
 					this.path = path;
 					onChange();
 					onChange();
-				});
+				}, false, path);
 			}
 			}
 		});
 		});
 		root.contextmenu(function(e) {
 		root.contextmenu(function(e) {
@@ -31,42 +31,42 @@ class FileSelect extends Component {
 			]);
 			]);
 			return false;
 			return false;
 		});
 		});
+
 		// allow drag files
 		// allow drag files
 		root.on("dragover", function(e) {
 		root.on("dragover", function(e) {
 			root.addClass("dragover");
 			root.addClass("dragover");
-			e.preventDefault();
 		});
 		});
 		root.on("dragleave", function(e) {
 		root.on("dragleave", function(e) {
 			root.removeClass("dragover");
 			root.removeClass("dragover");
 		});
 		});
-		root.on("drop", function(e:js.jquery.Event) {
+		root.on("drop", function(e) {
 			root.removeClass("dragover");
 			root.removeClass("dragover");
-			var file = getTransferFile(e);
-			if( file != null ) {
-				path = file;
-				onChange();
-			}
-			e.preventDefault();
 		});
 		});
 	}
 	}
 
 
-	function getTransferFile( e : js.jquery.Event ) {
-		var data : js.html.DataTransfer = untyped e.originalEvent.dataTransfer;
-		var text = data.getData("text/html");
-		var path : String = null;
-
-		if( data.files.length > 0 )
-			path = untyped data.files[0].path;
-		else if( StringTools.startsWith(text, "<a") && text.indexOf("jstree-anchor") > 0 ) {
-			var rpath = ~/id="([^"]+)_anchor"/;
-			if( rpath.match(text) )
-				path = rpath.matched(1);
+	public function onDragDrop( items : Array<String>, isDrop : Bool ) : Bool {
+		if( items.length == 0 )
+			return false;
+		var newPath = ide.makeRelative(items[0]);
+		if( pathIsValid(newPath) ) {
+			if( isDrop ) {
+				path = newPath;
+				onChange();
+			}
+			return true;
 		}
 		}
-		if( path != null && sys.FileSystem.exists(ide.getPath(path)) && extensions.indexOf(path.split(".").pop().toLowerCase()) >= 0 )
-			return ide.makeRelative(path);
-		return null;
+		return false;
 	}
 	}
 
 
+	function pathIsValid( path : String ) : Bool {
+		return (
+			path != null
+			&& sys.FileSystem.exists(ide.getPath(path))
+			&& extensions.indexOf(path.split(".").pop().toLowerCase()) >= 0
+		);
+	}
+
+
 	public function getFullPath() {
 	public function getFullPath() {
 		if( path == null )
 		if( path == null )
 			return null;
 			return null;

+ 22 - 2
hide/comp/PropsEditor.hx

@@ -20,6 +20,26 @@ class PropsEditor extends Component {
 		fields = [];
 		fields = [];
 	}
 	}
 
 
+	public function onDragDrop( items : Array<String>, isDrop : Bool ) : Bool {
+		if( items.length == 0 )
+			return false;
+
+		var pickedEl = js.Browser.document.elementFromPoint(ide.mouseX, ide.mouseY);
+		var rootEl = element[0];
+		while( pickedEl != null ) {
+			if( pickedEl == rootEl )
+				return false;
+			for( field in fields ) {
+				if( field.tselect != null && field.tselect.element[0] == pickedEl )
+					return field.tselect.onDragDrop(items, isDrop);
+				if( field.fselect != null && field.fselect.element[0] == pickedEl )
+					return field.fselect.onDragDrop(items, isDrop);
+			}
+			pickedEl = pickedEl.parentElement;
+		}
+		return false;
+	}
+
 	public function addMaterial( m : h3d.mat.Material, ?parent : Element, ?onChange ) {
 	public function addMaterial( m : h3d.mat.Material, ?parent : Element, ?onChange ) {
 		var def = m.editProps();
 		var def = m.editProps();
 		def = add(def, m.props, function(name) {
 		def = add(def, m.props, function(name) {
@@ -235,10 +255,10 @@ class PropsEditor extends Component {
 }
 }
 
 
 
 
+@:allow(hide.comp.PropsEditor)
 class PropsField extends Component {
 class PropsField extends Component {
-
 	public var fname : String;
 	public var fname : String;
-	public var isTempChange : Bool;
+	var isTempChange : Bool;
 	var props : PropsEditor;
 	var props : PropsEditor;
 	var context : Dynamic;
 	var context : Dynamic;
 	var current : Dynamic;
 	var current : Dynamic;

+ 8 - 0
hide/comp/SceneEditor.hx

@@ -1601,6 +1601,14 @@ class SceneEditor {
 	}
 	}
 
 
 	public function onDragDrop( items : Array<String>, isDrop : Bool ) {
 	public function onDragDrop( items : Array<String>, isDrop : Bool ) {
+		var pickedEl = js.Browser.document.elementFromPoint(ide.mouseX, ide.mouseY);
+		var propEl = properties.element[0];
+		while( pickedEl != null ) {
+			if( pickedEl == propEl )
+				return properties.onDragDrop(items, isDrop);
+			pickedEl = pickedEl.parentElement;
+		}
+
 		var supported = @:privateAccess hrt.prefab.Library.registeredExtensions;
 		var supported = @:privateAccess hrt.prefab.Library.registeredExtensions;
 		var paths = [];
 		var paths = [];
 		for(path in items) {
 		for(path in items) {