diff options
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Signals/TreeView/SignalReceiverTreeView.cs | 155 |
1 files changed, 155 insertions, 0 deletions
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<int>(); // 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<TreeViewItem>() }; + + 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; + } + } +} |
