BindingTreeViewDataSource.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEditor;
  4. using UnityEditor.IMGUI.Controls;
  5. using UnityEditor.Timeline;
  6. using UnityEngine;
  7. namespace UnityEditorInternal
  8. {
  9. class BindingTreeViewDataSource : TreeViewDataSource
  10. {
  11. public const int RootID = int.MinValue;
  12. public const int GroupID = -1;
  13. AnimationClip m_Clip;
  14. CurveDataSource m_CurveDataSource;
  15. public BindingTreeViewDataSource(
  16. TreeViewController treeView, AnimationClip clip, CurveDataSource curveDataSource)
  17. : base(treeView)
  18. {
  19. m_Clip = clip;
  20. showRootItem = false;
  21. m_CurveDataSource = curveDataSource;
  22. }
  23. void SetupRootNodeSettings()
  24. {
  25. showRootItem = false;
  26. SetExpanded(RootID, true);
  27. SetExpanded(GroupID, true);
  28. }
  29. static string GroupName(EditorCurveBinding binding)
  30. {
  31. string property = AnimationWindowUtility.NicifyPropertyGroupName(binding.type, binding.propertyName);
  32. if (!string.IsNullOrEmpty(binding.path))
  33. {
  34. property = binding.path + " : " + property;
  35. }
  36. return property;
  37. }
  38. static string PropertyName(EditorCurveBinding binding)
  39. {
  40. return AnimationWindowUtility.GetPropertyDisplayName(binding.propertyName);
  41. }
  42. public override void FetchData()
  43. {
  44. if (m_Clip == null)
  45. return;
  46. var bindings = AnimationUtility.GetCurveBindings(m_Clip)
  47. .Union(AnimationUtility.GetObjectReferenceCurveBindings(m_Clip))
  48. .ToArray();
  49. var results = bindings.GroupBy(p => GroupName(p), p => p, (key, g) => new
  50. {
  51. parent = key,
  52. bindings = g.ToList()
  53. }).OrderBy(t =>
  54. {
  55. //Force transform order first
  56. if (t.parent == "Position") return -3;
  57. if (t.parent == "Rotation") return -2;
  58. if (t.parent == "Scale") return -1;
  59. return 0;
  60. }).ThenBy(t => t.parent);
  61. m_RootItem = new CurveTreeViewNode(RootID, null, "root", null)
  62. {
  63. children = new List<TreeViewItem>(1)
  64. };
  65. var groupingNode = new CurveTreeViewNode(GroupID, m_RootItem, m_CurveDataSource.groupingName, bindings)
  66. {
  67. children = new List<TreeViewItem>()
  68. };
  69. m_RootItem.children.Add(groupingNode);
  70. foreach (var r in results)
  71. {
  72. var newNode = new CurveTreeViewNode(r.parent.GetHashCode(), groupingNode, r.parent, r.bindings.ToArray());
  73. groupingNode.children.Add(newNode);
  74. if (r.bindings.Count > 1)
  75. {
  76. for (int b = 0; b < r.bindings.Count; b++)
  77. {
  78. if (newNode.children == null)
  79. newNode.children = new List<TreeViewItem>();
  80. var binding = r.bindings[b];
  81. var bindingNode = new CurveTreeViewNode(binding.GetHashCode(), newNode, PropertyName(binding), new[] {binding});
  82. newNode.children.Add(bindingNode);
  83. }
  84. }
  85. }
  86. SetupRootNodeSettings();
  87. m_NeedRefreshRows = true;
  88. }
  89. public void UpdateData()
  90. {
  91. m_TreeView.ReloadData();
  92. }
  93. }
  94. class CurveTreeViewNode : TreeViewItem
  95. {
  96. EditorCurveBinding[] m_Bindings;
  97. public EditorCurveBinding[] bindings
  98. {
  99. get { return m_Bindings; }
  100. }
  101. public CurveTreeViewNode(int id, TreeViewItem parent, string displayName, EditorCurveBinding[] bindings)
  102. : base(id, parent != null ? parent.depth + 1 : -1, parent, displayName)
  103. {
  104. m_Bindings = bindings;
  105. }
  106. }
  107. }