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");
 | |
|         }
 | |
|     }
 | |
| }
 |