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.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(); 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.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("Oneshot")).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("Path"), style); EditorGUI.SelectableLabel(valueRect, eventRef.Path); } else { GUI.Label(labelRect, new GUIContent("GUID"), style); EditorGUI.SelectableLabel(valueRect, eventRef.Guid.ToString("b")); } labelRect.y += baseHeight; valueRect.y += baseHeight; GUI.Label(labelRect, new GUIContent("Banks"), style); GUI.Label(valueRect, string.Join(", ", eventRef.Banks.Select(x => x.Name).ToArray())); labelRect.y += baseHeight; valueRect.y += baseHeight; GUI.Label(labelRect, new GUIContent("Panning"), style); GUI.Label(valueRect, eventRef.Is3D ? "3D" : "2D"); labelRect.y += baseHeight; valueRect.y += baseHeight; GUI.Label(labelRect, new GUIContent("Stream"), style); GUI.Label(valueRect, eventRef.IsStream.ToString()); labelRect.y += baseHeight; valueRect.y += baseHeight; GUI.Label(labelRect, new GUIContent("Oneshot"), 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 } } }