Skip to content

Commit 890117f

Browse files
Added folder renaming
1 parent aa30305 commit 890117f

4 files changed

Lines changed: 55 additions & 90 deletions

File tree

CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ final class CEWorkspaceFile: Codable, Comparable, Hashable, Identifiable, Editor
116116

117117
/// Returns a boolean that is true if the resource represented by this object is a directory.
118118
lazy var isFolder: Bool = {
119-
resolvedURL.isFolder
119+
isPhantom ? resolvedURL.hasDirectoryPath : resolvedURL.isFolder
120120
}()
121121

122122
/// Returns a boolean that is true if the contents of the directory at this path are

CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -65,28 +65,14 @@ extension CEWorkspaceFileManager {
6565
useExtension: String? = nil,
6666
contents: Data? = nil
6767
) throws -> CEWorkspaceFile {
68-
// check the folder for other files, and see what the most common file extension is
6968
do {
70-
var fileExtension: String
71-
if fileName.contains(".") {
72-
// If we already have a file extension in the name, don't add another one
73-
fileExtension = ""
74-
} else {
75-
fileExtension = useExtension ?? findCommonFileExtension(for: file)
76-
77-
// Don't add a . if the extension is empty, but add it if it's missing.
78-
if !fileExtension.isEmpty && !fileExtension.starts(with: ".") {
79-
fileExtension = "." + fileExtension
80-
}
81-
}
82-
83-
var fileUrl = file.nearestFolder.appending(path: "\(fileName)\(fileExtension)")
69+
var fileUrl = file.nearestFolder.appending(path: "\(fileName)")
8470
// If a file/folder with the same name exists, add a number to the end.
8571
var fileNumber = 0
8672
while fileManager.fileExists(atPath: fileUrl.path) {
8773
fileNumber += 1
8874
fileUrl = fileUrl.deletingLastPathComponent()
89-
.appending(path: "\(fileName)\(fileNumber)\(fileExtension)")
75+
.appending(path: "\(fileName)\(fileNumber)")
9076
}
9177

9278
guard fileUrl.fileName.isValidFilename else {
@@ -117,31 +103,6 @@ extension CEWorkspaceFileManager {
117103
}
118104
}
119105

120-
/// Finds a common file extension in the same directory as a file. Defaults to `txt` if no better alternatives
121-
/// are found.
122-
/// - Parameter file: The file to use to determine a common extension.
123-
/// - Returns: The suggested file extension.
124-
private func findCommonFileExtension(for file: CEWorkspaceFile) -> String {
125-
var fileExtensions: [String: Int] = ["": 0]
126-
127-
for child in (
128-
file.isFolder ? file.flattenedSiblings(withHeight: 2, ignoringFolders: true, using: self)
129-
: file.parent?.flattenedSiblings(withHeight: 2, ignoringFolders: true, using: self)
130-
) ?? []
131-
where !child.isFolder {
132-
// if the file extension was present before, add it now
133-
let childFileName = child.fileName(typeHidden: false)
134-
if let index = childFileName.lastIndex(of: ".") {
135-
let childFileExtension = ".\(childFileName.suffix(from: index).dropFirst())"
136-
fileExtensions[childFileExtension] = (fileExtensions[childFileExtension] ?? 0) + 1
137-
} else {
138-
fileExtensions[""] = (fileExtensions[""] ?? 0) + 1
139-
}
140-
}
141-
142-
return fileExtensions.max(by: { $0.value < $1.value })?.key ?? "txt"
143-
}
144-
145106
/// This function deletes the item or folder from the current project by moving to Trash
146107
/// - Parameters:
147108
/// - file: The file or folder to delete

CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -84,33 +84,7 @@ extension ProjectNavigatorMenu {
8484
/// Action that creates a new untitled file
8585
@objc
8686
func newFile() {
87-
guard let item else { return }
88-
let phantomFile = CEWorkspaceFile(
89-
id: UUID().uuidString,
90-
url: item.url.appendingPathComponent("Untitled"),
91-
changeType: nil,
92-
staged: false
93-
)
94-
phantomFile.isPhantom = true
95-
phantomFile.parent = item
96-
97-
// Add phantom file to parent's children temporarily for display
98-
if let workspace = workspace,
99-
let fileManager = workspace.workspaceFileManager {
100-
_ = fileManager.childrenOfFile(item)
101-
fileManager.flattenedFileItems[phantomFile.id] = phantomFile
102-
if fileManager.childrenMap[item.id] == nil {
103-
fileManager.childrenMap[item.id] = []
104-
}
105-
fileManager.childrenMap[item.id]?.append(phantomFile.id)
106-
}
107-
108-
workspace?.listenerModel.highlightedFileItem = phantomFile
109-
sender.outlineView.reloadData()
110-
111-
DispatchQueue.main.async {
112-
self.renameFile()
113-
}
87+
createAndAddPhantomFile(isFolder: false)
11488
}
11589

11690
/// Opens the rename file dialogue on the cell this was presented from.
@@ -154,20 +128,10 @@ extension ProjectNavigatorMenu {
154128
}
155129
}
156130

157-
// TODO: allow custom folder names
158131
/// Action that creates a new untitled folder
159132
@objc
160133
func newFolder() {
161-
guard let item else { return }
162-
do {
163-
if let newFolder = try workspace?.workspaceFileManager?.addFolder(folderName: "untitled", toFile: item) {
164-
workspace?.listenerModel.highlightedFileItem = newFolder
165-
}
166-
} catch {
167-
let alert = NSAlert(error: error)
168-
alert.addButton(withTitle: "Dismiss")
169-
alert.runModal()
170-
}
134+
createAndAddPhantomFile(isFolder: true)
171135
}
172136

173137
/// Creates a new folder with the items selected.
@@ -299,6 +263,40 @@ extension ProjectNavigatorMenu {
299263
NSPasteboard.general.setString(paths, forType: .string)
300264
}
301265

266+
private func createAndAddPhantomFile(isFolder: Bool) {
267+
guard let item else { return }
268+
let phantomFile = CEWorkspaceFile(
269+
id: UUID().uuidString,
270+
url: item.url
271+
.appending(
272+
path: isFolder ? "New Folder" : "Untitled",
273+
directoryHint: isFolder ? .isDirectory : .notDirectory
274+
),
275+
changeType: nil,
276+
staged: false
277+
)
278+
phantomFile.isPhantom = true
279+
phantomFile.parent = item
280+
281+
// Add phantom file to parent's children temporarily for display
282+
if let workspace = workspace,
283+
let fileManager = workspace.workspaceFileManager {
284+
_ = fileManager.childrenOfFile(item)
285+
fileManager.flattenedFileItems[phantomFile.id] = phantomFile
286+
if fileManager.childrenMap[item.id] == nil {
287+
fileManager.childrenMap[item.id] = []
288+
}
289+
fileManager.childrenMap[item.id]?.append(phantomFile.id)
290+
}
291+
292+
workspace?.listenerModel.highlightedFileItem = phantomFile
293+
sender.outlineView.reloadData()
294+
295+
DispatchQueue.main.async {
296+
self.renameFile()
297+
}
298+
}
299+
302300
private func reloadData() {
303301
sender.outlineView.reloadData()
304302
sender.filteredContentChildren.removeAll()

CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,27 @@ final class ProjectNavigatorTableViewCell: FileSystemTableViewCell {
8888
let workspaceFileManager = workspace.workspace?.workspaceFileManager,
8989
let parent = fileItem.parent {
9090
do {
91-
let newFile = try workspaceFileManager.addFile(
92-
fileName: newName,
93-
toFile: parent
94-
)
95-
96-
removePhantomFile(fileItem: fileItem, fileManager: workspaceFileManager)
97-
workspace.workspace?.listenerModel.highlightedFileItem = newFile
98-
workspace.workspace?.editorManager?.openTab(item: newFile)
99-
91+
if fileItem.isFolder {
92+
let newFolder = try workspaceFileManager.addFolder(
93+
folderName: newName,
94+
toFile: parent
95+
)
96+
workspace.workspace?.listenerModel.highlightedFileItem = newFolder
97+
} else {
98+
let newFile = try workspaceFileManager.addFile(
99+
fileName: newName,
100+
toFile: parent
101+
)
102+
workspace.workspace?.listenerModel.highlightedFileItem = newFile
103+
workspace.workspace?.editorManager?.openTab(item: newFile)
104+
}
100105
} catch {
101106
let alert = NSAlert(error: error)
102107
alert.addButton(withTitle: "Dismiss")
103108
alert.runModal()
104-
removePhantomFile(fileItem: fileItem, fileManager: workspaceFileManager)
105109
}
110+
111+
removePhantomFile(fileItem: fileItem, fileManager: workspaceFileManager)
106112
}
107113
} else {
108114
if let workspace = delegate as? ProjectNavigatorViewController,

0 commit comments

Comments
 (0)