Browse Source

Various code improvements

trethaller 7 years ago
parent
commit
149fa67b25

+ 2 - 3
hide/comp/IconTree.hx

@@ -175,9 +175,8 @@ class IconTree<T:{}> extends Component {
 		(untyped root.jstree)('deselect_all');
 		var ids = [for( o in objects ) { var v = getRev(o); if( v != null ) v.id; }];
 		(untyped root.jstree)('select_node',ids);
-		if(objects.length > 0) {
-			revealNode(objects[0]);
-		}
+		for(obj in objects)
+			revealNode(obj);
 	}
 
 	public function refresh( ?onReady : Void -> Void ) {

+ 12 - 1
hide/comp/PropsEditor.hx

@@ -134,8 +134,19 @@ class PropsEditor extends Component {
 				if( onChange != null ) onChange(@:privateAccess f.fname);
 			};
 			fields.push(f);
-		}
 
+			// Init reset buttons
+			var defVal = f.root.attr("value");
+			if(defVal != null) {
+				var dd = f.root.parent().parent("dd");
+				var dt = dd.prev("dt");
+				var button = dt.wrapInner('<input type="button" value="${dt.text()}"/>');
+				button.click(function(e) {
+					var range = @:privateAccess f.range;
+					if(range != null) range.reset();
+				});
+			}
+		}
 		return e;
 	}
 

+ 1 - 3
hide/comp/Toolbar.hx

