private void loadFolder(ContentTreeNode node, bool checkSubDirs) { if (node == null) { return; } // Temporary data var folder = node.Folder; var path = folder.Path; // Check for missing files/folders (skip it during fast tree setup) if (!_isDuringFastSetup) { for (int i = 0; i < folder.Children.Count; i++) { var child = folder.Children[i]; if (!child.Exists) { // Send info Editor.Log(string.Format($"Content item \'{child.Path}\' has been removed")); // Destroy it Delete(child); i--; } } } // Find elements (use separate path for scripts and assets - perf stuff) if (node.CanHaveAssets) { LoadAssets(node, path); } if (node.CanHaveScripts) { LoadScripts(node, path); } // Get child directories var childFolders = Directory.GetDirectories(path); // Load child folders bool sortChildren = false; for (int i = 0; i < childFolders.Length; i++) { var childPath = StringUtils.NormalizePath(childFolders[i]); // Check if node already has that element (skip during init when we want to walk project dir very fast) ContentFolder childFolderNode = _isDuringFastSetup ? null : node.Folder.FindChild(childPath) as ContentFolder; if (childFolderNode == null) { // Create node ContentTreeNode n = new ContentTreeNode(node, childPath); if (!_isDuringFastSetup) { sortChildren = true; } // Load child folder loadFolder(n, true); // Fire event if (_enableEvents) { ItemAdded?.Invoke(n.Folder); OnWorkspaceModified?.Invoke(); } _itemsCreated++; } else if (checkSubDirs) { // Update child folder loadFolder(childFolderNode.Node, true); } } if (sortChildren) { node.SortChildren(); } }