A game about forced loneliness, made by TACStudios
at master 125 lines 4.4 kB view raw
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5using UnityEngine.Events; 6using UnityEngine.Timeline; 7 8namespace UnityEditor.Timeline.Signals 9{ 10 interface ISignalAssetProvider 11 { 12 SignalAsset signalAsset { get; set; } 13 IEnumerable<SignalAsset> AvailableSignalAssets(); 14 void CreateNewSignalAsset(string path); 15 } 16 17 static class SignalUtility 18 { 19 const string k_SignalExtension = "signal"; 20 21 public static void DrawSignalNames(ISignalAssetProvider assetProvider, Rect position, GUIContent label, bool multipleValues) 22 { 23 var assets = assetProvider.AvailableSignalAssets().ToList(); 24 var index = assets.IndexOf(assetProvider.signalAsset); 25 26 var availableNames = new List<string>(); 27 using (new GUIMixedValueScope(multipleValues)) 28 { 29 availableNames.Add(Styles.EmptySignalList.text); 30 31 availableNames.AddRange(assets.Select(x => x.name)); 32 availableNames.Add(Styles.CreateNewSignal.text); 33 34 var curValue = index + 1; 35 var selected = EditorGUI.Popup(position, label, curValue, availableNames.ToArray()); 36 37 if (selected != curValue) 38 { 39 var noneEntryIdx = 0; 40 if (selected == noneEntryIdx) // None 41 assetProvider.signalAsset = null; 42 else if (selected == availableNames.Count - 1) // "Create New Asset" 43 { 44 var path = GetNewSignalPath(); 45 if (!string.IsNullOrEmpty(path)) 46 assetProvider.CreateNewSignalAsset(path); 47 GUIUtility.ExitGUI(); 48 } 49 else 50 assetProvider.signalAsset = assets[selected - 1]; 51 } 52 } 53 } 54 55 public static string GetNewSignalPath() 56 { 57 return EditorUtility.SaveFilePanelInProject( 58 Styles.NewSignalWindowTitle.text, 59 Styles.NewSignalDefaultName.text, 60 k_SignalExtension, 61 Styles.NewSignalWindowMessage.text); 62 } 63 64 public static bool IsSignalAssetHandled(this SignalReceiver receiver, SignalAsset asset) 65 { 66 return receiver != null && asset != null && receiver.GetRegisteredSignals().Contains(asset); 67 } 68 69 public static void AddNewReaction(this SignalReceiver receiver, SignalAsset signalAsset) 70 { 71 if (signalAsset != null && receiver != null) 72 { 73 Undo.RecordObject(receiver, Styles.UndoAddReaction); 74 var newEvent = new UnityEvent(); 75 newEvent.AddPersistentListener(); 76 var evtIndex = newEvent.GetPersistentEventCount() - 1; 77 newEvent.RegisterVoidPersistentListenerWithoutValidation(evtIndex, receiver.gameObject, string.Empty); 78 receiver.AddReaction(signalAsset, newEvent); 79 PrefabUtility.RecordPrefabInstancePropertyModifications(receiver); 80 } 81 } 82 83 public static void DrawCenteredMessage(string message) 84 { 85 using (new GUILayout.HorizontalScope()) 86 { 87 GUILayout.FlexibleSpace(); 88 GUILayout.Label(message); 89 GUILayout.FlexibleSpace(); 90 } 91 } 92 93 public static bool DrawCenteredButton(GUIContent buttonLabel) 94 { 95 bool buttonClicked; 96 using (new GUILayout.HorizontalScope()) 97 { 98 GUILayout.FlexibleSpace(); 99 buttonClicked = GUILayout.Button(buttonLabel); 100 GUILayout.FlexibleSpace(); 101 } 102 return buttonClicked; 103 } 104 } 105 106 static class SignalReceiverUtility 107 { 108 const int k_DefaultTreeviewHeaderHeight = 20; 109 110 public static int headerHeight 111 { 112 get { return k_DefaultTreeviewHeaderHeight; } 113 } 114 115 public static SerializedProperty FindSignalsProperty(SerializedObject obj) 116 { 117 return obj.FindProperty("m_Events.m_Signals"); 118 } 119 120 public static SerializedProperty FindEventsProperty(SerializedObject obj) 121 { 122 return obj.FindProperty("m_Events.m_Events"); 123 } 124 } 125}