public MagitekResult AddFolder(ResourceFolderModel folderModel, string parentNodePath, string diskLocation) { var folder = new ResourceFolder(folderModel.Name); var folderNode = new ResourceFolderNode(folder.Name, folder) { DiskLocation = diskLocation }; Tree.TryGetNode(parentNodePath, out var parentNode); parentNode.AttachChildNode(folderNode); return(MagitekResult.SuccessResult); }
/// <summary> /// Creates a new folder node under the specified parent /// </summary> /// <param name="parentNode">Parent to the new folder</param> /// <param name="name">New name of the folder which will be augmented if already existing</param> /// <returns>The newly created ResourceNode result</returns> public virtual MagitekResult <ResourceNode> CreateNewFolder(ResourceNode parentNode, string name) { var tree = _projects.FirstOrDefault(x => x.ContainsNode(parentNode)); if (tree is null) { return(new MagitekResult <ResourceNode> .Failed($"{parentNode.Item.Name} is not contained within any loaded project")); } if (parentNode.ContainsChildNode(name) || !parentNode.Item.CanContainChildResources) { return(new MagitekResult <ResourceNode> .Failed($"Could not create folder '{name}' under parent '{parentNode.Name}'")); } try { var childName = FindFirstNewChildResourceName(parentNode, name); var folder = new ResourceFolder(childName); var node = new ResourceFolderNode(childName, folder); var directoryName = ResourceFileLocator.LocateByParent(tree, parentNode, node); node.DiskLocation = directoryName; Directory.CreateDirectory(directoryName); parentNode.AttachChildNode(node); return(new MagitekResult <ResourceNode> .Success(node)); } catch (Exception ex) { return(new MagitekResult <ResourceNode> .Failed($"Could not create folder '{name}' under parent '{parentNode.Name}'\n{ex.Message}")); } string FindFirstNewChildResourceName(ResourceNode node, string baseName) { if (!node.ContainsChildNode(baseName)) { return(baseName); } else { return new string[] { baseName } } .Concat(Enumerable.Range(1, 999).Select(x => $"{baseName} ({x})")) .FirstOrDefault(x => !node.ContainsChildNode(x)); }