您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
210 行
6.7 KiB
210 行
6.7 KiB
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace UnityEditor.VFXToolbox
|
|
{
|
|
internal class VFXToolboxGUIUtility
|
|
{
|
|
#region GUIContent caching
|
|
private static Dictionary<string, GUIContent> s_GUIContentCache;
|
|
|
|
public static GUIContent Get(string textAndTooltip)
|
|
{
|
|
return GetTextAndIcon(textAndTooltip, null);
|
|
}
|
|
|
|
public static GUIContent GetTextAndIcon(string textAndTooltip, string icon)
|
|
{
|
|
if (s_GUIContentCache == null)
|
|
s_GUIContentCache = new Dictionary<string, GUIContent>();
|
|
|
|
if (string.IsNullOrEmpty(textAndTooltip))
|
|
return GUIContent.none;
|
|
|
|
GUIContent content;
|
|
|
|
if (!s_GUIContentCache.TryGetValue(textAndTooltip, out content))
|
|
{
|
|
var s = textAndTooltip.Split('|');
|
|
|
|
if (!string.IsNullOrEmpty(icon))
|
|
{
|
|
var iconContent = EditorGUIUtility.IconContent(icon);
|
|
content = new GUIContent(s[0], iconContent.image);
|
|
}
|
|
else
|
|
{
|
|
content = new GUIContent(s[0]);
|
|
}
|
|
|
|
if (s.Length > 1 && !string.IsNullOrEmpty(s[1]))
|
|
content.tooltip = s[1];
|
|
|
|
s_GUIContentCache.Add(textAndTooltip, content);
|
|
}
|
|
|
|
return content;
|
|
|
|
}
|
|
|
|
public static void Clear()
|
|
{
|
|
s_GUIContentCache.Clear();
|
|
}
|
|
#endregion
|
|
|
|
#region ProgressBar Handling
|
|
|
|
private static double s_LastProgressBarTime;
|
|
|
|
/// <summary>
|
|
/// Displays a progress bar with delay and optional cancel button
|
|
/// </summary>
|
|
/// <param name="title">title of the window</param>
|
|
/// <param name="message">message</param>
|
|
/// <param name="progress">progress</param>
|
|
/// <param name="delay">minimum delay before displaying window</param>
|
|
/// <param name="cancelable">is the window cancellable?</param>
|
|
/// <returns>true if cancelled, false otherwise</returns>
|
|
public static bool DisplayProgressBar(string title, string message, float progress, float delay = 0.0f, bool cancelable = false)
|
|
{
|
|
if(s_LastProgressBarTime < 0.0)
|
|
s_LastProgressBarTime = EditorApplication.timeSinceStartup;
|
|
|
|
if (EditorApplication.timeSinceStartup - s_LastProgressBarTime > delay)
|
|
{
|
|
if(cancelable)
|
|
{
|
|
return EditorUtility.DisplayCancelableProgressBar(title, message, progress);
|
|
}
|
|
else
|
|
{
|
|
EditorUtility.DisplayProgressBar(title, message, progress);
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clears the current progressbar
|
|
/// </summary>
|
|
public static void ClearProgressBar()
|
|
{
|
|
s_LastProgressBarTime = -1.0;
|
|
EditorUtility.ClearProgressBar();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Other GUI Utils
|
|
public static void GUIRotatedLabel(Rect position, string label, float angle, GUIStyle style)
|
|
{
|
|
var matrix = GUI.matrix;
|
|
var rect = new Rect(position.x - 10f, position.y, position.width, position.height);
|
|
GUIUtility.RotateAroundPivot(angle, rect.center);
|
|
GUI.Label(rect, label, style);
|
|
GUI.matrix = matrix;
|
|
}
|
|
#endregion
|
|
|
|
#region ToggleableHeader
|
|
|
|
public static bool ToggleableHeader(bool enabled, bool bToggleable, string title)
|
|
{
|
|
Rect rect = GUILayoutUtility.GetRect(16f, 32f, VFXToolboxStyles.Header);
|
|
using (new EditorGUI.DisabledGroupScope(!enabled))
|
|
{
|
|
GUI.Box(rect, title, VFXToolboxStyles.Header);
|
|
}
|
|
if(bToggleable)
|
|
{
|
|
Rect toggleRect = new Rect(rect.x + 10f, rect.y + 6f, 13f, 13f);
|
|
if (Event.current.type == EventType.Repaint)
|
|
VFXToolboxStyles.HeaderCheckBox.Draw(toggleRect, false, false, enabled, false);
|
|
|
|
Event e = Event.current;
|
|
if (e.type == EventType.MouseDown)
|
|
{
|
|
if (toggleRect.Contains(e.mousePosition))
|
|
{
|
|
enabled = !enabled;
|
|
e.Use();
|
|
}
|
|
}
|
|
}
|
|
|
|
return enabled;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Tabbed Buttons
|
|
public static int TabbedButtonsGUILayout(int value, string[] labels, bool[] enabled)
|
|
{
|
|
int count = labels.Length;
|
|
|
|
int selected = value;
|
|
|
|
if (labels.Length != enabled.Length)
|
|
throw new ArgumentException("Labels or enabled arrays does not match count for EnumTabbedButtons()");
|
|
|
|
int i = 0;
|
|
|
|
using (new EditorGUILayout.HorizontalScope())
|
|
{
|
|
foreach(string label in labels)
|
|
{
|
|
GUIStyle style = (i == 0) ? VFXToolboxStyles.TabButtonLeft : ((i == count - 1) ? VFXToolboxStyles.TabButtonRight : VFXToolboxStyles.TabButtonMid);
|
|
using (new EditorGUI.DisabledScope(!enabled[i]))
|
|
{
|
|
bool val = GUILayout.Toggle(selected == i, Get(label), style, GUILayout.Height(24));
|
|
if(val != (selected == i))
|
|
{
|
|
selected = i;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
return selected;
|
|
}
|
|
#endregion
|
|
|
|
#region Custom Scopes
|
|
|
|
public class HeaderSectionScope : GUI.Scope
|
|
{
|
|
public HeaderSectionScope(string headerText)
|
|
{
|
|
EditorGUILayout.LabelField(Get(headerText), s_Styles.header);
|
|
EditorGUI.indentLevel += 1;
|
|
}
|
|
|
|
protected override void CloseScope()
|
|
{
|
|
EditorGUI.indentLevel -= 1;
|
|
GUILayout.Label(GUIContent.none, s_Styles.separator);
|
|
}
|
|
|
|
static Styles s_Styles = new Styles();
|
|
|
|
private class Styles
|
|
{
|
|
public GUIStyle header;
|
|
public GUIStyle separator;
|
|
|
|
public Styles()
|
|
{
|
|
header = new GUIStyle(EditorStyles.boldLabel);
|
|
header.margin = new RectOffset(0, 0, 0, 12);
|
|
separator = new GUIStyle("sv_iconselector_sep");
|
|
separator.margin = new RectOffset(0, 0, 8, 0);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|