Add validation for menu icons.

This commit is contained in:
raiti-chan 2022-12-02 16:17:41 +09:00
parent a61d9e803c
commit 5145a9dde4
3 changed files with 45 additions and 5 deletions

View File

@ -5,6 +5,7 @@ using UnityEngine;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects;
using static nadena.dev.modular_avatar.core.editor.Localization;
using static nadena.dev.modular_avatar.core.editor.Util;
namespace nadena.dev.modular_avatar.core.editor
{
@ -118,13 +119,25 @@ namespace nadena.dev.modular_avatar.core.editor
}
_devFoldout = EditorGUILayout.Foldout(_devFoldout, G("menuinstall.devoptions"));
if (_devFoldout)
{
if (_devFoldout) {
SerializedProperty menuToAppendProperty = serializedObject.FindProperty(nameof(ModularAvatarMenuInstaller.menuToAppend));
switch (ValidateExpressionMenuIcon((VRCExpressionsMenu)menuToAppendProperty.objectReferenceValue))
{
case ValidateExpressionMenuIconResult.Success:
break;
case ValidateExpressionMenuIconResult.TooLarge:
EditorGUILayout.HelpBox(S("menuinstall.menu_icon_too_large"), MessageType.Error);
break;
case ValidateExpressionMenuIconResult.Uncompressed:
EditorGUILayout.HelpBox(S("menuinstall.menu_icon_uncompressed"), MessageType.Error);
break;
default:
throw new ArgumentOutOfRangeException();
}
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(
serializedObject.FindProperty(nameof(ModularAvatarMenuInstaller.menuToAppend)),
new GUIContent(G("menuinstall.srcmenu"))
);
menuToAppendProperty, new GUIContent(G("menuinstall.srcmenu")));
EditorGUI.indentLevel--;
}
@ -190,5 +203,28 @@ namespace nadena.dev.modular_avatar.core.editor
{
return _avatarMenus == null || _avatarMenus.Contains(menu);
}
private static ValidateExpressionMenuIconResult ValidateExpressionMenuIcon(VRCExpressionsMenu menu) {
if (menu == null) return ValidateExpressionMenuIconResult.Success;
foreach (VRCExpressionsMenu.Control control in menu.controls) {
// Control
ValidateExpressionMenuIconResult result = Util.ValidateExpressionMenuIcon(control.icon);
if (result != ValidateExpressionMenuIconResult.Success) return result;
// Labels
foreach (VRCExpressionsMenu.Control.Label label in control.labels) {
ValidateExpressionMenuIconResult labelResult = Util.ValidateExpressionMenuIcon(label.icon);
if (labelResult != ValidateExpressionMenuIconResult.Success) return labelResult;
}
// SubMenu
if (control.type != VRCExpressionsMenu.Control.ControlType.SubMenu) continue;
ValidateExpressionMenuIconResult subMenuResult = ValidateExpressionMenuIcon(control.subMenu);
if (subMenuResult != ValidateExpressionMenuIconResult.Success) return subMenuResult;
}
return ValidateExpressionMenuIconResult.Success;
}
}
}

View File

@ -9,6 +9,8 @@
"menuinstall.showcontents": "Show menu contents",
"menuinstall.showcontents.notselected": "No menu selected",
"menuinstall.devoptions": "Prefab Developer Options",
"menuinstall.menu_icon_too_large" : "The icon set in the menu is too large than 256 pixels.",
"menuinstall.menu_icon_uncompressed" : "The icon set in the menu is not set for compression.",
"menuinstall.srcmenu": "Menu to Install",
"params.autodetect_header": " Autodetected Parameters ",
"params.internal": "Internal",

View File

@ -9,6 +9,8 @@
"menuinstall.showcontents": "メニュー内容を表示",
"menuinstall.showcontents.notselected": "メニューが選択されていません",
"menuinstall.devoptions": "プレハブ開発者向け設定",
"menuinstall.menu_icon_too_large" : "メニューに設定されているアイコンが256ピクセルより大きすぎます。",
"menuinstall.menu_icon_uncompressed" : "メニューに設定されているアイコンが圧縮設定されていません。",
"menuinstall.srcmenu": "インストールされるメニュー",
"params.autodetect_header": " 自動検出されたパラメーター ",
"params.internal": "内部値",