Example #1
0
    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);
    }
Example #2
0
    /// <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));
        }