Add warnings to menu installer

This commit is contained in:
bd_ 2022-10-16 12:47:51 -07:00
parent ea623a3030
commit ff75670ac9

View File

@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects;
namespace net.fushizen.modular_avatar.core.editor
@ -16,9 +18,13 @@ namespace net.fushizen.modular_avatar.core.editor
private bool _menuFoldout;
private bool _devFoldout;
private HashSet<VRCExpressionsMenu> _avatarMenus;
private void OnEnable()
{
_installer = (ModularAvatarMenuInstaller) target;
FindMenus();
}
private void SetupMenuEditor()
@ -45,6 +51,24 @@ namespace net.fushizen.modular_avatar.core.editor
SetupMenuEditor();
var installTo = serializedObject.FindProperty(nameof(ModularAvatarMenuInstaller.installTargetMenu));
if (!installTo.hasMultipleDifferentValues)
{
if (installTo.objectReferenceValue == null)
{
EditorGUILayout.HelpBox(
"Select one of your avatar's menus below to automatically install controls for this prefab."
, MessageType.Info);
}
else if (!IsMenuReachable(RuntimeUtil.FindAvatarInParents(((Component) target).transform),
(VRCExpressionsMenu) installTo.objectReferenceValue))
{
EditorGUILayout.HelpBox(
"Selected menu asset is not part of your avatar."
, MessageType.Error);
}
}
EditorGUILayout.PropertyField(installTo, new GUIContent("Install To"));
var avatar = RuntimeUtil.FindAvatarInParents(_installer.transform);
@ -86,5 +110,40 @@ namespace net.fushizen.modular_avatar.core.editor
serializedObject.ApplyModifiedProperties();
}
private void FindMenus()
{
if (targets.Length > 1)
{
_avatarMenus = null;
return;
}
_avatarMenus = new HashSet<VRCExpressionsMenu>();
var queue = new Queue<VRCExpressionsMenu>();
var avatar = RuntimeUtil.FindAvatarInParents(((Component) target).transform);
if (avatar == null || avatar.expressionsMenu == null) return;
queue.Enqueue(avatar.expressionsMenu);
while (queue.Count > 0)
{
var menu = queue.Dequeue();
if (_avatarMenus.Contains(menu)) continue;
_avatarMenus.Add(menu);
foreach (var subMenu in menu.controls)
{
if (subMenu.type == VRCExpressionsMenu.Control.ControlType.SubMenu)
{
queue.Enqueue(subMenu.subMenu);
}
}
}
}
private bool IsMenuReachable(VRCAvatarDescriptor avatar, VRCExpressionsMenu menu)
{
return _avatarMenus == null || _avatarMenus.Contains(menu);
}
}
}