public void RenderThemeDefinitions() { GUIStyle box = InspectorUIUtility.HelpBox(EditorGUI.indentLevel * ThemeBoxMargin); // Loop through all InteractableThemePropertySettings of Theme for (int index = 0; index < themeDefinitions.arraySize; index++) { using (new EditorGUILayout.VerticalScope(box)) { SerializedProperty themeDefinition = themeDefinitions.GetArrayElementAtIndex(index); SerializedProperty className = themeDefinition.FindPropertyRelative("ClassName"); string themeDefinition_prefKey = theme.name + "_Definitions" + index; bool show = false; using (new EditorGUILayout.HorizontalScope()) { show = InspectorUIUtility.DrawSectionFoldoutWithKey(className.stringValue, themeDefinition_prefKey, MixedRealityStylesUtility.BoldFoldoutStyle); if (RenderDeleteButton(index)) { return; } } if (show) { EditorGUILayout.Space(); using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.LabelField("General Properties", EditorStyles.boldLabel); using (new EditorGUILayout.HorizontalScope()) { var themeTypes = TypeCacheUtility.GetSubClasses <InteractableThemeBase>(); var themeClassNames = themeTypes.Select(t => t?.Name).ToArray(); int id = Array.IndexOf(themeClassNames, className.stringValue); int newId = EditorGUILayout.Popup("Theme Runtime", id, themeClassNames); // Some old Themes did not properly save a value here SerializedProperty assemblyQualifiedName = themeDefinition.FindPropertyRelative("AssemblyQualifiedName"); if (string.IsNullOrEmpty(assemblyQualifiedName.stringValue) && newId != -1) { assemblyQualifiedName.stringValue = themeTypes[newId].AssemblyQualifiedName; } // If user changed the theme type for current themeDefinition if (id != newId && newId != -1) { Type oldType = id != -1 ? themeTypes[id] : null; Type newType = themeTypes[newId]; ChangeThemeDefinitionType(index, oldType, newType); return; } } var themeType = theme.Definitions[index].ThemeType; if (themeType != null) { SerializedProperty customProperties = themeDefinition.FindPropertyRelative("customProperties"); RenderCustomProperties(customProperties); var themeExample = (InteractableThemeBase)Activator.CreateInstance(themeType); if (themeExample.IsEasingSupported) { RenderEasingProperties(themeDefinition); } if (themeExample.AreShadersSupported) { RenderShaderProperties(themeDefinition); } EditorGUILayout.Space(); RenderThemeStates(themeDefinition); } else { InspectorUIUtility.DrawError("Theme Runtime Type is not valid"); } } } } } // If no theme properties assigned, add a default one if (themeDefinitions.arraySize < 1 || GUILayout.Button(AddThemePropertyLabel)) { AddThemeDefinition(); } }