diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs index 45b98d7d..efeee178 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs @@ -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; + } } } \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json index 64ef7078..557d0e21 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json @@ -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", diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json index ffd5693d..31c0c651 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json @@ -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": "内部値",