using UnityEngine; using UnityObject = UnityEngine.Object; using UnityEditor.IMGUI.Controls; using UnityEngine.Events; using UnityEngine.Timeline; namespace UnityEditor.Timeline.Signals { [CustomEditor(typeof(SignalReceiver))] class SignalReceiverInspector : Editor { SignalReceiver m_Target; [SerializeField] TreeViewState m_TreeState; [SerializeField] MultiColumnHeaderState m_MultiColumnHeaderState; internal SignalReceiverTreeView m_TreeView; SignalEmitter signalEmitterContext { get { return m_Context as SignalEmitter; } } void OnEnable() { m_Target = target as SignalReceiver; InitTreeView(serializedObject); Undo.undoRedoPerformed += OnUndoRedo; } void OnDisable() { Undo.undoRedoPerformed -= OnUndoRedo; } void OnUndoRedo() { m_TreeView.dirty = true; } public override void OnInspectorGUI() { serializedObject.Update(); using (var changeCheck = new EditorGUI.ChangeCheckScope()) { m_TreeView.RefreshIfDirty(); DrawEmitterControls(); // Draws buttons coming from the Context (SignalEmitter) EditorGUILayout.Space(); m_TreeView.Draw(); if (signalEmitterContext == null) DrawAddRemoveButtons(); if (changeCheck.changed) { serializedObject.ApplyModifiedProperties(); m_TreeView.dirty = true; } } } void DrawEmitterControls() { var context = signalEmitterContext; if (context != null) { var currentSignal = context.asset; if (currentSignal != null && !m_Target.IsSignalAssetHandled(currentSignal)) { EditorGUILayout.Separator(); var message = string.Format(Styles.NoReaction, currentSignal.name); SignalUtility.DrawCenteredMessage(message); if (SignalUtility.DrawCenteredButton(Styles.AddReactionButton)) m_Target.AddNewReaction(currentSignal); // Add reaction on the first EditorGUILayout.Separator(); } } } internal void SetAssetContext(SignalAsset asset) { m_TreeView.SetSignalContext(asset); } void DrawAddRemoveButtons() { using (new GUILayout.HorizontalScope()) { GUILayout.FlexibleSpace(); if (GUILayout.Button(Styles.AddReactionButton)) { Undo.RecordObject(m_Target, Styles.UndoAddReaction); m_Target.AddEmptyReaction(new UnityEvent()); PrefabUtility.RecordPrefabInstancePropertyModifications(m_Target); } GUILayout.Space(18.0f); } } void InitTreeView(SerializedObject so) { m_TreeState = SignalListFactory.CreateViewState(); m_MultiColumnHeaderState = SignalListFactory.CreateHeaderState(); var header = SignalListFactory.CreateHeader(m_MultiColumnHeaderState, SignalReceiverUtility.headerHeight); var context = signalEmitterContext; m_TreeView = SignalListFactory.CreateSignalInspectorList(m_TreeState, header, m_Target, so); m_TreeView.readonlySignals = context != null; if (context != null) m_TreeView.SetSignalContext(context.asset); } } }