From 830401c8d10e005df2362f7192dd92ac294d7144 Mon Sep 17 00:00:00 2001 From: bd_ Date: Sat, 25 Feb 2023 14:12:33 +0900 Subject: [PATCH] add menu installer targets to root menu groups on UI target selection --- .../Editor/Inspector/AvMenuTreeView.cs | 39 +++++++++++++++++-- .../MenuGeneration/MenuInstallerEditor.cs | 5 +++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs index 062d8237..b37edadc 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/AvMenuTreeView.cs @@ -154,6 +154,18 @@ namespace nadena.dev.modular_avatar.core.editor _menuTree = VirtualMenu.ForAvatar(_avatar); + var preferredRoot = FindPreferredRoot(_menuTree); + var rootName = ""; + if (preferredRoot is ModularAvatarMenuGroup group) + { + if (group.targetObject != null) rootName = $"({group.targetObject.name})"; + else rootName = $"({group.gameObject.name})"; + } + else if (preferredRoot is VRCExpressionsMenu menu) + { + rootName = $"({menu.name})"; + } + var root = new TreeViewItem(-1, -1, ""); List treeItems = new List { @@ -162,16 +174,37 @@ namespace nadena.dev.modular_avatar.core.editor id = 0, depth = 0, displayName = - $"{Avatar.gameObject.name} ({(Avatar.expressionsMenu == null ? "None" : Avatar.expressionsMenu.name)})" + $"{Avatar.gameObject.name} {rootName}" } }; - _nodeKeys.Add(_menuTree.RootMenuKey); - _visitedMenuStack.Push(_menuTree.RootMenuKey); + + _nodeKeys.Add(preferredRoot); + _visitedMenuStack.Push(preferredRoot); TraverseMenu(1, treeItems, _menuTree.RootMenuNode); SetupParentsAndChildrenFromDepths(root, treeItems); return root; } + private object FindPreferredRoot(VirtualMenu menuTree) + { + // There's always a VRCExpressionsMenu at the root, but we'd prefer to add stuff under a MenuItem tree if + // available. See if we can find one. + foreach (var installer in _avatar.GetComponentsInChildren(true)) + { + if (installer.installTargetMenu != null && installer.installTargetMenu != menuTree.RootMenuKey) + { + continue; + } + + var menuSource = installer.GetComponent(); + if (menuSource == null || !(menuSource is ModularAvatarMenuGroup group)) continue; + + return menuSource; + } + + return menuTree.RootMenuKey; + } + private void TraverseMenu(int depth, List items, VirtualMenuNode node) { IEnumerable children = node.Controls diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuGeneration/MenuInstallerEditor.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuGeneration/MenuInstallerEditor.cs index 7ec187f4..164d82fc 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuGeneration/MenuInstallerEditor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuGeneration/MenuInstallerEditor.cs @@ -217,6 +217,11 @@ namespace nadena.dev.modular_avatar.core.editor menu = new MenuNodesUnder(menuParent); } } + else if (menu is ModularAvatarMenuGroup group) + { + if (group.targetObject != null) menu = new MenuNodesUnder(group.targetObject); + else menu = new MenuNodesUnder(group.gameObject); + } if (menu is VRCExpressionsMenu expMenu) {