Browse Source

L3D: Add collapse tree button

trethaller 6 năm trước cách đây
mục cha
commit
c0916b35f0
6 tập tin đã thay đổi với 49 bổ sung15 xóa
  1. 0 2
      bin/style.css
  2. 0 2
      bin/style.less
  3. 15 6
      hide/comp/IconTree.hx
  4. 21 2
      hide/comp/SceneEditor.hx
  5. 2 2
      hide/comp/SceneTree.hx
  6. 11 1
      hide/view/l3d/Level3D.hx

+ 0 - 2
bin/style.css

@@ -303,11 +303,9 @@ input[type=checkbox]:checked:after {
 }
 .hide-toolbar {
   flex: none;
-  padding: 4px;
   padding-top: 2px;
   padding-bottom: 2px;
   background-color: #222222;
-  border-bottom: 1px solid #000;
   display: inline-block;
 }
 .hide-toolbar .button,

+ 0 - 2
bin/style.less

@@ -331,11 +331,9 @@ input[type=checkbox] {
 .hide-toolbar {
 
 	flex: none;
-	padding : 4px;
 	padding-top: 2px;
 	padding-bottom: 2px;
 	background-color : rgb(34,34,34);
-	border-bottom : 1px solid #000;
 	display: inline-block;
 
 	.button, .toggle {

+ 15 - 6
hide/comp/IconTree.hx

@@ -38,7 +38,7 @@ class IconTree<T:{}> extends Component {
 		return [{ value : null, text : "get()", children : true }];
 	}
 
-	public dynamic function onClick( e : T ) : Void {
+	public dynamic function onClick( e : T, evt: Dynamic) : Void {
 	}
 
 	public dynamic function onDblClick( e : T ) : Bool {
@@ -120,7 +120,7 @@ class IconTree<T:{}> extends Component {
 			var node = new Element(event.target).closest("li");
 			if(node == null || node.length == 0) return;
    			var i = map.get(node[0].id);
-			onClick(i.value);
+			onClick(i.value, event);
 		});
 		element.on("dblclick.jstree", function (event) {
 			// ignore dblclick on open/close arrow
@@ -237,12 +237,21 @@ class IconTree<T:{}> extends Component {
 		return [for( id in ids ) map.get(id).value];
 	}
 
-	public function revealNode(e : T) {
+	public function collapseAll() {
+		(element:Dynamic).jstree('close_all');
+	}
+
+	public function openNode(e: T) {
 		var v = getRev(e);
 		if(v == null) return;
-		(element:Dynamic).jstree('_open_to', v.id).focus();
-		var el = (element:Dynamic).jstree('get_node', v.id, true)[0];
-		el.scrollIntoViewIfNeeded();
+		(element:Dynamic).jstree('_open_to', v.id);
+	}
+
+	public function revealNode(e : T) {
+		openNode(e);
+		var el = getElement(e);
+		if(el != null)
+			(el[0] : Dynamic).scrollIntoViewIfNeeded();
 	}
 
 	public function searchFilter( filter : String ) {

+ 21 - 2
hide/comp/SceneEditor.hx

@@ -295,8 +295,20 @@ class SceneEditor {
 		favTree.onAllowMove = function(_, _) {
 			return false;
 		};
-		favTree.onClick = function(e) {
+		favTree.onClick = function(e, evt) {
+			if(evt.ctrlKey) {
+				var sel = tree.getSelection();
+				sel.push(e);
+				selectObjects(sel, true);
+				tree.revealNode(e);
+			}
+			else
+				selectObjects([e], true);
+		}
+		favTree.onDblClick = function(e) {
 			selectObjects([e], true);
+			tree.revealNode(e);
+			return true;
 		}
 		tree.get = function(o:PrefabElement) {
 			var objs = o == null ? sceneData.children : Lambda.array(o);
@@ -346,7 +358,7 @@ class SceneEditor {
 		favTree.element.parent().contextmenu(ctxMenu.bind(favTree));
 		tree.allowRename = true;
 		tree.init();
-		tree.onClick = function(e) {
+		tree.onClick = function(e, _) {
 			selectObjects(tree.getSelection(), false);
 		}
 		tree.onDblClick = function(e) {
@@ -393,6 +405,12 @@ class SceneEditor {
 		refreshTree(callb);
 	}
 
+	public function collapseTree() {
+		tree.collapseAll();
+		for(fav in favorites)
+			tree.openNode(fav);
+	}
+
 	function refreshTree( ?callb ) {
 		tree.refresh(function() {
 			var all = sceneData.flatten(hxd.prefab.Prefab);
@@ -1533,6 +1551,7 @@ class SceneEditor {
 	}
 
 	function update(dt:Float) {
+		trace(K.isDown(K.CTRL));
 		var cam = scene.s3d.camera;
 		@:privateAccess view.saveDisplayState("Camera", { x : cam.pos.x, y : cam.pos.y, z : cam.pos.z, tx : cam.target.x, ty : cam.target.y, tz : cam.target.z });
 		if(gizmo != null) {

+ 2 - 2
hide/comp/SceneTree.hx

@@ -32,7 +32,7 @@ class SceneTree extends IconTree<String> {
 		return null;
 	}
 
-	override function onClick(id:String) {
+	override function onClick(id:String, evt: Dynamic) {
 		var v : Dynamic = resolvePath(id);
 		if( Std.is(v, h3d.scene.Object) )
 			onSelectObject(v);
@@ -48,7 +48,7 @@ class SceneTree extends IconTree<String> {
 
 	override function applyStyle(id: String, el: Element) {
 		var v : Dynamic = resolvePath(id);
-		
+
 		var obj = Std.instance(v, h3d.scene.Object);
 
 		if (obj != null) {

+ 11 - 1
hide/view/l3d/Level3D.hx

@@ -331,7 +331,14 @@ class Level3D extends FileView {
 							<label>Favorites</label>
 							<div class="favorites-tree"></div>
 						</div>
-						<div class="hide-scenetree" style="height:80%;"></div>
+						<div style="height:80%;">
+							<div class="hide-toolbar" style="zoom: 80%">
+								<div class="button collapse-btn" title="Collapse all">
+									<div class="icon fa fa-reply-all"></div>
+								</div>
+							</div>
+							<div class="hide-scenetree"></div>
+						</div>
 					</div>
 					<div class="tabs">
 						<div class="tab expand" name="Scene" icon="sitemap">
@@ -358,6 +365,9 @@ class Level3D extends FileView {
 		element.find(".heaps-scene").first().append(sceneEditor.scene.element);
 		sceneEditor.tree.element.addClass("small");
 		sceneEditor.favTree.element.addClass("small");
+		element.find(".collapse-btn").click(function(e) {
+			sceneEditor.collapseTree();
+		});
 
 		// Level edit
 		{