Browse Source

Model: add visibility buttons on new tree

lviguier 2 months ago
parent
commit
91a9b08332
3 changed files with 49 additions and 0 deletions
  1. 3 0
      bin/style.css
  2. 4 0
      bin/style.less
  3. 42 0
      hide/view/Model.hx

+ 3 - 0
bin/style.css

@@ -5073,6 +5073,9 @@ fancy-tree fancy-scroll fancy-tree-item {
   background-color: hsl(from var(--background) h s calc(var(--highlight) + l));
   display: flex;
 }
+fancy-tree fancy-scroll fancy-tree-item.hidden {
+  filter: opacity(40%);
+}
 fancy-tree fancy-scroll fancy-tree-item.hide-search {
   overflow: hidden;
   height: 0px;

+ 4 - 0
bin/style.less

@@ -6055,6 +6055,10 @@ fancy-tree {
 
 			display: flex;
 
+			&.hidden {
+				filter: opacity(40%);
+			}
+
 			&.hide-search {
 				overflow: hidden;
 				height: 0px;

+ 42 - 0
hide/view/Model.hx

@@ -1398,6 +1398,48 @@ class Model extends FileView {
 			hide.comp.ContextMenu.createFromEvent(cast event, menuItems);
 		};
 		tree.onContextMenu = ctxMenu;
+		tree.getButtons = (item : Dynamic) -> {
+			var obj = Std.downcast(item, h3d.scene.Object);
+			if (obj == null || Std.isOfType(obj, h3d.scene.Skin.Joint) || Std.isOfType(obj, h3d.mat.Material))
+				return [];
+
+			var buttons: Array<hide.comp.FancyTree.TreeButton<Dynamic>> = [];
+			buttons.push({
+				getIcon: (e:Dynamic) -> obj.visible ? '<div class="ico ico-eye"></div>' : '<div class="ico ico-eye-slash"></div>',
+				click: (e:Dynamic) -> {
+					function setChildrenVisibility(item: hide.comp.FancyTree.TreeItemData<Dynamic>, visible: Bool) {
+						for (c in item.children) {
+							var obj = Std.downcast(c.item, h3d.scene.Object);
+							if (c.buttons?.length > 0 && !obj.visible)
+								continue;
+
+							@:privateAccess tree.genElement(c);
+							if (visible)
+								c.element?.classList?.remove("hidden");
+							else
+								c.element?.classList?.add("hidden");
+							setChildrenVisibility(c, visible);
+						}
+					}
+
+					var treeItemData : hide.comp.FancyTree.TreeItemData<Dynamic> = null;
+					var itemMap = @:privateAccess tree.itemMap;
+					for (h in itemMap.keys()) {
+						if (itemMap.get(h).item == e)
+							treeItemData = itemMap.get(h);
+					}
+
+					obj.visible = !obj.visible;
+					if (obj.visible && obj.parent.visible)
+						treeItemData.element.classList.remove("hidden");
+					else
+						treeItemData.element.classList.add("hidden");
+					setChildrenVisibility(treeItemData, obj.visible);
+				},
+				forceVisiblity: (e:Dynamic) -> true,
+			});
+			return buttons;
+		}
 		tree.rebuildTree();
 		tree.openItem(obj, true);