diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs index b947801c..e136c9f8 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; using NUnit.Framework; using UnityEditor; using UnityEditor.IMGUI.Controls; @@ -83,6 +85,9 @@ namespace nadena.dev.modular_avatar.core.editor private List _menuItems = new List(); private HashSet _visitedMenus = new HashSet(); + private MenuTree _menuTree; + private Stack _visitedMenuStack = new Stack(); + public AvMenuTreeView(TreeViewState state) : base(state) { } @@ -98,6 +103,53 @@ namespace nadena.dev.modular_avatar.core.editor OnDoubleclickSelect.Invoke(); } + protected override TreeViewItem BuildRoot() { + this._menuItems.Clear(); + this._visitedMenuStack.Clear(); + + if (Avatar.expressionsMenu == null) { + // TODO: nullの場合もツリーを表示できるように(Installerがあれば子もあるので) + return new TreeViewItem(0, -1, "No menu"); + } + + _menuTree = new MenuTree(Avatar); + _menuTree.AvatarsMenuMapping(); + + var root = new TreeViewItem(-1, -1, ""); + List treeItems = new List { + new TreeViewItem { + id = 0, + depth = 0, + displayName = $"{Avatar.gameObject.name} ({Avatar.expressionsMenu.name})" + } + }; + this._menuItems.Add(Avatar.expressionsMenu); + this._visitedMenuStack.Push(Avatar.expressionsMenu); + + this.TraverseMenu(1, treeItems, Avatar.expressionsMenu); + SetupParentsAndChildrenFromDepths(root, treeItems); + return root; + } + + private void TraverseMenu(int depth, List items, VRCExpressionsMenu menu) { + IEnumerable children = this._menuTree.GetChildren(menu) + .Where(child => !this._visitedMenuStack.Contains(child)); + foreach (VRCExpressionsMenu child in children) { + items.Add( + new TreeViewItem { + id = items.Count, + depth = depth, + displayName = $"{ /*control.name*/null} ({child.name})" // TODO: サブメニュー名を取ってこれるように + } + ); + this._menuItems.Add(child); + this._visitedMenuStack.Push(child); + this.TraverseMenu(depth + 1, items, child); + this._visitedMenuStack.Pop(); + } + } + + /* protected override TreeViewItem BuildRoot() { _menuItems.Clear(); @@ -143,5 +195,6 @@ namespace nadena.dev.modular_avatar.core.editor } } } + */ } } \ No newline at end of file