2024-10-20 03:58:41 +02:00
|
|
|
|
#if MA_VRCSDK3_AVATARS
|
2025-03-15 11:50:38 +09:00
|
|
|
|
using System.Linq;
|
2024-10-20 03:58:41 +02:00
|
|
|
|
using nadena.dev.modular_avatar.ui;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
using UnityEditor;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using VRC.SDK3.Avatars.ScriptableObjects;
|
|
|
|
|
|
|
|
|
|
namespace nadena.dev.modular_avatar.core.editor
|
|
|
|
|
{
|
|
|
|
|
internal static class ToggleCreatorShortcut
|
|
|
|
|
{
|
2025-02-02 12:25:09 +09:00
|
|
|
|
[MenuItem(UnityMenuItems.GameObject_CreateToggleForSelection, false, UnityMenuItems.GameObject_CreateToggleForSelectionOrder)]
|
2025-03-15 11:50:38 +09:00
|
|
|
|
private static void CreateToggleForSelection()
|
|
|
|
|
{
|
|
|
|
|
var forSelection = true;
|
|
|
|
|
|
|
|
|
|
var selections = Selection.objects.OfType<GameObject>();
|
|
|
|
|
// Ignore GameObjects with submenu in the context of CreateToggleForSelection.
|
|
|
|
|
selections = selections.Where(s => !TryGetChildrenSourceSubmenu(s, out var _));
|
|
|
|
|
if (selections.Count() == 0) return;
|
|
|
|
|
|
|
|
|
|
foreach (var selected in selections)
|
|
|
|
|
{
|
|
|
|
|
var avatarRoot = RuntimeUtil.FindAvatarTransformInParents(selected.transform);
|
|
|
|
|
if (avatarRoot == null) return;
|
|
|
|
|
|
|
|
|
|
var parent = selected.transform.parent?.gameObject;
|
|
|
|
|
if (parent == null) continue;
|
|
|
|
|
|
|
|
|
|
CreateToggleImpl(selected, parent, selected.name + " Toggle", forSelection, createInstaller:true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Selection.objects = null;
|
|
|
|
|
}
|
2024-12-21 06:18:37 +09:00
|
|
|
|
|
2024-08-10 19:16:57 -07:00
|
|
|
|
[MenuItem(UnityMenuItems.GameObject_CreateToggle, false, UnityMenuItems.GameObject_CreateToggleOrder)]
|
2025-03-15 11:50:38 +09:00
|
|
|
|
private static void CreateToggle()
|
2024-12-21 06:40:23 +09:00
|
|
|
|
{
|
2025-03-15 11:50:38 +09:00
|
|
|
|
var selections = Selection.objects.OfType<GameObject>();
|
|
|
|
|
if (selections.Count() == 0) return;
|
2024-12-21 06:18:37 +09:00
|
|
|
|
|
2025-03-15 11:50:38 +09:00
|
|
|
|
foreach (var selected in selections)
|
|
|
|
|
{
|
|
|
|
|
var avatarRoot = RuntimeUtil.FindAvatarTransformInParents(selected.transform);
|
|
|
|
|
if (avatarRoot == null) return;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
|
2025-03-15 11:50:38 +09:00
|
|
|
|
var parent = avatarRoot.gameObject;
|
|
|
|
|
var createInstaller = true;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
|
2025-03-15 11:50:38 +09:00
|
|
|
|
if (TryGetChildrenSourceSubmenu(selected, out var _))
|
|
|
|
|
{
|
|
|
|
|
parent = selected;
|
|
|
|
|
createInstaller = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CreateToggleImpl(selected, parent, "New Toggle", createInstaller:createInstaller);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Selection.objects = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static bool TryGetChildrenSourceSubmenu(GameObject target, out ModularAvatarMenuItem subMenu)
|
|
|
|
|
{
|
|
|
|
|
subMenu = null;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
try
|
|
|
|
|
{
|
2025-03-15 11:50:38 +09:00
|
|
|
|
var mami = target.GetComponent<ModularAvatarMenuItem>();
|
|
|
|
|
if (mami?.Control?.type == VRCExpressionsMenu.Control.ControlType.SubMenu
|
|
|
|
|
&& mami.MenuSource == SubmenuSource.Children
|
2024-08-10 19:16:57 -07:00
|
|
|
|
)
|
|
|
|
|
{
|
2025-03-15 11:50:38 +09:00
|
|
|
|
subMenu = mami;
|
|
|
|
|
return true;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-27 19:24:19 -07:00
|
|
|
|
catch (MissingComponentException)
|
2024-08-10 19:16:57 -07:00
|
|
|
|
{
|
|
|
|
|
// ignore
|
|
|
|
|
}
|
2025-03-15 11:50:38 +09:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-12-21 06:18:37 +09:00
|
|
|
|
|
2025-03-15 11:50:38 +09:00
|
|
|
|
private static void CreateToggleImpl(GameObject selected, GameObject parent, string name, bool forSelection = false, bool createInstaller = true)
|
|
|
|
|
{
|
|
|
|
|
var avatarRoot = RuntimeUtil.FindAvatarTransformInParents(selected.transform);
|
|
|
|
|
if (avatarRoot == null) return;
|
2024-08-10 19:16:57 -07:00
|
|
|
|
|
2024-12-21 06:18:37 +09:00
|
|
|
|
var toggle = new GameObject(name);
|
2024-08-10 19:16:57 -07:00
|
|
|
|
|
|
|
|
|
var objToggle = toggle.AddComponent<ModularAvatarObjectToggle>();
|
2025-02-02 12:25:09 +09:00
|
|
|
|
if (forSelection)
|
2024-12-21 06:18:37 +09:00
|
|
|
|
{
|
|
|
|
|
var path = RuntimeUtil.RelativePath(avatarRoot.gameObject, selected);
|
|
|
|
|
objToggle.Objects.Add(new ToggledObject
|
|
|
|
|
{
|
|
|
|
|
Object = new AvatarObjectReference(){ referencePath = path },
|
2024-12-21 12:51:58 +09:00
|
|
|
|
Active = !selected.activeSelf
|
2024-12-21 06:18:37 +09:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-10 19:16:57 -07:00
|
|
|
|
|
2025-03-15 11:50:38 +09:00
|
|
|
|
toggle.transform.SetParent(parent.transform, false);
|
2024-09-14 10:57:03 +09:00
|
|
|
|
|
|
|
|
|
var mami = toggle.AddComponent<ModularAvatarMenuItem>();
|
|
|
|
|
mami.InitSettings();
|
|
|
|
|
mami.Control = new VRCExpressionsMenu.Control
|
2024-08-10 19:16:57 -07:00
|
|
|
|
{
|
|
|
|
|
type = VRCExpressionsMenu.Control.ControlType.Toggle,
|
2024-12-21 06:18:37 +09:00
|
|
|
|
name = name,
|
2024-08-10 19:16:57 -07:00
|
|
|
|
value = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (createInstaller)
|
|
|
|
|
{
|
|
|
|
|
toggle.AddComponent<ModularAvatarMenuInstaller>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Selection.activeGameObject = toggle;
|
|
|
|
|
EditorGUIUtility.PingObject(objToggle);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Undo.RegisterCreatedObjectUndo(toggle, "Create Toggle");
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-20 03:58:41 +02:00
|
|
|
|
}
|
|
|
|
|
#endif
|