@@ -31,18 +31,16 @@ class Toolbar extends Component {
 		if(label != null) {
 			new Element('<label>$label</label>').appendTo(e);
 		}
-		var callback = null;
 		e.click(function(_) {
 			e.toggleClass("toggled");
 			this.saveDisplayState("toggle:" + icon, e.hasClass("toggled"));
-			if( callback != null ) callback(e.hasClass("toggled"));
+			if( onToggle != null ) onToggle(e.hasClass("toggled"));
 		});
 		e.appendTo(root);
 		if( defValue ) e.addClass("toggled");
 		var def = getDisplayState("toggle:" + icon);
 		if( def == null ) def = false;
 		if( def != defValue ) e.click();
-		callback = onToggle;
 		return {
 			element : e,
 			toggle : function(b) e.toggleClass("toggled",b),

+ 11 - 22
hide/prefab/Object3D.hx

@@ -91,40 +91,29 @@ class Object3D extends Prefab {
 		var props = new hide.Element('
 			<div class="group" name="Position">
 				<dl>
-					<dt><input type="button" value="X" xfield="x" class="reset"/></dt><dd><input type="range" min="-10" max="10" value="0" field="x"/></dd>
-					<dt><input type="button" value="Y" xfield="y" class="reset"/></dt><dd><input type="range" min="-10" max="10" value="0" field="y"/></dd>
-					<dt><input type="button" value="Z" xfield="z" class="reset"/></dt><dd><input type="range" min="-10" max="10" value="0" field="z"/></dd>
-					<dt><input type="button" value="Scale X" xfield="scaleX" class="reset"/></dt><dd><input type="range" min="0" max="5" value="1" field="scaleX"/></dd>
-					<dt><input type="button" value="Scale Y" xfield="scaleY" class="reset"/></dt><dd><input type="range" min="0" max="5" value="1" field="scaleY"/></dd>
-					<dt><input type="button" value="Scale Z" xfield="scaleZ" class="reset"/></dt><dd><input type="range" min="0" max="5" value="1" field="scaleZ"/></dd>
-					<dt><input type="button" value="Rotation X" xfield="rotationX" class="reset"/></dt><dd><input type="range" min="-180" max="180" value="0" field="rotationX" scale="${Math.PI/180}"/></dd>
-					<dt><input type="button" value="Rotation Y" xfield="rotationY" class="reset"/></dt><dd><input type="range" min="-180" max="180" value="0" field="rotationY" scale="${Math.PI/180}"/></dd>
-					<dt><input type="button" value="Rotation Z" xfield="rotationZ" class="reset"/></dt><dd><input type="range" min="-180" max="180" value="0" field="rotationZ" scale="${Math.PI/180}"/></dd>
+					<dt>X</dt><dd><input type="range" min="-10" max="10" value="0" field="x"/></dd>
+					<dt>Y</dt><dd><input type="range" min="-10" max="10" value="0" field="y"/></dd>
+					<dt>Z</dt><dd><input type="range" min="-10" max="10" value="0" field="z"/></dd>
+					<dt>Scale X</dt><dd><input type="range" min="0" max="5" value="1" field="scaleX"/></dd>
+					<dt>Scale Y</dt><dd><input type="range" min="0" max="5" value="1" field="scaleY"/></dd>
+					<dt>Scale Z</dt><dd><input type="range" min="0" max="5" value="1" field="scaleZ"/></dd>
+					<dt>Rotation X</dt><dd><input type="range" min="-180" max="180" value="0" field="rotationX" scale="${Math.PI/180}"/></dd>
+					<dt>Rotation Y</dt><dd><input type="range" min="-180" max="180" value="0" field="rotationY" scale="${Math.PI/180}"/></dd>
+					<dt>Rotation Z</dt><dd><input type="range" min="-180" max="180" value="0" field="rotationZ" scale="${Math.PI/180}"/></dd>
 					<dt>Visible</dt><dd><input type="checkbox" field="visible"/></dd>
 				</dl>
 			</div>
 		');
-
 		ctx.properties.add(props, this, function(pname) {
 			applyPos(ctx.getContext(this).local3d);
 			ctx.onChange(this, pname);
 		});
-
-		for(fname in "x y z rotationX rotationY rotationZ scaleX scaleY scaleZ".split(" ")) {
-			var resets = props.find('input.reset[xfield="$fname"]');
-			resets.click(function(e) {
-				var field = ctx.properties.fields.find(f -> f.fname == fname);
-				if(field != null) {
-					var range = @:privateAccess field.range;
-					if(range != null) range.reset();
-				}
-			});
-		}
 		#end
 	}
 
 	override function getHideProps() {
-		return { icon : "folder-open", name : "Group", fileSource : null };
+		// Check children
+		return { icon : children == null || children.length > 0 ? "folder-open" : "genderless", name : "Group", fileSource : null };
 	}
 
 	static var _ = Library.register("object", Object3D);

+ 20 - 5
hide/prefab/Prefab.hx

@@ -154,17 +154,28 @@ class Prefab {
 	public function getAll<T:Prefab>( cl : Class<T>, ?arr: Array<T> ) : Array<T> {
 		if(arr == null)
 			arr = [];
-		var i = Std.instance(this, cl);
-		if(i != null)
-			arr.push(i);
 		for(c in children) {
+			var i = Std.instance(c, cl);
+			if(i != null)
+				arr.push(i);
 			c.getAll(cl, arr);
 		}
 		return arr;
 	}
 
-	public function to<T:Prefab>( c : Class<T> ) : Null<T> {
-		return Std.instance(this, c);
+	public function flatten<T:Prefab>( ?cl : Class<T>, ?arr: Array<T> ) : Array<T> {
+		if(arr == null)
+			arr = [];
+		if( cl == null )
+			arr.push(cast this);
+		else {
+			var i = Std.instance(this, cl);
+			if(i != null)
+				arr.push(i);
+		}
+		for(c in children)
+			c.flatten(cl, arr);
+		return arr;
 	}
 
 	public function getParent<T:Prefab>( c : Class<T> ) : Null<T> {
@@ -176,4 +187,8 @@ class Prefab {
 		}
 		return null;
 	}
+
+	public function to<T:Prefab>( c : Class<T> ) : Null<T> {
+		return Std.instance(this, c);
+	}
 }

+ 2 - 3
hide/prefab/l3d/Layer.hx

@@ -14,9 +14,8 @@ class Layer extends Object3D {
 	public function getCdbModel() {
 		var levelSheet = getLevelSheet();
 		if(levelSheet == null) return null;
-		var lname = name.toLowerCase();
-		lname = lname.split("_")[0].split(" ")[0].split("-")[0];
-		var col = levelSheet.columns.find(c -> { var lc = c.name.toLowerCase(); lc == lname || lc + "s" == lname; });
+		var lname = name.split("_")[0];
+		var col = levelSheet.columns.find(c -> c.name == lname);
 		if(col == null || col.type != TList) return null;
 		return levelSheet.getSub(col);
 	}

+ 24 - 27
hide/ui/Ide.hx

@@ -88,25 +88,23 @@ class Ide {
 		// handle cancel on type=file
 		var body = window.window.document.body;
 		body.onfocus = function(_) haxe.Timer.delay(function() new Element(body).find("input[type=file]").change().remove(), 200);
-		body.ondragover = function(e:js.html.DragEvent) {
+		function dragFunc(drop : Bool, e:js.html.DragEvent) {
 			syncMousePosition(e);
 			var view = getViewAt(mouseX, mouseY);
 			var items : Array<String> = [for(f in e.dataTransfer.files) Reflect.field(f, "path")];
-			if(view != null && view.onDrop(true, items)) {
+			if(view != null && view.onDragDrop(items, false)) {
 				e.preventDefault();
 				e.stopPropagation();
+				return true;
 			}
 			return false;
+		}
+		body.ondragover = function(e:js.html.DragEvent) {
+			dragFunc(false, e);
+			return false;
 		};
 		body.ondrop = function(e:js.html.DragEvent) {
-			syncMousePosition(e);
-			var view = getViewAt(mouseX, mouseY);
-			var items : Array<String>  = [for(f in e.dataTransfer.files) Reflect.field(f, "path")];
-			if(view != null && view.onDrop(false, items)) {
-				e.preventDefault();
-				e.stopPropagation();
-			}
-			else {
+			if(!dragFunc(true, e)) {
 				for( f in e.dataTransfer.files )
 					openFile(Reflect.field(f,"path"));
 				e.preventDefault();
@@ -116,23 +114,22 @@ class Ide {
 
 		// Listen to FileTree dnd
 		new Element(window.window.document).on("dnd_stop.vakata.jstree", function(e, data) {
-			if(data.data.jstree != null) {
-				for( v in views ) {
-					var ft = Std.instance(v, hide.view.FileTree);
-					if(ft != null) @:privateAccess {
-						if(ft.tree.root[0] == data.data.origin.element[0]) {
-							var node = data.data.origin.get_node(data.element);
-							var item = ft.tree.map.get(node.id);
-							if(item != null) {
-								var path = item.value;
-								var view = getViewAt(mouseX, mouseY);
-								if(view != null) {
-									view.onDrop(false, [path]);
-								}
-							}
-							break;
-						}
-					}
+			if(data.data.jstree == null) return;
+			for( v in views ) {
+				var ft = Std.instance(v, hide.view.FileTree);
+				if(ft == null) continue;
+				var item;
+				@:privateAccess {
+					if(ft.tree.root[0] != data.data.origin.element[0]) continue;
+					var node = data.data.origin.get_node(data.element);
+					item = ft.tree.map.get(node.id);
+				}
+				if( item == null ) continue;
+				var path = item.value;
+				var view = getViewAt(mouseX, mouseY);
+				if(view != null) {
+					view.onDragDrop([path], true);
+					return;
 				}
 			}
 		});

+ 1 - 1
hide/ui/View.hx

@@ -136,7 +136,7 @@ class View<T> extends hide.comp.Component {
 	public function onResize() {
 	}
 
-	public function onDrop(over : Bool, items : Array<String>) {
+	public function onDragDrop(items : Array<String>, isDrop : Bool) {
 		return false;
 	}
 

+ 54 - 51
hide/view/l3d/Level3D.hx

@@ -476,63 +476,64 @@ class Level3D extends FileView {
 				});
 			}
 
-			{
+			function addNewInstances() {
 				var curLayer = current.to(hide.prefab.l3d.Layer);
-				if(curLayer != null) {
-					var cdbSheet = curLayer.getCdbModel();
-					if(cdbSheet != null) {
-						var refCol = Instance.findRefColumn(cdbSheet);
-						if(refCol != null) {
-							var refSheet = cdbSheet.base.getSheet(refCol.sheet);
-							var idCol = Instance.findIDColumn(refSheet);
-							if(idCol != null) {
-								var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
-								for(line in refSheet.lines) {
-									var kind = Reflect.getProperty(line, idCol.name);
-									kindItems.push({
-										label : kind,
-										click : function() {
-											var p = new hide.prefab.l3d.Instance(current);
-											p.props = {};
-											for( c in cdbSheet.columns ) {
-												var d = cdbSheet.base.getDefault(c);
-												if( d != null )
-													Reflect.setField(p.props, c.name, d);
-											}
-											p.name = kind.toLowerCase() + "_";
-											Reflect.setField(p.props, refCol.col.name, kind);
-											autoName(p);
-											addObject(p);
-										}
-									});
+				if(curLayer == null)
+					return;
+				var cdbSheet = curLayer.getCdbModel();
+				if(cdbSheet == null)
+					return;
+				var refCol = Instance.findRefColumn(cdbSheet);
+				if(refCol == null)
+					return;
+				var refSheet = cdbSheet.base.getSheet(refCol.sheet);
+				var idCol = Instance.findIDColumn(refSheet);
+				if(idCol != null) {
+					var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
+					for(line in refSheet.lines) {
+						var kind : String = Reflect.getProperty(line, idCol.name);
+						kindItems.push({
+							label : kind,
+							click : function() {
+								var p = new hide.prefab.l3d.Instance(current);
+								p.props = {};
+								for( c in cdbSheet.columns ) {
+									var d = cdbSheet.base.getDefault(c);
+									if( d != null )
+										Reflect.setField(p.props, c.name, d);
 								}
-								newItems.unshift({
-									label : "Instance",
-									menu: kindItems
-								});
-							}
-							else {
-								newItems.unshift({
-									label : "Instance",
-									click : function() {
-										var p = new hide.prefab.l3d.Instance(current);
-										p.name = "object";
-										autoName(p);
-										addObject(p);
-									}
-								});
+								p.name = kind.charAt(0).toLowerCase + kind.substr(1) + "_";
+								Reflect.setField(p.props, refCol.col.name, kind);
+								autoName(p);
+								addObject(p);
 							}
-						}
+						});
 					}
+					newItems.unshift({
+						label : "Instance",
+						menu: kindItems
+					});
 				}
-			}
+				else {
+					newItems.unshift({
+						label : "Instance",
+						click : function() {
+							var p = new hide.prefab.l3d.Instance(current);
+							p.name = "object";
+							autoName(p);
+							addObject(p);
+						}
+					});
+				}
+			};
+			addNewInstances();
 
 			var menuItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [
 				{ label : "New...", menu : newItems },
 				{ label : "Rename", enabled : current != null, click : function() tree.editNode(current) },
 				{ label : "Delete", enabled : current != null, click : function() deleteElements(curEdit.rootElements) },
 				{ label : "Select all", click : selectAll },
-				{ label : "Select children", enabled : current != null, click : function() selectObjects(current.getAll(PrefabElement)) },
+				{ label : "Select children", enabled : current != null, click : function() selectObjects(current.flatten()) },
 				{ label : "Show", enabled : curEdit != null && curEdit.elements.length > 0, click : function() setVisible(curEdit.elements, true) },
 				{ label : "Hide", enabled : curEdit != null && curEdit.elements.length > 0, click : function() setVisible(curEdit.elements, false) },
 				{ label : "Isolate", enabled : curEdit != null && curEdit.elements.length > 0, click : function() isolate(curEdit.elements) },
@@ -635,7 +636,6 @@ class Level3D extends FileView {
 	}
 
 	function isolate(elts : Array<PrefabElement>) {
-		var all = context.shared.contexts.keys();
 		var toShow = elts.copy();
 		var toHide = [];
 		function hideSiblings(elt: PrefabElement) {
@@ -710,7 +710,7 @@ class Level3D extends FileView {
 		}];
 		var oldContexts = contexts.copy();
 		for(e in elts) {
-			for(c in e.getAll(PrefabElement))
+			for(c in e.flatten())
 				contexts.remove(c);
 		}
 		var newContexts = contexts.copy();
@@ -776,7 +776,7 @@ class Level3D extends FileView {
 		}
 	}
 
-	override function onDrop(over: Bool, items : Array<String>) {
+	override function onDragDrop(items : Array<String>, isDrop : Bool) {
 		var supported = ["fbx"];
 		var models = [];
 		for(path in items) {
@@ -786,7 +786,7 @@ class Level3D extends FileView {
 			}
 		}
 		if(models.length > 0) {
-			if(!over) {
+			if(isDrop) {
 				dropModels(models);
 			}
 			return true;
@@ -936,13 +936,16 @@ class Level3D extends FileView {
 		}
 		layerButtons = new Map<PrefabElement, hide.comp.Toolbar.ToolToggle>();
 		var all = context.shared.contexts.keys();
+		var initDone = false;
 		for(elt in all) {
 			var layer = elt.to(hide.prefab.l3d.Layer);
 			if(layer == null) continue;
 			layerButtons[elt] = tools.addToggle("file", layer.name, layer.name, function(on) {
-				setVisible([layer], on);
+				if(initDone)
+					setVisible([layer], on);
 			}, layer.visible);
 		}
+		initDone = true;
 	}
 
 	function getSelfMeshes(p : PrefabElement) {