363 lines
12 KiB
C#
363 lines
12 KiB
C#
|
//--------------------------------------------------------------------------------------------------------------------------------
|
|||
|
// Cartoon FX
|
|||
|
// (c) 2012-2020 Jean Moreno
|
|||
|
//--------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
using UnityEngine;
|
|||
|
using UnityEditor;
|
|||
|
|
|||
|
// GUI Styles and UI methods
|
|||
|
|
|||
|
namespace CartoonFX
|
|||
|
{
|
|||
|
public static class Styles
|
|||
|
{
|
|||
|
//================================================================================================================================
|
|||
|
// GUI Styles
|
|||
|
//================================================================================================================================
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// (x) close button
|
|||
|
static GUIStyle _closeCrossButton;
|
|||
|
public static GUIStyle CloseCrossButton
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_closeCrossButton == null)
|
|||
|
{
|
|||
|
//Try to load GUISkin according to its GUID
|
|||
|
//Assumes that its .meta file should always stick with it!
|
|||
|
string guiSkinPath = AssetDatabase.GUIDToAssetPath("02d396fa782e5d7438e231ea9f8be23c");
|
|||
|
var gs = AssetDatabase.LoadAssetAtPath<GUISkin>(guiSkinPath);
|
|||
|
if(gs != null)
|
|||
|
{
|
|||
|
_closeCrossButton = System.Array.Find<GUIStyle>(gs.customStyles, x => x.name == "CloseCrossButton");
|
|||
|
}
|
|||
|
|
|||
|
//Else fall back to minibutton
|
|||
|
if(_closeCrossButton == null)
|
|||
|
_closeCrossButton = EditorStyles.miniButton;
|
|||
|
}
|
|||
|
return _closeCrossButton;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Shuriken Toggle with label alignment fix
|
|||
|
static GUIStyle _shurikenToggle;
|
|||
|
public static GUIStyle ShurikenToggle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_shurikenToggle == null)
|
|||
|
{
|
|||
|
_shurikenToggle = new GUIStyle("ShurikenToggle");
|
|||
|
_shurikenToggle.fontSize = 9;
|
|||
|
_shurikenToggle.contentOffset = new Vector2(16, -1);
|
|||
|
if(EditorGUIUtility.isProSkin)
|
|||
|
{
|
|||
|
var textColor = new Color(.8f, .8f, .8f);
|
|||
|
_shurikenToggle.normal.textColor = textColor;
|
|||
|
_shurikenToggle.active.textColor = textColor;
|
|||
|
_shurikenToggle.focused.textColor = textColor;
|
|||
|
_shurikenToggle.hover.textColor = textColor;
|
|||
|
_shurikenToggle.onNormal.textColor = textColor;
|
|||
|
_shurikenToggle.onActive.textColor = textColor;
|
|||
|
_shurikenToggle.onFocused.textColor = textColor;
|
|||
|
_shurikenToggle.onHover.textColor = textColor;
|
|||
|
}
|
|||
|
}
|
|||
|
return _shurikenToggle;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Bold mini-label (the one from EditorStyles isn't actually "mini")
|
|||
|
static GUIStyle _miniBoldLabel;
|
|||
|
public static GUIStyle MiniBoldLabel
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_miniBoldLabel == null)
|
|||
|
{
|
|||
|
_miniBoldLabel = new GUIStyle(EditorStyles.boldLabel);
|
|||
|
_miniBoldLabel.fontSize = 10;
|
|||
|
_miniBoldLabel.margin = new RectOffset(0, 0, 0, 0);
|
|||
|
}
|
|||
|
return _miniBoldLabel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Bold mini-foldout
|
|||
|
static GUIStyle _miniBoldFoldout;
|
|||
|
public static GUIStyle MiniBoldFoldout
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_miniBoldFoldout == null)
|
|||
|
{
|
|||
|
_miniBoldFoldout = new GUIStyle(EditorStyles.foldout);
|
|||
|
_miniBoldFoldout.fontSize = 10;
|
|||
|
_miniBoldFoldout.fontStyle = FontStyle.Bold;
|
|||
|
_miniBoldFoldout.margin = new RectOffset(0, 0, 0, 0);
|
|||
|
}
|
|||
|
return _miniBoldFoldout;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Gray right-aligned label for Orderable List (Material Animator)
|
|||
|
static GUIStyle _PropertyTypeLabel;
|
|||
|
public static GUIStyle PropertyTypeLabel
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_PropertyTypeLabel == null)
|
|||
|
{
|
|||
|
_PropertyTypeLabel = new GUIStyle(EditorStyles.label);
|
|||
|
_PropertyTypeLabel.alignment = TextAnchor.MiddleRight;
|
|||
|
_PropertyTypeLabel.normal.textColor = Color.gray;
|
|||
|
_PropertyTypeLabel.fontSize = 9;
|
|||
|
}
|
|||
|
return _PropertyTypeLabel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Dark Gray right-aligned label for Orderable List (Material Animator)
|
|||
|
static GUIStyle _PropertyTypeLabelFocused;
|
|||
|
public static GUIStyle PropertyTypeLabelFocused
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_PropertyTypeLabelFocused == null)
|
|||
|
{
|
|||
|
_PropertyTypeLabelFocused = new GUIStyle(EditorStyles.label);
|
|||
|
_PropertyTypeLabelFocused.alignment = TextAnchor.MiddleRight;
|
|||
|
_PropertyTypeLabelFocused.normal.textColor = new Color(.2f, .2f, .2f);
|
|||
|
_PropertyTypeLabelFocused.fontSize = 9;
|
|||
|
}
|
|||
|
return _PropertyTypeLabelFocused;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Rounded Box
|
|||
|
static GUIStyle _roundedBox;
|
|||
|
public static GUIStyle RoundedBox
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_roundedBox == null)
|
|||
|
{
|
|||
|
_roundedBox = new GUIStyle(EditorStyles.helpBox);
|
|||
|
}
|
|||
|
return _roundedBox;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Center White Label ("Editing Spline" label in Scene View)
|
|||
|
static GUIStyle _CenteredWhiteLabel;
|
|||
|
public static GUIStyle CenteredWhiteLabel
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_CenteredWhiteLabel == null)
|
|||
|
{
|
|||
|
_CenteredWhiteLabel = new GUIStyle(EditorStyles.centeredGreyMiniLabel);
|
|||
|
_CenteredWhiteLabel.fontSize = 20;
|
|||
|
_CenteredWhiteLabel.normal.textColor = Color.white;
|
|||
|
}
|
|||
|
return _CenteredWhiteLabel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Used to draw lines for separators
|
|||
|
static public GUIStyle _LineStyle;
|
|||
|
static public GUIStyle LineStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_LineStyle == null)
|
|||
|
{
|
|||
|
_LineStyle = new GUIStyle();
|
|||
|
_LineStyle.normal.background = EditorGUIUtility.whiteTexture;
|
|||
|
_LineStyle.stretchWidth = true;
|
|||
|
}
|
|||
|
|
|||
|
return _LineStyle;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// HelpBox with rich text formatting support
|
|||
|
static GUIStyle _HelpBoxRichTextStyle;
|
|||
|
static public GUIStyle HelpBoxRichTextStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_HelpBoxRichTextStyle == null)
|
|||
|
{
|
|||
|
_HelpBoxRichTextStyle = new GUIStyle("HelpBox");
|
|||
|
_HelpBoxRichTextStyle.richText = true;
|
|||
|
}
|
|||
|
return _HelpBoxRichTextStyle;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Material Blue Header
|
|||
|
static public GUIStyle _MaterialHeaderStyle;
|
|||
|
static public GUIStyle MaterialHeaderStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_MaterialHeaderStyle == null)
|
|||
|
{
|
|||
|
_MaterialHeaderStyle = new GUIStyle(EditorStyles.label);
|
|||
|
_MaterialHeaderStyle.fontStyle = FontStyle.Bold;
|
|||
|
_MaterialHeaderStyle.fontSize = 11;
|
|||
|
_MaterialHeaderStyle.padding.top = 0;
|
|||
|
_MaterialHeaderStyle.padding.bottom = 0;
|
|||
|
_MaterialHeaderStyle.normal.textColor = EditorGUIUtility.isProSkin ? new Color32(75, 128, 255, 255) : new Color32(0, 50, 230, 255);
|
|||
|
_MaterialHeaderStyle.stretchWidth = true;
|
|||
|
}
|
|||
|
|
|||
|
return _MaterialHeaderStyle;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Material Header emboss effect
|
|||
|
static public GUIStyle _MaterialHeaderStyleHighlight;
|
|||
|
static public GUIStyle MaterialHeaderStyleHighlight
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_MaterialHeaderStyleHighlight == null)
|
|||
|
{
|
|||
|
_MaterialHeaderStyleHighlight = new GUIStyle(MaterialHeaderStyle);
|
|||
|
_MaterialHeaderStyleHighlight.contentOffset = new Vector2(1, 1);
|
|||
|
_MaterialHeaderStyleHighlight.normal.textColor = EditorGUIUtility.isProSkin ? new Color32(255, 255, 255, 16) : new Color32(255, 255, 255, 32);
|
|||
|
}
|
|||
|
|
|||
|
return _MaterialHeaderStyleHighlight;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Filled rectangle
|
|||
|
|
|||
|
static private GUIStyle _WhiteRectangleStyle;
|
|||
|
|
|||
|
static public void DrawRectangle(Rect position, Color color)
|
|||
|
{
|
|||
|
var col = GUI.color;
|
|||
|
GUI.color *= color;
|
|||
|
DrawRectangle(position);
|
|||
|
GUI.color = col;
|
|||
|
}
|
|||
|
static public void DrawRectangle(Rect position)
|
|||
|
{
|
|||
|
if(_WhiteRectangleStyle == null)
|
|||
|
{
|
|||
|
_WhiteRectangleStyle = new GUIStyle();
|
|||
|
_WhiteRectangleStyle.normal.background = EditorGUIUtility.whiteTexture;
|
|||
|
}
|
|||
|
|
|||
|
if(Event.current != null && Event.current.type == EventType.Repaint)
|
|||
|
{
|
|||
|
_WhiteRectangleStyle.Draw(position, false, false, false, false);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//================================================================================================================================
|
|||
|
// Methods
|
|||
|
//================================================================================================================================
|
|||
|
|
|||
|
static public void DrawLine(float height = 2f)
|
|||
|
{
|
|||
|
DrawLine(Color.black, height);
|
|||
|
}
|
|||
|
static public void DrawLine(Color color, float height = 1f)
|
|||
|
{
|
|||
|
Rect position = GUILayoutUtility.GetRect(0f, float.MaxValue, height, height, LineStyle);
|
|||
|
DrawLine(position, color);
|
|||
|
}
|
|||
|
static public void DrawLine(Rect position, Color color)
|
|||
|
{
|
|||
|
if(Event.current.type == EventType.Repaint)
|
|||
|
{
|
|||
|
Color orgColor = GUI.color;
|
|||
|
GUI.color = orgColor * color;
|
|||
|
LineStyle.Draw(position, false, false, false, false);
|
|||
|
GUI.color = orgColor;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static public void MaterialDrawHeader(GUIContent guiContent)
|
|||
|
{
|
|||
|
var rect = GUILayoutUtility.GetRect(guiContent, MaterialHeaderStyle);
|
|||
|
GUI.Label(rect, guiContent, MaterialHeaderStyleHighlight);
|
|||
|
GUI.Label(rect, guiContent, MaterialHeaderStyle);
|
|||
|
}
|
|||
|
|
|||
|
static public void MaterialDrawSeparator()
|
|||
|
{
|
|||
|
GUILayout.Space(4);
|
|||
|
if(EditorGUIUtility.isProSkin)
|
|||
|
DrawLine(new Color(.3f, .3f, .3f, 1f), 1);
|
|||
|
else
|
|||
|
DrawLine(new Color(.6f, .6f, .6f, 1f), 1);
|
|||
|
GUILayout.Space(4);
|
|||
|
}
|
|||
|
|
|||
|
static public void MaterialDrawSeparatorDouble()
|
|||
|
{
|
|||
|
GUILayout.Space(6);
|
|||
|
if(EditorGUIUtility.isProSkin)
|
|||
|
{
|
|||
|
DrawLine(new Color(.1f, .1f, .1f, 1f), 1);
|
|||
|
DrawLine(new Color(.4f, .4f, .4f, 1f), 1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DrawLine(new Color(.3f, .3f, .3f, 1f), 1);
|
|||
|
DrawLine(new Color(.9f, .9f, .9f, 1f), 1);
|
|||
|
}
|
|||
|
GUILayout.Space(6);
|
|||
|
}
|
|||
|
|
|||
|
//built-in console icons, also used in help box
|
|||
|
static Texture2D warnIcon;
|
|||
|
static Texture2D infoIcon;
|
|||
|
static Texture2D errorIcon;
|
|||
|
|
|||
|
static public void HelpBoxRichText(Rect position, string message, MessageType msgType)
|
|||
|
{
|
|||
|
Texture2D icon = null;
|
|||
|
switch(msgType)
|
|||
|
{
|
|||
|
case MessageType.Warning: icon = warnIcon ?? (warnIcon = EditorGUIUtility.Load("console.warnicon") as Texture2D); break;
|
|||
|
case MessageType.Info: icon = infoIcon ?? (infoIcon = EditorGUIUtility.Load("console.infoicon") as Texture2D); break;
|
|||
|
case MessageType.Error: icon = errorIcon ?? (errorIcon = EditorGUIUtility.Load("console.erroricon") as Texture2D); break;
|
|||
|
}
|
|||
|
EditorGUI.LabelField(position, GUIContent.none, new GUIContent(message, icon), HelpBoxRichTextStyle);
|
|||
|
}
|
|||
|
|
|||
|
static public void HelpBoxRichText(string message, MessageType msgType)
|
|||
|
{
|
|||
|
Texture2D icon = null;
|
|||
|
switch(msgType)
|
|||
|
{
|
|||
|
case MessageType.Warning: icon = warnIcon ?? (warnIcon = EditorGUIUtility.Load("console.warnicon") as Texture2D); break;
|
|||
|
case MessageType.Info: icon = infoIcon ?? (infoIcon = EditorGUIUtility.Load("console.infoicon") as Texture2D); break;
|
|||
|
case MessageType.Error: icon = errorIcon ?? (errorIcon = EditorGUIUtility.Load("console.erroricon") as Texture2D); break;
|
|||
|
}
|
|||
|
EditorGUILayout.LabelField(GUIContent.none, new GUIContent(message, icon), HelpBoxRichTextStyle);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|