// This one is private as we do not want to have unhandled advanced switch. Change it if necessary. static IDrawer FoldoutGroup <TEnum, TState>(GUIContent title, TEnum mask, ExpandedState <TEnum, TState> state, FoldoutOption options, Enabler isAdvanced, SwitchEnabler switchAdvanced, params ActionDrawer[] contentDrawers) where TEnum : struct, IConvertible { return(Group((data, owner) => { bool isBoxed = (options & FoldoutOption.Boxed) != 0; bool isIndented = (options & FoldoutOption.Indent) != 0; bool isSubFoldout = (options & FoldoutOption.SubFoldout) != 0; bool noSpaceAtEnd = (options & FoldoutOption.NoSpaceAtEnd) != 0; bool expended = state[mask]; bool newExpended = expended; if (isSubFoldout) { newExpended = CoreEditorUtils.DrawSubHeaderFoldout(title, expended, isBoxed, isAdvanced == null ? (Func <bool>)null : () => isAdvanced(data, owner), switchAdvanced == null ? (Action)null : () => switchAdvanced(data, owner)); } else { CoreEditorUtils.DrawSplitter(isBoxed); newExpended = CoreEditorUtils.DrawHeaderFoldout(title, expended, isBoxed, isAdvanced == null ? (Func <bool>)null : () => isAdvanced(data, owner), switchAdvanced == null ? (Action)null : () => switchAdvanced(data, owner)); } if (newExpended ^ expended) { state[mask] = newExpended; } if (newExpended) { if (isIndented) { ++EditorGUI.indentLevel; } for (var i = 0; i < contentDrawers.Length; i++) { contentDrawers[i](data, owner); } if (isIndented) { --EditorGUI.indentLevel; } if (!noSpaceAtEnd) { EditorGUILayout.Space(); } } })); }
/// <summary> /// Creates a material header scope to display the foldout in the material UI. /// </summary> /// <param name="title">Title of the header.</param> /// <param name="bitExpanded">Bit index which specifies the state of the header (whether it is open or collapsed) inside Editor Prefs.</param> /// <param name="materialEditor">The current material editor.</param> /// <param name="spaceAtEnd">Set this to true to make the block include space at the bottom of its UI. Set to false to not include any space.</param> /// <param name="colorDot">Specify a color to display a dot, like in the layered UI.</param> /// <param name="subHeader">Set to true to make this into a sub-header. This affects the style of the header. Set to false to make this use the standard style.</param> public MaterialHeaderScope(string title, uint bitExpanded, MaterialEditor materialEditor, bool spaceAtEnd = true, Color colorDot = default(Color), bool subHeader = false) { bool beforeExpended = materialEditor.GetExpandedAreas(bitExpanded); #if !UNITY_2020_1_OR_NEWER oldIndentLevel = EditorGUI.indentLevel; EditorGUI.indentLevel = subHeader ? 1 : 0; //fix for preset in 2019.3 (preset are one more indentation depth in material) #endif this.spaceAtEnd = spaceAtEnd; if (!subHeader) { CoreEditorUtils.DrawSplitter(); } GUILayout.BeginVertical(); bool saveChangeState = GUI.changed; if (colorDot != default(Color)) { title = " " + title; } expanded = subHeader ? CoreEditorUtils.DrawSubHeaderFoldout(title, beforeExpended) : CoreEditorUtils.DrawHeaderFoldout(title, beforeExpended); if (colorDot != default(Color)) { Rect dotRect = GUILayoutUtility.GetLastRect(); dotRect.width = 5; dotRect.height = 5; dotRect.y += 7; dotRect.x += 17; EditorGUI.DrawRect(dotRect, colorDot); } if (expanded ^ beforeExpended) { materialEditor.SetExpandedAreas((uint)bitExpanded, expanded); saveChangeState = true; } GUI.changed = saveChangeState; if (expanded) { ++EditorGUI.indentLevel; } }
public MaterialHeaderScope(string title, uint bitExpanded, MaterialEditor materialEditor, bool spaceAtEnd = true, Color colorDot = default(Color), bool subHeader = false) { bool beforeExpended = materialEditor.GetExpandedAreas(bitExpanded); this.spaceAtEnd = spaceAtEnd; if (!subHeader) { CoreEditorUtils.DrawSplitter(); } GUILayout.BeginVertical(); bool saveChangeState = GUI.changed; if (colorDot != default(Color)) { title = " " + title; } expanded = subHeader ? CoreEditorUtils.DrawSubHeaderFoldout(title, beforeExpended) : CoreEditorUtils.DrawHeaderFoldout(title, beforeExpended); if (colorDot != default(Color)) { Color previousColor = GUI.contentColor; GUI.contentColor = colorDot; Rect headerRect = GUILayoutUtility.GetLastRect(); headerRect.xMin += 16f; EditorGUI.LabelField(headerRect, "■"); GUI.contentColor = previousColor; } if (expanded ^ beforeExpended) { materialEditor.SetExpandedAreas((uint)bitExpanded, expanded); saveChangeState = true; } GUI.changed = saveChangeState; if (expanded) { ++EditorGUI.indentLevel; } }