126 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Events; | ||
|  | using UnityEngine.Timeline; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline.Signals | ||
|  | { | ||
|  |     interface ISignalAssetProvider | ||
|  |     { | ||
|  |         SignalAsset signalAsset { get; set; } | ||
|  |         IEnumerable<SignalAsset> AvailableSignalAssets(); | ||
|  |         void CreateNewSignalAsset(string path); | ||
|  |     } | ||
|  | 
 | ||
|  |     static class SignalUtility | ||
|  |     { | ||
|  |         const string k_SignalExtension = "signal"; | ||
|  | 
 | ||
|  |         public static void DrawSignalNames(ISignalAssetProvider assetProvider, Rect position, GUIContent label, bool multipleValues) | ||
|  |         { | ||
|  |             var assets = assetProvider.AvailableSignalAssets().ToList(); | ||
|  |             var index = assets.IndexOf(assetProvider.signalAsset); | ||
|  | 
 | ||
|  |             var availableNames = new List<string>(); | ||
|  |             using (new GUIMixedValueScope(multipleValues)) | ||
|  |             { | ||
|  |                 availableNames.Add(Styles.EmptySignalList.text); | ||
|  | 
 | ||
|  |                 availableNames.AddRange(assets.Select(x => x.name)); | ||
|  |                 availableNames.Add(Styles.CreateNewSignal.text); | ||
|  | 
 | ||
|  |                 var curValue = index + 1; | ||
|  |                 var selected = EditorGUI.Popup(position, label, curValue, availableNames.ToArray()); | ||
|  | 
 | ||
|  |                 if (selected != curValue) | ||
|  |                 { | ||
|  |                     var noneEntryIdx = 0; | ||
|  |                     if (selected == noneEntryIdx) // None | ||
|  |                         assetProvider.signalAsset = null; | ||
|  |                     else if (selected == availableNames.Count - 1) // "Create New Asset" | ||
|  |                     { | ||
|  |                         var path = GetNewSignalPath(); | ||
|  |                         if (!string.IsNullOrEmpty(path)) | ||
|  |                             assetProvider.CreateNewSignalAsset(path); | ||
|  |                         GUIUtility.ExitGUI(); | ||
|  |                     } | ||
|  |                     else | ||
|  |                         assetProvider.signalAsset = assets[selected - 1]; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetNewSignalPath() | ||
|  |         { | ||
|  |             return EditorUtility.SaveFilePanelInProject( | ||
|  |                 Styles.NewSignalWindowTitle.text, | ||
|  |                 Styles.NewSignalDefaultName.text, | ||
|  |                 k_SignalExtension, | ||
|  |                 Styles.NewSignalWindowMessage.text); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool IsSignalAssetHandled(this SignalReceiver receiver, SignalAsset asset) | ||
|  |         { | ||
|  |             return receiver != null && asset != null && receiver.GetRegisteredSignals().Contains(asset); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void AddNewReaction(this SignalReceiver receiver, SignalAsset signalAsset) | ||
|  |         { | ||
|  |             if (signalAsset != null && receiver != null) | ||
|  |             { | ||
|  |                 Undo.RecordObject(receiver, Styles.UndoAddReaction); | ||
|  |                 var newEvent = new UnityEvent(); | ||
|  |                 newEvent.AddPersistentListener(); | ||
|  |                 var evtIndex = newEvent.GetPersistentEventCount() - 1; | ||
|  |                 newEvent.RegisterVoidPersistentListenerWithoutValidation(evtIndex, receiver.gameObject, string.Empty); | ||
|  |                 receiver.AddReaction(signalAsset, newEvent); | ||
|  |                 PrefabUtility.RecordPrefabInstancePropertyModifications(receiver); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void DrawCenteredMessage(string message) | ||
|  |         { | ||
|  |             using (new GUILayout.HorizontalScope()) | ||
|  |             { | ||
|  |                 GUILayout.FlexibleSpace(); | ||
|  |                 GUILayout.Label(message); | ||
|  |                 GUILayout.FlexibleSpace(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool DrawCenteredButton(GUIContent buttonLabel) | ||
|  |         { | ||
|  |             bool buttonClicked; | ||
|  |             using (new GUILayout.HorizontalScope()) | ||
|  |             { | ||
|  |                 GUILayout.FlexibleSpace(); | ||
|  |                 buttonClicked = GUILayout.Button(buttonLabel); | ||
|  |                 GUILayout.FlexibleSpace(); | ||
|  |             } | ||
|  |             return buttonClicked; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     static class SignalReceiverUtility | ||
|  |     { | ||
|  |         const int k_DefaultTreeviewHeaderHeight = 20; | ||
|  | 
 | ||
|  |         public static int headerHeight | ||
|  |         { | ||
|  |             get { return k_DefaultTreeviewHeaderHeight; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static SerializedProperty FindSignalsProperty(SerializedObject obj) | ||
|  |         { | ||
|  |             return obj.FindProperty("m_Events.m_Signals"); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static SerializedProperty FindEventsProperty(SerializedObject obj) | ||
|  |         { | ||
|  |             return obj.FindProperty("m_Events.m_Events"); | ||
|  |         } | ||
|  |     } | ||
|  | } |