using System;
using UnityEngine;
namespace UnityEditor.Rendering.HighDefinition
{
///
/// Create a toggleable header for material UI, must be used within a scope.
/// Example:
///
/// void OnGUI()
/// {
/// using (var header = new MaterialHeaderScope(text, ExpandBit, editor))
/// {
/// if (header.expanded)
/// EditorGUILayout.LabelField("Hello World !");
/// }
/// }
///
///
///
public struct MaterialHeaderScope : IDisposable
{
/// Indicates whether the header is expanded or not. Is true if the header is expanded, false otherwise.
public readonly bool expanded;
bool spaceAtEnd;
#if !UNITY_2020_1_OR_NEWER
int oldIndentLevel;
#endif
///
/// Creates a material header scope to display the foldout in the material UI.
///
/// Title of the header.
/// Bit index which specifies the state of the header (whether it is open or collapsed) inside Editor Prefs.
/// The current material editor.
/// Set this to true to make the block include space at the bottom of its UI. Set to false to not include any space.
/// Specify a color to display a dot, like in the layered UI.
/// Set to true to make this into a sub-header. This affects the style of the header. Set to false to make this use the standard style.
public MaterialHeaderScope(string title, uint bitExpanded, MaterialEditor materialEditor, bool spaceAtEnd = true, Color colorDot = default(Color), bool subHeader = false)
{
bool beforeExpended = materialEditor.GetExpandedAreas(bitExpanded);
#if !UNITY_2020_1_OR_NEWER
oldIndentLevel = EditorGUI.indentLevel;
EditorGUI.indentLevel = subHeader ? 1 : 0; //fix for preset in 2019.3 (preset are one more indentation depth in material)
#endif
this.spaceAtEnd = spaceAtEnd;
if (!subHeader)
CoreEditorUtils.DrawSplitter();
GUILayout.BeginVertical();
bool saveChangeState = GUI.changed;
if (colorDot != default(Color))
title = " " + title;
expanded = subHeader
? CoreEditorUtils.DrawSubHeaderFoldout(title, beforeExpended)
: CoreEditorUtils.DrawHeaderFoldout(title, beforeExpended);
if (colorDot != default(Color))
{
Rect dotRect = GUILayoutUtility.GetLastRect();
dotRect.width = 5;
dotRect.height = 5;
dotRect.y += 7;
dotRect.x += 17;
EditorGUI.DrawRect(dotRect, colorDot);
}
if (expanded ^ beforeExpended)
{
materialEditor.SetExpandedAreas((uint)bitExpanded, expanded);
saveChangeState = true;
}
GUI.changed = saveChangeState;
if (expanded)
++EditorGUI.indentLevel;
}
/// Disposes of the material scope header and cleans up any resources it used.
void IDisposable.Dispose()
{
if (expanded)
{
if (spaceAtEnd && (Event.current.type == EventType.Repaint || Event.current.type == EventType.Layout))
EditorGUILayout.Space();
--EditorGUI.indentLevel;
}
#if !UNITY_2020_1_OR_NEWER
EditorGUI.indentLevel = oldIndentLevel;
#endif
GUILayout.EndVertical();
}
}
}