#define AVPROVIDEO_SUPPORT_LIVEEDITMODE using UnityEngine; using UnityEditor; using System.Collections.Generic; //----------------------------------------------------------------------------- // Copyright 2015-2021 RenderHeads Ltd. All rights reserved. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo.Editor { /// A collapsable GUI section that animates during open and close internal class AnimCollapseSection { internal const string SettingsPrefix = "AVProVideo-MediaPlayerEditor-"; private const float CollapseSpeed = 2f; private static GUIStyle _styleCollapsableSection = null; private static GUIStyle _styleButtonFoldout = null; private static GUIStyle _styleHelpBoxNoPad = null; public AnimCollapseSection(string label, bool showOnlyInEditMode, bool isDefaultExpanded, System.Action action, UnityEditor.Editor editor, Color backgroundColor, List groupItems = null) : this(new GUIContent(label), showOnlyInEditMode, isDefaultExpanded, action, editor, backgroundColor, groupItems) { } public AnimCollapseSection(GUIContent label, bool showOnlyInEditMode, bool isDefaultExpanded, System.Action action, UnityEditor.Editor editor, Color backgroundColor, List groupItems = null) { Label = label; _name = Label.text; Label.text = " " + Label.text; // Add a space for aesthetics ShowOnlyInEditMode = showOnlyInEditMode; _action = action; isDefaultExpanded = EditorPrefs.GetBool(PrefName, isDefaultExpanded); BackgroundColor = backgroundColor; _groupItems = groupItems; _anim = new UnityEditor.AnimatedValues.AnimBool(isDefaultExpanded); _anim.speed = CollapseSpeed; _anim.valueChanged.AddListener(editor.Repaint); } ~AnimCollapseSection() { _anim.valueChanged.RemoveAllListeners(); } private string _name; private UnityEditor.AnimatedValues.AnimBool _anim; private System.Action _action; private List _groupItems; public void Invoke() { _action.Invoke(); } public bool IsExpanded { get { return _anim.target; } set { if (_anim.target != value) { _anim.target = value; if (value) CollapseSiblings(); } } } public float Faded { get { return _anim.faded; } } public GUIContent Label { get; private set; } public bool ShowOnlyInEditMode { get; private set; } public Color BackgroundColor { get; private set; } private string PrefName { get { return GetPrefName(_name); } } public void Save() { EditorPrefs.SetBool(PrefName, IsExpanded); } private void CollapseSiblings() { // Ensure only a single item is in an expanded state if (_groupItems != null) { foreach (AnimCollapseSection section in _groupItems) { if (section != this && section.IsExpanded) { section.IsExpanded = false; } } } } internal static string GetPrefName(string label) { return SettingsPrefix + "Expand-" + label; } internal static void CreateStyles() { if (_styleCollapsableSection == null) { _styleCollapsableSection = new GUIStyle(GUI.skin.box); _styleCollapsableSection.padding.top = 0; _styleCollapsableSection.padding.bottom = 0; } if (_styleButtonFoldout == null) { _styleButtonFoldout = new GUIStyle(EditorStyles.foldout); _styleButtonFoldout.margin = new RectOffset(); _styleButtonFoldout.fontStyle = FontStyle.Bold; _styleButtonFoldout.alignment = TextAnchor.MiddleLeft; } if (_styleHelpBoxNoPad == null) { _styleHelpBoxNoPad = new GUIStyle(EditorStyles.helpBox); _styleHelpBoxNoPad.padding = new RectOffset(); //_styleHelpBoxNoPad.border = new RectOffset(); _styleHelpBoxNoPad.overflow = new RectOffset(); _styleHelpBoxNoPad.margin = new RectOffset(); _styleHelpBoxNoPad.margin = new RectOffset(8, 0, 0, 0); _styleHelpBoxNoPad.stretchWidth = false; _styleHelpBoxNoPad.stretchHeight = false; //_styleHelpBoxNoPad.normal.background = Texture2D.whiteTexture; } } internal static void Show(AnimCollapseSection section, int indentLevel = 0) { if (section.ShowOnlyInEditMode && Application.isPlaying) return; float headerGlow = Mathf.Lerp(0.5f, 0.85f, section.Faded); //float headerGlow = Mathf.Lerp(0.85f, 1f, section.Faded); if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = section.BackgroundColor * new Color(headerGlow, headerGlow, headerGlow, 1f); } else { headerGlow = Mathf.Lerp(0.75f, 1f, section.Faded); GUI.backgroundColor = section.BackgroundColor * new Color(headerGlow, headerGlow, headerGlow, 1f); } GUILayout.BeginVertical(_styleHelpBoxNoPad); GUILayout.Box(GUIContent.none, EditorStyles.miniButton, GUILayout.ExpandWidth(true)); GUI.backgroundColor = Color.white; Rect buttonRect = GUILayoutUtility.GetLastRect(); if (Event.current.type != EventType.Layout) { buttonRect.xMin += indentLevel * EditorGUIUtility.fieldWidth / 3f; EditorGUI.indentLevel++; EditorGUIUtility.SetIconSize(new Vector2(16f, 16f)); section.IsExpanded = EditorGUI.Foldout(buttonRect, section.IsExpanded, section.Label, true, _styleButtonFoldout); EditorGUIUtility.SetIconSize(Vector2.zero); EditorGUI.indentLevel--; } if (EditorGUILayout.BeginFadeGroup(section.Faded)) { section.Invoke(); } EditorGUILayout.EndFadeGroup(); GUILayout.EndVertical(); } internal static void Show(string label, ref bool isExpanded, System.Action action, bool showOnlyInEditMode) { if (showOnlyInEditMode && Application.isPlaying) return; if (BeginShow(label, ref isExpanded, Color.white)) { action.Invoke(); } EndShow(); } internal static bool BeginShow(string label, ref bool isExpanded, Color tintColor) { GUI.color = Color.white; GUI.backgroundColor = Color.clear; if (isExpanded) { GUI.color = Color.white; GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 0.1f); if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = Color.black; } } GUILayout.BeginVertical(_styleCollapsableSection); GUI.color = tintColor; GUI.backgroundColor = Color.white; if (GUILayout.Button(label, EditorStyles.toolbarButton)) { isExpanded = !isExpanded; } GUI.color = Color.white; return isExpanded; } internal static void EndShow() { GUILayout.EndVertical(); } } }