SignalUtility.cs 4.3 KB

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