UP-Viagg-io/Viagg-io/Assets/Packages/AVProVideo/Editor/Scripts/AnimCollapseSection.cs

194 lines
6.5 KiB
C#
Executable File

#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<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();
}
}
}