| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | #define AVPROVIDEO_SUPPORT_LIVEEDITMODEusing 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<AnimCollapseSection> 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<AnimCollapseSection> 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<AnimCollapseSection> _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();		}	}}
 |