TurnBasedStrategyCourse/Library/PackageCache/com.unity.probuilder@5.1.0/AssetIdRemapUtility/Editor/AssetIdRemapBuilderTreeView.cs

220 lines
7.5 KiB
C#

#if PROBUILDER_DEBUG
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
namespace UnityEngine.ProBuilder.AssetIdRemapUtility
{
sealed class AssetIdRemapBuilderTreeView : TreeView
{
AssetIdRemapObject m_RemapObject = null;
const float k_RowHeight = 20f;
const float k_RowHeightSearching = 76f;
public bool isDirty = false;
public AssetIdRemapObject remapObject
{
get { return m_RemapObject; }
set { m_RemapObject = value; }
}
public AssetIdRemapBuilderTreeView(TreeViewState state, MultiColumnHeader header)
: base(state, header)
{
rowHeight = 20f;
showAlternatingRowBackgrounds = true;
showBorder = true;
extraSpaceBeforeIconAndLabel = 18f;
}
protected override TreeViewItem BuildRoot()
{
StringTupleTreeElement root = new StringTupleTreeElement(0, -1, -1, "Root", "", "");
var all = new List<TreeViewItem>();
int index = 1;
for (int i = 0, c = remapObject.map.Count; i < c; i++)
{
all.Add(new StringTupleTreeElement(index++, 0, i, "Remap Entry", remapObject[i].source.name, remapObject[i].destination.name));
all.Add(new StringTupleTreeElement(index++, 1, i, "Local Path", remapObject[i].source.localPath, remapObject[i].destination.localPath));
all.Add(new StringTupleTreeElement(index++, 1, i, "GUID", remapObject[i].source.guid, remapObject[i].destination.guid));
all.Add(new StringTupleTreeElement(index++, 1, i, "File ID", remapObject[i].source.fileId, remapObject[i].destination.fileId));
all.Add(new StringTupleTreeElement(index++, 1, i, "Type", remapObject[i].source.type, remapObject[i].destination.type));
}
SetupParentsAndChildrenFromDepths(root, all);
return root;
}
public void SetRowHeight()
{
rowHeight = hasSearch ? k_RowHeightSearching : k_RowHeight;
}
protected override void RowGUI(RowGUIArgs args)
{
StringTupleTreeElement item = args.item as StringTupleTreeElement;
for (int i = 0; i < args.GetNumVisibleColumns(); ++i)
{
CellGUI(args.GetCellRect(i), item, i, ref args);
}
}
GUIContent m_CellContents = new GUIContent();
void CellGUI(Rect rect, StringTupleTreeElement item, int visibleColumn, ref RowGUIArgs args)
{
if (hasSearch)
{
AssetId id = visibleColumn == 0 ? m_RemapObject[item.index].source : m_RemapObject[item.index].destination;
m_CellContents.text = "<b>Name: </b>" + id.name +
"\n<b>Path: </b>" + id.localPath +
"\n<b>Guid: </b>" + id.guid +
"\n<b>FileId: </b>" + id.fileId +
"\n<b>Type: </b>" + id.type + (string.IsNullOrEmpty(id.assetType) ? "" : " (" + id.assetType + ")");
}
else
{
m_CellContents.text = item.GetLabel(visibleColumn);
}
rect.x += foldoutWidth + 4;
rect.width -= (foldoutWidth + 4);
if (hasSearch)
{
float textHeight = GUI.skin.label.CalcHeight(m_CellContents, rect.width);
rect.y += (rect.height - textHeight) * .5f;
rect.height = textHeight;
}
else
{
CenterRectUsingSingleLineHeight(ref rect);
}
GUI.skin.label.richText = true;
GUI.Label(rect, m_CellContents);
}
protected override bool DoesItemMatchSearch(TreeViewItem element, string search)
{
StringTupleTreeElement tup = element as StringTupleTreeElement;
if (tup == null || tup.depth > 0)
return false;
var o = m_RemapObject[tup.index];
try
{
var patterns = search.Split(new[] { "\\&" }, StringSplitOptions.None).Select(x => new Regex(x));
foreach (var pattern in patterns)
{
if (!(pattern.IsMatch(o.source.localPath) ||
pattern.IsMatch(o.source.guid) ||
pattern.IsMatch(o.source.fileId) ||
pattern.IsMatch(o.source.type) ||
pattern.IsMatch(o.destination.localPath) ||
pattern.IsMatch(o.destination.guid) ||
pattern.IsMatch(o.destination.fileId) ||
pattern.IsMatch(o.destination.type)))
return false;
}
return true;
}
catch
{
return o.source.localPath.Contains(search) ||
o.source.guid.Contains(search) ||
o.source.fileId.Contains(search) ||
o.source.type.Contains(search) ||
o.destination.localPath.Contains(search) ||
o.destination.guid.Contains(search) ||
o.destination.fileId.Contains(search) ||
o.destination.type.Contains(search);
}
}
protected override void ContextClicked()
{
GenericMenu menu = new GenericMenu();
menu.AddItem(new GUIContent("Combine", ""), false, () =>
{
m_RemapObject.Merge(GetAssetIdSelection());
isDirty = true;
Reload();
SetSelection(new int[] {});
});
menu.ShowAsContext();
}
IEnumerable<AssetIdentifierTuple> GetAssetIdSelection()
{
return GetSelection().Select(x => m_RemapObject[((StringTupleTreeElement)FindItem(x, rootItem)).index]);
}
protected override void CommandEventHandling()
{
var evt = Event.current;
var selected = GetSelection();
if (selected.Count > 0)
{
if (evt.type == EventType.ValidateCommand)
{
if (evt.commandName.Equals("SoftDelete"))
evt.Use();
}
else if (evt.type == EventType.ExecuteCommand)
{
if (evt.commandName.Equals("SoftDelete")
&& EditorUtility.DisplayDialog("Delete", "Delete Selected Entries?", "Delete", "Cancel"))
{
m_RemapObject.Delete(GetAssetIdSelection());
evt.Use();
Reload();
isDirty = true;
SetSelection(new int[] {});
}
}
}
base.CommandEventHandling();
}
}
class StringTupleTreeElement : TreeViewItem
{
public string item1;
public string item2;
public int index;
public StringTupleTreeElement(int id, int depth, int sourceIndex, string displayName, string key, string value) : base(id, depth, displayName)
{
item1 = key;
item2 = value;
index = sourceIndex;
}
public string GetLabel(int column)
{
return column < 1 ? item1 : item2;
}
}
}
#endif