IncludedAssembliesTreeView.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using UnityEditor.IMGUI.Controls;
  2. using UnityEditor.Compilation;
  3. using System.Text.RegularExpressions;
  4. using System.Text;
  5. using System.Linq;
  6. using System;
  7. using UnityEngine;
  8. using UnityEditor.TestTools.CodeCoverage.Analytics;
  9. namespace UnityEditor.TestTools.CodeCoverage
  10. {
  11. class IncludedAssembliesTreeView : TreeView
  12. {
  13. string m_AssembliesToInclude;
  14. CodeCoverageWindow m_Parent;
  15. const float kCheckBoxWidth = 42f;
  16. public float Width { get; set; } = 100f;
  17. public IncludedAssembliesTreeView(CodeCoverageWindow parent, string assembliesToInclude)
  18. : base(new TreeViewState())
  19. {
  20. m_AssembliesToInclude = assembliesToInclude;
  21. m_Parent = parent;
  22. showAlternatingRowBackgrounds = true;
  23. showBorder = true;
  24. Reload();
  25. }
  26. protected override bool CanMultiSelect(TreeViewItem item)
  27. {
  28. return false;
  29. }
  30. protected override TreeViewItem BuildRoot()
  31. {
  32. string[] includeAssemblyFilters = m_AssembliesToInclude.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  33. Regex[] includeAssemblies = includeAssemblyFilters
  34. .Select(f => AssemblyFiltering.CreateFilterRegex(f))
  35. .ToArray();
  36. TreeViewItem root = new TreeViewItem(-1, -1);
  37. Assembly[] assemblies = CompilationPipeline.GetAssemblies();
  38. Array.Sort(assemblies, (x, y) => String.Compare(x.name, y.name));
  39. int assembliesLength = assemblies.Length;
  40. GUIContent textContent = new GUIContent();
  41. for (int i = 0; i < assembliesLength; ++i)
  42. {
  43. Assembly assembly = assemblies[i];
  44. bool enabled = includeAssemblies.Any(f => f.IsMatch(assembly.name.ToLowerInvariant()));
  45. root.AddChild(new AssembliesTreeViewItem() { id = i+1, displayName = assembly.name, Enabled = enabled });
  46. textContent.text = assembly.name;
  47. float itemWidth = TreeView.DefaultStyles.label.CalcSize(textContent).x + kCheckBoxWidth;
  48. if (Width < itemWidth)
  49. Width = itemWidth;
  50. }
  51. return root;
  52. }
  53. protected override void RowGUI(RowGUIArgs args)
  54. {
  55. AssembliesTreeViewItem item = args.item as AssembliesTreeViewItem;
  56. EditorGUI.BeginChangeCheck();
  57. bool enabled = EditorGUI.ToggleLeft(args.rowRect, args.label, item.Enabled);
  58. if (EditorGUI.EndChangeCheck())
  59. {
  60. item.Enabled = enabled;
  61. ApplyChanges();
  62. }
  63. }
  64. public void SelectAll()
  65. {
  66. ToggleAll(true);
  67. }
  68. public void DeselectAll()
  69. {
  70. ToggleAll(false);
  71. }
  72. private void ToggleAll(bool enabled)
  73. {
  74. foreach (var child in rootItem.children)
  75. {
  76. AssembliesTreeViewItem childItem = child as AssembliesTreeViewItem;
  77. if (searchString == null)
  78. childItem.Enabled = enabled;
  79. else if (DoesItemMatchSearch(child, searchString))
  80. childItem.Enabled = enabled;
  81. }
  82. ApplyChanges();
  83. }
  84. void ApplyChanges()
  85. {
  86. CoverageAnalytics.instance.CurrentCoverageEvent.updateAssembliesDialog = true;
  87. StringBuilder sb = new StringBuilder();
  88. foreach(var child in rootItem.children)
  89. {
  90. AssembliesTreeViewItem childItem = child as AssembliesTreeViewItem;
  91. if (childItem.Enabled)
  92. {
  93. if (sb.Length > 0)
  94. sb.Append(",");
  95. sb.Append(childItem.displayName);
  96. }
  97. }
  98. m_Parent.AssembliesToInclude = sb.ToString();
  99. m_Parent.Repaint();
  100. }
  101. }
  102. class AssembliesTreeViewItem : TreeViewItem
  103. {
  104. public bool Enabled { get; set; }
  105. }
  106. }