cvr-props/Assets/ABI.CCK/Scripts/Editor/GUIExtensions/SharedComponentGUI.cs

177 lines
No EOL
6.9 KiB
C#
Executable file

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace ABI.CCK.Scripts.Editor
{
// Shared between all Custom Editors for CCK Components specifically
public static class SharedComponentGUI
{
public static readonly GUIStyle s_BoldLabelStyle;
public static readonly GUIStyle s_BoldFoldoutStyle;
static SharedComponentGUI()
{
// Foldout scope styles
s_BoldLabelStyle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold };
s_BoldFoldoutStyle = new GUIStyle(EditorStyles.foldout) { fontStyle = FontStyle.Bold };
}
public static void Separator()
{
GUILayout.Space(2);
GUILayout.Box("", EditorStyles.helpBox, GUILayout.ExpandWidth(true), GUILayout.Height(2));
GUILayout.Space(2);
}
public static bool InnerFoldout(ref bool foldoutState, string label, GUIStyle style = null)
{
return foldoutState = EditorGUILayout.Foldout(foldoutState, label, true, style ?? EditorStyles.foldout);
}
public static bool InnerFoldout(ref bool foldoutState, GUIContent label, GUIStyle style = null)
{
return foldoutState = EditorGUILayout.Foldout(foldoutState, label, true, style ?? EditorStyles.foldout);
}
public class LabelScope : GUI.Scope
{
// Magic numbers
private const float LabelHeight = 24.0f;
private const float IndentX = 8.0f;
private const float VerticalSpacingAdjust = -26.0f;
public LabelScope(string label, GUIStyle style = null)
{
InitLabelScope(new GUIContent(label), style ?? s_BoldLabelStyle);
}
public LabelScope(GUIContent label, GUIStyle style = null)
{
InitLabelScope(label, style ?? s_BoldLabelStyle);
}
private void InitLabelScope(GUIContent label, GUIStyle style)
{
// Label
Rect labelRect = GUILayoutUtility.GetRect(1.0f, LabelHeight);
EditorGUI.HelpBox(labelRect, "", MessageType.None);
labelRect.x += IndentX;
labelRect.width -= IndentX;
EditorGUI.LabelField(labelRect, label, style);
// Content
GUILayout.Space(VerticalSpacingAdjust);
GUILayout.BeginVertical(EditorStyles.helpBox);
GUILayout.Space(LabelHeight);
}
protected override void CloseScope()
{
GUILayout.Space(3f);
GUILayout.EndVertical();
}
}
public class FoldoutScope : GUI.Scope
{
// Magic numbers
private const float FoldoutHeight = 24.0f;
private const float IndentX = 18.0f;
private const float VerticalSpacingAdjust = -26.0f;
public FoldoutScope(ref bool foldoutState, string label, GUIStyle style = null)
{
InitFoldoutScope(ref foldoutState, new GUIContent(label), style ?? s_BoldFoldoutStyle);
}
public FoldoutScope(ref bool foldoutState, GUIContent label, GUIStyle style = null)
{
InitFoldoutScope(ref foldoutState, label, style ?? s_BoldFoldoutStyle);
}
private void InitFoldoutScope(ref bool foldoutState, GUIContent label, GUIStyle style)
{
// Foldout
Rect foldoutRect = GUILayoutUtility.GetRect(1.0f, FoldoutHeight);
EditorGUI.HelpBox(foldoutRect, "", MessageType.None);
foldoutRect.x += IndentX;
foldoutRect.width -= IndentX;
foldoutState = EditorGUI.Foldout(foldoutRect, foldoutState, label, true, style);
// Content
GUILayout.Space(VerticalSpacingAdjust);
GUILayout.BeginVertical(EditorStyles.helpBox);
GUILayout.Space(foldoutState ? FoldoutHeight : 21);
}
protected override void CloseScope()
{
GUILayout.Space(3f);
GUILayout.EndVertical();
}
}
public class ToggleFoldoutScope : GUI.Scope
{
// Magic numbers 2
private const float FoldoutHeight = 24.0f;
private const float IndentX = 18.0f;
private const float VerticalSpacingAdjust = -26.0f;
private const float ToggleWidth = 16.0f;
public ToggleFoldoutScope(ref bool foldoutState, ref bool toggleState, string label, GUIStyle style = null)
{
InitToggleFoldoutScope(ref foldoutState, ref toggleState, new GUIContent(label), style ?? s_BoldFoldoutStyle);
}
public ToggleFoldoutScope(ref bool foldoutState, ref bool toggleState, GUIContent label, GUIStyle style = null)
{
InitToggleFoldoutScope(ref foldoutState, ref toggleState, label, style ?? s_BoldFoldoutStyle);
}
private void InitToggleFoldoutScope(ref bool foldoutState, ref bool toggleState, GUIContent label, GUIStyle style)
{
// Foldout
Rect fullRect = GUILayoutUtility.GetRect(1.0f, FoldoutHeight);
EditorGUI.HelpBox(fullRect, "", MessageType.None);
// Toggle
Rect toggleRect = new Rect(fullRect.x + IndentX + 1f, fullRect.y + 1f, ToggleWidth, FoldoutHeight);
toggleState = EditorGUI.Toggle(toggleRect, toggleState);
// Foldout
Rect foldoutRect = new Rect(fullRect.x + IndentX, fullRect.y, fullRect.width - IndentX, FoldoutHeight);
foldoutState = EditorGUI.Foldout(foldoutRect, foldoutState, " " + label, true, style);
// Content
GUILayout.Space(VerticalSpacingAdjust);
GUILayout.BeginVertical(EditorStyles.helpBox);
GUILayout.Space(foldoutState ? FoldoutHeight : 21);
}
protected override void CloseScope()
{
GUILayout.Space(3f);
GUILayout.EndVertical();
}
}
public class SetIndentLevelScope : GUI.Scope
{
private readonly int originalIndentLevel;
public SetIndentLevelScope(int indentLevel)
{
originalIndentLevel = EditorGUI.indentLevel;
EditorGUI.indentLevel = indentLevel;
}
protected override void CloseScope()
{
EditorGUI.indentLevel = originalIndentLevel;
}
}
}
}
#endif