revival/game/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs

157 lines
7.7 KiB
C#
Raw Normal View History

2021-02-22 16:25:38 +01:00
using System;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEditor;
using System.IO;
namespace FMODUnity
{
[CustomPropertyDrawer(typeof(EventRefAttribute))]
class EventRefDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
Texture browseIcon = EditorGUIUtility.Load("FMOD/SearchIconBlack.png") as Texture;
Texture openIcon = EditorGUIUtility.Load("FMOD/BrowserIcon.png") as Texture;
Texture addIcon = EditorGUIUtility.Load("FMOD/AddIcon.png") as Texture;
label = EditorGUI.BeginProperty(position, label, property);
SerializedProperty pathProperty = property;
Event e = Event.current;
if (e.type == EventType.DragPerform && position.Contains(e.mousePosition))
{
if (DragAndDrop.objectReferences.Length > 0 &&
DragAndDrop.objectReferences[0] != null &&
DragAndDrop.objectReferences[0].GetType() == typeof(EditorEventRef))
{
pathProperty.stringValue = ((EditorEventRef)DragAndDrop.objectReferences[0]).Path;
GUI.changed = true;
e.Use();
}
}
if (e.type == EventType.DragUpdated && position.Contains(e.mousePosition))
{
if (DragAndDrop.objectReferences.Length > 0 &&
DragAndDrop.objectReferences[0] != null &&
DragAndDrop.objectReferences[0].GetType() == typeof(EditorEventRef))
{
DragAndDrop.visualMode = DragAndDropVisualMode.Move;
DragAndDrop.AcceptDrag();
e.Use();
}
}
float baseHeight = GUI.skin.textField.CalcSize(new GUIContent()).y;
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
GUIStyle buttonStyle = new GUIStyle(GUI.skin.button);
buttonStyle.padding.top = 1;
buttonStyle.padding.bottom = 1;
Rect addRect = new Rect(position.x + position.width - addIcon.width - 7, position.y, addIcon.width + 7, baseHeight);
Rect openRect = new Rect(addRect.x - openIcon.width - 7, position.y, openIcon.width + 6, baseHeight);
Rect searchRect = new Rect(openRect.x - browseIcon.width - 9, position.y, browseIcon.width + 8, baseHeight);
Rect pathRect = new Rect(position.x, position.y, searchRect.x - position.x - 3, baseHeight);
EditorGUI.PropertyField(pathRect, pathProperty, GUIContent.none);
if (GUI.Button(searchRect, new GUIContent(browseIcon, "Search"), buttonStyle))
{
var eventBrowser = ScriptableObject.CreateInstance<EventBrowser>();
eventBrowser.ChooseEvent(property);
var windowRect = position;
windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position);
windowRect.height = openRect.height + 1;
eventBrowser.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 400));
}
if (GUI.Button(addRect, new GUIContent(addIcon, "Create New Event in Studio"), buttonStyle))
{
var addDropdown= EditorWindow.CreateInstance<CreateEventPopup>();
addDropdown.SelectEvent(property);
var windowRect = position;
windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position);
windowRect.height = openRect.height + 1;
addDropdown.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 500));
}
if (GUI.Button(openRect, new GUIContent(openIcon, "Open In Browser"), buttonStyle) &&
!string.IsNullOrEmpty(pathProperty.stringValue) &&
EventManager.EventFromPath(pathProperty.stringValue) != null
)
{
EventBrowser.ShowWindow();
EventBrowser eventBrowser = EditorWindow.GetWindow<EventBrowser>();
eventBrowser.FrameEvent(pathProperty.stringValue);
}
if (!string.IsNullOrEmpty(pathProperty.stringValue) && EventManager.EventFromPath(pathProperty.stringValue) != null)
{
Rect foldoutRect = new Rect(position.x + 10, position.y + baseHeight, position.width, baseHeight);
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, "Event Properties");
if (property.isExpanded)
{
var style = new GUIStyle(GUI.skin.label);
style.richText = true;
EditorEventRef eventRef = EventManager.EventFromPath(pathProperty.stringValue);
float width = style.CalcSize(new GUIContent("<b>Oneshot</b>")).x;
Rect labelRect = new Rect(position.x, position.y + baseHeight * 2, width, baseHeight);
Rect valueRect = new Rect(position.x + width + 10, position.y + baseHeight * 2, pathRect.width, baseHeight);
if (pathProperty.stringValue.StartsWith("{"))
{
GUI.Label(labelRect, new GUIContent("<b>Path</b>"), style);
EditorGUI.SelectableLabel(valueRect, eventRef.Path);
}
else
{
GUI.Label(labelRect, new GUIContent("<b>GUID</b>"), style);
EditorGUI.SelectableLabel(valueRect, eventRef.Guid.ToString("b"));
}
labelRect.y += baseHeight;
valueRect.y += baseHeight;
GUI.Label(labelRect, new GUIContent("<b>Banks</b>"), style);
GUI.Label(valueRect, string.Join(", ", eventRef.Banks.Select(x => x.Name).ToArray()));
labelRect.y += baseHeight;
valueRect.y += baseHeight;
GUI.Label(labelRect, new GUIContent("<b>Panning</b>"), style);
GUI.Label(valueRect, eventRef.Is3D ? "3D" : "2D");
labelRect.y += baseHeight;
valueRect.y += baseHeight;
GUI.Label(labelRect, new GUIContent("<b>Stream</b>"), style);
GUI.Label(valueRect, eventRef.IsStream.ToString());
labelRect.y += baseHeight;
valueRect.y += baseHeight;
GUI.Label(labelRect, new GUIContent("<b>Oneshot</b>"), style);
GUI.Label(valueRect, eventRef.IsOneShot.ToString());
labelRect.y += baseHeight;
valueRect.y += baseHeight;
}
}
else
{
Rect labelRect = new Rect(position.x, position.y + baseHeight, position.width, baseHeight);
GUI.Label(labelRect, new GUIContent("Event Not Found", EditorGUIUtility.Load("FMOD/NotFound.png") as Texture2D));
}
EditorGUI.EndProperty();
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
bool expanded = property.isExpanded && !string.IsNullOrEmpty(property.stringValue) && EventManager.EventFromPath(property.stringValue) != null;
float baseHeight = GUI.skin.textField.CalcSize(new GUIContent()).y;
return baseHeight * (expanded ? 7 : 2); // 6 lines of info
}
}
}