From c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Sun, 19 Apr 2020 17:19:32 -0400 Subject: Inital commit --- .../Editor/Signals/TreeView/SignalListFactory.cs | 31 ++++ .../Signals/TreeView/SignalListFactory.cs.meta | 11 ++ .../Editor/Signals/TreeView/SignalReceiverItem.cs | 180 +++++++++++++++++++++ .../Signals/TreeView/SignalReceiverItem.cs.meta | 11 ++ .../Signals/TreeView/SignalReceiverTreeView.cs | 155 ++++++++++++++++++ .../TreeView/SignalReceiverTreeView.cs.meta | 11 ++ 6 files changed, 399 insertions(+) create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs.meta create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs.meta create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs.meta (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView') diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs new file mode 100644 index 0000000..1b59ec6 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs @@ -0,0 +1,31 @@ +using System; +using UnityEditor.IMGUI.Controls; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline.Signals +{ + static class SignalListFactory + { + public static SignalReceiverTreeView CreateSignalInspectorList(TreeViewState state, SignalReceiverHeader header, SignalReceiver target, SerializedObject so) + { + return new SignalReceiverTreeView(state, header, target, so); + } + + public static SignalReceiverHeader CreateHeader(MultiColumnHeaderState state, int columnHeight) + { + var header = new SignalReceiverHeader(state) { height = columnHeight }; + header.ResizeToFit(); + return header; + } + + public static MultiColumnHeaderState CreateHeaderState() + { + return new MultiColumnHeaderState(SignalReceiverTreeView.GetColumns()); + } + + public static TreeViewState CreateViewState() + { + return new TreeViewState(); + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs.meta new file mode 100644 index 0000000..fcc2a87 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalListFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01cd96d8687272f4898cfd1562079dd7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs new file mode 100644 index 0000000..a58b2fe --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs @@ -0,0 +1,180 @@ +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.RecordObject(m_CurrentReceiver, Styles.UndoCreateSignalAsset); + m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, value); + PrefabUtility.RecordPrefabInstancePropertyModifications(m_CurrentReceiver); + } + } + + 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.RecordObject(target, Styles.UndoDuplicateRow); + var evtCloner = ScriptableObject.CreateInstance(); + evtCloner.evt = target.GetReactionAtIndex(rowIdx); + var clone = Object.Instantiate(evtCloner); + target.AddEmptyReaction(clone.evt); + m_TreeView.dirty = true; + PrefabUtility.RecordPrefabInstancePropertyModifications(target); + + }); + menu.AddItem(new GUIContent(Styles.SignalListDeleteOption), false, () => + { + Undo.RecordObject(target, Styles.UndoDeleteRow); + target.RemoveAtIndex(rowIdx); + m_TreeView.dirty = true; + PrefabUtility.RecordPrefabInstancePropertyModifications(target); + }); + menu.ShowAsContext(); + } + } + + IEnumerable ISignalAssetProvider.AvailableSignalAssets() + { + var ret = SignalManager.assets.Except(m_CurrentReceiver.GetRegisteredSignals()); + return signalAsset == null ? ret : ret.Union(new List {signalAsset}).ToList(); + } + + void ISignalAssetProvider.CreateNewSignalAsset(string path) + { + var newSignalAsset = SignalManager.CreateSignalAssetInstance(path); + Undo.RecordObject(m_CurrentReceiver, Styles.UndoCreateSignalAsset); + m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, newSignalAsset); + PrefabUtility.RecordPrefabInstancePropertyModifications(m_CurrentReceiver); + } + + class UnityEventCloner : ScriptableObject + { + public UnityEvent evt; + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs.meta new file mode 100644 index 0000000..826e615 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bc2b69915879416f8df18971dc98e2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs new file mode 100644 index 0000000..abacd72 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using UnityEditor.IMGUI.Controls; +using UnityEngine; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline.Signals +{ + class SignalReceiverTreeView : TreeView + { + public bool dirty { private get; set; } + + SerializedProperty signals { get; set; } + SerializedProperty events { get; set; } + + readonly SignalReceiver m_Target; + + const float k_VerticalPadding = 5; + const float k_HorizontalPadding = 5; + + public SignalReceiverTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader, SignalReceiver receiver, SerializedObject serializedObject) + : base(state, multiColumnHeader) + { + m_Target = receiver; + useScrollView = true; + SetSerializedProperties(serializedObject); + getNewSelectionOverride = (item, selection, shift) => new List(); // Disable Selection + } + + SignalAsset signalAssetContext { get; set; } + public bool readonlySignals { get; set; } + + public void SetSignalContext(SignalAsset assetContext = null) + { + signalAssetContext = assetContext; + dirty = true; + } + + void SetSerializedProperties(SerializedObject serializedObject) + { + signals = SignalReceiverUtility.FindSignalsProperty(serializedObject); + events = SignalReceiverUtility.FindEventsProperty(serializedObject); + Reload(); + } + + public void Draw() + { + var rect = EditorGUILayout.GetControlRect(true, GetTotalHeight()); + OnGUI(rect); + } + + public void RefreshIfDirty() + { + var signalsListSizeHasChanged = signals.arraySize != GetRows().Count; + if (dirty || signalsListSizeHasChanged) + Reload(); + dirty = false; + } + + public static MultiColumnHeaderState.Column[] GetColumns() + { + return new[] + { + new MultiColumnHeaderState.Column + { + headerContent = EditorGUIUtility.TrTextContent("Signal"), + contextMenuText = "", + headerTextAlignment = TextAlignment.Center, + width = 50, minWidth = 50, + autoResize = true, + allowToggleVisibility = false, + canSort = false + }, + new MultiColumnHeaderState.Column + { + headerContent = EditorGUIUtility.TrTextContent("Reaction"), + contextMenuText = "", + headerTextAlignment = TextAlignment.Center, + width = 120, minWidth = 120, + autoResize = true, + allowToggleVisibility = false, + canSort = false + } + }; + } + + protected override TreeViewItem BuildRoot() + { + var root = new TreeViewItem(-1, -1) { children = new List() }; + + var matchingId = signalAssetContext != null && readonlySignals ? FindIdForSignal(signals, signalAssetContext) : -1; + if (matchingId >= 0) + AddItem(root, matchingId); + + for (var i = 0; i < signals.arraySize; ++i) + { + if (i == matchingId) continue; + AddItem(root, i, !readonlySignals); + } + + return root; + } + + protected override void RowGUI(RowGUIArgs args) + { + var item = (SignalReceiverItem)args.item; + for (var i = 0; i < args.GetNumVisibleColumns(); ++i) + { + var rect = args.GetCellRect(i); + rect.y += k_VerticalPadding; + item.Draw(rect, args.GetColumn(i), args.row, k_HorizontalPadding, m_Target); + } + } + + protected override float GetCustomRowHeight(int row, TreeViewItem treeItem) + { + var item = treeItem as SignalReceiverItem; + return item.GetHeight() + k_VerticalPadding; + } + + void AddItem(TreeViewItem root, int id, bool enabled = true) + { + var signal = signals.GetArrayElementAtIndex(id); + var evt = events.GetArrayElementAtIndex(id); + root.children.Add(new SignalReceiverItem(signal, evt, id, readonlySignals, enabled, this)); + } + + float GetTotalHeight() + { + var height = 0.0f; + foreach (var item in GetRows()) + { + var signalListItem = item as SignalReceiverItem; + height += signalListItem.GetHeight() + k_VerticalPadding; + } + + var scrollbarPadding = showingHorizontalScrollBar ? GUI.skin.horizontalScrollbar.fixedHeight : k_VerticalPadding; + return height + multiColumnHeader.height + scrollbarPadding; + } + + static int FindIdForSignal(SerializedProperty signals, SignalAsset signalToFind) + { + for (var i = 0; i < signals.arraySize; ++i) + { + //signal in the receiver that matches the current signal asset will be displayed first + var serializedProperty = signals.GetArrayElementAtIndex(i); + var signalReferenceValue = serializedProperty.objectReferenceValue; + var signalToFindRefValue = signalToFind; + if (signalReferenceValue != null && signalReferenceValue == signalToFindRefValue) + return i; + } + return -1; + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs.meta new file mode 100644 index 0000000..7c121bf --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 698b660e9477f4f16abad03ec00ce38c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.2.3