/// <summary> /// Attempts to collapse parent and child if there is only one child. /// </summary> private static void PruneTree(FileItemViewModel root) { if (root.Children.Count == 1) { var child = root.Children[0]; // Update root's name to include child's root.Name = root.Name + Path.AltDirectorySeparatorChar + child.Name; // Remove child from list of children root.Children.Clear(); // Assign child's children to root. Re-assign parent to point to root. foreach (var grandchild in child.Children) { root.Children.Add(grandchild); grandchild.Parent = root; } } foreach (var child in root.Children) { WorkspacePageViewModel.PruneTree(child); } }
private static List <FileItemViewModel> BuildTreeFromFiles(List <Tuple <string, float> > files) { // Step 3: Contruct a tree based on files var cache = new Dictionary <string, FileItemViewModel>(); var roots = new List <FileItemViewModel>(); for (var i = 0; i < files.Count; i++) { var filePath = files[i]; // Get the path components var filePathParts = filePath.Item1.Split(Path.AltDirectorySeparatorChar); // Create the leaf using the file name var fileItemViewModel = new FileItemViewModel( filePath.Item1, filePathParts[filePathParts.Length - 1], filePath.Item2); // Go through each file and add every nodes in the tree for each folder as well as leaves for each file var currentChild = fileItemViewModel; for (var j = filePathParts.Length - 2; j >= 0; j--) { var ancestorName = filePathParts[j]; var ancestorId = currentChild.Id.Substring( 0, currentChild.Id.LastIndexOf(Path.AltDirectorySeparatorChar)); if (!cache.ContainsKey(ancestorId)) { cache[ancestorId] = new FileItemViewModel(ancestorId, ancestorName, 0); if (j == 0) { roots.Add(cache[ancestorId]); } } var ancestor = cache[ancestorId]; if (!ancestor.Children.Contains(currentChild)) { currentChild.Parent = ancestor; ancestor.Children.Add(currentChild); } currentChild = ancestor; } } // Go through the entire tree and remove nodes with a single child, collapsing their info // into their parent node. SortBiggerFirst(roots); foreach (var root in roots) { WorkspacePageViewModel.PruneTree(root); } return(roots); }