using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEditor.IMGUI.Controls;
|
|
|
|
//带数据的TreeViewItem
|
|
public class AssetViewItem : TreeViewItem
|
|
{
|
|
public ReferenceFinderData.AssetDescription data;
|
|
}
|
|
|
|
//资源引用树
|
|
public class AssetTreeView : TreeView
|
|
{
|
|
//图标宽度
|
|
const float kIconWidth = 18f;
|
|
//列表高度
|
|
const float kRowHeights = 20f;
|
|
public AssetViewItem assetRoot;
|
|
|
|
private GUIStyle stateGUIStyle = new GUIStyle { richText = true, alignment = TextAnchor.MiddleCenter };
|
|
|
|
//列信息
|
|
enum MyColumns
|
|
{
|
|
Name,
|
|
Path,
|
|
State,
|
|
}
|
|
|
|
public AssetTreeView(TreeViewState state,MultiColumnHeader multicolumnHeader):base(state,multicolumnHeader)
|
|
{
|
|
rowHeight = kRowHeights;
|
|
columnIndexForTreeFoldouts = 0;
|
|
showAlternatingRowBackgrounds = true;
|
|
showBorder = false;
|
|
customFoldoutYOffset = (kRowHeights - EditorGUIUtility.singleLineHeight) * 0.5f; // center foldout in the row since we also center content. See RowGUI
|
|
extraSpaceBeforeIconAndLabel = kIconWidth;
|
|
}
|
|
|
|
//响应右击事件
|
|
protected override void ContextClickedItem(int id)
|
|
{
|
|
SetExpanded(id, !IsExpanded(id));
|
|
}
|
|
|
|
//响应双击事件
|
|
protected override void DoubleClickedItem(int id)
|
|
{
|
|
var item = (AssetViewItem)FindItem(id, rootItem);
|
|
//在ProjectWindow中高亮双击资源
|
|
if (item != null)
|
|
{
|
|
var assetObject = AssetDatabase.LoadAssetAtPath(item.data.path, typeof(UnityEngine.Object));
|
|
EditorUtility.FocusProjectWindow();
|
|
Selection.activeObject = assetObject;
|
|
EditorGUIUtility.PingObject(assetObject);
|
|
}
|
|
}
|
|
|
|
//生成ColumnHeader
|
|
public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState(float treeViewWidth)
|
|
{
|
|
var columns = new[]
|
|
{
|
|
//图标+名称
|
|
new MultiColumnHeaderState.Column
|
|
{
|
|
headerContent = new GUIContent("Name"),
|
|
headerTextAlignment = TextAlignment.Center,
|
|
sortedAscending = false,
|
|
width = 200,
|
|
minWidth = 60,
|
|
autoResize = false,
|
|
allowToggleVisibility = false,
|
|
canSort = false
|
|
},
|
|
//路径
|
|
new MultiColumnHeaderState.Column
|
|
{
|
|
headerContent = new GUIContent("Path"),
|
|
headerTextAlignment = TextAlignment.Center,
|
|
sortedAscending = false,
|
|
width = 360,
|
|
minWidth = 60,
|
|
autoResize = false,
|
|
allowToggleVisibility = false,
|
|
canSort = false
|
|
},
|
|
//状态
|
|
new MultiColumnHeaderState.Column
|
|
{
|
|
headerContent = new GUIContent("State"),
|
|
headerTextAlignment = TextAlignment.Center,
|
|
sortedAscending = false,
|
|
width = 60,
|
|
minWidth = 60,
|
|
autoResize = false,
|
|
allowToggleVisibility = true,
|
|
canSort = false
|
|
},
|
|
};
|
|
var state = new MultiColumnHeaderState(columns);
|
|
return state;
|
|
}
|
|
|
|
protected override TreeViewItem BuildRoot()
|
|
{
|
|
return assetRoot;
|
|
}
|
|
|
|
protected override void RowGUI(RowGUIArgs args)
|
|
{
|
|
var item = (AssetViewItem)args.item;
|
|
for(int i = 0; i < args.GetNumVisibleColumns(); ++i)
|
|
{
|
|
CellGUI(args.GetCellRect(i), item, (MyColumns)args.GetColumn(i), ref args);
|
|
}
|
|
}
|
|
|
|
//绘制列表中的每项内容
|
|
void CellGUI(Rect cellRect,AssetViewItem item,MyColumns column, ref RowGUIArgs args)
|
|
{
|
|
CenterRectUsingSingleLineHeight(ref cellRect);
|
|
switch (column)
|
|
{
|
|
case MyColumns.Name:
|
|
{
|
|
var iconRect = cellRect;
|
|
iconRect.x += GetContentIndent(item);
|
|
iconRect.width = kIconWidth;
|
|
if (iconRect.x < cellRect.xMax)
|
|
{
|
|
var icon = GetIcon(item.data.path);
|
|
if(icon != null)
|
|
GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit);
|
|
}
|
|
args.rowRect = cellRect;
|
|
base.RowGUI(args);
|
|
}
|
|
break;
|
|
case MyColumns.Path:
|
|
{
|
|
GUI.Label(cellRect, item.data.path);
|
|
}
|
|
break;
|
|
case MyColumns.State:
|
|
{
|
|
GUI.Label(cellRect, ReferenceFinderData.GetInfoByState(item.data.state),stateGUIStyle);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//根据资源信息获取资源图标
|
|
private Texture2D GetIcon(string path)
|
|
{
|
|
Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
|
|
if (obj != null)
|
|
{
|
|
Texture2D icon = AssetPreview.GetMiniThumbnail(obj);
|
|
if (icon == null)
|
|
icon = AssetPreview.GetMiniTypeThumbnail(obj.GetType());
|
|
return icon;
|
|
}
|
|
return null;
|
|
}
|
|
}
|