using System; using UnityEditor; using UnityEngine; namespace UnityEditor.U2D.Common { /// /// Utilities to draw foldout headers in Inspector /// internal class InspectorUtils { /// Draw a splitter separator /// [Optional] add margin if the splitter is boxed public static void DrawSplitter(bool isBoxed = false) { var rect = GUILayoutUtility.GetRect(1f, 1f); float xMin = rect.xMin; // Splitter rect should be full-width rect.xMin = 0f; rect.width += 4f; if (isBoxed) { rect.xMin = xMin == 7.0 ? 4.0f : EditorGUIUtility.singleLineHeight; rect.width -= 1; } if (Event.current.type != EventType.Repaint) return; EditorGUI.DrawRect(rect, !EditorGUIUtility.isProSkin ? new Color(0.6f, 0.6f, 0.6f, 1.333f) : new Color(0.12f, 0.12f, 0.12f, 1.333f)); } /// Draw a header /// Title of the header public static void DrawHeader(string title) => DrawHeader(EditorGUIUtility.TrTextContent(title)); /// Draw a header /// Title of the header public static void DrawHeader(GUIContent title) { var backgroundRect = GUILayoutUtility.GetRect(1f, 17f); var labelRect = backgroundRect; labelRect.xMin += 16f; labelRect.xMax -= 20f; var foldoutRect = backgroundRect; foldoutRect.y += 1f; foldoutRect.width = 13f; foldoutRect.height = 13f; // Background rect should be full-width backgroundRect.xMin = 0f; backgroundRect.width += 4f; // Background float backgroundTint = EditorGUIUtility.isProSkin ? 0.1f : 1f; EditorGUI.DrawRect(backgroundRect, new Color(backgroundTint, backgroundTint, backgroundTint, 0.2f)); // Title EditorGUI.LabelField(labelRect, title, EditorStyles.boldLabel); } /// Draw a foldout header /// The title of the header /// The state of the header /// [optional] is the eader contained in a box style ? /// [optional] Delegate used to draw the right state of the advanced button. If null, no button drawn. /// [optional] Callback call when advanced button clicked. Should be used to toggle its state. /// return the state of the foldout header public static bool DrawHeaderFoldout(string title, bool state, bool isBoxed = false, Func hasMoreOptions = null, Action toggleMoreOption = null) => DrawHeaderFoldout(EditorGUIUtility.TrTextContent(title), state, isBoxed, hasMoreOptions, toggleMoreOption); /// Draw a foldout header /// The title of the header /// The state of the header /// [optional] is the eader contained in a box style ? /// [optional] Delegate used to draw the right state of the advanced button. If null, no button drawn. /// [optional] Callback call when advanced button clicked. Should be used to toggle its state. /// return the state of the foldout header public static bool DrawHeaderFoldout(GUIContent title, bool state, bool isBoxed = false, Func hasMoreOptions = null, Action toggleMoreOptions = null) { const float height = 17f; var backgroundRect = GUILayoutUtility.GetRect(1f, height); float xMin = backgroundRect.xMin; var labelRect = backgroundRect; labelRect.xMin += 16f; labelRect.xMax -= 20f; var foldoutRect = backgroundRect; foldoutRect.y += 1f; foldoutRect.width = 13f; foldoutRect.height = 13f; foldoutRect.x = labelRect.xMin + 15 * (EditorGUI.indentLevel - 1); //fix for presset // More options 1/2 var moreOptionsRect = new Rect(); if (hasMoreOptions != null) { moreOptionsRect = backgroundRect; moreOptionsRect.x += moreOptionsRect.width - 16 - 1; moreOptionsRect.height = 15; moreOptionsRect.width = 16; } // Background rect should be full-width backgroundRect.xMin = 0f; backgroundRect.width += 4f; if (isBoxed) { labelRect.xMin += 5; foldoutRect.xMin += 5; backgroundRect.xMin = xMin == 7.0 ? 4.0f : EditorGUIUtility.singleLineHeight; backgroundRect.width -= 1; } // Background float backgroundTint = EditorGUIUtility.isProSkin ? 0.1f : 1f; EditorGUI.DrawRect(backgroundRect, new Color(backgroundTint, backgroundTint, backgroundTint, 0.2f)); // Title EditorGUI.LabelField(labelRect, title, EditorStyles.boldLabel); // Active checkbox state = GUI.Toggle(foldoutRect, state, GUIContent.none, EditorStyles.foldout); var e = Event.current; if (e.type == EventType.MouseDown && backgroundRect.Contains(e.mousePosition) && !moreOptionsRect.Contains(e.mousePosition) && e.button == 0) { state = !state; e.Use(); } return state; } } }