using System; using UnityEditor.AnimatedValues; using System.Collections.Generic; namespace UnityEditor.Rendering { /// Used in editor drawer part to store the state of additional properties areas. /// An enum to use to describe the state. public abstract class AdditionalPropertiesStateBase where TState : struct, IConvertible { HashSet m_Editors = new HashSet(); Dictionary m_AnimFloats = new Dictionary(); void RepaintAll() { foreach (var editor in m_Editors) { editor.Repaint(); } } /// Get or set the state given the mask. /// The filtering mask /// True: All flagged area are expended public bool this[TState mask] { get => GetAdditionalPropertiesState(mask); set => SetAdditionalPropertiesState(mask, value); } /// Accessor to the expended state of this specific mask. /// The filtering mask /// True: All flagged area are expended public abstract bool GetAdditionalPropertiesState(TState mask); /// Setter to the expended state. /// The filtering mask. /// True to show the additional properties. public void SetAdditionalPropertiesState(TState mask, bool value) { SetAdditionalPropertiesStateValue(mask, value); if (value) ResetAnimation(mask); } /// Setter to the expended state without resetting animation. /// The filtering mask. /// True to show the additional properties. protected abstract void SetAdditionalPropertiesStateValue(TState mask, bool value); /// Utility to set all states to true public abstract void ShowAll(); /// Utility to set all states to false public abstract void HideAll(); internal AnimFloat GetAnimation(TState mask) { AnimFloat anim = null; if (!m_AnimFloats.TryGetValue(mask, out anim)) { anim = new AnimFloat(0, RepaintAll); anim.speed = CoreEditorConstants.additionalPropertiesHightLightSpeed; m_AnimFloats.Add(mask, anim); } return anim; } protected internal void ResetAnimation(TState mask) { AnimFloat anim = GetAnimation(mask); anim.value = 1.0f; anim.target = 0.0f; } /// /// Register an editor for this set of additional properties. /// /// Editor to register. public void RegisterEditor(Editor editor) { m_Editors.Add(editor); } /// /// Unregister an editor for this set of additional properties. /// /// Editor to unregister. public void UnregisterEditor(Editor editor) { m_Editors.Remove(editor); } } /// Used in editor drawer part to store the state of additional properties areas. /// An enum to use to describe the state. /// A type given to automatically compute the key. public class AdditionalPropertiesState : AdditionalPropertiesStateBase where TState : struct, IConvertible { protected internal EditorPrefBoolFlags m_State; /// Constructor will create the key to store in the EditorPref the state given generic type passed. /// If key did not exist, it will be created with this value for initialization. /// [Optional] Prefix scope of the key (Default is CoreRP) /// [Optional] Postfix used to differentiate between different keys (Default is UI_AP_State) public AdditionalPropertiesState(TState defaultValue, string prefix = "CoreRP", string stateId = "UI_AP_State") { string key = $"{prefix}:{typeof(TTarget).Name}:{typeof(TState).Name}:{stateId}"; m_State = new EditorPrefBoolFlags(key); //register key if not already there if (!EditorPrefs.HasKey(key)) { EditorPrefs.SetInt(key, (int)(object)defaultValue); } } /// public override bool GetAdditionalPropertiesState(TState mask) { return m_State.HasFlag(mask); } /// protected override void SetAdditionalPropertiesStateValue(TState mask, bool value) { m_State.SetFlag(mask, value); } /// public override void ShowAll() { m_State.rawValue = uint.MaxValue; } /// public override void HideAll() { m_State.rawValue = 0u; } } /// Used in editor drawer part to store the state of additional properties for a list of elements. /// A type given to automatically compute the key. public class AdditionalPropertiesStateList : AdditionalPropertiesState { /// Constructor will create the key to store in the EditorPref the state given generic type passed. /// [Optional] Prefix scope of the key (Default is CoreRP) public AdditionalPropertiesStateList(string prefix = "CoreRP") : base(default(int), prefix, "UI_AP_State_List") { } /// /// Swap flag between src index and dst index. /// /// src index to swap. /// dst index to swap. public void SwapFlags(int srcIndex, int dstIndex) { int srcFlag = 1 << srcIndex; int dstFlag = 1 << dstIndex; bool srcVal = GetAdditionalPropertiesState(srcFlag); SetAdditionalPropertiesState(srcFlag, GetAdditionalPropertiesState(dstFlag)); SetAdditionalPropertiesState(dstFlag, srcVal); } /// Removes a flag at a given index which causes the following flags' index to decrease by one. /// The index of the flag to be removed. public void RemoveFlagAtIndex(int index) { m_State.rawValue = ExpandedStateList.RightShiftOnceFromIndexToMSB(index, m_State.rawValue); } } }