SignalReceiverTreeView.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor.IMGUI.Controls;
  4. using UnityEngine;
  5. using UnityEngine.Timeline;
  6. namespace UnityEditor.Timeline.Signals
  7. {
  8. class SignalReceiverTreeView : TreeView
  9. {
  10. public bool dirty { private get; set; }
  11. SerializedProperty signals { get; set; }
  12. SerializedProperty events { get; set; }
  13. readonly SignalReceiver m_Target;
  14. const float k_VerticalPadding = 5;
  15. const float k_HorizontalPadding = 5;
  16. public SignalReceiverTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader, SignalReceiver receiver, SerializedObject serializedObject)
  17. : base(state, multiColumnHeader)
  18. {
  19. m_Target = receiver;
  20. useScrollView = true;
  21. SetSerializedProperties(serializedObject);
  22. getNewSelectionOverride = (item, selection, shift) => new List<int>(); // Disable Selection
  23. }
  24. SignalAsset signalAssetContext { get; set; }
  25. public bool readonlySignals { get; set; }
  26. public void SetSignalContext(SignalAsset assetContext = null)
  27. {
  28. signalAssetContext = assetContext;
  29. dirty = true;
  30. }
  31. void SetSerializedProperties(SerializedObject serializedObject)
  32. {
  33. signals = SignalReceiverUtility.FindSignalsProperty(serializedObject);
  34. events = SignalReceiverUtility.FindEventsProperty(serializedObject);
  35. Reload();
  36. }
  37. public void Draw()
  38. {
  39. var rect = EditorGUILayout.GetControlRect(true, GetTotalHeight());
  40. OnGUI(rect);
  41. }
  42. public void RefreshIfDirty()
  43. {
  44. var signalsListSizeHasChanged = signals.arraySize != GetRows().Count;
  45. if (dirty || signalsListSizeHasChanged)
  46. Reload();
  47. dirty = false;
  48. }
  49. public static MultiColumnHeaderState.Column[] GetColumns()
  50. {
  51. return new[]
  52. {
  53. new MultiColumnHeaderState.Column
  54. {
  55. headerContent = EditorGUIUtility.TrTextContent("Signal"),
  56. contextMenuText = "",
  57. headerTextAlignment = TextAlignment.Center,
  58. width = 50, minWidth = 50,
  59. autoResize = true,
  60. allowToggleVisibility = false,
  61. canSort = false
  62. },
  63. new MultiColumnHeaderState.Column
  64. {
  65. headerContent = EditorGUIUtility.TrTextContent("Reaction"),
  66. contextMenuText = "",
  67. headerTextAlignment = TextAlignment.Center,
  68. width = 120, minWidth = 120,
  69. autoResize = true,
  70. allowToggleVisibility = false,
  71. canSort = false
  72. }
  73. };
  74. }
  75. protected override TreeViewItem BuildRoot()
  76. {
  77. var root = new TreeViewItem(-1, -1) { children = new List<TreeViewItem>() };
  78. var matchingId = signalAssetContext != null && readonlySignals ? FindIdForSignal(signals, signalAssetContext) : -1;
  79. if (matchingId >= 0)
  80. AddItem(root, matchingId);
  81. for (var i = 0; i < signals.arraySize; ++i)
  82. {
  83. if (i == matchingId) continue;
  84. AddItem(root, i, !readonlySignals);
  85. }
  86. return root;
  87. }
  88. protected override void RowGUI(RowGUIArgs args)
  89. {
  90. var item = (SignalReceiverItem)args.item;
  91. for (var i = 0; i < args.GetNumVisibleColumns(); ++i)
  92. {
  93. var rect = args.GetCellRect(i);
  94. rect.y += k_VerticalPadding;
  95. item.Draw(rect, args.GetColumn(i), args.row, k_HorizontalPadding, m_Target);
  96. }
  97. }
  98. protected override float GetCustomRowHeight(int row, TreeViewItem treeItem)
  99. {
  100. var item = treeItem as SignalReceiverItem;
  101. return item.GetHeight() + k_VerticalPadding;
  102. }
  103. void AddItem(TreeViewItem root, int id, bool enabled = true)
  104. {
  105. var signal = signals.GetArrayElementAtIndex(id);
  106. var evt = events.GetArrayElementAtIndex(id);
  107. root.children.Add(new SignalReceiverItem(signal, evt, id, readonlySignals, enabled, this));
  108. }
  109. float GetTotalHeight()
  110. {
  111. var height = 0.0f;
  112. foreach (var item in GetRows())
  113. {
  114. var signalListItem = item as SignalReceiverItem;
  115. height += signalListItem.GetHeight() + k_VerticalPadding;
  116. }
  117. var scrollbarPadding = showingHorizontalScrollBar ? GUI.skin.horizontalScrollbar.fixedHeight : k_VerticalPadding;
  118. return height + multiColumnHeader.height + scrollbarPadding;
  119. }
  120. static int FindIdForSignal(SerializedProperty signals, SignalAsset signalToFind)
  121. {
  122. for (var i = 0; i < signals.arraySize; ++i)
  123. {
  124. //signal in the receiver that matches the current signal asset will be displayed first
  125. var serializedProperty = signals.GetArrayElementAtIndex(i);
  126. var signalReferenceValue = serializedProperty.objectReferenceValue;
  127. var signalToFindRefValue = signalToFind;
  128. if (signalReferenceValue != null && signalReferenceValue == signalToFindRefValue)
  129. return i;
  130. }
  131. return -1;
  132. }
  133. }
  134. }