wuxianshengcong/Library/PackageCache/com.unity.2d.psdimporter@8.0.5/Editor/UTK/PSDImporterMultiColumnTreeViewUI.cs
2025-01-02 14:50:41 +08:00

198 lines
7.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor.AssetImporters;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.PSD
{
internal class LayerManagementTreeViewData
{
public string assetName;
public PSDImportData importData;
public SerializedProperty layerImportSettings;
public SerializedProperty mosaicLayers;
public SerializedProperty importHiddenLayers;
public SerializedProperty importFileNodeState;
public IPSDLayerMappingStrategy mappingStrategy;
public LayerManagementTreeViewData(SerializedObject so)
{
Update(so);
}
public void Update(SerializedObject so)
{
mosaicLayers = so.FindProperty("m_MosaicLayers");
importHiddenLayers = so.FindProperty("m_ImportHiddenLayers");
importFileNodeState = so.FindProperty("m_ImportFileNodeState");
assetName = Path.GetFileNameWithoutExtension(((ScriptedImporter)so.targetObject).assetPath);
importData = ((PSDImporter)so.targetObject).importData;
mappingStrategy = ((PSDImporter)so.targetObject).GetLayerMappingStrategy();
layerImportSettings = so.FindProperty("m_PSDLayerImportSetting");
}
}
[Serializable]
internal class PSDImporterLayerManagementMultiColumnTreeView : MultiColumnTreeView
{
int m_LastArraySize;
LayerManagementTreeViewData m_LayerManagementTreeViewData;
PSDTreeViewNode[] m_Data;
UILayerImportColumn m_LayerImportColumn;
public void UpdateTreeView(SerializedObject so)
{
m_LayerManagementTreeViewData.Update(so);
SetupColumns();
RebuildTree();
}
void SetupColumns()
{
columns.Clear();
m_LayerImportColumn = new UILayerImportColumn(this)
{
name = "UILayerImportColumn",
};
columns.Add(m_LayerImportColumn);
Column col;
col = new UILayerNameColumn(this)
{
name = "UILayerNameColumn",
};
columns.Add(col);
columns.primaryColumnName = "UILayerNameColumn";
}
public PSDImporterLayerManagementMultiColumnTreeView(SerializedObject so)
{
viewDataKey = "PSDImporterLayerManagementMultiColumnTreeView-ViewDataKey";
m_LayerManagementTreeViewData = new LayerManagementTreeViewData(so);
showAlternatingRowBackgrounds = AlternatingRowBackground.All;
showBorder = true;
UpdateTreeView(so);
}
public PSDTreeViewNode[] data => m_Data;
public bool importHidden => m_LayerManagementTreeViewData.importHiddenLayers.boolValue;
SerializedProperty layerImportSetting => m_LayerManagementTreeViewData.layerImportSettings;
IList<PSDLayerData> importLayerData => m_LayerManagementTreeViewData.importData.psdLayerData;
IPSDLayerMappingStrategy layerMappingStrategy => m_LayerManagementTreeViewData.mappingStrategy;
void RebuildTree()
{
SetRootItems(BuildTree());
Rebuild();
}
public void Update()
{
foreach (var c in columns)
{
if (c is IColumnUpdate)
{
((IColumnUpdate)c).Update();
}
}
}
List<TreeViewItemData<int>> BuildTree()
{
var treeViewData = new List<TreeViewItemData<int>>();
layerImportSetting.serializedObject.Update();
m_LastArraySize = layerImportSetting.arraySize;
var fileRoot = new PSDFileTreeViewNode(m_LayerManagementTreeViewData)
{
id = 0, displayName = m_LayerManagementTreeViewData.assetName
};
//fileRoot.icon = EditorGUIUtility.IconContent("Texture Icon").image as Texture2D;
var spWrapper = new List<PSDLayerImportSettingSerializedPropertyWrapper>();
if (layerImportSetting.arraySize > 0)
{
var firstElement = layerImportSetting.GetArrayElementAtIndex(0);
for (int i = 0; i < layerImportSetting.arraySize; ++i)
{
spWrapper.Add(new PSDLayerImportSettingSerializedPropertyWrapper(firstElement, layerImportSetting, null, i));
firstElement.Next(false);
}
}
if (importLayerData != null)
{
PSDTreeViewNode[] nodes = new PSDTreeViewNode[importLayerData.Count+1];
nodes[0] = fileRoot;
for(int i = 1; i <= importLayerData.Count; ++i)
{
var l = importLayerData[i-1];
var importSettingIndex = spWrapper.FindIndex(x => layerMappingStrategy.Compare(x, l));
PSDLayerImportSettingSerializedPropertyWrapper importSetting = null;
if (importSettingIndex < 0)
{
importSetting = new PSDLayerImportSettingSerializedPropertyWrapper(null, layerImportSetting, l, layerImportSetting.arraySize)
{
wasLayerImported = l.isVisible || m_LayerManagementTreeViewData.importHiddenLayers.boolValue
};
}
else
{
importSetting = spWrapper[importSettingIndex];
spWrapper.RemoveAt(importSettingIndex);
}
if (l != null && l.isGroup)
nodes[i] = new PSDGroupTreeViewNode(l, i, importSetting);
else
nodes[i] = new PSDLayerTreeViewNode(l, i, importSetting);
var node = nodes[i];
node.disable = !node.layer.isVisible;
while (node.layer.parentIndex != -1 && nodes[i].disable == false)
{
if (!node.layer.isVisible || !nodes[node.layer.parentIndex + 1].layer.isVisible)
{
nodes[i].disable = true;
}
node = nodes[node.layer.parentIndex+1];
}
}
foreach (var node in nodes)
{
PSDTreeViewNode rootTreeViewNode = null;
if (node.layer == null)
continue;
if (node.layer.parentIndex == -1)
{
rootTreeViewNode = fileRoot;
}
else
{
rootTreeViewNode = nodes[node.layer.parentIndex+1];
}
rootTreeViewNode.AddChild(node);
}
m_Data = nodes;
}
else
{
m_Data = new[] { fileRoot };
}
treeViewData.Add(fileRoot.BuildTreeViewItemData());
return treeViewData;
}
public PSDTreeViewNode GetFromIndex(int i)
{
var e = GetItemDataForIndex<int>(i);
return m_Data[e];
}
}
}