Files
tianrunCRM/Assets/CoolapeFrame/3rd/UnityEditorHelper/Editor/EditorHelper.cs
2020-07-04 14:41:25 +08:00

242 lines
5.8 KiB
C#

using System;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace UnityEditorHelper
{
public static class EditorHelper
{
private static readonly GUIStyle SimpleRectStyle;
static EditorHelper()
{
Texture2D simpleTexture = new Texture2D(1, 1);
simpleTexture.SetPixel(0, 0, Color.white);
simpleTexture.Apply();
SimpleRectStyle = new GUIStyle { normal = { background = simpleTexture } };
}
public static bool DrawIconHeader(string key, Texture icon, string caption, Color captionColor)
{
bool state = EditorPrefs.GetBool(key, true);
EditorGUILayout.BeginHorizontal();
{
EditorGUILayout.LabelField(new GUIContent(icon), EditorStyles.miniLabel, GUILayout.Width(22), GUILayout.Height(22));
using (new SwitchColor(captionColor)) {
EditorGUILayout.BeginVertical();
GUILayout.Space(5);
EditorGUILayout.LabelField(caption, EditorStyles.boldLabel);
EditorGUILayout.EndVertical();
}
EditorGUILayout.Space();
string cap = state ? "\u25bc" : "\u25b2";
if (GUILayout.Button(cap, EditorStyles.label, GUILayout.Width(16), GUILayout.Height(16))) {
state = !state;
EditorPrefs.SetBool(key, state);
}
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(2);
return state;
}
public static string GetAssetPath(string assetFileName)
{
if (!AssetDatabase.GetAllAssetPaths().Any(p => p.EndsWith(assetFileName))) {
AssetDatabase.Refresh();
}
string basePath = AssetDatabase.GetAllAssetPaths().First(p => p.EndsWith(assetFileName));
int lastDelimiter = basePath.LastIndexOf('/') + 1;
basePath = basePath.Remove(lastDelimiter, basePath.Length - lastDelimiter);
return basePath;
}
public static GUIStyle GetEditorStyle(string style)
{
return EditorGUIUtility.GetBuiltinSkin(EditorGUIUtility.isProSkin ? EditorSkin.Scene : EditorSkin.Inspector).GetStyle(style);
}
public static void GUIDrawRect(Rect position, Color color)
{
using (new SwitchColor(color)) {
GUI.Box(position, GUIContent.none, SimpleRectStyle);
}
}
}
public sealed class HighlightBox : IDisposable
{
public HighlightBox() : this(new Color(0.1f, 0.1f, 0.2f))
{
}
public HighlightBox(Color color)
{
GUILayout.Space(8f);
GUILayout.BeginHorizontal();
GUILayout.Space(4f);
using (new SwitchColor(color)) {
EditorGUILayout.BeginHorizontal(EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector).GetStyle("sv_iconselector_labelselection"), GUILayout.MinHeight(10f));
}
GUILayout.BeginVertical();
GUILayout.Space(4f);
}
public void Dispose()
{
try {
GUILayout.Space(3f);
GUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
GUILayout.Space(3f);
GUILayout.EndHorizontal();
GUILayout.Space(3f);
} catch (Exception e) {
Debug.LogWarning(e);
}
}
}
public sealed class EditorBlock : IDisposable
{
public enum Orientation
{
Horizontal,
Vertical
}
private readonly Orientation _orientation;
public EditorBlock(Orientation orientation, string style, params GUILayoutOption[] options)
{
_orientation = orientation;
if (orientation == Orientation.Horizontal) {
EditorGUILayout.BeginHorizontal(string.IsNullOrEmpty(style) ? GUIStyle.none : style, options);
} else {
EditorGUILayout.BeginVertical(string.IsNullOrEmpty(style) ? GUIStyle.none : style, options);
}
}
public EditorBlock(Orientation orientation, string style) : this(orientation, style, new GUILayoutOption[] { })
{
}
public EditorBlock(Orientation orientation) : this(orientation, null, new GUILayoutOption[] { })
{
}
public void Dispose()
{
if (_orientation == Orientation.Horizontal) {
EditorGUILayout.EndHorizontal();
} else {
EditorGUILayout.EndVertical();
}
}
}
public sealed class SwitchColor : IDisposable
{
private readonly Color _savedColor;
public SwitchColor(Color newColor)
{
_savedColor = GUI.backgroundColor;
GUI.color = newColor;
}
public void Dispose()
{
GUI.color = _savedColor;
}
}
public class IndentBlock : IDisposable
{
public IndentBlock()
{
EditorGUI.indentLevel++;
}
public void Dispose()
{
EditorGUI.indentLevel--;
}
}
public class ScrollViewBlock : IDisposable
{
public ScrollViewBlock(ref Vector2 scrollPosition, params GUILayoutOption[] options)
{
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, options);
}
public void Dispose()
{
EditorGUILayout.EndScrollView();
}
}
public sealed class FoldableBlock : IDisposable
{
private readonly Color _defaultBackgroundColor;
private bool _expanded;
public FoldableBlock(ref bool expanded, string header) : this(ref expanded, header, null)
{
}
public FoldableBlock(ref bool expanded, string header, Texture2D icon)
{
_defaultBackgroundColor = GUI.backgroundColor;
GUILayout.Space(3f);
GUILayout.BeginHorizontal();
GUILayout.Space(3f);
GUI.changed = false;
if (!GUILayout.Toggle(true, new GUIContent("<b><size=11>" + header + "</size></b>", icon), "dragtab", GUILayout.MinWidth(20f)))
expanded = !expanded;
GUILayout.Space(2f);
GUILayout.EndHorizontal();
if (!expanded) {
GUILayout.Space(3f);
} else {
GroupStart();
}
_expanded = expanded;
}
private void GroupStart()
{
GUILayout.BeginHorizontal();
GUILayout.Space(4f);
EditorGUILayout.BeginHorizontal(NGUIEditorTools.textArea, GUILayout.MinHeight(10f));
GUILayout.BeginVertical();
GUILayout.Space(2f);
}
private void GroupEnd()
{
try {
GUILayout.Space(3f);
GUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
GUILayout.Space(3f);
GUILayout.EndHorizontal();
GUILayout.Space(3f);
GUI.backgroundColor = _defaultBackgroundColor;
} catch (Exception e) {
Debug.LogWarning(e);
}
}
public void Dispose()
{
if (_expanded)
GroupEnd();
}
}
}