diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift index 96115088f..3e2f5ac77 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift @@ -251,11 +251,11 @@ extension CEWorkspaceFileManager { @discardableResult public func move(file: CEWorkspaceFile, to newLocation: URL) throws -> CEWorkspaceFile? { do { - guard fileManager.fileExists(atPath: file.url.path()) else { + guard fileManager.fileExists(atPath: file.url.path(percentEncoded: false)) else { throw FileManagerError.originFileNotFound } - guard !fileManager.fileExists(atPath: newLocation.path) else { + guard !fileManager.fileExists(atPath: newLocation.path(percentEncoded: false)) else { throw FileManagerError.destinationFileExists } @@ -305,7 +305,9 @@ extension CEWorkspaceFileManager { /// - newLocation: The location to copy to. public func copy(file: CEWorkspaceFile, to newLocation: URL) throws { do { - guard file.url != newLocation && !fileManager.fileExists(atPath: newLocation.absoluteString) else { + guard file.url != newLocation && !fileManager.fileExists( + atPath: newLocation.absoluteURL.path(percentEncoded: false) + ) else { throw FileManagerError.originFileNotFound } try fileManager.copyItem(at: file.url, to: newLocation) diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift index 74d1f5320..a7be86bc8 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift @@ -85,8 +85,16 @@ struct ProjectNavigatorOutlineView: NSViewControllerRepresentable { guard let outlineView = controller?.outlineView else { return } let selectedRows = outlineView.selectedRowIndexes.compactMap({ outlineView.item(atRow: $0) }) - for item in updatedItems { - outlineView.reloadItem(item, reloadChildren: true) + // If some text view inside the outline view is first responder right now, push the update off + // until editing is finished using the `shouldReloadAfterDoneEditing` flag. + if outlineView.window?.firstResponder !== outlineView + && outlineView.window?.firstResponder is NSTextView + && (outlineView.window?.firstResponder as? NSView)?.isDescendant(of: outlineView) == true { + controller?.shouldReloadAfterDoneEditing = true + } else { + for item in updatedItems { + outlineView.reloadItem(item, reloadChildren: true) + } } // Restore selected items where the files still exist. diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift index eef5b4e1b..82db7b164 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift @@ -10,6 +10,7 @@ import SwiftUI protocol OutlineTableViewCellDelegate: AnyObject { func moveFile(file: CEWorkspaceFile, to destination: URL) func copyFile(file: CEWorkspaceFile, to destination: URL) + func cellDidFinishEditing() } /// A `NSTableCellView` showing an ``icon`` and a ``label`` @@ -64,5 +65,6 @@ final class ProjectNavigatorTableViewCell: FileSystemTableViewCell { } else { textField?.stringValue = fileItem.labelFileName() } + delegate?.cellDidFinishEditing() } } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift index b8d09e631..91d68b42e 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift @@ -39,4 +39,9 @@ extension ProjectNavigatorViewController: OutlineTableViewCellDelegate { alert.runModal() } } + + func cellDidFinishEditing() { + guard shouldReloadAfterDoneEditing else { return } + outlineView.reloadData() + } } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift index ea9e2ee25..41ef0c07c 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift @@ -64,6 +64,8 @@ final class ProjectNavigatorViewController: NSViewController { /// to open the file a second time. var shouldSendSelectionUpdate: Bool = true + var shouldReloadAfterDoneEditing: Bool = false + var filterIsEmpty: Bool { workspace?.navigatorFilter.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == true } diff --git a/CodeEdit/Features/SplitView/Views/SplitViewControllerView.swift b/CodeEdit/Features/SplitView/Views/SplitViewControllerView.swift index 57a47cd7d..81a29dd82 100644 --- a/CodeEdit/Features/SplitView/Views/SplitViewControllerView.swift +++ b/CodeEdit/Features/SplitView/Views/SplitViewControllerView.swift @@ -15,7 +15,7 @@ struct SplitViewControllerView: NSViewControllerRepresentable { @Binding var viewController: () -> SplitViewController? func makeNSViewController(context: Context) -> SplitViewController { - let controller = SplitViewController(axis: axis) { controller in + let controller = SplitViewController(axis: axis, parentView: self) { controller in updateItems(controller: controller) } return controller @@ -64,10 +64,6 @@ struct SplitViewControllerView: NSViewControllerRepresentable { } } } - - func makeCoordinator() -> SplitViewController { - SplitViewController(axis: axis, setUpItems: nil) - } } final class SplitViewController: NSSplitViewController { @@ -108,8 +104,9 @@ final class SplitViewController: NSSplitViewController { var setUpItems: ((SplitViewController) -> Void)? - init(axis: Axis, setUpItems: ((SplitViewController) -> Void)?) { + init(axis: Axis, parentView: SplitViewControllerView?, setUpItems: ((SplitViewController) -> Void)?) { self.axis = axis + self.parentView = parentView self.setUpItems = setUpItems super.init(nibName: nil, bundle: nil) }