TreeViewItem EnsureFolderPath(string folderPath, Dictionary <string, TreeViewItem> treeViewFolders, bool initExpandedState) { //We're in the root folder, so just return the root item as the parent. if (folderPath == "") { return(m_RootItem); } // Does folder path exist? int id = folderPath.GetHashCode(); TreeViewItem item = TreeViewUtility.FindItem(id, m_RootItem); if (item != null) { return(item); } // Add folders as needed string[] splitPath = folderPath.Split('/'); string currentPath = ""; TreeViewItem currentItem = m_RootItem; int folderDepth = -1; // Will be incremented to the right depth in the loop. for (int depth = 0; depth < splitPath.Length; ++depth) { string folder = splitPath[depth]; if (currentPath != "") { currentPath += '/'; } currentPath += folder; // Dont create a 'Assets' folder (we already have that as a hidden root) if (depth == 0 && currentPath == "Assets") { continue; } // Only increment the folder depth if we are past the root "Assets" folder. ++folderDepth; id = currentPath.GetHashCode(); TreeViewItem foundItem; if (treeViewFolders.TryGetValue(currentPath, out foundItem)) { currentItem = foundItem; } else { // If we do not have a tree view item for this folder we create one var folderItem = new PackageImportTreeViewItem(null, id, folderDepth, currentItem, folder); // Add to children array of the parent currentItem.AddChild(folderItem); currentItem = folderItem; // Auto expand all folder items if (initExpandedState) { m_TreeView.state.expandedIDs.Add(id); } // For faster finding of folders treeViewFolders[currentPath] = folderItem; } } return(currentItem); }
public override void FetchData() { int rootDepth = -1; // -1 so its children will have 0 depth m_RootItem = new PackageImportTreeViewItem(null, "Assets".GetHashCode(), rootDepth, null, "InvisibleAssetsFolder"); bool initExpandedState = true; if (initExpandedState) { m_TreeView.state.expandedIDs.Add(m_RootItem.id); } ImportPackageItem[] items = m_PackageImportView.packageItems; Dictionary <string, TreeViewItem> treeViewFolders = new Dictionary <string, TreeViewItem>(); for (int i = 0; i < items.Length; i++) { var item = items[i]; if (PackageImport.HasInvalidCharInFilePath(item.destinationAssetPath)) { continue; // Do not add invalid paths (we already warn the user with a dialog in PackageImport.cs) } string filename = Path.GetFileName(item.destinationAssetPath).ConvertSeparatorsToUnity(); string folderPath = Path.GetDirectoryName(item.destinationAssetPath).ConvertSeparatorsToUnity(); // Ensure folders. This is for when installed packages have been moved to other folders. TreeViewItem targetFolder; treeViewFolders.TryGetValue(folderPath, out targetFolder); if (targetFolder == null) { targetFolder = EnsureFolderPath(folderPath, treeViewFolders, initExpandedState); } // Add file to folder if (targetFolder != null) { int id = item.destinationAssetPath.GetHashCode(); var newItem = new PackageImportTreeViewItem(item, id, targetFolder.depth + 1, targetFolder, filename); targetFolder.AddChild(newItem); if (initExpandedState) { m_TreeView.state.expandedIDs.Add(id); } // We need to ensure that the folder is available for // EnsureFolderPath on subsequent iterations. if (item.isFolder) { treeViewFolders[item.destinationAssetPath] = newItem; } } } if (initExpandedState) { m_TreeView.state.expandedIDs.Sort(); } }