184 lines
6.4 KiB
C#
184 lines
6.4 KiB
C#
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; }
|
|
}
|
|
} |