A game about forced loneliness, made by TACStudios
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}