ViewNode AddViewNode(ABInspectorItemData data, int depth, int breadth, int totalBreadth) { string path = AssetDatabase.GUIDToAssetPath(data.GUID); string name = Path.GetFileNameWithoutExtension(path); Debug.LogFormat("depth:{0}, breadth:{1} node:{2}", depth, breadth, data.GUID); ViewNode viewNode = new ViewNode(name, data.GUID); viewNode.Icon = AssetDatabase.GetCachedIcon(path) as Texture2D; int halfBreadth = totalBreadth / 2; Vector2 position; if (totalBreadth % 2 == 0) { int index = (breadth - halfBreadth); index = index >= 0 ? index + 1 : index; position = new Vector2(depth * (NodeSize.x + NodeOffest.x), index * (NodeSize.y + NodeOffest.y)); } else { position = new Vector2(depth * (NodeSize.x + NodeOffest.x), (breadth - halfBreadth) * (NodeSize.y + NodeOffest.y)); } viewNode.Rect = new Rect(position, NodeSize); nodes.Add(viewNode); return(viewNode); }
public void ShowSelectNodeOrganization(ABInspectorItemData node) { if (node != null) { root.children.Clear(); CreatTreeView(root, node, 0); } }
public void SelectNode(string GUID) { ABInspectorItemData node = dataManager.GetItemDataByGUID(GUID); if (node != null) { SelectNode(dataManager.GetItemDataByGUID(GUID)); } }
public ABInspectorItemData GetItemDataByGUID(string guid) { ABInspectorItemData result = null; if (dataMap.TryGetValue(guid, out result)) { return(result); } return(null); }
public void SelectNode(ABInspectorItemData selectData) { if (selectData == null) { return; } if (nodes != null) { nodes.Clear(); } if (links != null) { links.Clear(); } //向下处理选中的节点 HandleChildNode(selectData); //处理父节点 HandleParentNode(selectData); float minX = float.MaxValue; float minY = float.MaxValue; //float maxX = float.MinValue; //float maxY = float.MinValue; foreach (var item in nodes) { if (item.Rect.xMin < minX) { minX = item.Rect.xMin; } if (item.Rect.yMin < minY) { minY = item.Rect.yMin; } //if (item.Rect.xMax > maxX) maxX = item.Rect.xMax; //if (item.Rect.yMax < maxY) maxY = item.Rect.yMax; } Vector2 offset = Vector2.zero; offset.x = minX < 0 ? Mathf.Abs(minX) : 0; offset.y = minY < 0 ? Mathf.Abs(minY) : 0; foreach (var item in nodes) { item.Rect = new Rect(item.Rect.position + offset, item.Rect.size); } }
private void HandleParentNode(ABInspectorItemData node) { if (node.ReverseDependency != null) { //记录当前深度 int depth = -1; //记录当前的广度 int breadth = 0; Queue <ViewNode> parentQueue = new Queue <ViewNode>(); //记录下一层的节点总数 int childCount = node.ReverseDependency.Count; ABInspectorItemData current = null; ViewNode viewNode = null; foreach (var guid in node.ReverseDependency) { handleQueque.Enqueue(GetItemByGUID(guid)); parentQueue.Enqueue(nodes[0]); } while (handleQueque.Count != 0) { current = handleQueque.Dequeue(); viewNode = AddViewNode(current, depth, breadth, childCount); if (parentQueue.Count > 0) { var link = new Link(viewNode, parentQueue.Dequeue()); links.Add(link); } breadth++; foreach (var guid in current.ReverseDependency) { handleQueque.Enqueue(GetItemByGUID(guid)); parentQueue.Enqueue(viewNode); } if (breadth == childCount) { //一层绘制完毕,此时队列里都是下一层节点 depth--; breadth = 0; childCount = handleQueque.Count; } } } }
private void GetNodeDependency(string path, string nodeGUID) { ABInspectorItemData currentNode = null; ABInspectorItemData result = null; string dpdcGUID = string.Empty; string[] depsPathAry; //获取节点 if (dataMap.TryGetValue(nodeGUID, out currentNode) == false) { currentNode = CreateDataNode(nodeGUID, path); m_dataCollection.items.Add(currentNode); dataMap[nodeGUID] = currentNode; } //获取直接依赖项 depsPathAry = AssetDatabase.GetDependencies(path, false); foreach (var dpdcPath in depsPathAry) { dpdcGUID = Path2GUID(dpdcPath); //去掉自身引用 if (dpdcGUID == nodeGUID) { continue; } if (dataMap.TryGetValue(dpdcGUID, out result) == false) { result = CreateDataNode(dpdcGUID, dpdcPath); m_dataCollection.items.Add(result); dataMap[dpdcGUID] = result; } //记录正向直接引用 if (currentNode.Dependency.Contains(dpdcGUID) == false) { currentNode.Dependency.Add(dpdcGUID); } //记录反向直接引用 if (result.ReverseDependency.Contains(nodeGUID) == false) { result.ReverseDependency.Add(nodeGUID); } } }
private void HandleChildNode(ABInspectorItemData node) { if (node.Dependency != null) { //记录当前深度 int depth = 0; //记录当前的广度 int breadth = 0; //记录下一层的节点总数 int childCount = 0; Queue <ViewNode> parentQueue = new Queue <ViewNode>(); handleQueque.Enqueue(node); ABInspectorItemData current = null; ViewNode viewNode = null; childCount = handleQueque.Count; while (handleQueque.Count != 0) { current = handleQueque.Dequeue(); //用depth,breadth和当前层节点数量绘制当前节点 viewNode = AddViewNode(current, depth, breadth, childCount); if (parentQueue.Count > 0) { var link = new Link(parentQueue.Dequeue(), viewNode); links.Add(link); } breadth++; foreach (var guid in current.Dependency) { handleQueque.Enqueue(GetItemByGUID(guid)); parentQueue.Enqueue(viewNode); } if (breadth == childCount) { //一层绘制完毕,此时队列里都是下一层节点 depth++; breadth = 0; childCount = handleQueque.Count; } } } }
private void CreatTreeView(OrganizationTreeViewItem parent, ABInspectorItemData node, int depth) { string path = AssetDatabase.GUIDToAssetPath(node.GUID); string name = Path.GetFileName(path); OrganizationTreeViewItem nodeItem = new OrganizationTreeViewItem(node.GUID.GetHashCode(), depth, name); nodeItem.children = new List <TreeViewItem>(); //只显示类型名,忽略其他信息 string TypeName = AssetDatabase.GetMainAssetTypeAtPath(path).ToString(); nodeItem.Type = TypeName.Substring(TypeName.LastIndexOf(".") + 1); nodeItem.Count = node.Dependency.Count; nodeItem.icon = AssetDatabase.GetCachedIcon(path) as Texture2D; parent.AddChild(nodeItem); foreach (var dpcGUID in node.Dependency) { ABInspectorItemData dpcNode = GetABInspectorItemDataByGUID(dpcGUID); CreatTreeView(nodeItem, dpcNode, depth + 1); } }
private bool CheckFileSystem() { var guids = AssetDatabase.FindAssets("", new string[] { "Assets" }); string path = string.Empty; int index = 0; List <string> currentFiles = new List <string>(); List <string> storedFiles = new List <string>(dataMap.Keys); foreach (var nodeGUID in guids) { path = GUID2Path(nodeGUID); if (path.Contains(".") == false) { continue; } if (path.Contains(".manifest") == true) { continue; } if (path.Contains("/Editor/")) { continue; } EditorUtility.DisplayProgressBar("Check File", path, (index++ *1f) / (guids.Length * 1f)); currentFiles.Add(nodeGUID); } IEnumerable <string> subFiles = storedFiles.Except(currentFiles); IEnumerable <string> addFiles = currentFiles.Except(storedFiles); ABInspectorItemData itemNode = null; ABInspectorItemData childItem = null; index = 0; int Total = subFiles.Count(); foreach (var subItem in subFiles) { EditorUtility.DisplayProgressBar("Remove Item", path, (index++ *1f) / (Total * 1f)); if (dataMap.TryGetValue(subItem, out itemNode)) { //删除正向引用 foreach (var dpyGUID in itemNode.Dependency) { if (dataMap.TryGetValue(dpyGUID, out childItem)) { childItem.ReverseDependency.Remove(subItem); } } //删除逆向引用 foreach (var dpyGUID in itemNode.ReverseDependency) { if (dataMap.TryGetValue(dpyGUID, out childItem)) { childItem.Dependency.Remove(subItem); } } } dataMap.Remove(subItem); m_dataCollection.items.Remove(itemNode); } index = 0; Total = addFiles.Count(); foreach (var addItem in addFiles) { EditorUtility.DisplayProgressBar("Remove Item", path, (index++ *1f) / (Total * 1f)); path = GUID2Path(addItem); GetNodeDependency(path, addItem); } EditorUtility.ClearProgressBar(); bool needSave = subFiles.Any() || addFiles.Any(); return(needSave); }