You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
6.4 KiB
C#

1 year ago
using UnityEditor.IMGUI.Controls;
using UnityEditor.Compilation;
using System.Text.RegularExpressions;
using System.Text;
using System.Linq;
using System;
using UnityEngine;
using UnityEditor.TestTools.CodeCoverage.Analytics;
namespace UnityEditor.TestTools.CodeCoverage
{
class IncludedAssembliesTreeView : TreeView
{
string m_AssembliesToInclude;
readonly CodeCoverageWindow m_Parent;
const float kCheckBoxWidth = 42f;
public float Width { get; set; } = 100f;
public IncludedAssembliesTreeView(CodeCoverageWindow parent, string assembliesToInclude)
: base(new TreeViewState())
{
m_AssembliesToInclude = assembliesToInclude;
m_Parent = parent;
showAlternatingRowBackgrounds = true;
showBorder = true;
Reload();
}
protected override bool CanMultiSelect(TreeViewItem item)
{
return false;
}
protected override TreeViewItem BuildRoot()
{
string[] includeAssemblyFilters = m_AssembliesToInclude.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Regex[] includeAssemblies = includeAssemblyFilters
.Select(f => AssemblyFiltering.CreateFilterRegex(f))
.ToArray();
TreeViewItem root = new TreeViewItem(-1, -1);
bool developerMode = EditorPrefs.GetBool("DeveloperMode", false);
if (developerMode)
{
System.Reflection.Assembly[] assemblies = AssemblyFiltering.GetAllProjectAssembliesInternal();
int assembliesLength = assemblies.Length;
GUIContent textContent = new GUIContent();
for (int i = 0; i < assembliesLength; ++i)
{
System.Reflection.Assembly assembly = assemblies[i];
bool enabled = includeAssemblies.Any(f => f.IsMatch(assembly.GetName().Name.ToLowerInvariant()));
root.AddChild(new AssembliesTreeViewItem() { id = i + 1, displayName = assembly.GetName().Name, Enabled = enabled });
textContent.text = assembly.GetName().Name;
float itemWidth = TreeView.DefaultStyles.label.CalcSize(textContent).x + kCheckBoxWidth;
if (Width < itemWidth)
Width = itemWidth;
}
}
else
{
Assembly[] assemblies = AssemblyFiltering.GetAllProjectAssemblies();
int assembliesLength = assemblies.Length;
GUIContent textContent = new GUIContent();
for (int i = 0; i < assembliesLength; ++i)
{
Assembly assembly = assemblies[i];
bool enabled = includeAssemblies.Any(f => f.IsMatch(assembly.name.ToLowerInvariant()));
root.AddChild(new AssembliesTreeViewItem() { id = i + 1, displayName = assembly.name, Enabled = enabled });
textContent.text = assembly.name;
float itemWidth = TreeView.DefaultStyles.label.CalcSize(textContent).x + kCheckBoxWidth;
if (Width < itemWidth)
Width = itemWidth;
}
}
return root;
}
protected override void RowGUI(RowGUIArgs args)
{
AssembliesTreeViewItem item = args.item as AssembliesTreeViewItem;
EditorGUI.BeginChangeCheck();
bool enabled = EditorGUI.ToggleLeft(args.rowRect, args.label, item.Enabled);
if (EditorGUI.EndChangeCheck())
{
item.Enabled = enabled;
ApplyChanges();
}
}
public void SelectAll()
{
ToggleAll(true);
}
public void DeselectAll()
{
ToggleAll(false);
}
public void SelectAssets()
{
m_AssembliesToInclude = AssemblyFiltering.GetUserOnlyAssembliesString();
SelectFromString(m_AssembliesToInclude);
}
public void SelectPackages()
{
m_AssembliesToInclude = AssemblyFiltering.GetPackagesOnlyAssembliesString();
SelectFromString(m_AssembliesToInclude);
}
private void SelectFromString(string assembliesToInclude)
{
string[] includeAssemblyFilters = assembliesToInclude.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Regex[] includeAssemblies = includeAssemblyFilters
.Select(f => AssemblyFiltering.CreateFilterRegex(f))
.ToArray();
foreach (var child in rootItem.children)
{
AssembliesTreeViewItem childItem = child as AssembliesTreeViewItem;
bool enabled = includeAssemblies.Any(f => f.IsMatch(childItem.displayName.ToLowerInvariant()));
if (searchString == null)
childItem.Enabled = enabled;
else if (DoesItemMatchSearch(child, searchString))
childItem.Enabled = enabled;
}
ApplyChanges();
}
private void ToggleAll(bool enabled)
{
foreach (var child in rootItem.children)
{
AssembliesTreeViewItem childItem = child as AssembliesTreeViewItem;
if (searchString == null)
childItem.Enabled = enabled;
else if (DoesItemMatchSearch(child, searchString))
childItem.Enabled = enabled;
}
ApplyChanges();
}
void ApplyChanges()
{
CoverageAnalytics.instance.CurrentCoverageEvent.updateAssembliesDialog = true;
StringBuilder sb = new StringBuilder();
foreach(var child in rootItem.children)
{
AssembliesTreeViewItem childItem = child as AssembliesTreeViewItem;
if (childItem.Enabled)
{
if (sb.Length > 0)
sb.Append(",");
sb.Append(childItem.displayName);
}
}
m_Parent.AssembliesToInclude = sb.ToString();
m_Parent.Repaint();
}
}
class AssembliesTreeViewItem : TreeViewItem
{
public bool Enabled { get; set; }
}
}