diff --git a/src/SharpIDE.Application/Features/FileWatching/IdeFileExternalChangeHandler.cs b/src/SharpIDE.Application/Features/FileWatching/IdeFileExternalChangeHandler.cs index 312ff5c..96d00f1 100644 --- a/src/SharpIDE.Application/Features/FileWatching/IdeFileExternalChangeHandler.cs +++ b/src/SharpIDE.Application/Features/FileWatching/IdeFileExternalChangeHandler.cs @@ -24,7 +24,7 @@ public class IdeFileExternalChangeHandler var sharpIdeFolder = SolutionModel.AllFolders.SingleOrDefault(f => f.Path == folderPath); if (sharpIdeFolder is not null) { - Console.WriteLine($"Error - Folder {folderPath} already exists"); + //Console.WriteLine($"Error - Folder {folderPath} already exists"); return; } var containingFolderPath = Path.GetDirectoryName(folderPath)!; @@ -34,7 +34,8 @@ public class IdeFileExternalChangeHandler Console.WriteLine($"Error - Containing Folder of {folderPath} does not exist"); return; } - await _sharpIdeSolutionModificationService.CreateDirectory(containingFolder, folderPath); + var folderName = Path.GetFileName(folderPath); + await _sharpIdeSolutionModificationService.AddDirectory(containingFolder, folderName); } private async Task OnFileCreated(string filePath) diff --git a/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs b/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs index f51a768..e5309c7 100644 --- a/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs +++ b/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs @@ -6,9 +6,10 @@ public class IdeFileOperationsService(SharpIdeSolutionModificationService sharpI { private readonly SharpIdeSolutionModificationService _sharpIdeSolutionModificationService = sharpIdeSolutionModificationService; - public async Task CreateDirectory(SharpIdeFolder parentFolder, string directoryPath) + public async Task CreateDirectory(SharpIdeFolder parentFolder, string newDirectoryName) { - var newFolder = await _sharpIdeSolutionModificationService.CreateDirectory(parentFolder, directoryPath); - Directory.CreateDirectory(directoryPath); + var newDirectoryPath = Path.Combine(parentFolder.Path, newDirectoryName); + Directory.CreateDirectory(newDirectoryPath); + var newFolder = await _sharpIdeSolutionModificationService.AddDirectory(parentFolder, newDirectoryName); } } diff --git a/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs b/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs index 9989ea4..9888843 100644 --- a/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs +++ b/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs @@ -7,10 +7,12 @@ public class SharpIdeSolutionModificationService { public SharpIdeSolutionModel SolutionModel { get; set; } = null!; - public async Task CreateDirectory(SharpIdeFolder parentFolder, string directoryPath) + /// The directory must already exist on disk + public async Task AddDirectory(SharpIdeFolder parentFolder, string directoryName) { // Passing [] to allFiles and allFolders, as we assume that a brand new folder has no subfolders or files yet - var sharpIdeFolder = new SharpIdeFolder(new DirectoryInfo(directoryPath), parentFolder, [], []); + var addedDirectoryPath = Path.Combine(parentFolder.Path, directoryName); + var sharpIdeFolder = new SharpIdeFolder(new DirectoryInfo(addedDirectoryPath), parentFolder, [], []); parentFolder.Folders.Add(sharpIdeFolder); SolutionModel.AllFolders.Add(sharpIdeFolder); return sharpIdeFolder; diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/ContextMenus/Dialogs/NewDirectoryDialog.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/ContextMenus/Dialogs/NewDirectoryDialog.cs index c6e67f0..2ac93e3 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/ContextMenus/Dialogs/NewDirectoryDialog.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/ContextMenus/Dialogs/NewDirectoryDialog.cs @@ -1,4 +1,5 @@ using Godot; +using SharpIDE.Application.Features.FileWatching; using SharpIDE.Application.Features.SolutionDiscovery; namespace SharpIDE.Godot.Features.SolutionExplorer.ContextMenus.Dialogs; @@ -9,6 +10,8 @@ public partial class NewDirectoryDialog : ConfirmationDialog public SharpIdeFolder ParentFolder { get; set; } = null!; + [Inject] private readonly IdeFileOperationsService _ideFileOperationsService = null!; + public override void _Ready() { _nameLineEdit = GetNode("%DirectoryNameLineEdit"); @@ -20,5 +23,15 @@ public partial class NewDirectoryDialog : ConfirmationDialog private void OnConfirmed() { var directoryName = _nameLineEdit.Text.Trim(); + if (string.IsNullOrEmpty(directoryName)) + { + GD.PrintErr("Directory name cannot be empty."); + return; + } + + _ = Task.GodotRun(async () => + { + await _ideFileOperationsService.CreateDirectory(ParentFolder, directoryName); + }); } } \ No newline at end of file diff --git a/src/SharpIDE.Godot/IdeRoot.cs b/src/SharpIDE.Godot/IdeRoot.cs index fce0a74..87fb314 100644 --- a/src/SharpIDE.Godot/IdeRoot.cs +++ b/src/SharpIDE.Godot/IdeRoot.cs @@ -44,6 +44,7 @@ public partial class IdeRoot : Control [Inject] private readonly BuildService _buildService = null!; [Inject] private readonly IdeOpenTabsFileManager _openTabsFileManager = null!; [Inject] private readonly RoslynAnalysis _roslynAnalysis = null!; + [Inject] private readonly SharpIdeSolutionModificationService _sharpIdeSolutionModificationService = null!; public override void _EnterTree() { @@ -141,6 +142,7 @@ public partial class IdeRoot : Control _searchAllFilesWindow.Solution = solutionModel; _fileExternalChangeHandler.SolutionModel = solutionModel; _fileChangedService.SolutionModel = solutionModel; + _sharpIdeSolutionModificationService.SolutionModel = solutionModel; Callable.From(_solutionExplorerPanel.BindToSolution).CallDeferred(); _roslynAnalysis.StartSolutionAnalysis(solutionModel); _fileWatcher.StartWatching(solutionModel);