From e47bebffca0a992efff5cd1e0e904fbcaff642a0 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Tue, 21 Oct 2025 21:37:06 +1000 Subject: [PATCH] cut and paste files --- .../FileWatching/IdeFileOperationsService.cs | 9 +++++++++ .../SharpIdeSolutionModificationService.cs | 13 +++++++++++++ .../SolutionExplorerPanel.Clipboard.cs | 10 +++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs b/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs index 913675b..b6ebe26 100644 --- a/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs +++ b/src/SharpIDE.Application/Features/FileWatching/IdeFileOperationsService.cs @@ -57,6 +57,15 @@ public class IdeFileOperationsService(SharpIdeSolutionModificationService sharpI return sharpIdeFile; } + public async Task MoveFile(IFolderOrProject destinationParentNode, SharpIdeFile fileToMove) + { + var newFilePath = Path.Combine(destinationParentNode.ChildNodeBasePath, fileToMove.Name); + if (File.Exists(newFilePath)) throw new InvalidOperationException($"File {newFilePath} already exists."); + File.Move(fileToMove.Path, newFilePath); + var sharpIdeFile = await _sharpIdeSolutionModificationService.MoveFile(destinationParentNode, fileToMove); + return sharpIdeFile; + } + private static string GetFileParentNodePath(IFolderOrProject parentNode) => parentNode switch { SharpIdeFolder folder => folder.Path, diff --git a/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs b/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs index 8be3629..a5f9306 100644 --- a/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs +++ b/src/SharpIDE.Application/Features/FileWatching/SharpIdeSolutionModificationService.cs @@ -110,4 +110,17 @@ public class SharpIdeSolutionModificationService(FileChangedService fileChangedS SolutionModel.AllFiles.Remove(file); await _fileChangedService.SharpIdeFileRemoved(file); } + + public async Task MoveFile(IFolderOrProject destinationParentNode, SharpIdeFile fileToMove) + { + var oldPath = fileToMove.Path; + var newFilePath = Path.Combine(destinationParentNode.ChildNodeBasePath, fileToMove.Name); + var parentFolderOrProject = (IFolderOrProject)fileToMove.Parent; + parentFolderOrProject.Files.Remove(fileToMove); + destinationParentNode.Files.Add(fileToMove); + fileToMove.Parent = destinationParentNode; + fileToMove.Path = newFilePath; + await _fileChangedService.SharpIdeFileMoved(fileToMove, oldPath); + return fileToMove; + } } diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.Clipboard.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.Clipboard.cs index 458d851..d8648e4 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.Clipboard.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.Clipboard.cs @@ -18,7 +18,7 @@ public partial class SolutionExplorerPanel .OfType>() .Select(s => s.Item) .ToList(), - ClipboardOperation.Copy); + clipboardOperation); } private List GetSelectedTreeItems() @@ -75,6 +75,14 @@ public partial class SolutionExplorerPanel await _ideFileOperationsService.CopyFile(folderOrProject, fileToPaste.Path, fileToPaste.Name); } } + // This will blow up if cutting a file into a directory that already has a file with the same name, but I don't really want to handle renaming cut-pasted files for MVP + else if (operation is ClipboardOperation.Cut) + { + foreach (var fileToPaste in filesToPaste) + { + await _ideFileOperationsService.MoveFile(folderOrProject, fileToPaste); + } + } }); } } \ No newline at end of file