From 6ba5bb911fcd6b9312eccd880379be155493625d Mon Sep 17 00:00:00 2001 From: lilxyzw Date: Thu, 19 Sep 2024 17:45:42 +0900 Subject: [PATCH] chore: supports when menus are cloned as multiple different objects --- Editor/Menu/VirtualMenu.cs | 42 +++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/Editor/Menu/VirtualMenu.cs b/Editor/Menu/VirtualMenu.cs index b425a84a..cbc6adad 100644 --- a/Editor/Menu/VirtualMenu.cs +++ b/Editor/Menu/VirtualMenu.cs @@ -235,7 +235,7 @@ namespace nadena.dev.modular_avatar.core.editor.menu private Dictionary _resolvedMenu = new Dictionary(); - private Dictionary _menuMap = new Dictionary(); + private Dictionary> _menuMap = new Dictionary>(); // TODO: immutable? public Dictionary ResolvedMenu => _resolvedMenu; @@ -278,8 +278,14 @@ namespace nadena.dev.modular_avatar.core.editor.menu void GetMenuReferences(VRCExpressionsMenu exMenu) { - if (!exMenu || menu._menuMap.ContainsValue(exMenu)) return; - menu._menuMap[ObjectRegistry.GetReference(exMenu)] = exMenu; + if (!exMenu || menu._menuMap.SelectMany(m => m.Value).Contains(exMenu)) return; + var reference = ObjectRegistry.GetReference(exMenu); + if(!menu._menuMap.TryGetValue(reference, out var hashSet)) + { + hashSet = new HashSet(); + menu._menuMap[reference] = hashSet; + } + hashSet.Add(exMenu); foreach (var control in exMenu.controls) { if(control.type == VRCExpressionsMenu.Control.ControlType.SubMenu) @@ -327,18 +333,30 @@ namespace nadena.dev.modular_avatar.core.editor.menu // initial validation if (installer.menuToAppend == null && installer.GetComponent() == null) return; - var installTargetMenu = installer.installTargetMenu && - _menuMap.TryGetValue(ObjectRegistry.GetReference(installer.installTargetMenu), out var currentMenu) ? - currentMenu : installer.installTargetMenu; - - var target = installTargetMenu ? (object) installTargetMenu : RootMenuKey; - if (!_targetMenuToInstaller.TryGetValue(target, out var targets)) + var menus = new HashSet(); + if (installer.installTargetMenu && _menuMap.TryGetValue(ObjectRegistry.GetReference(installer.installTargetMenu), out var hashSet)) { - targets = new List(); - _targetMenuToInstaller[target] = targets; + menus.UnionWith(hashSet); + } + else if(installer.installTargetMenu) + { + menus.Add(installer.installTargetMenu); + } + else + { + menus.Add(RootMenuKey); } - targets.Add(installer); + foreach (var target in menus) + { + if (!_targetMenuToInstaller.TryGetValue(target, out var targets)) + { + targets = new List(); + _targetMenuToInstaller[target] = targets; + } + + targets.Add(installer); + } } ///