123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.Timeline;
- using Object = UnityEngine.Object;
- namespace UnityEditor.Timeline.Signals
- {
- class SignalReceiverItem : TreeViewItem, ISignalAssetProvider
- {
- static readonly SignalEventDrawer k_EvtDrawer = new SignalEventDrawer();
- readonly SerializedProperty m_Asset;
- readonly SerializedProperty m_Evt;
- readonly SignalReceiverTreeView m_TreeView;
- int m_CurrentRowIdx;
- SignalReceiver m_CurrentReceiver;
- internal readonly bool enabled;
- internal readonly bool readonlySignal;
- internal const string SignalName = "SignalName";
- internal const string SignalNameReadOnly = "SignalNameReadOnly";
- internal const string SignalOptions = "SignalOptions";
- public SignalReceiverItem(SerializedProperty signalAsset, SerializedProperty eventListEntry, int id, bool readonlySignal, bool enabled, SignalReceiverTreeView treeView)
- : base(id, 0)
- {
- m_Asset = signalAsset;
- m_Evt = eventListEntry;
- this.enabled = enabled;
- this.readonlySignal = readonlySignal;
- m_TreeView = treeView;
- }
- public SignalAsset signalAsset
- {
- get { return m_CurrentReceiver.GetSignalAssetAtIndex(m_CurrentRowIdx); }
- set
- {
- Undo.RegisterCompleteObjectUndo(m_CurrentReceiver, Styles.UndoCreateSignalAsset);
- m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, value);
- }
- }
- public float GetHeight()
- {
- return k_EvtDrawer.GetPropertyHeight(m_Evt, GUIContent.none);
- }
- public void Draw(Rect rect, int colIdx, int rowIdx, float padding, SignalReceiver target)
- {
- switch (colIdx)
- {
- case 0:
- DrawSignalNameColumn(rect, padding, target, rowIdx);
- break;
- case 1:
- DrawReactionColumn(rect, rowIdx);
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
- }
- void DrawSignalNameColumn(Rect rect, float padding, SignalReceiver target, int rowIdx)
- {
- using (new EditorGUI.DisabledScope(!enabled))
- {
- if (!readonlySignal)
- {
- m_CurrentRowIdx = rowIdx;
- m_CurrentReceiver = target;
- rect.x += padding;
- rect.width -= padding;
- rect.height = EditorGUIUtility.singleLineHeight;
- GUI.SetNextControlName(SignalName);
- SignalUtility.DrawSignalNames(this, rect, GUIContent.none, false);
- }
- else
- {
- GUI.SetNextControlName(SignalNameReadOnly);
- var signalAsset = m_Asset.objectReferenceValue;
- GUI.Label(rect,
- signalAsset != null
- ? EditorGUIUtility.TempContent(signalAsset.name)
- : Styles.EmptySignalList);
- }
- }
- }
- void DrawReactionColumn(Rect rect, int rowIdx)
- {
- if (!readonlySignal)
- {
- var optionButtonSize = GetOptionButtonSize();
- rect.width -= optionButtonSize.x;
- var optionButtonRect = new Rect
- {
- x = rect.xMax,
- y = rect.y,
- width = optionButtonSize.x,
- height = optionButtonSize.y
- };
- DrawOptionsButton(optionButtonRect, rowIdx, m_CurrentReceiver);
- }
- using (new EditorGUI.DisabledScope(!enabled))
- {
- var nameAsString = m_Asset.objectReferenceValue == null ? "Null" : m_Asset.objectReferenceValue.name;
- using (var change = new EditorGUI.ChangeCheckScope())
- {
- EditorGUI.PropertyField(rect, m_Evt, EditorGUIUtility.TempContent(nameAsString));
- if (change.changed)
- m_TreeView.dirty = true;
- }
- }
- }
- static Vector2 GetOptionButtonSize()
- {
- EditorGUIUtility.SetIconSize(Vector2.zero);
- return EditorStyles.iconButton.CalcSize(EditorGUI.GUIContents.titleSettingsIcon);
- }
- void DrawOptionsButton(Rect rect, int rowIdx, SignalReceiver target)
- {
- GUI.SetNextControlName(SignalOptions);
- if (EditorGUI.DropdownButton(rect, EditorGUI.GUIContents.titleSettingsIcon, FocusType.Passive, EditorStyles.iconButton))
- {
- var menu = new GenericMenu();
- menu.AddItem(new GUIContent(Styles.SignalListDuplicateOption), false, () =>
- {
- Undo.RegisterCompleteObjectUndo(target, "Duplicate Row");
- var evtCloner = ScriptableObject.CreateInstance<UnityEventCloner>();
- evtCloner.evt = target.GetReactionAtIndex(rowIdx);
- var clone = Object.Instantiate(evtCloner);
- target.AddEmptyReaction(clone.evt);
- m_TreeView.dirty = true;
- });
- menu.AddItem(new GUIContent(Styles.SignalListDeleteOption), false, () =>
- {
- Undo.RegisterCompleteObjectUndo(target, "Delete Row");
- target.RemoveAtIndex(rowIdx);
- m_TreeView.dirty = true;
- });
- menu.ShowAsContext();
- }
- }
- IEnumerable<SignalAsset> ISignalAssetProvider.AvailableSignalAssets()
- {
- var ret = SignalManager.assets.Except(m_CurrentReceiver.GetRegisteredSignals());
- return signalAsset == null ? ret : ret.Union(new List<SignalAsset> {signalAsset}).ToList();
- }
- void ISignalAssetProvider.CreateNewSignalAsset(string path)
- {
- var newSignalAsset = SignalManager.CreateSignalAssetInstance(path);
- m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, newSignalAsset);
- }
- class UnityEventCloner : ScriptableObject
- {
- public UnityEvent evt;
- }
- }
- }
|