From b69f297871c42500f27216e4f3a3e9a157581adb Mon Sep 17 00:00:00 2001 From: Karan Sah <58397645+karan0046@users.noreply.github.com> Date: Fri, 28 Feb 2025 02:41:39 +0530 Subject: [PATCH 01/24] Fix Open in Tab not working issue (#1994) Co-authored-by: Karan Sah --- CodeEdit/Features/Editor/Models/Editor.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CodeEdit/Features/Editor/Models/Editor.swift b/CodeEdit/Features/Editor/Models/Editor.swift index a4da65317..d6fcfa767 100644 --- a/CodeEdit/Features/Editor/Models/Editor.swift +++ b/CodeEdit/Features/Editor/Models/Editor.swift @@ -186,6 +186,8 @@ final class Editor: ObservableObject, Identifiable { case (.some(let tab), false) where tab == item: temporaryTab = nil + case (.some(let tab), false) where tab != item: + openTab(file: item.file) case (.none, true): openTab(file: item.file) From 50ba7d19ef68bb2543130c57833b3076bd8f70c3 Mon Sep 17 00:00:00 2001 From: Abe Date: Thu, 27 Feb 2025 17:56:00 -0800 Subject: [PATCH 02/24] Replace deprecated appendingPathComponent calls (#1998) --- .../CEWorkspace/Models/CEWorkspaceFile.swift | 2 +- .../CEWorkspaceFileManager+FileManagement.swift | 12 ++++++------ .../Models/CEWorkspaceFileManager.swift | 2 +- .../Models/CEWorkspaceSettings.swift | 4 ++-- .../FileInspector/FileInspectorView.swift | 2 +- .../OutlineView/FileSystemTableViewCell.swift | 2 +- .../ProjectNavigatorMenuActions.swift | 2 +- .../ProjectNavigatorTableViewCell.swift | 2 +- ...rViewController+NSOutlineViewDataSource.swift | 2 +- CodeEdit/Features/Settings/Models/Settings.swift | 4 ++-- .../AccountsSettingsDetailsView.swift | 8 ++++---- .../Models/SearchSettingsModel.swift | 8 ++++---- .../Models/IgnorePatternModel.swift | 6 +++--- .../SourceControlGitView.swift | 10 +++++----- .../ThemeSettings/Models/ThemeModel+CRUD.swift | 16 ++++++++-------- .../Pages/ThemeSettings/Models/ThemeModel.swift | 12 ++++++------ .../SourceControl/Models/GitCommit.swift | 2 +- .../Features/CodeFile/CodeFileTests.swift | 6 +++--- .../Documents/Indexer/TemporaryFile.swift | 10 +++++----- ...ocument+SearchState+FindAndReplaceTests.swift | 4 ++-- ...WorkspaceDocument+SearchState+FindTests.swift | 4 ++-- ...orkspaceDocument+SearchState+IndexTests.swift | 4 ++-- .../CEWorkspaceFileManagerTests.swift | 10 +++++----- 23 files changed, 67 insertions(+), 67 deletions(-) diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift index 32e3367ee..b544b6367 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift @@ -258,7 +258,7 @@ final class CEWorkspaceFile: Codable, Comparable, Hashable, Identifiable, Editor !newName.isEmpty && newName.isValidFilename && !FileManager.default.fileExists( - atPath: self.url.deletingLastPathComponent().appendingPathComponent(newName).path + atPath: self.url.deletingLastPathComponent().appending(path: newName).path ) else { return false } diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift index 29182c645..96115088f 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+FileManagement.swift @@ -18,15 +18,15 @@ extension CEWorkspaceFileManager { func addFolder(folderName: String, toFile file: CEWorkspaceFile) throws -> CEWorkspaceFile { // Check if folder, if it is create folder under self, else create on same level. var folderUrl = ( - file.isFolder ? file.url.appendingPathComponent(folderName) - : file.url.deletingLastPathComponent().appendingPathComponent(folderName) + file.isFolder ? file.url.appending(path: folderName) + : file.url.deletingLastPathComponent().appending(path: folderName) ) // If a file/folder with the same name exists, add a number to the end. var fileNumber = 0 while fileManager.fileExists(atPath: folderUrl.path) { fileNumber += 1 - folderUrl = folderUrl.deletingLastPathComponent().appendingPathComponent("\(folderName)\(fileNumber)") + folderUrl = folderUrl.deletingLastPathComponent().appending(path: "\(folderName)\(fileNumber)") } // Create the folder @@ -79,13 +79,13 @@ extension CEWorkspaceFileManager { } } - var fileUrl = file.nearestFolder.appendingPathComponent("\(fileName)\(fileExtension)") + var fileUrl = file.nearestFolder.appending(path: "\(fileName)\(fileExtension)") // If a file/folder with the same name exists, add a number to the end. var fileNumber = 0 while fileManager.fileExists(atPath: fileUrl.path) { fileNumber += 1 fileUrl = fileUrl.deletingLastPathComponent() - .appendingPathComponent("\(fileName)\(fileNumber)\(fileExtension)") + .appending(path: "\(fileName)\(fileNumber)\(fileExtension)") } guard fileUrl.fileName.isValidFilename else { @@ -227,7 +227,7 @@ extension CEWorkspaceFileManager { let fileExtension = fileUrl.pathExtension.isEmpty ? "" : ".\(fileUrl.pathExtension)" let fileName = fileExtension.isEmpty ? previousName : previousName.replacingOccurrences(of: fileExtension, with: "") - fileUrl = fileUrl.deletingLastPathComponent().appendingPathComponent("\(fileName) copy\(fileExtension)") + fileUrl = fileUrl.deletingLastPathComponent().appending(path: "\(fileName) copy\(fileExtension)") } if fileManager.fileExists(atPath: file.url.path) { diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager.swift index f81e40622..078d85d5b 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager.swift @@ -198,7 +198,7 @@ final class CEWorkspaceFileManager { /// - Parameter file: The parent element. /// - Returns: A child element with an associated parent. func createChild(_ url: URL, forParent file: CEWorkspaceFile) -> CEWorkspaceFile { - let relativeURL = URL(filePath: file.id).appendingPathComponent(url.lastPathComponent) + let relativeURL = URL(filePath: file.id).appending(path: url.lastPathComponent) let childId = relativeURL.relativePath let newFileItem = CEWorkspaceFile(id: childId, url: relativeURL) newFileItem.parent = file diff --git a/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift b/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift index a48610d8a..8ff0b0249 100644 --- a/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift +++ b/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift @@ -18,11 +18,11 @@ final class CEWorkspaceSettings: ObservableObject { private(set) var folderURL: URL private var settingsURL: URL { - folderURL.appendingPathComponent("settings").appendingPathExtension("json") + folderURL.appending(path: "settings").appending(path: "json") } init(workspaceURL: URL) { - folderURL = workspaceURL.appendingPathComponent(".codeedit", isDirectory: true) + folderURL = workspaceURL.appending(path: ".codeedit", directoryHint: .isDirectory) loadSettings() storeTask = $settings diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index d11f75fbd..c7a3933aa 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -91,7 +91,7 @@ struct FileInspectorView: View { if file.validateFileName(for: fileName) { let destinationURL = file.url .deletingLastPathComponent() - .appendingPathComponent(fileName) + .appending(path: fileName) DispatchQueue.main.async { [weak workspace] in do { if let newItem = try workspace?.workspaceFileManager?.move( diff --git a/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift b/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift index 9721c8ccf..fcbed691d 100644 --- a/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift +++ b/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift @@ -164,7 +164,7 @@ extension FileSystemTableViewCell: NSTextFieldDelegate { if fileItem.validateFileName(for: textField?.stringValue ?? "") { let newURL = fileItem.url .deletingLastPathComponent() - .appendingPathComponent(textField?.stringValue ?? "") + .appending(path: textField?.stringValue ?? "") try workspace?.workspaceFileManager?.move(file: fileItem, to: newURL) } else { textField?.stringValue = fileItem.labelFileName() diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift index 8cdd59349..f3eac9cef 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift @@ -127,7 +127,7 @@ extension ProjectNavigatorMenu { var folderNumber = 0 while workspaceFileManager.fileManager.fileExists(atPath: newFolderURL.path) { folderNumber += 1 - newFolderURL = parent.url.appendingPathComponent("New Folder With Items \(folderNumber)") + newFolderURL = parent.url.appending(path: "New Folder With Items \(folderNumber)") } do { diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift index e6a2ac377..eef5b4e1b 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorTableViewCell.swift @@ -59,7 +59,7 @@ final class ProjectNavigatorTableViewCell: FileSystemTableViewCell { if fileItem.validateFileName(for: textField?.stringValue ?? "") { let destinationURL = fileItem.url .deletingLastPathComponent() - .appendingPathComponent(textField?.stringValue ?? "") + .appending(path: textField?.stringValue ?? "") delegate?.moveFile(file: fileItem, to: destinationURL) } else { textField?.stringValue = fileItem.labelFileName() diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift index 546a0b621..9cd4f4e3d 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift @@ -86,7 +86,7 @@ extension ProjectNavigatorViewController: NSOutlineViewDataSource { let destParentURL = fileItemDestination.url for fileItemURL in fileItemURLS { - let destURL = destParentURL.appendingPathComponent(fileItemURL.lastPathComponent) + let destURL = destParentURL.appending(path: fileItemURL.lastPathComponent) // cancel dropping file item on self or in parent directory if fileItemURL == destURL || fileItemURL == destParentURL { return false diff --git a/CodeEdit/Features/Settings/Models/Settings.swift b/CodeEdit/Features/Settings/Models/Settings.swift index 4953d1e0d..0d638c0ec 100644 --- a/CodeEdit/Features/Settings/Models/Settings.swift +++ b/CodeEdit/Features/Settings/Models/Settings.swift @@ -80,7 +80,7 @@ final class Settings: ObservableObject { internal var baseURL: URL { filemanager .homeDirectoryForCurrentUser - .appendingPathComponent("Library/Application Support/CodeEdit", isDirectory: true) + .appending(path: "Library/Application Support/CodeEdit", directoryHint: .isDirectory) } /// The URL of the `settings.json` settings file. @@ -88,7 +88,7 @@ final class Settings: ObservableObject { /// Points to `~/Library/Application Support/CodeEdit/settings.json` private var settingsURL: URL { baseURL - .appendingPathComponent("settings") + .appending(path: "settings") .appendingPathExtension("json") } } diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsDetailsView.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsDetailsView.swift index 13707d7e2..b4a02095d 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsDetailsView.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsDetailsView.swift @@ -80,15 +80,15 @@ struct AccountsSettingsDetailsView: View { Text("None") .tag("") Divider() - if let sshPath = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent( - ".ssh", - isDirectory: true + if let sshPath = FileManager.default.homeDirectoryForCurrentUser.appending( + path: ".ssh", + directoryHint: .isDirectory ) as URL? { if let files = try? FileManager.default.contentsOfDirectory( atPath: sshPath.path ) { ForEach(files, id: \.self) { filename in - let fileURL = sshPath.appendingPathComponent(filename) + let fileURL = sshPath.appending(path: filename) if let contents = try? String(contentsOf: fileURL) { if isPublicSSHKey(contents) { Text(filename.replacingOccurrences(of: ".pub", with: "")) diff --git a/CodeEdit/Features/Settings/Pages/SearchSettings/Models/SearchSettingsModel.swift b/CodeEdit/Features/Settings/Pages/SearchSettings/Models/SearchSettingsModel.swift index 41a798a5d..28cf47818 100644 --- a/CodeEdit/Features/Settings/Pages/SearchSettings/Models/SearchSettingsModel.swift +++ b/CodeEdit/Features/Settings/Pages/SearchSettings/Models/SearchSettingsModel.swift @@ -29,22 +29,22 @@ final class SearchSettingsModel: ObservableObject { /// The base folder url `~/Library/Application Support/CodeEdit/` private var baseURL: URL { - filemanager.homeDirectoryForCurrentUser.appendingPathComponent("Library/Application Support/CodeEdit") + filemanager.homeDirectoryForCurrentUser.appending(path: "Library/Application Support/CodeEdit") } /// The URL of the `search` folder internal var searchURL: URL { - baseURL.appendingPathComponent("search", isDirectory: true) + baseURL.appending(path: "search", directoryHint: .isDirectory) } /// The URL of the `Extensions` folder internal var extensionsURL: URL { - baseURL.appendingPathComponent("Extensions", isDirectory: true) + baseURL.appending(path: "Extensions", directoryHint: .isDirectory) } /// The URL of the `settings.json` file internal var settingsURL: URL { - baseURL.appendingPathComponent("settings.json", isDirectory: true) + baseURL.appending(path: "settings.json", directoryHint: .isDirectory) } /// Selected patterns diff --git a/CodeEdit/Features/Settings/Pages/SourceControlSettings/Models/IgnorePatternModel.swift b/CodeEdit/Features/Settings/Pages/SourceControlSettings/Models/IgnorePatternModel.swift index c57d79d3c..01c8d7aab 100644 --- a/CodeEdit/Features/Settings/Pages/SourceControlSettings/Models/IgnorePatternModel.swift +++ b/CodeEdit/Features/Settings/Pages/SourceControlSettings/Models/IgnorePatternModel.swift @@ -56,15 +56,15 @@ class IgnorePatternModel: ObservableObject { if !excludesFile.isEmpty { if excludesFile.starts(with: "~/") { let relativePath = String(excludesFile.dropFirst(2)) // Remove "~/" - return FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(relativePath) + return FileManager.default.homeDirectoryForCurrentUser.appending(path: relativePath) } else if excludesFile.starts(with: "/") { return URL(fileURLWithPath: excludesFile) // Absolute path } else { - return FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(excludesFile) + return FileManager.default.homeDirectoryForCurrentUser.appending(path: excludesFile) } } else { let defaultPath = ".gitignore_global" - let fileURL = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(defaultPath) + let fileURL = FileManager.default.homeDirectoryForCurrentUser.appending(path: defaultPath) await gitConfig.set(key: "core.excludesfile", value: "~/\(defaultPath)", global: true) return fileURL } diff --git a/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlGitView.swift b/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlGitView.swift index 7ba696434..b0436366d 100644 --- a/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlGitView.swift +++ b/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlGitView.swift @@ -170,15 +170,15 @@ private extension SourceControlGitView { ), !excludesfile.isEmpty { if excludesfile.starts(with: "~/") { let relativePath = String(excludesfile.dropFirst(2)) - return FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(relativePath) + return FileManager.default.homeDirectoryForCurrentUser.appending(path: relativePath) } else if excludesfile.starts(with: "/") { return URL(fileURLWithPath: excludesfile) } else { - return FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(excludesfile) + return FileManager.default.homeDirectoryForCurrentUser.appending(path: excludesfile) } } else { - let defaultURL = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent( - ".gitignore_global" + let defaultURL = FileManager.default.homeDirectoryForCurrentUser.appending( + path: ".gitignore_global" ) await gitConfig.set(key: "core.excludesfile", value: "~/\(defaultURL.lastPathComponent)", global: true) return defaultURL @@ -196,7 +196,7 @@ private extension SourceControlGitView { } private func openGitConfigFile() { - let fileURL = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(".gitconfig") + let fileURL = FileManager.default.homeDirectoryForCurrentUser.appending(path: ".gitconfig") if !FileManager.default.fileExists(atPath: fileURL.path) { FileManager.default.createFile(atPath: fileURL.path, contents: nil) diff --git a/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel+CRUD.swift b/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel+CRUD.swift index 07b03dd14..3c9e5e093 100644 --- a/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel+CRUD.swift +++ b/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel+CRUD.swift @@ -50,7 +50,7 @@ extension ThemeModel { $0.contains(".cetheme") } let userDefinedThemeURLs = userDefinedThemeFilenames.map { - themesURL.appendingPathComponent($0) + themesURL.appending(path: $0) } // get all bundled theme URLs @@ -58,7 +58,7 @@ extension ThemeModel { $0.contains(".cetheme") } let bundledThemeURLs = bundledThemeFilenames.map { - bundledThemesURL.appendingPathComponent($0) + bundledThemesURL.appending(path: $0) } // combine user theme URLs with bundled theme URLs @@ -154,7 +154,7 @@ extension ThemeModel { do { self.isAdding = true // Construct the destination file URL - var destinationFileURL = self.themesURL.appendingPathComponent(url.lastPathComponent) + var destinationFileURL = self.themesURL.appending(path: url.lastPathComponent) // Extract the base filename and extension let fileExtension = destinationFileURL.pathExtension @@ -172,7 +172,7 @@ extension ThemeModel { if isBundled { newFileName = "\(fileName) \(iterator)" destinationFileURL = self.themesURL - .appendingPathComponent(newFileName) + .appending(path: newFileName) .appendingPathExtension(fileExtension) } @@ -188,7 +188,7 @@ extension ThemeModel { // Generate a new filename with an iterator newFileName = "\(fileName) \(iterator)" destinationFileURL = self.themesURL - .appendingPathComponent(newFileName) + .appending(path: newFileName) .appendingPathExtension(fileExtension) iterator += 1 @@ -231,17 +231,17 @@ extension ThemeModel { } var finalName = newName - var finalURL = themesURL.appendingPathComponent(finalName).appendingPathExtension("cetheme") + var finalURL = themesURL.appending(path: finalName).appendingPathExtension("cetheme") var iterator = 1 // Check for existing display names in themes while themes.contains(where: { theme != $0 && $0.displayName == finalName }) { finalName = "\(newName) \(iterator)" - finalURL = themesURL.appendingPathComponent(finalName).appendingPathExtension("cetheme") + finalURL = themesURL.appending(path: finalName).appendingPathExtension("cetheme") iterator += 1 } - let isActive = self.getThemeActive(theme) + _ = self.getThemeActive(theme) try filemanager.moveItem(at: oldURL, to: finalURL) diff --git a/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel.swift b/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel.swift index 55bac77d5..fb755a9fe 100644 --- a/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel.swift +++ b/CodeEdit/Features/Settings/Pages/ThemeSettings/Models/ThemeModel.swift @@ -26,26 +26,26 @@ final class ThemeModel: ObservableObject { /// The base folder url `~/Library/Application Support/CodeEdit/` private var baseURL: URL { - filemanager.homeDirectoryForCurrentUser.appendingPathComponent("Library/Application Support/CodeEdit") + filemanager.homeDirectoryForCurrentUser.appending(path: "Library/Application Support/CodeEdit") } var bundledThemesURL: URL? { - Bundle.main.resourceURL?.appendingPathComponent("DefaultThemes", isDirectory: true) ?? nil + Bundle.main.resourceURL?.appending(path: "DefaultThemes", directoryHint: .isDirectory) ?? nil } /// The URL of the `Themes` folder internal var themesURL: URL { - baseURL.appendingPathComponent("Themes", isDirectory: true) + baseURL.appending(path: "Themes", directoryHint: .isDirectory) } /// The URL of the `Extensions` folder internal var extensionsURL: URL { - baseURL.appendingPathComponent("Extensions", isDirectory: true) + baseURL.appending(path: "Extensions", directoryHint: .isDirectory) } /// The URL of the `settings.json` file internal var settingsURL: URL { - baseURL.appendingPathComponent("settings.json", isDirectory: true) + baseURL.appending(path: "settings.json", directoryHint: .isDirectory) } /// System color scheme @@ -193,7 +193,7 @@ final class ThemeModel: ObservableObject { for theme in customThemes { guard let sourceURL = theme.fileURL else { continue } - let destinationURL = exportDirectory.appendingPathComponent("\(theme.displayName).cetheme") + let destinationURL = exportDirectory.appending(path: "\(theme.displayName).cetheme") do { try FileManager.default.copyItem(at: sourceURL, to: destinationURL) diff --git a/CodeEdit/Features/SourceControl/Models/GitCommit.swift b/CodeEdit/Features/SourceControl/Models/GitCommit.swift index b0195b9f3..da2b95063 100644 --- a/CodeEdit/Features/SourceControl/Models/GitCommit.swift +++ b/CodeEdit/Features/SourceControl/Models/GitCommit.swift @@ -48,7 +48,7 @@ struct GitCommit: Equatable, Hashable, Identifiable { formattedRemote = URL.init(fileURLWithPath: "\(domain)/\(parts[parts.count - 1])") } - return formattedRemote.deletingPathExtension().appendingPathComponent("commit") + return formattedRemote.deletingPathExtension().appending(path: "commit") } var remoteString: String { diff --git a/CodeEditTests/Features/CodeFile/CodeFileTests.swift b/CodeEditTests/Features/CodeFile/CodeFileTests.swift index 8f5649136..20d747b2f 100644 --- a/CodeEditTests/Features/CodeFile/CodeFileTests.swift +++ b/CodeEditTests/Features/CodeFile/CodeFileTests.swift @@ -20,10 +20,10 @@ final class CodeFileUnitTests: XCTestCase { appropriateFor: nil, create: true ) - .appendingPathComponent("CodeEdit", isDirectory: true) - .appendingPathComponent("WorkspaceClientTests", isDirectory: true) + .appending(path: "CodeEdit", directoryHint: .isDirectory) + .appending(path: "WorkspaceClientTests", directoryHint: .isDirectory) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) - fileURL = directory.appendingPathComponent("fakeFile.swift") + fileURL = directory.appending(path: "fakeFile.swift") } func testLoadUTF8Encoding() throws { diff --git a/CodeEditTests/Features/Documents/Indexer/TemporaryFile.swift b/CodeEditTests/Features/Documents/Indexer/TemporaryFile.swift index 8e9017b3d..b910ac1b3 100644 --- a/CodeEditTests/Features/Documents/Indexer/TemporaryFile.swift +++ b/CodeEditTests/Features/Documents/Indexer/TemporaryFile.swift @@ -52,7 +52,7 @@ class TempFolderManager { init() { self.temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()) - self.customFolderURL = temporaryDirectoryURL.appendingPathComponent("TestingFolder") + self.customFolderURL = temporaryDirectoryURL.appending(path: "TestingFolder") } deinit { @@ -72,8 +72,8 @@ class TempFolderManager { } func createFiles() { - let file1URL = customFolderURL.appendingPathComponent("file1.txt") - let file2URL = customFolderURL.appendingPathComponent("file2.txt") + let file1URL = customFolderURL.appending(path: "file1.txt") + let file2URL = customFolderURL.appending(path: "file2.txt") let file1Content = "This is file 1" let file2Content = "This is file 2" @@ -88,8 +88,8 @@ class TempFolderManager { func cleanup() { do { - let file1URL = customFolderURL.appendingPathComponent("file1.txt") - let file2URL = customFolderURL.appendingPathComponent("file2.txt") + let file1URL = customFolderURL.appending(path: "file1.txt") + let file2URL = customFolderURL.appending(path: "file2.txt") try FileManager.default.removeItem(at: file1URL) try FileManager.default.removeItem(at: file2URL) diff --git a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift index d358b0991..72fd990db 100644 --- a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift +++ b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift @@ -29,8 +29,8 @@ final class FindAndReplaceTests: XCTestCase { appropriateFor: nil, create: true ) - .appendingPathComponent("CodeEdit", isDirectory: true) - .appendingPathComponent("WorkspaceClientTests", isDirectory: true) + .appending(path: "CodeEdit", directoryHint: .isDirectory) + .appending(path: "WorkspaceClientTests", directoryHint: .isDirectory) try? FileManager.default.removeItem(at: directory) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) diff --git a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindTests.swift b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindTests.swift index 71434f2ef..1c3de542b 100644 --- a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindTests.swift +++ b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindTests.swift @@ -25,8 +25,8 @@ final class FindTests: XCTestCase { appropriateFor: nil, create: true ) - .appendingPathComponent("CodeEdit", isDirectory: true) - .appendingPathComponent("WorkspaceClientTests", isDirectory: true) + .appending(path: "CodeEdit", directoryHint: .isDirectory) + .appending(path: "WorkspaceClientTests", directoryHint: .isDirectory) try? FileManager.default.removeItem(at: directory) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) diff --git a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+IndexTests.swift b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+IndexTests.swift index a0f161133..e37039e0a 100644 --- a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+IndexTests.swift +++ b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+IndexTests.swift @@ -28,8 +28,8 @@ final class WorkspaceDocumentIndexTests: XCTestCase { appropriateFor: nil, create: true ) - .appendingPathComponent("CodeEdit", isDirectory: true) - .appendingPathComponent("WorkspaceClientTests", isDirectory: true) + .appending(path: "CodeEdit", directoryHint: .isDirectory) + .appending(path: "WorkspaceClientTests", directoryHint: .isDirectory) try? FileManager.default.removeItem(at: directory) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) diff --git a/CodeEditTests/Utils/CEWorkspaceFileManager/CEWorkspaceFileManagerTests.swift b/CodeEditTests/Utils/CEWorkspaceFileManager/CEWorkspaceFileManagerTests.swift index fd80ace28..2fb01159f 100644 --- a/CodeEditTests/Utils/CEWorkspaceFileManager/CEWorkspaceFileManagerTests.swift +++ b/CodeEditTests/Utils/CEWorkspaceFileManager/CEWorkspaceFileManagerTests.swift @@ -32,8 +32,8 @@ final class CEWorkspaceFileManagerUnitTests: XCTestCase { appropriateFor: nil, create: true ) - .appendingPathComponent("CodeEdit", isDirectory: true) - .appendingPathComponent("WorkspaceClientTests", isDirectory: true) + .appending(path: "CodeEdit", directoryHint: .isDirectory) + .appending(path: "WorkspaceClientTests", directoryHint: .isDirectory) try? FileManager.default.removeItem(at: directory) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) } @@ -48,7 +48,7 @@ final class CEWorkspaceFileManagerUnitTests: XCTestCase { try files.forEach { let fakeData = Data("fake string".utf8) let fileUrl = directory - .appendingPathComponent($0) + .appending(path: $0) try fakeData.write(to: fileUrl) } let client = CEWorkspaceFileManager( @@ -85,7 +85,7 @@ final class CEWorkspaceFileManagerUnitTests: XCTestCase { try files.forEach { let fakeData = Data("fake string".utf8) let fileUrl = directory - .appendingPathComponent($0) + .appending(path: $0) try fakeData.write(to: fileUrl) } @@ -144,7 +144,7 @@ final class CEWorkspaceFileManagerUnitTests: XCTestCase { func testDuplicateFile() throws { let testFileURL = directory.appending(path: "file.txt") - let testDuplicatedFileURL = directory.appendingPathComponent("file copy.txt") + let testDuplicatedFileURL = directory.appending(path: "file copy.txt") try "😄".write(to: testFileURL, atomically: true, encoding: .utf8) let fileManager = CEWorkspaceFileManager( From aac7aa1a1ec055c7543b761a90cc3a30534c6fbc Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Sun, 2 Mar 2025 09:16:09 -0600 Subject: [PATCH 03/24] Drag and Drop External Files to Open in Editor (#2000) --- .../Editor/Views/EditorAreaView.swift | 33 +++++++++++++++++++ CodeEdit/WorkspaceView.swift | 22 +++++++++++++ 2 files changed, 55 insertions(+) diff --git a/CodeEdit/Features/Editor/Views/EditorAreaView.swift b/CodeEdit/Features/Editor/Views/EditorAreaView.swift index 16b498db5..e67b9f81d 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaView.swift @@ -7,6 +7,7 @@ import SwiftUI import CodeEditTextView +import UniformTypeIdentifiers struct EditorAreaView: View { @AppSettings(\.general.showEditorJumpBar) @@ -26,6 +27,9 @@ struct EditorAreaView: View { @State var codeFile: CodeFileDocument? + @Environment(\.window.value) + private var window: NSWindow? + init(editor: Editor, focus: FocusState.Binding) { self.editor = editor self._focus = focus @@ -59,6 +63,10 @@ struct EditorAreaView: View { insets.top += editorInsetAmount } .opacity(dimEditorsWithoutFocus && editor != editorManager.activeEditor ? 0.5 : 1) + .onDrop(of: [.fileURL], isTargeted: nil) { providers in + _ = handleDrop(providers: providers) + return true + } } else { LoadingFileView(selected.file.name) .onAppear { @@ -77,6 +85,10 @@ struct EditorAreaView: View { .onTapGesture { editorManager.activeEditor = editor } + .onDrop(of: [.fileURL], isTargeted: nil) { providers in + _ = handleDrop(providers: providers) + return true + } } } .frame(maxWidth: .infinity, maxHeight: .infinity) @@ -122,4 +134,25 @@ struct EditorAreaView: View { codeFile = newValue?.file.fileDocument } } + + private func handleDrop(providers: [NSItemProvider]) -> Bool { + for provider in providers { + provider.loadItem(forTypeIdentifier: UTType.fileURL.identifier, options: nil) { item, _ in + guard let data = item as? Data, + let url = URL(dataRepresentation: data, relativeTo: nil) else { + return + } + + DispatchQueue.main.async { + let file = CEWorkspaceFile(url: url) + editor.openTab(file: file) + editorManager.activeEditor = editor + focus = editor + NSApp.activate(ignoringOtherApps: true) + window?.makeKeyAndOrderFront(nil) + } + } + } + return true + } } diff --git a/CodeEdit/WorkspaceView.swift b/CodeEdit/WorkspaceView.swift index 3a7cf0ddf..9332b4f16 100644 --- a/CodeEdit/WorkspaceView.swift +++ b/CodeEdit/WorkspaceView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import UniformTypeIdentifiers struct WorkspaceView: View { @Environment(\.window.value) @@ -167,8 +168,29 @@ struct WorkspaceView: View { } .background(EffectView(.contentBackground)) .background(WorkspaceSheets().environmentObject(sourceControlManager)) + .onDrop(of: [.fileURL], isTargeted: nil) { providers in + _ = handleDrop(providers: providers) + return true + } .accessibilityElement(children: .contain) .accessibilityLabel("workspace area") } } + + private func handleDrop(providers: [NSItemProvider]) -> Bool { + for provider in providers { + provider.loadItem(forTypeIdentifier: UTType.fileURL.identifier, options: nil) { item, _ in + guard let data = item as? Data, + let url = URL(dataRepresentation: data, relativeTo: nil) else { + return + } + + DispatchQueue.main.async { + let file = CEWorkspaceFile(url: url) + editorManager.activeEditor.openTab(file: file) + } + } + } + return true + } } From abced050b7d34e0a9e31c323a5f0f8639bf03342 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Sun, 2 Mar 2025 15:34:15 -0600 Subject: [PATCH 04/24] Global Notification System (#1984) --- CodeEdit.xcodeproj/project.pbxproj | 108 ++++++- .../About/Views/BlurButtonStyle.swift | 46 +-- .../TaskNotificationHandler.swift | 2 +- .../{Views => Styles}/IconButtonStyle.swift | 0 .../{Views => Styles}/IconToggleStyle.swift | 0 .../MenuWithButtonStyle.swift | 0 .../Styles/OverlayButtonStyle.swift | 34 +++ .../CodeEditUI/Views/FeatureIcon.swift | 98 +++++++ .../Views/ScrollOffsetPreferenceKey.swift | 10 + .../Views/SegmentedControlImproved.swift | 145 ---------- .../CodeEditWindowController+Toolbar.swift | 11 + .../CodeEditWindowControllerExtensions.swift | 1 + .../WorkspaceDocument/WorkspaceDocument.swift | 13 + .../FileInspector/FileInspectorView.swift | 2 +- .../InternalDevelopmentInspectorView.swift | 16 ++ ...InternalDevelopmentNotificationsView.swift | 206 ++++++++++++++ .../InspectorArea/Models/InspectorTab.swift | 7 + .../Views/InspectorAreaView.swift | 34 ++- .../Notifications/Models/CENotification.swift | 122 ++++++++ .../NotificationManager+Delegate.swift | 67 +++++ .../NotificationManager+System.swift | 46 +++ .../Notifications/NotificationManager.swift | 196 +++++++++++++ .../NotificationPanelViewModel.swift | 265 ++++++++++++++++++ .../Views/DismissTransition.swift | 12 + .../Views/NotificationBannerView.swift | 170 +++++++++++ .../Views/NotificationPanelView.swift | 164 +++++++++++ .../Views/NotificationToolbarItem.swift | 35 +++ .../AccountsSettingsAccountLink.swift | 9 +- .../AccountsSettingsProviderRow.swift | 6 +- .../AccountsSettingsSigninView.swift | 7 +- .../DeveloperSettingsView.swift | 7 + .../Models/DeveloperSettings.swift | 11 +- .../SourceControlSettingsView.swift | 2 +- .../Features/Settings/Views/FeatureIcon.swift | 44 --- .../Settings/Views/SettingsPageView.swift | 19 +- CodeEdit/WorkspaceView.swift | 3 + .../Preferences/ViewOffsetPreferenceKey.swift | 10 + 37 files changed, 1676 insertions(+), 252 deletions(-) rename CodeEdit/Features/CodeEditUI/{Views => Styles}/IconButtonStyle.swift (100%) rename CodeEdit/Features/CodeEditUI/{Views => Styles}/IconToggleStyle.swift (100%) rename CodeEdit/Features/CodeEditUI/{Views => Styles}/MenuWithButtonStyle.swift (100%) create mode 100644 CodeEdit/Features/CodeEditUI/Styles/OverlayButtonStyle.swift create mode 100644 CodeEdit/Features/CodeEditUI/Views/FeatureIcon.swift create mode 100644 CodeEdit/Features/CodeEditUI/Views/ScrollOffsetPreferenceKey.swift delete mode 100644 CodeEdit/Features/CodeEditUI/Views/SegmentedControlImproved.swift create mode 100644 CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift create mode 100644 CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift create mode 100644 CodeEdit/Features/Notifications/Models/CENotification.swift create mode 100644 CodeEdit/Features/Notifications/NotificationManager+Delegate.swift create mode 100644 CodeEdit/Features/Notifications/NotificationManager+System.swift create mode 100644 CodeEdit/Features/Notifications/NotificationManager.swift create mode 100644 CodeEdit/Features/Notifications/ViewModels/NotificationPanelViewModel.swift create mode 100644 CodeEdit/Features/Notifications/Views/DismissTransition.swift create mode 100644 CodeEdit/Features/Notifications/Views/NotificationBannerView.swift create mode 100644 CodeEdit/Features/Notifications/Views/NotificationPanelView.swift create mode 100644 CodeEdit/Features/Notifications/Views/NotificationToolbarItem.swift delete mode 100644 CodeEdit/Features/Settings/Views/FeatureIcon.swift create mode 100644 CodeEditUI/src/Preferences/ViewOffsetPreferenceKey.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 15d4f127d..6a26fcfb4 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -458,7 +458,6 @@ 6CB9144B29BEC7F100BC47F2 /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CB94CFE2C9F1C9A00E8651C /* TextView+LSPRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CB94CFD2C9F1C9A00E8651C /* TextView+LSPRange.swift */; }; 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB94D022CA1205100E8651C /* AsyncAlgorithms */; }; - 6CBA0D512A1BF524002C6FAA /* SegmentedControlImproved.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBA0D502A1BF524002C6FAA /* SegmentedControlImproved.swift */; }; 6CBD1BC62978DE53006639D5 /* Font+Caption3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBD1BC52978DE53006639D5 /* Font+Caption3.swift */; }; 6CBE1CFB2B71DAA6003AC32E /* Loopable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBE1CFA2B71DAA6003AC32E /* Loopable.swift */; }; 6CC00A8B2CBEF150004E8134 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC00A8A2CBEF150004E8134 /* CodeEditSourceEditor */; }; @@ -527,6 +526,10 @@ B607184C2B17E037009CDAB4 /* SourceControlStashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B607184B2B17E037009CDAB4 /* SourceControlStashView.swift */; }; B60BE8BD297A167600841125 /* AcknowledgementRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60BE8BC297A167600841125 /* AcknowledgementRowView.swift */; }; B6152B802ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */; }; + B616EA882D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */; }; + B616EA892D651ADA00DF9029 /* OverlayButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */; }; + B616EA8D2D65238900DF9029 /* InternalDevelopmentInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */; }; + B616EA8F2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */; }; B61A606129F188AB009B43F9 /* ExternalLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61A606029F188AB009B43F9 /* ExternalLink.swift */; }; B61A606929F4481A009B43F9 /* MonospacedFontPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61A606829F4481A009B43F9 /* MonospacedFontPicker.swift */; }; B61DA9DF29D929E100BF4A43 /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */; }; @@ -558,6 +561,8 @@ B65B10FE2B08B07D002852CF /* SourceControlNavigatorChangesList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10FD2B08B07D002852CF /* SourceControlNavigatorChangesList.swift */; }; B65B11012B09D5D4002852CF /* GitClient+Pull.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B11002B09D5D4002852CF /* GitClient+Pull.swift */; }; B65B11042B09DB1C002852CF /* GitClient+Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B11032B09DB1C002852CF /* GitClient+Fetch.swift */; }; + B66460592D600E9500EC1411 /* NotificationManager+Delegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */; }; + B664605A2D600E9500EC1411 /* NotificationManager+System.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66460582D600E9500EC1411 /* NotificationManager+System.swift */; }; B664C3B02B965F6C00816B4E /* NavigationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B664C3AF2B965F6C00816B4E /* NavigationSettings.swift */; }; B664C3B32B96634F00816B4E /* NavigationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B664C3B22B96634F00816B4E /* NavigationSettingsView.swift */; }; B66A4E4529C8E86D004573B4 /* CommandsFixes.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E4429C8E86D004573B4 /* CommandsFixes.swift */; }; @@ -580,6 +585,11 @@ B67DBB942CD5FC08007F4F18 /* GlobPatternListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */; }; B68108042C60287F008B27C1 /* StartTaskToolbarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68108032C60287F008B27C1 /* StartTaskToolbarButton.swift */; }; B685DE7929CC9CCD002860C8 /* StatusBarIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B685DE7829CC9CCD002860C8 /* StatusBarIcon.swift */; }; + B68DE5DF2D5A61E5009A43EF /* CENotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5D72D5A61E5009A43EF /* CENotification.swift */; }; + B68DE5E02D5A61E5009A43EF /* NotificationBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */; }; + B68DE5E22D5A61E5009A43EF /* NotificationToolbarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */; }; + B68DE5E32D5A61E5009A43EF /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */; }; + B68DE5E52D5A7988009A43EF /* NotificationPanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */; }; B6966A282C2F683300259C2D /* SourceControlPullView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A272C2F683300259C2D /* SourceControlPullView.swift */; }; B6966A2A2C2F687A00259C2D /* SourceControlFetchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A292C2F687A00259C2D /* SourceControlFetchView.swift */; }; B6966A2E2C3056AD00259C2D /* SourceControlCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A2D2C3056AD00259C2D /* SourceControlCommands.swift */; }; @@ -588,6 +598,7 @@ B6966A342C34996B00259C2D /* SourceControlManager+GitClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A332C34996B00259C2D /* SourceControlManager+GitClient.swift */; }; B696A7E62CFE20C40048CFE1 /* FeatureIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */; }; B697937A29FF5668002027EC /* AccountsSettingsAccountLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B697937929FF5668002027EC /* AccountsSettingsAccountLink.swift */; }; + B69970322D63E5C700BB132D /* NotificationPanelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */; }; B69BFDC72B0686910050D9A6 /* GitClient+Initiate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69BFDC62B0686910050D9A6 /* GitClient+Initiate.swift */; }; B69D3EDE2C5E85A2005CF43A /* StopTaskToolbarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EDD2C5E85A2005CF43A /* StopTaskToolbarButton.swift */; }; B69D3EE12C5F5357005CF43A /* TaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EE02C5F5357005CF43A /* TaskView.swift */; }; @@ -1146,7 +1157,6 @@ 6CABB1A029C5593800340467 /* SearchPanelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPanelView.swift; sourceTree = ""; }; 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFileManager+FileManagement.swift"; sourceTree = ""; }; 6CB94CFD2C9F1C9A00E8651C /* TextView+LSPRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TextView+LSPRange.swift"; sourceTree = ""; }; - 6CBA0D502A1BF524002C6FAA /* SegmentedControlImproved.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentedControlImproved.swift; sourceTree = ""; }; 6CBD1BC52978DE53006639D5 /* Font+Caption3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font+Caption3.swift"; sourceTree = ""; }; 6CBE1CFA2B71DAA6003AC32E /* Loopable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Loopable.swift; sourceTree = ""; }; 6CC17B502C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+NSOutlineViewDataSource.swift"; sourceTree = ""; }; @@ -1212,6 +1222,10 @@ B607184B2B17E037009CDAB4 /* SourceControlStashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlStashView.swift; sourceTree = ""; }; B60BE8BC297A167600841125 /* AcknowledgementRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementRowView.swift; sourceTree = ""; }; B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditWindowControllerExtensions.swift; sourceTree = ""; }; + B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayButtonStyle.swift; sourceTree = ""; }; + B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollOffsetPreferenceKey.swift; sourceTree = ""; }; + B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentInspectorView.swift; sourceTree = ""; }; + B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentNotificationsView.swift; sourceTree = ""; }; B61A606029F188AB009B43F9 /* ExternalLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLink.swift; sourceTree = ""; }; B61A606829F4481A009B43F9 /* MonospacedFontPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonospacedFontPicker.swift; sourceTree = ""; }; B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; }; @@ -1248,6 +1262,8 @@ B65B10FD2B08B07D002852CF /* SourceControlNavigatorChangesList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangesList.swift; sourceTree = ""; }; B65B11002B09D5D4002852CF /* GitClient+Pull.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Pull.swift"; sourceTree = ""; }; B65B11032B09DB1C002852CF /* GitClient+Fetch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Fetch.swift"; sourceTree = ""; }; + B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationManager+Delegate.swift"; sourceTree = ""; }; + B66460582D600E9500EC1411 /* NotificationManager+System.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationManager+System.swift"; sourceTree = ""; }; B664C3AF2B965F6C00816B4E /* NavigationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSettings.swift; sourceTree = ""; }; B664C3B22B96634F00816B4E /* NavigationSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSettingsView.swift; sourceTree = ""; }; B66A4E4429C8E86D004573B4 /* CommandsFixes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandsFixes.swift; sourceTree = ""; }; @@ -1270,6 +1286,11 @@ B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobPatternListItem.swift; sourceTree = ""; }; B68108032C60287F008B27C1 /* StartTaskToolbarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartTaskToolbarButton.swift; sourceTree = ""; }; B685DE7829CC9CCD002860C8 /* StatusBarIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarIcon.swift; sourceTree = ""; }; + B68DE5D72D5A61E5009A43EF /* CENotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CENotification.swift; sourceTree = ""; }; + B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationBannerView.swift; sourceTree = ""; }; + B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationToolbarItem.swift; sourceTree = ""; }; + B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; + B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPanelView.swift; sourceTree = ""; }; B6966A272C2F683300259C2D /* SourceControlPullView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlPullView.swift; sourceTree = ""; }; B6966A292C2F687A00259C2D /* SourceControlFetchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlFetchView.swift; sourceTree = ""; }; B6966A2D2C3056AD00259C2D /* SourceControlCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlCommands.swift; sourceTree = ""; }; @@ -1278,6 +1299,7 @@ B6966A332C34996B00259C2D /* SourceControlManager+GitClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceControlManager+GitClient.swift"; sourceTree = ""; }; B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIcon.swift; sourceTree = ""; }; B697937929FF5668002027EC /* AccountsSettingsAccountLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsAccountLink.swift; sourceTree = ""; }; + B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPanelViewModel.swift; sourceTree = ""; }; B69BFDC62B0686910050D9A6 /* GitClient+Initiate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Initiate.swift"; sourceTree = ""; }; B69D3EDD2C5E85A2005CF43A /* StopTaskToolbarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopTaskToolbarButton.swift; sourceTree = ""; }; B69D3EE02C5F5357005CF43A /* TaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskView.swift; sourceTree = ""; }; @@ -1761,6 +1783,7 @@ 58A5DF9D29339F6400D1BD5D /* Keybindings */, 30B087FB2C0D53080063A882 /* LSP */, 287776EA27E350A100D46668 /* NavigatorArea */, + B68DE5DE2D5A61E5009A43EF /* Notifications */, 5878DAA0291AE76700DD95A3 /* OpenQuickly */, 58798210292D92370085B254 /* Search */, B67B270029D7868000FB9301 /* Settings */, @@ -2100,6 +2123,7 @@ 587B9D7529300ABD00AC7927 /* CodeEditUI */ = { isa = PBXGroup; children = ( + B616EA8A2D651B0A00DF9029 /* Styles */, 587B9D8629300ABD00AC7927 /* Views */, ); path = CodeEditUI; @@ -2115,21 +2139,19 @@ B65B10FA2B08B054002852CF /* Divided.swift */, 587B9D8B29300ABD00AC7927 /* EffectView.swift */, 587B9D9029300ABD00AC7927 /* HelpButton.swift */, - B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */, - B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */, + B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */, 587B9D8D29300ABD00AC7927 /* SearchPanel.swift */, 6CABB1A029C5593800340467 /* SearchPanelView.swift */, 61816B822C81DC2C00C71BF7 /* SearchField.swift */, - 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */, 587B9D8929300ABD00AC7927 /* PanelDivider.swift */, B67DB0EE2AF3E381002DC647 /* PaneTextField.swift */, 587B9D8E29300ABD00AC7927 /* PressActionsModifier.swift */, 587B9D8829300ABD00AC7927 /* SegmentedControl.swift */, - 6CBA0D502A1BF524002C6FAA /* SegmentedControlImproved.swift */, 587B9D8C29300ABD00AC7927 /* SettingsTextEditor.swift */, 587B9D8F29300ABD00AC7927 /* ToolbarBranchPicker.swift */, B6DCDAC52CCDE2B90099FBF9 /* InstantPopoverModifier.swift */, 2897E1C62979A29200741E32 /* TrackableScrollView.swift */, + B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */, B60718302B15A9A3009CDAB4 /* CEOutlineGroup.swift */, ); path = Views; @@ -3253,6 +3275,26 @@ path = Views; sourceTree = ""; }; + B616EA8A2D651B0A00DF9029 /* Styles */ = { + isa = PBXGroup; + children = ( + B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */, + B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */, + B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */, + 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */, + ); + path = Styles; + sourceTree = ""; + }; + B616EA8C2D65238900DF9029 /* InternalDevelopmentInspector */ = { + isa = PBXGroup; + children = ( + B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */, + B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */, + ); + path = InternalDevelopmentInspector; + sourceTree = ""; + }; B61DA9DD29D929BF00BF4A43 /* Pages */ = { isa = PBXGroup; children = ( @@ -3547,6 +3589,37 @@ path = Settings; sourceTree = ""; }; + B68DE5D82D5A61E5009A43EF /* Models */ = { + isa = PBXGroup; + children = ( + B68DE5D72D5A61E5009A43EF /* CENotification.swift */, + ); + path = Models; + sourceTree = ""; + }; + B68DE5DC2D5A61E5009A43EF /* Views */ = { + isa = PBXGroup; + children = ( + B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */, + B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */, + B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */, + ); + path = Views; + sourceTree = ""; + }; + B68DE5DE2D5A61E5009A43EF /* Notifications */ = { + isa = PBXGroup; + children = ( + B68DE5D82D5A61E5009A43EF /* Models */, + B69970312D63E5C700BB132D /* ViewModels */, + B68DE5DC2D5A61E5009A43EF /* Views */, + B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */, + B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */, + B66460582D600E9500EC1411 /* NotificationManager+System.swift */, + ); + path = Notifications; + sourceTree = ""; + }; B6966A262C2F673A00259C2D /* Views */ = { isa = PBXGroup; children = ( @@ -3563,6 +3636,14 @@ path = Views; sourceTree = ""; }; + B69970312D63E5C700BB132D /* ViewModels */ = { + isa = PBXGroup; + children = ( + B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; B69D3EDC2C5E856F005CF43A /* Views */ = { isa = PBXGroup; children = ( @@ -3643,7 +3724,6 @@ B6CF632A29E5436C0085880A /* Views */ = { isa = PBXGroup; children = ( - B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */, B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */, B67DBB912CD5EAA4007F4F18 /* GlobPatternList.swift */, B6041F4C29D7A4E9000F3454 /* SettingsPageView.swift */, @@ -3698,6 +3778,7 @@ 3026F50B2AC006A10061227E /* ViewModels */, B67660672AA972B000CD56B0 /* FileInspector */, B67660662AA9726F00CD56B0 /* HistoryInspector */, + B616EA8C2D65238900DF9029 /* InternalDevelopmentInspector */, 20EBB50B280C382800F3A5DA /* Models */, 20EBB4FF280C325000F3A5DA /* Views */, ); @@ -4065,6 +4146,10 @@ B6BF41422C2C672A003AB4B3 /* SourceControlPushView.swift in Sources */, 587B9E8429301D8F00AC7927 /* GitHubUser.swift in Sources */, 04BA7C1C2AE2D84100584E1C /* GitClient+Commit.swift in Sources */, + B68DE5DF2D5A61E5009A43EF /* CENotification.swift in Sources */, + B68DE5E02D5A61E5009A43EF /* NotificationBannerView.swift in Sources */, + B68DE5E22D5A61E5009A43EF /* NotificationToolbarItem.swift in Sources */, + B68DE5E32D5A61E5009A43EF /* NotificationManager.swift in Sources */, B65B10EC2B073913002852CF /* CEContentUnavailableView.swift in Sources */, 5B698A0A2B262FA000DE9392 /* SearchSettingsView.swift in Sources */, B65B10FB2B08B054002852CF /* Divided.swift in Sources */, @@ -4112,6 +4197,7 @@ 587B9E8829301D8F00AC7927 /* GitHubFiles.swift in Sources */, 587B9DA729300ABD00AC7927 /* HelpButton.swift in Sources */, 77EF6C0B2C60C80800984B69 /* URL+Filename.swift in Sources */, + B616EA8D2D65238900DF9029 /* InternalDevelopmentInspectorView.swift in Sources */, 30B088172C0D53080063A882 /* LSPUtil.swift in Sources */, 6C5B63DE29C76213005454BA /* WindowCodeFileView.swift in Sources */, 58F2EB08292FB2B0004A9BDE /* TextEditingSettings.swift in Sources */, @@ -4183,6 +4269,8 @@ B6B2D7A12CE8797B00379967 /* GitConfigExtensions.swift in Sources */, 587B9E7329301D8F00AC7927 /* GitRouter.swift in Sources */, 6C2C156129B4F52F00EA60A5 /* SplitViewModifiers.swift in Sources */, + B69970322D63E5C700BB132D /* NotificationPanelViewModel.swift in Sources */, + B68DE5E52D5A7988009A43EF /* NotificationPanelView.swift in Sources */, 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */, 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */, 30CB648D2C12680F00CC8A9E /* LSPService+Events.swift in Sources */, @@ -4235,7 +4323,6 @@ 611192082B08CCFD00D4459B /* SearchIndexer+Terms.swift in Sources */, B67DBB902CD5EA77007F4F18 /* GlobPattern.swift in Sources */, 28B8F884280FFE4600596236 /* NSTableView+Background.swift in Sources */, - 6CBA0D512A1BF524002C6FAA /* SegmentedControlImproved.swift in Sources */, 58F2EB06292FB2B0004A9BDE /* KeybindingsSettings.swift in Sources */, 618725A12C29EFCC00987354 /* SchemeDropDownView.swift in Sources */, 587B9E8E29301D8F00AC7927 /* BitBucketRepositoryRouter.swift in Sources */, @@ -4388,6 +4475,7 @@ 587B9E7929301D8F00AC7927 /* GitHubIssueRouter.swift in Sources */, B67700F92D2A2662004FD61F /* WorkspacePanelView.swift in Sources */, 587B9E8029301D8F00AC7927 /* GitHubConfiguration.swift in Sources */, + B616EA8F2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift in Sources */, 58822524292C280D00E83CDE /* StatusBarView.swift in Sources */, 581550D429FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift in Sources */, 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */, @@ -4481,6 +4569,8 @@ B6A43C5D29FC4AF00027E0E0 /* CreateSSHKeyView.swift in Sources */, B6EA200229DB7F81001BF195 /* View+ConstrainHeightToWindow.swift in Sources */, 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */, + B66460592D600E9500EC1411 /* NotificationManager+Delegate.swift in Sources */, + B664605A2D600E9500EC1411 /* NotificationManager+System.swift in Sources */, 613899B72B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift in Sources */, 6C48D8F42972DB1A00D6D205 /* Env+Window.swift in Sources */, 6C5FDF7A29E6160000BC08C0 /* AppSettings.swift in Sources */, @@ -4584,6 +4674,8 @@ 613899BC2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift in Sources */, 611192002B08CCD700D4459B /* SearchIndexer+Memory.swift in Sources */, 587B9E8129301D8F00AC7927 /* PublicKey.swift in Sources */, + B616EA882D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift in Sources */, + B616EA892D651ADA00DF9029 /* OverlayButtonStyle.swift in Sources */, 6CCEE7F52D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift in Sources */, 611191FE2B08CCD200D4459B /* SearchIndexer+File.swift in Sources */, B69D3EE52C5F54B3005CF43A /* TasksPopoverMenuItem.swift in Sources */, diff --git a/CodeEdit/Features/About/Views/BlurButtonStyle.swift b/CodeEdit/Features/About/Views/BlurButtonStyle.swift index 768f84131..a86f21bcf 100644 --- a/CodeEdit/Features/About/Views/BlurButtonStyle.swift +++ b/CodeEdit/Features/About/Views/BlurButtonStyle.swift @@ -9,12 +9,18 @@ import SwiftUI extension ButtonStyle where Self == BlurButtonStyle { static var blur: BlurButtonStyle { BlurButtonStyle() } + static var secondaryBlur: BlurButtonStyle { BlurButtonStyle(isSecondary: true) } } struct BlurButtonStyle: ButtonStyle { + var isSecondary: Bool = false + @Environment(\.controlSize) var controlSize + @Environment(\.colorScheme) + var colorScheme + var height: CGFloat { switch controlSize { case .large: @@ -24,32 +30,40 @@ struct BlurButtonStyle: ButtonStyle { } } - @Environment(\.colorScheme) - var colorScheme - func makeBody(configuration: Configuration) -> some View { configuration.label + .padding(.horizontal, 8) .frame(height: height) - .buttonStyle(.bordered) .background { switch colorScheme { case .dark: - Color - .gray - .opacity(0.001) - .overlay(.regularMaterial.blendMode(.plusLighter)) - .overlay(Color.gray.opacity(0.30)) - .overlay(Color.white.opacity(configuration.isPressed ? 0.20 : 0.00)) + ZStack { + Color.gray.opacity(0.001) + if isSecondary { + Rectangle() + .fill(.regularMaterial) + } else { + Rectangle() + .fill(.regularMaterial) + .blendMode(.plusLighter) + } + Color.gray.opacity(isSecondary ? 0.10 : 0.30) + Color.white.opacity(configuration.isPressed ? 0.10 : 0.00) + } case .light: - Color - .gray - .opacity(0.001) - .overlay(.regularMaterial.blendMode(.darken)) - .overlay(Color.gray.opacity(0.15).blendMode(.plusDarker)) + ZStack { + Color.gray.opacity(0.001) + Rectangle() + .fill(.regularMaterial) + .blendMode(.darken) + Color.gray.opacity(isSecondary ? 0.05 : 0.15) + .blendMode(.plusDarker) + Color.gray.opacity(configuration.isPressed ? 0.10 : 0.00) + } @unknown default: Color.black } } - .clipShape(RoundedRectangle(cornerRadius: 6)) + .clipShape(RoundedRectangle(cornerRadius: controlSize == .large ? 6 : 5)) } } diff --git a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift b/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift index 8685ec7eb..ae0fdc645 100644 --- a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift +++ b/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift @@ -76,7 +76,7 @@ import Combine /// "id": "uniqueTaskID", /// "action": "update", /// "title": "Updated Task Title", -/// "message": "Updated Task Message" +/// "message": "Updated Task Message", /// "percentage": 0.5, /// "isLoading": true /// ] diff --git a/CodeEdit/Features/CodeEditUI/Views/IconButtonStyle.swift b/CodeEdit/Features/CodeEditUI/Styles/IconButtonStyle.swift similarity index 100% rename from CodeEdit/Features/CodeEditUI/Views/IconButtonStyle.swift rename to CodeEdit/Features/CodeEditUI/Styles/IconButtonStyle.swift diff --git a/CodeEdit/Features/CodeEditUI/Views/IconToggleStyle.swift b/CodeEdit/Features/CodeEditUI/Styles/IconToggleStyle.swift similarity index 100% rename from CodeEdit/Features/CodeEditUI/Views/IconToggleStyle.swift rename to CodeEdit/Features/CodeEditUI/Styles/IconToggleStyle.swift diff --git a/CodeEdit/Features/CodeEditUI/Views/MenuWithButtonStyle.swift b/CodeEdit/Features/CodeEditUI/Styles/MenuWithButtonStyle.swift similarity index 100% rename from CodeEdit/Features/CodeEditUI/Views/MenuWithButtonStyle.swift rename to CodeEdit/Features/CodeEditUI/Styles/MenuWithButtonStyle.swift diff --git a/CodeEdit/Features/CodeEditUI/Styles/OverlayButtonStyle.swift b/CodeEdit/Features/CodeEditUI/Styles/OverlayButtonStyle.swift new file mode 100644 index 000000000..7e9b962c6 --- /dev/null +++ b/CodeEdit/Features/CodeEditUI/Styles/OverlayButtonStyle.swift @@ -0,0 +1,34 @@ +import SwiftUI + +/// A button style for overlay buttons (like close, action buttons in notifications) +struct OverlayButtonStyle: ButtonStyle { + @Environment(\.colorScheme) + private var colorScheme + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .font(.system(size: 10)) + .foregroundColor(.secondary) + .frame(width: 20, height: 20, alignment: .center) + .background(Color.primary.opacity(configuration.isPressed ? colorScheme == .dark ? 0.10 : 0.05 : 0.00)) + .background(.regularMaterial) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color(nsColor: .separatorColor), lineWidth: 2) + ) + .cornerRadius(10) + .shadow( + color: Color(.black.withAlphaComponent(colorScheme == .dark ? 0.2 : 0.1)), + radius: 5, + x: 0, + y: 2 + ) + } +} + +extension ButtonStyle where Self == OverlayButtonStyle { + /// A button style for overlay buttons + static var overlay: OverlayButtonStyle { + OverlayButtonStyle() + } +} diff --git a/CodeEdit/Features/CodeEditUI/Views/FeatureIcon.swift b/CodeEdit/Features/CodeEditUI/Views/FeatureIcon.swift new file mode 100644 index 000000000..33d0ae09c --- /dev/null +++ b/CodeEdit/Features/CodeEditUI/Views/FeatureIcon.swift @@ -0,0 +1,98 @@ +// +// FeatureIcon.swift +// CodeEdit +// +// Created by Austin Condiff on 12/2/24. +// + +import SwiftUI +import CodeEditSymbols + +struct FeatureIcon: View { + private let content: IconContent + private let color: Color? + private let size: CGFloat + + init( + symbol: String, + color: Color? = nil, + size: CGFloat? = nil + ) { + self.content = .symbol(symbol) + self.color = color ?? .accentColor + self.size = size ?? 20 + } + + init( + text: String, + textColor: Color? = nil, + color: Color? = nil, + size: CGFloat? = nil + ) { + self.content = .text(text, textColor: textColor) + self.color = color ?? .accentColor + self.size = size ?? 20 + } + + init( + image: Image, + size: CGFloat? = nil + ) { + self.content = .image(image) + self.color = nil + self.size = size ?? 20 + } + + private func getSafeImage(named: String) -> Image { + if NSImage(systemSymbolName: named, accessibilityDescription: nil) != nil { + return Image(systemName: named) + } else { + return Image(symbol: named) + } + } + + var body: some View { + RoundedRectangle(cornerRadius: size / 4, style: .continuous) + .fill(background) + .overlay { + switch content { + case let .symbol(name): + getSafeImage(named: name) + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundColor(.white) + .padding(size / 8) + case let .text(text, textColor): + Text(text) + .font(.system(size: size * 0.65)) + .foregroundColor(textColor ?? .primary) + case let .image(image): + image + .resizable() + .aspectRatio(contentMode: .fill) + } + } + .clipShape(RoundedRectangle(cornerRadius: size / 4, style: .continuous)) + .shadow( + color: Color(NSColor.black).opacity(0.25), + radius: size / 40, + y: size / 40 + ) + .frame(width: size, height: size) + } + + private var background: AnyShapeStyle { + switch content { + case .symbol, .text: + return AnyShapeStyle((color ?? .accentColor).gradient) + case .image: + return AnyShapeStyle(.regularMaterial) + } + } +} + +private enum IconContent { + case symbol(String) + case text(String, textColor: Color?) + case image(Image) +} diff --git a/CodeEdit/Features/CodeEditUI/Views/ScrollOffsetPreferenceKey.swift b/CodeEdit/Features/CodeEditUI/Views/ScrollOffsetPreferenceKey.swift new file mode 100644 index 000000000..13ca28511 --- /dev/null +++ b/CodeEdit/Features/CodeEditUI/Views/ScrollOffsetPreferenceKey.swift @@ -0,0 +1,10 @@ +import SwiftUI + +/// Tracks scroll offset in scrollable views +struct ScrollOffsetPreferenceKey: PreferenceKey { + typealias Value = CGFloat + static var defaultValue = CGFloat.zero + static func reduce(value: inout Value, nextValue: () -> Value) { + value += nextValue() + } +} diff --git a/CodeEdit/Features/CodeEditUI/Views/SegmentedControlImproved.swift b/CodeEdit/Features/CodeEditUI/Views/SegmentedControlImproved.swift deleted file mode 100644 index 2578cd7b7..000000000 --- a/CodeEdit/Features/CodeEditUI/Views/SegmentedControlImproved.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// SegmentedControlImproved.swift -// CodeEdit -// -// Created by Wouter Hennen on 22/05/2023. -// - -import SwiftUI - -extension ButtonStyle where Self == XcodeButtonStyle { - static func xcodeButton( - isActive: Bool, - prominent: Bool, - isHovering: Bool, - namespace: Namespace.ID = Namespace().wrappedValue - ) -> XcodeButtonStyle { - XcodeButtonStyle(isActive: isActive, prominent: prominent, isHovering: isHovering, namespace: namespace) - } -} - -struct XcodeButtonStyle: ButtonStyle { - var isActive: Bool - var prominent: Bool - var isHovering: Bool - var namespace: Namespace.ID - - @Environment(\.controlSize) - var controlSize - - @Environment(\.colorScheme) - var colorScheme - - @Environment(\.controlActiveState) - private var activeState - - func makeBody(configuration: Configuration) -> some View { - configuration.label - .padding(.horizontal, controlSizePadding.horizontal) - .padding(.vertical, controlSizePadding.vertical) - .font(fontSize) - .foregroundColor(isActive ? .white : .primary) - .opacity(textOpacity) - .background { - if isActive { - RoundedRectangle(cornerRadius: 5) - .foregroundColor(.accentColor) - .opacity(configuration.isPressed ? (prominent ? 0.75 : 0.5) : (prominent ? 1 : 0.75)) - .matchedGeometryEffect(id: "xcodebuttonbackground", in: namespace) - - } else if isHovering { - RoundedRectangle(cornerRadius: 5) - .foregroundColor(.gray) - .opacity(0.2) - .transition(.opacity) - .animation(.easeInOut, value: isHovering) - } - } - .opacity(activeState == .inactive ? 0.6 : 1) - .animation(.interpolatingSpring(stiffness: 600, damping: 50), value: isActive) - } - - var fontSize: Font { - switch controlSize { - case .mini: - return .footnote - case .small, .regular: - return .subheadline - default: - return .callout - } - } - - var controlSizePadding: (vertical: CGFloat, horizontal: CGFloat) { - switch controlSize { - case .mini: - return (1, 2) - case .small: - return (2, 4) - case .regular: - return (3, 8) - case .large: - return (6, 12) - default: - return (4, 8) - } - } - - private var textOpacity: Double { - if prominent { - return activeState != .inactive ? 1 : isActive ? 1 : 0.3 - } else { - return activeState != .inactive ? 1 : isActive ? 0.5 : 0.3 - } - } -} - -private struct MyTag: _ViewTraitKey { - static var defaultValue: AnyHashable? = Optional.none -} - -extension View { - func segmentedTag(_ value: Value) -> some View { - _trait(MyTag.self, value) - } -} - -struct SegmentedControlV2: View { - @Binding var selection: Selection - var prominent: Bool - @ViewBuilder var content: Content - - @State private var hoveringOver: Selection? - - @Namespace var namespace - - var body: some View { - content.variadic { children in - HStack(spacing: 8) { - ForEach(children, id: \.id) { option in - let tag: Selection? = option[MyTag.self].flatMap { $0 as? Selection } - Button { - hoveringOver = nil - if let tag { - selection = tag - } - } label: { - option - } - .buttonStyle( - .xcodeButton( - isActive: tag == selection, - prominent: prominent, - isHovering: tag == hoveringOver, - namespace: namespace - ) - ) - .onHover { hover in - hoveringOver = hover ? tag : nil - } - .animation(.interpolatingSpring(stiffness: 600, damping: 50), value: selection) - } - } - } - } -} diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift index b0d612b3e..e7d5f0282 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift @@ -31,6 +31,7 @@ extension CodeEditWindowController { .branchPicker, .flexibleSpace, .activityViewer, + .notificationItem, .flexibleSpace, .itemListTrackingSeparator, .flexibleSpace, @@ -47,6 +48,7 @@ extension CodeEditWindowController { .toggleLastSidebarItem, .branchPicker, .activityViewer, + .notificationItem, .startTaskSidebarItem, .stopTaskSidebarItem ] @@ -173,6 +175,15 @@ extension CodeEditWindowController { strongWidth ]) + toolbarItem.view = view + return toolbarItem + case .notificationItem: + let toolbarItem = NSToolbarItem(itemIdentifier: .notificationItem) + guard let workspace = workspace else { return nil } + let view = NSHostingView( + rootView: NotificationToolbarItem() + .environmentObject(workspace) + ) toolbarItem.view = view return toolbarItem default: diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowControllerExtensions.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowControllerExtensions.swift index 9d7ffe4d2..88e7dbc9b 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowControllerExtensions.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowControllerExtensions.swift @@ -140,4 +140,5 @@ extension NSToolbarItem.Identifier { static let itemListTrackingSeparator = NSToolbarItem.Identifier("ItemListTrackingSeparator") static let branchPicker: NSToolbarItem.Identifier = NSToolbarItem.Identifier("BranchPicker") static let activityViewer: NSToolbarItem.Identifier = NSToolbarItem.Identifier("ActivityViewer") + static let notificationItem = NSToolbarItem.Identifier("notificationItem") } diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index aaac6e235..1b96e4fca 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -43,8 +43,21 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { var workspaceSettingsManager: CEWorkspaceSettings? var taskNotificationHandler: TaskNotificationHandler = TaskNotificationHandler() + @Published var notificationPanel = NotificationPanelViewModel() private var cancellables = Set() + override init() { + super.init() + + // Observe changes to notification panel + notificationPanel.objectWillChange + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.objectWillChange.send() + } + .store(in: &cancellables) + } + deinit { cancellables.forEach { $0.cancel() } NotificationCenter.default.removeObserver(self) diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index c7a3933aa..d4e6c1032 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -85,7 +85,7 @@ struct FileInspectorView: View { if let file { TextField("Name", text: $fileName) .background( - file.validateFileName(for: fileName) ? Color.clear : Color(errorRed) + fileName != file.fileName() && !file.validateFileName(for: fileName) ? Color(errorRed) : Color.clear ) .onSubmit { if file.validateFileName(for: fileName) { diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift new file mode 100644 index 000000000..0906bbcbf --- /dev/null +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift @@ -0,0 +1,16 @@ +// +// InternalDevelopmentInspectorView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/19/24. +// + +import SwiftUI + +struct InternalDevelopmentInspectorView: View { + var body: some View { + Form { + InternalDevelopmentNotificationsView() + } + } +} diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift new file mode 100644 index 000000000..533488099 --- /dev/null +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift @@ -0,0 +1,206 @@ +// +// InternalDevelopmentNotificationsView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/19/24. +// + +import SwiftUI + +struct InternalDevelopmentNotificationsView: View { + enum IconType: String, CaseIterable { + case symbol = "Symbol" + case image = "Image" + case text = "Text" + case emoji = "Emoji" + } + + @State private var delay: Bool = false + @State private var sticky: Bool = false + @State private var selectedIconType: IconType = .symbol + @State private var actionButtonText: String = "View" + @State private var notificationTitle: String = "Test Notification" + @State private var notificationDescription: String = "This is a test notification." + + // Icon selection states + @State private var selectedSymbol: String? + @State private var selectedEmoji: String? + @State private var selectedText: String? + @State private var selectedImage: String? + @State private var selectedColor: Color? + + private let availableSymbols = [ + "bell.fill", "bell.badge.fill", "exclamationmark.triangle.fill", + "info.circle.fill", "checkmark.seal.fill", "xmark.octagon.fill", + "bubble.left.fill", "envelope.fill", "phone.fill", "megaphone.fill", + "clock.fill", "calendar", "flag.fill", "bookmark.fill", "bolt.fill", + "shield.lefthalf.fill", "gift.fill", "heart.fill", "star.fill", + "curlybraces" + ] + + private let availableEmojis = [ + "🔔", "🚨", "⚠️", "👋", "😍", "😎", "😘", "😜", "😝", "😀", "😁", + "😂", "🤣", "😃", "😄", "😅", "😆", "😇", "😉", "😊", "😋", "😌" + ] + + private let availableImages = [ + "GitHubIcon", "BitBucketIcon", "GitLabIcon" + ] + + private let availableColors: [(String, Color)] = [ + ("Red", .red), ("Orange", .orange), ("Yellow", .yellow), + ("Green", .green), ("Mint", .mint), ("Cyan", .cyan), + ("Teal", .teal), ("Blue", .blue), ("Indigo", .indigo), + ("Purple", .purple), ("Pink", .pink), ("Gray", .gray) + ] + + var body: some View { + Section("Notifications") { + Toggle("Delay 5s", isOn: $delay) + Toggle("Sticky", isOn: $sticky) + + Picker("Icon Type", selection: $selectedIconType) { + ForEach(IconType.allCases, id: \.self) { type in + Text(type.rawValue).tag(type) + } + } + + Group { + switch selectedIconType { + case .symbol: + Picker("Symbol", selection: $selectedSymbol) { + Label("Random", systemImage: "dice").tag(nil as String?) + Divider() + ForEach(availableSymbols, id: \.self) { symbol in + Label(symbol, systemImage: symbol).tag(symbol as String?) + } + } + case .emoji: + Picker("Emoji", selection: $selectedEmoji) { + Label("Random", systemImage: "dice").tag(nil as String?) + Divider() + ForEach(availableEmojis, id: \.self) { emoji in + Text(emoji).tag(emoji as String?) + } + } + case .text: + Picker("Text", selection: $selectedText) { + Label("Random", systemImage: "dice").tag(nil as String?) + Divider() + ForEach("ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { String($0) }, id: \.self) { letter in + Text(letter).tag(letter as String?) + } + } + case .image: + Picker("Image", selection: $selectedImage) { + Label("Random", systemImage: "dice").tag(nil as String?) + Divider() + ForEach(availableImages, id: \.self) { image in + Text(image).tag(image as String?) + } + } + } + + if selectedIconType == .symbol || selectedIconType == .text || selectedIconType == .emoji { + Picker("Icon Color", selection: $selectedColor) { + Label("Random", systemImage: "dice").tag(nil as Color?) + Divider() + ForEach(availableColors, id: \.0) { name, color in + HStack { + Circle() + .fill(color) + .frame(width: 12, height: 12) + Text(name) + }.tag(color as Color?) + } + } + } + } + + TextField("Title", text: $notificationTitle) + TextField("Description", text: $notificationDescription, axis: .vertical) + .lineLimit(1...5) + TextField("Action Button", text: $actionButtonText) + + Button("Add Notification") { + let action = { + switch selectedIconType { + case .symbol: + let iconSymbol = selectedSymbol ?? availableSymbols.randomElement() ?? "bell.fill" + let iconColor = selectedColor ?? availableColors.randomElement()?.1 ?? .blue + + NotificationManager.shared.post( + iconSymbol: iconSymbol, + iconColor: iconColor, + title: notificationTitle, + description: notificationDescription, + actionButtonTitle: actionButtonText, + action: { + print("Test notification action triggered") + }, + isSticky: sticky + ) + case .image: + let imageName = selectedImage ?? availableImages.randomElement() ?? "GitHubIcon" + + NotificationManager.shared.post( + iconImage: Image(imageName), + title: notificationTitle, + description: notificationDescription, + actionButtonTitle: actionButtonText, + action: { + print("Test notification action triggered") + }, + isSticky: sticky + ) + case .text: + let text = selectedText ?? randomLetter() + let iconColor = selectedColor ?? availableColors.randomElement()?.1 ?? .blue + + NotificationManager.shared.post( + iconText: text, + iconTextColor: .white, + iconColor: iconColor, + title: notificationTitle, + description: notificationDescription, + actionButtonTitle: actionButtonText, + action: { + print("Test notification action triggered") + }, + isSticky: sticky + ) + case .emoji: + let emoji = selectedEmoji ?? availableEmojis.randomElement() ?? "🔔" + let iconColor = selectedColor ?? availableColors.randomElement()?.1 ?? .blue + + NotificationManager.shared.post( + iconText: emoji, + iconTextColor: .white, + iconColor: iconColor, + title: notificationTitle, + description: notificationDescription, + actionButtonTitle: actionButtonText, + action: { + print("Test notification action triggered") + }, + isSticky: sticky + ) + } + } + + if delay { + DispatchQueue.main.asyncAfter(deadline: .now() + 5) { + action() + } + } else { + action() + } + } + } + } + + private func randomLetter() -> String { + let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { String($0) } + return letters.randomElement() ?? "A" + } +} diff --git a/CodeEdit/Features/InspectorArea/Models/InspectorTab.swift b/CodeEdit/Features/InspectorArea/Models/InspectorTab.swift index 209083a07..f9311cea3 100644 --- a/CodeEdit/Features/InspectorArea/Models/InspectorTab.swift +++ b/CodeEdit/Features/InspectorArea/Models/InspectorTab.swift @@ -12,6 +12,7 @@ import ExtensionFoundation enum InspectorTab: WorkspacePanelTab { case file case gitHistory + case internalDevelopment case uiExtension(endpoint: AppExtensionIdentity, data: ResolvedSidebar.SidebarStore) var systemImage: String { @@ -20,6 +21,8 @@ enum InspectorTab: WorkspacePanelTab { return "doc" case .gitHistory: return "clock" + case .internalDevelopment: + return "hammer" case .uiExtension(_, let data): return data.icon ?? "e.square" } @@ -38,6 +41,8 @@ enum InspectorTab: WorkspacePanelTab { return "File Inspector" case .gitHistory: return "History Inspector" + case .internalDevelopment: + return "Internal Development" case .uiExtension(_, let data): return data.help ?? data.sceneID } @@ -49,6 +54,8 @@ enum InspectorTab: WorkspacePanelTab { FileInspectorView() case .gitHistory: HistoryInspectorView() + case .internalDevelopment: + InternalDevelopmentInspectorView() case let .uiExtension(endpoint, data): ExtensionSceneView(with: endpoint, sceneID: data.sceneID) } diff --git a/CodeEdit/Features/InspectorArea/Views/InspectorAreaView.swift b/CodeEdit/Features/InspectorArea/Views/InspectorAreaView.swift index c6491f00d..ecfe7df84 100644 --- a/CodeEdit/Features/InspectorArea/Views/InspectorAreaView.swift +++ b/CodeEdit/Features/InspectorArea/Views/InspectorAreaView.swift @@ -16,21 +16,32 @@ struct InspectorAreaView: View { @AppSettings(\.general.inspectorTabBarPosition) var sidebarPosition: SettingsData.SidebarTabBarPosition + @AppSettings(\.developerSettings.showInternalDevelopmentInspector) + var showInternalDevelopmentInspector + init(viewModel: InspectorAreaViewModel) { self.viewModel = viewModel + updateTabs() + } + + private func updateTabs() { + var tabs: [InspectorTab] = [.file, .gitHistory] + + if showInternalDevelopmentInspector { + tabs.append(.internalDevelopment) + } - viewModel.tabItems = [.file, .gitHistory] + - extensionManager - .extensions - .map { ext in - ext.availableFeatures.compactMap { - if case .sidebarItem(let data) = $0, data.kind == .inspector { - return InspectorTab.uiExtension(endpoint: ext.endpoint, data: data) - } - return nil + viewModel.tabItems = tabs + extensionManager + .extensions + .map { ext in + ext.availableFeatures.compactMap { + if case .sidebarItem(let data) = $0, data.kind == .inspector { + return InspectorTab.uiExtension(endpoint: ext.endpoint, data: data) } + return nil } - .joined() + } + .joined() } var body: some View { @@ -43,5 +54,8 @@ struct InspectorAreaView: View { .formStyle(.grouped) .accessibilityElement(children: .contain) .accessibilityLabel("inspector") + .onChange(of: showInternalDevelopmentInspector) { _ in + updateTabs() + } } } diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift new file mode 100644 index 000000000..f71d39a49 --- /dev/null +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -0,0 +1,122 @@ +// +// CENotification.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + +import Foundation +import SwiftUI + +struct CENotification: Identifiable, Equatable { + let id: UUID + let icon: IconType + let title: String + let description: String + let actionButtonTitle: String + let action: () -> Void + let isSticky: Bool + var isRead: Bool + let timestamp: Date + var isBeingDismissed: Bool = false + + enum IconType { + case symbol(name: String, color: Color?) + case image(Image) + case text(String, backgroundColor: Color?, textColor: Color?) + } + + init( + id: UUID = UUID(), + iconSymbol: String, + iconColor: Color? = nil, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false, + isRead: Bool = false + ) { + self.init( + id: id, + icon: .symbol(name: iconSymbol, color: iconColor), + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky, + isRead: isRead + ) + } + + init( + id: UUID = UUID(), + iconText: String, + iconTextColor: Color? = nil, + iconColor: Color? = nil, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false, + isRead: Bool = false + ) { + self.init( + id: id, + icon: .text(iconText, backgroundColor: iconColor, textColor: iconTextColor), + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky, + isRead: isRead + ) + } + + init( + id: UUID = UUID(), + iconImage: Image, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false, + isRead: Bool = false + ) { + self.init( + id: id, + icon: .image(iconImage), + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky, + isRead: isRead + ) + } + + private init( + id: UUID, + icon: IconType, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool, + isRead: Bool + ) { + self.id = id + self.icon = icon + self.title = title + self.description = description + self.actionButtonTitle = actionButtonTitle + self.action = action + self.isSticky = isSticky + self.isRead = isRead + self.timestamp = Date() + } + + static func == (lhs: CENotification, rhs: CENotification) -> Bool { + lhs.id == rhs.id + } +} diff --git a/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift b/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift new file mode 100644 index 000000000..967023db1 --- /dev/null +++ b/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift @@ -0,0 +1,67 @@ +// +// NotificationManager+Delegate.swift +// CodeEdit +// +// Created by Austin Condiff on 2/14/24. +// + +import AppKit +import UserNotifications + +extension NotificationManager: UNUserNotificationCenterDelegate { + func userNotificationCenter( + _ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse, + withCompletionHandler completionHandler: @escaping () -> Void + ) { + if let notification = notifications.first(where: { + $0.id.uuidString == response.notification.request.identifier + }) { + // Focus CodeEdit and run action if action button was clicked + if response.actionIdentifier == "ACTION_BUTTON" || + response.actionIdentifier == UNNotificationDefaultActionIdentifier { + NSApp.activate(ignoringOtherApps: true) + notification.action() + } + + // Remove the notification for both action and dismiss + if response.actionIdentifier == "ACTION_BUTTON" || + response.actionIdentifier == UNNotificationDefaultActionIdentifier || + response.actionIdentifier == UNNotificationDismissActionIdentifier { + dismissNotification(notification) + } + } + + completionHandler() + } + + func userNotificationCenter( + _ center: UNUserNotificationCenter, + willPresent notification: UNNotification, + withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void + ) { + completionHandler([.banner, .sound]) + } + + func setupNotificationDelegate() { + UNUserNotificationCenter.current().delegate = self + + // Create action button + let action = UNNotificationAction( + identifier: "ACTION_BUTTON", + title: "Action", // This will be replaced with actual button title + options: .foreground + ) + + // Create category with action button + let actionCategory = UNNotificationCategory( + identifier: "ACTIONABLE", + actions: [action], + intentIdentifiers: [], + options: .customDismissAction + ) + + UNUserNotificationCenter.current().setNotificationCategories([actionCategory]) + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { _, _ in } + } +} diff --git a/CodeEdit/Features/Notifications/NotificationManager+System.swift b/CodeEdit/Features/Notifications/NotificationManager+System.swift new file mode 100644 index 000000000..24522d7c4 --- /dev/null +++ b/CodeEdit/Features/Notifications/NotificationManager+System.swift @@ -0,0 +1,46 @@ +// +// NotificationManager+System.swift +// CodeEdit +// +// Created by Austin Condiff on 2/14/24. +// + +import Foundation +import UserNotifications + +extension NotificationManager { + /// Shows a system notification when app is in background + func showSystemNotification(_ notification: CENotification) { + let content = UNMutableNotificationContent() + content.title = notification.title + content.body = notification.description + + if !notification.actionButtonTitle.isEmpty { + content.categoryIdentifier = "ACTIONABLE" + } + + let request = UNNotificationRequest( + identifier: notification.id.uuidString, + content: content, + trigger: nil + ) + + UNUserNotificationCenter.current().add(request) + } + + /// Removes a system notification + func removeSystemNotification(_ notification: CENotification) { + UNUserNotificationCenter.current().removeDeliveredNotifications( + withIdentifiers: [notification.id.uuidString] + ) + } + + /// Handles response from system notification + func handleSystemNotificationResponse(id: String) { + if let uuid = UUID(uuidString: id), + let notification = notifications.first(where: { $0.id == uuid }) { + notification.action() + dismissNotification(notification) + } + } +} diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift new file mode 100644 index 000000000..e27051418 --- /dev/null +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -0,0 +1,196 @@ +// +// NotificationManager.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + +import SwiftUI +import Combine +import UserNotifications + +/// Manages the application's notification system, handling both in-app notifications and system notifications. +/// This class is responsible for: +/// - Managing notification persistence +/// - Tracking notification read status +/// - Broadcasting notifications to workspaces +final class NotificationManager: NSObject, ObservableObject { + /// Shared instance for accessing the notification manager + static let shared = NotificationManager() + + /// Collection of all notifications, both read and unread + @Published private(set) var notifications: [CENotification] = [] + + private var isAppActive: Bool = true + + /// Number of unread notifications + var unreadCount: Int { + notifications.filter { !$0.isRead }.count + } + + /// Posts a new notification + /// - Parameters: + /// - iconSymbol: SF Symbol or CodeEditSymbol name for the notification icon + /// - iconColor: Color for the icon + /// - title: Main notification title + /// - description: Detailed notification message + /// - actionButtonTitle: Title for the action button + /// - action: Closure to execute when action button is clicked + /// - isSticky: Whether the notification should persist until manually dismissed + func post( + iconSymbol: String, + iconColor: Color? = Color(.systemBlue), + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false + ) { + let notification = CENotification( + iconSymbol: iconSymbol, + iconColor: iconColor, + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky, + isRead: false + ) + + postNotification(notification) + } + + /// Posts a new notification + /// - Parameters: + /// - iconImage: Image for the notification icon + /// - title: Main notification title + /// - description: Detailed notification message + /// - actionButtonTitle: Title for the action button + /// - action: Closure to execute when action button is clicked + /// - isSticky: Whether the notification should persist until manually dismissed + func post( + iconImage: Image, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false + ) { + let notification = CENotification( + iconImage: iconImage, + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky + ) + + postNotification(notification) + } + + /// Posts a new notification + /// - Parameters: + /// - iconText: Text or emoji for the notification icon + /// - iconTextColor: Color of the text/emoji (defaults to primary label color) + /// - iconColor: Background color for the icon + /// - title: Main notification title + /// - description: Detailed notification message + /// - actionButtonTitle: Title for the action button + /// - action: Closure to execute when action button is clicked + /// - isSticky: Whether the notification should persist until manually dismissed + func post( + iconText: String, + iconTextColor: Color? = nil, + iconColor: Color? = Color(.systemBlue), + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false + ) { + let notification = CENotification( + iconText: iconText, + iconTextColor: iconTextColor, + iconColor: iconColor, + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky + ) + + postNotification(notification) + } + + /// Dismisses a specific notification + func dismissNotification(_ notification: CENotification) { + notifications.removeAll(where: { $0.id == notification.id }) + markAsRead(notification) + + // Remove system notification if it exists + removeSystemNotification(notification) + + NotificationCenter.default.post( + name: .init("NotificationDismissed"), + object: notification + ) + } + + /// Marks a notification as read + /// - Parameter notification: The notification to mark as read + func markAsRead(_ notification: CENotification) { + if let index = notifications.firstIndex(where: { $0.id == notification.id }) { + notifications[index].isRead = true + } + } + + override init() { + super.init() + setupNotificationDelegate() + + // Observe app active state + NotificationCenter.default.addObserver( + self, + selector: #selector(handleAppDidBecomeActive), + name: NSApplication.didBecomeActiveNotification, + object: nil + ) + + NotificationCenter.default.addObserver( + self, + selector: #selector(handleAppDidResignActive), + name: NSApplication.didResignActiveNotification, + object: nil + ) + } + + @objc + private func handleAppDidBecomeActive() { + isAppActive = true + // Remove any system notifications when app becomes active + UNUserNotificationCenter.current().removeAllDeliveredNotifications() + } + + @objc + private func handleAppDidResignActive() { + isAppActive = false + } + + /// Posts a notification to workspaces and system + private func postNotification(_ notification: CENotification) { + DispatchQueue.main.async { [weak self] in + self?.notifications.append(notification) + + // Always notify workspaces of new notification + NotificationCenter.default.post( + name: .init("NewNotificationAdded"), + object: notification + ) + + // Additionally show system notification when app is in background + if self?.isAppActive != true { + self?.showSystemNotification(notification) + } + } + } +} diff --git a/CodeEdit/Features/Notifications/ViewModels/NotificationPanelViewModel.swift b/CodeEdit/Features/Notifications/ViewModels/NotificationPanelViewModel.swift new file mode 100644 index 000000000..9343856b9 --- /dev/null +++ b/CodeEdit/Features/Notifications/ViewModels/NotificationPanelViewModel.swift @@ -0,0 +1,265 @@ +// +// NotificationPanelViewModel.swift +// CodeEdit +// +// Created by Austin Condiff on 2/14/24. +// + +import SwiftUI + +final class NotificationPanelViewModel: ObservableObject { + /// Currently displayed notifications in the panel + @Published private(set) var activeNotifications: [CENotification] = [] + + /// Whether notifications panel was manually shown via toolbar + @Published private(set) var isPresented: Bool = false + + /// Set of hidden notification IDs + @Published private(set) var hiddenNotificationIds: Set = [] + + /// Timers for notifications + private var timers: [UUID: Timer] = [:] + + /// Display duration for notifications + private let displayDuration: TimeInterval = 5.0 + + /// Whether notifications are paused + private var isPaused: Bool = false + + private var notificationManager = NotificationManager.shared + + @Published var scrolledToTop: Bool = true + + /// Whether a notification should be visible in the panel + func isNotificationVisible(_ notification: CENotification) -> Bool { + if notification.isBeingDismissed { + return true // Always show notifications being dismissed + } + if notification.isSticky { + return true // Always show sticky notifications + } + if isPresented { + return true // Show all notifications when manually shown + } + return !hiddenNotificationIds.contains(notification.id) + } + + /// Handles focus changes for the notification panel + func handleFocusChange(isFocused: Bool) { + if !isFocused { + // Only hide if manually shown and focus is completely lost + if isPresented { + toggleNotificationsVisibility() + } + } + } + + /// Toggles visibility of notifications in the panel + func toggleNotificationsVisibility() { + if isPresented { + if !scrolledToTop { + // Just set isPresented to false to trigger the offset animation + withAnimation(.easeInOut(duration: 0.3)) { + isPresented = false + } + + // After the slide-out animation, hide notifications + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + // Hide non-sticky notifications + self.activeNotifications + .filter { !$0.isSticky } + .forEach { self.hiddenNotificationIds.insert($0.id) } + self.objectWillChange.send() + + // After notifications are hidden, reset scroll position + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.scrolledToTop = true + } + } + } else { + // At top, just hide normally + hideNotifications() + } + } else { + withAnimation(.easeInOut(duration: 0.3)) { + isPresented = true + hiddenNotificationIds.removeAll() + objectWillChange.send() + } + } + } + + private func hideNotifications() { + withAnimation(.easeInOut(duration: 0.3)) { + self.isPresented = false + self.activeNotifications + .filter { !$0.isSticky } + .forEach { self.hiddenNotificationIds.insert($0.id) } + self.objectWillChange.send() + } + } + + /// Starts the timer to automatically hide a notification + func startHideTimer(for notification: CENotification) { + guard !notification.isSticky && !isPresented else { return } + + timers[notification.id]?.invalidate() + timers[notification.id] = nil + + guard !isPaused else { return } + + timers[notification.id] = Timer.scheduledTimer( + withTimeInterval: displayDuration, + repeats: false + ) { [weak self] _ in + guard let self = self else { return } + self.timers[notification.id] = nil + + // Ensure we're on the main thread and animate the change + DispatchQueue.main.async { + NSAnimationContext.runAnimationGroup { context in + context.duration = 0.3 + context.allowsImplicitAnimation = true + + withAnimation(.easeInOut(duration: 0.3)) { + var newHiddenIds = self.hiddenNotificationIds + newHiddenIds.insert(notification.id) + self.hiddenNotificationIds = newHiddenIds + } + } + } + } + } + + /// Pauses all auto-hide timers + func pauseTimer() { + isPaused = true + timers.values.forEach { $0.invalidate() } + } + + /// Resumes all auto-hide timers + func resumeTimer() { + isPaused = false + // Only restart timers for notifications that are currently visible + activeNotifications + .filter { !$0.isSticky && isNotificationVisible($0) } + .forEach { startHideTimer(for: $0) } + } + + /// Inserts a notification in the correct position (sticky notifications on top) + private func insertNotification(_ notification: CENotification) { + if notification.isSticky { + // Find the first sticky notification (to insert before it) + if let firstStickyIndex = activeNotifications.firstIndex(where: { $0.isSticky }) { + // Insert at the very start of sticky group + activeNotifications.insert(notification, at: firstStickyIndex) + } else { + // No sticky notifications yet, insert at the start + activeNotifications.insert(notification, at: 0) + } + } else { + // Find the first non-sticky notification + if let firstNonStickyIndex = activeNotifications.firstIndex(where: { !$0.isSticky }) { + // Insert at the start of non-sticky group + activeNotifications.insert(notification, at: firstNonStickyIndex) + } else { + // No non-sticky notifications yet, append at the end + activeNotifications.append(notification) + } + } + } + + /// Handles a new notification being added + func handleNewNotification(_ notification: CENotification) { + withAnimation(.easeInOut(duration: 0.3)) { + insertNotification(notification) + hiddenNotificationIds.remove(notification.id) + if !isPresented && !notification.isSticky { + startHideTimer(for: notification) + } + } + } + + /// Dismisses a specific notification + func dismissNotification(_ notification: CENotification, disableAnimation: Bool = false) { + // Clean up timers + timers[notification.id]?.invalidate() + timers[notification.id] = nil + hiddenNotificationIds.remove(notification.id) + + // Mark as being dismissed for animation + if let index = activeNotifications.firstIndex(where: { $0.id == notification.id }) { + if disableAnimation { + self.activeNotifications.removeAll(where: { $0.id == notification.id }) + NotificationManager.shared.markAsRead(notification) + NotificationManager.shared.dismissNotification(notification) + return + } + + var dismissingNotification = activeNotifications[index] + dismissingNotification.isBeingDismissed = true + activeNotifications[index] = dismissingNotification + + // Wait for fade animation before removing + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { + withAnimation(.easeOut(duration: 0.2)) { + self.activeNotifications.removeAll(where: { $0.id == notification.id }) + if self.activeNotifications.isEmpty && self.isPresented { + self.isPresented = false + } + } + + NotificationManager.shared.markAsRead(notification) + NotificationManager.shared.dismissNotification(notification) + } + } + } + + init() { + // Observe new notifications + NotificationCenter.default.addObserver( + self, + selector: #selector(handleNewNotificationAdded(_:)), + name: .init("NewNotificationAdded"), + object: nil + ) + + // Observe notification dismissals + NotificationCenter.default.addObserver( + self, + selector: #selector(handleNotificationRemoved(_:)), + name: .init("NotificationDismissed"), + object: nil + ) + + // Load initial notifications from NotificationManager + notificationManager.notifications.forEach { notification in + handleNewNotification(notification) + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + @objc + private func handleNewNotificationAdded(_ notification: Notification) { + guard let ceNotification = notification.object as? CENotification else { return } + handleNewNotification(ceNotification) + } + + @objc + private func handleNotificationRemoved(_ notification: Notification) { + guard let ceNotification = notification.object as? CENotification else { return } + + // Just remove from active notifications without triggering global state changes + withAnimation(.easeOut(duration: 0.2)) { + activeNotifications.removeAll(where: { $0.id == ceNotification.id }) + + // If this was the last notification and they were manually shown, hide the panel + if activeNotifications.isEmpty && isPresented { + isPresented = false + } + } + } +} diff --git a/CodeEdit/Features/Notifications/Views/DismissTransition.swift b/CodeEdit/Features/Notifications/Views/DismissTransition.swift new file mode 100644 index 000000000..d977a2e92 --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/DismissTransition.swift @@ -0,0 +1,12 @@ +import SwiftUI + +struct DismissTransition: ViewModifier { + let useOpactityTransition: Bool + let isIdentity: Bool + + func body(content: Content) -> some View { + content + .opacity(useOpactityTransition ? (isIdentity ? 1 : 0) : 1) + .offset(x: useOpactityTransition ? 0 : (isIdentity ? 0 : 350)) + } +} diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift new file mode 100644 index 000000000..11a90696a --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -0,0 +1,170 @@ +// +// NotificationBannerView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + +import SwiftUI + +struct NotificationBannerView: View { + @Environment(\.colorScheme) + private var colorScheme + + @EnvironmentObject private var workspace: WorkspaceDocument + @ObservedObject private var notificationManager = NotificationManager.shared + + let notification: CENotification + let onDismiss: () -> Void + let onAction: () -> Void + + @State private var isHovering = false + + let cornerRadius: CGFloat = 10 + + private var backgroundContainer: some View { + RoundedRectangle(cornerRadius: cornerRadius) + .fill(.regularMaterial) + } + + private var borderOverlay: some View { + RoundedRectangle(cornerRadius: cornerRadius) + .stroke(Color(nsColor: .separatorColor), lineWidth: 2) + } + + var body: some View { + VStack(spacing: 10) { + HStack(alignment: .top, spacing: 10) { + switch notification.icon { + case let .symbol(name, color): + FeatureIcon( + symbol: name, + color: color ?? Color(.systemBlue), + size: 26 + ) + case let .text(text, backgroundColor, textColor): + FeatureIcon( + text: text, + textColor: textColor ?? .primary, + color: backgroundColor ?? Color(.systemBlue), + size: 26 + ) + case let .image(image): + FeatureIcon( + image: image, + size: 26 + ) + } + VStack(alignment: .leading, spacing: 1) { + Text(notification.title) + .font(.system(size: 12)) + .fontWeight(.semibold) + .padding(.top, -3) + Text(notification.description) + .font(.callout) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .mask( + LinearGradient( + gradient: Gradient( + colors: [ + .black, + .black, + !notification.isSticky && isHovering ? .clear : .black, + !notification.isSticky && isHovering ? .clear : .black + ] + ), + startPoint: .leading, + endPoint: .trailing + ) + ) + } + if notification.isSticky { + HStack(spacing: 8) { + Button(action: onDismiss, label: { + Text("Dismiss") + .frame(maxWidth: .infinity) + }) + .buttonStyle(.secondaryBlur) + .controlSize(.small) + Button(action: onAction, label: { + Text(notification.actionButtonTitle) + .frame(maxWidth: .infinity) + }) + .buttonStyle(.secondaryBlur) + .controlSize(.small) + } + .transition(.opacity.combined(with: .move(edge: .top))) + } + } + .padding(10) + .background(backgroundContainer) + .overlay(borderOverlay) + .cornerRadius(cornerRadius) + .shadow( + color: Color(.black.withAlphaComponent(colorScheme == .dark ? 0.2 : 0.1)), + radius: 5, + x: 0, + y: 2 + ) + .overlay(alignment: .bottomTrailing) { + if !notification.isSticky && isHovering { + Button(action: onAction, label: { + Text(notification.actionButtonTitle) + }) + .buttonStyle(.secondaryBlur) + .controlSize(.small) + .padding(10) + .transition(.opacity) + } + } + .overlay(alignment: .topLeading) { + if !notification.isSticky && isHovering { + Button(action: onDismiss) { + Image(systemName: "xmark") + } + .buttonStyle(.overlay) + .padding(.top, -5) + .padding(.leading, -5) + .transition(.opacity) + } + } + .frame(width: 300) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .modifier( + active: DismissTransition( + useOpactityTransition: notification.isBeingDismissed, + isIdentity: false + ), + identity: DismissTransition( + useOpactityTransition: notification.isBeingDismissed, + isIdentity: true + ) + ) + )) + .onHover { hovering in + withAnimation(.easeOut(duration: 0.2)) { + isHovering = hovering + } + + if hovering { + workspace.notificationPanel.pauseTimer() + } else { + workspace.notificationPanel.resumeTimer() + } + } + } +} + +struct DismissTransition: ViewModifier { + let useOpactityTransition: Bool + let isIdentity: Bool + + func body(content: Content) -> some View { + content + .opacity(useOpactityTransition && !isIdentity ? 0 : 1) + .offset(x: !useOpactityTransition && !isIdentity ? 350 : 0) + } +} diff --git a/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift b/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift new file mode 100644 index 000000000..c2c764eeb --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift @@ -0,0 +1,164 @@ +// +// NotificationPanelView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + +import SwiftUI + +struct NotificationPanelView: View { + @EnvironmentObject private var workspace: WorkspaceDocument + @Environment(\.controlActiveState) + private var controlActiveState + + @ObservedObject private var notificationManager = NotificationManager.shared + @FocusState private var isFocused: Bool + + // ID for the top anchor + private let topID = "top" + + // Fixed width for notifications + private let notificationWidth: CGFloat = 320 // 300 + 10 padding on each side + + @State private var hasOverflow: Bool = false + @State private var contentHeight: CGFloat = 0.0 + + private func updateOverflow(contentHeight: CGFloat, containerHeight: CGFloat) { + if !hasOverflow && contentHeight > containerHeight { + hasOverflow = true + } else if hasOverflow && contentHeight <= containerHeight { + hasOverflow = false + } + } + + @ViewBuilder var notifications: some View { + let visibleNotifications = workspace.notificationPanel.activeNotifications.filter { + workspace.notificationPanel.isNotificationVisible($0) + } + + VStack(spacing: 8) { + ForEach(visibleNotifications, id: \.id) { notification in + NotificationBannerView( + notification: notification, + onDismiss: { + workspace.notificationPanel.dismissNotification(notification) + }, + onAction: { + notification.action() + if workspace.notificationPanel.isPresented { + workspace.notificationPanel.toggleNotificationsVisibility() + workspace.notificationPanel.dismissNotification(notification, disableAnimation: true) + } else { + workspace.notificationPanel.dismissNotification(notification) + } + } + ) + } + } + .padding(10) + .animation(.easeInOut(duration: 0.3), value: visibleNotifications) + } + + @ViewBuilder var notificationsWithScrollView: some View { + GeometryReader { geometry in + HStack { + Spacer() + ScrollViewReader { proxy in + ScrollView(.vertical, showsIndicators: false) { + VStack(alignment: .trailing, spacing: 0) { + Color.clear + .frame(height: 0) + .id(topID) + .background( + GeometryReader { + Color.clear.preference( + key: ViewOffsetKey.self, + value: -$0.frame(in: .named("scroll")).origin.y + ) + } + ) + .onPreferenceChange(ViewOffsetKey.self) { + if $0 <= 0.0 && !workspace.notificationPanel.scrolledToTop { + workspace.notificationPanel.scrolledToTop = true + } else if $0 > 0.0 && workspace.notificationPanel.scrolledToTop { + workspace.notificationPanel.scrolledToTop = false + } + } + notifications + } + .background( + GeometryReader { proxy in + Color.clear.onChange(of: proxy.size.height) { newValue in + contentHeight = newValue + updateOverflow(contentHeight: newValue, containerHeight: geometry.size.height) + } + } + ) + } + .frame(maxWidth: notificationWidth, alignment: .trailing) + .frame(height: min(geometry.size.height, contentHeight)) + .scrollDisabled(!hasOverflow) + .coordinateSpace(name: "scroll") + .onChange(of: isFocused) { newValue in + workspace.notificationPanel.handleFocusChange(isFocused: newValue) + } + .onChange(of: geometry.size.height) { newValue in + updateOverflow(contentHeight: contentHeight, containerHeight: newValue) + } + .onChange(of: workspace.notificationPanel.isPresented) { isPresented in + if !isPresented && !workspace.notificationPanel.scrolledToTop { + // If scrolled, delay scroll animation until after notifications are hidden + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + withAnimation(.easeOut(duration: 0.3)) { + proxy.scrollTo(topID, anchor: .top) + } + } + } + } + .allowsHitTesting( + workspace.notificationPanel.activeNotifications + .contains { workspace.notificationPanel.isNotificationVisible($0) } + ) + } + } + } + } + + var body: some View { + Group { + if #available(macOS 14.0, *) { + notificationsWithScrollView + .scrollClipDisabled(true) + .focusable() + .focusEffectDisabled() + .focused($isFocused) + .onChange(of: workspace.notificationPanel.isPresented) { isPresented in + if isPresented { + isFocused = true + } + } + .onChange(of: controlActiveState) { newState in + if newState != .active && newState != .key && workspace.notificationPanel.isPresented { + // Delay hiding notifications to match animation timing + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + workspace.notificationPanel.toggleNotificationsVisibility() + } + } + } + } else { + notificationsWithScrollView + } + } + .opacity(controlActiveState == .active || controlActiveState == .key ? 1 : 0) + .offset( + x: (controlActiveState == .active || controlActiveState == .key) && + (workspace.notificationPanel.isPresented || workspace.notificationPanel.scrolledToTop) + ? 0 + : 350 + ) + .animation(.easeInOut(duration: 0.3), value: workspace.notificationPanel.isPresented) + .animation(.easeInOut(duration: 0.3), value: workspace.notificationPanel.scrolledToTop) + .animation(.easeInOut(duration: 0.2), value: controlActiveState) + } +} diff --git a/CodeEdit/Features/Notifications/Views/NotificationToolbarItem.swift b/CodeEdit/Features/Notifications/Views/NotificationToolbarItem.swift new file mode 100644 index 000000000..9729330dd --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/NotificationToolbarItem.swift @@ -0,0 +1,35 @@ +// +// NotificationToolbarItem.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + +import SwiftUI + +struct NotificationToolbarItem: View { + @EnvironmentObject private var workspace: WorkspaceDocument + @ObservedObject private var notificationManager = NotificationManager.shared + @Environment(\.controlActiveState) + private var controlActiveState + + var body: some View { + let visibleNotifications = workspace.notificationPanel.activeNotifications.filter { + !workspace.notificationPanel.hiddenNotificationIds.contains($0.id) + } + + if notificationManager.unreadCount > 0 || !visibleNotifications.isEmpty { + Button { + workspace.notificationPanel.toggleNotificationsVisibility() + } label: { + HStack(spacing: 4) { + Image(systemName: "bell.badge.fill") + .symbolRenderingMode(.palette) + .foregroundStyle(controlActiveState == .inactive ? .secondary : Color.accentColor, .primary) + Text("\(notificationManager.unreadCount)") + .monospacedDigit() + } + } + } + } +} diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift index 51a92e099..0461a3fd0 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift @@ -22,13 +22,8 @@ struct AccountsSettingsAccountLink: View { .font(.footnote) .foregroundColor(.secondary) } icon: { - Image(account.provider.iconName) - .resizable() - .aspectRatio(contentMode: .fill) - .clipShape(RoundedRectangle(cornerRadius: 6)) - .frame(width: 26, height: 26) - .padding(.top, 2) - .padding(.bottom, 2) + FeatureIcon(image: Image(account.provider.iconName), size: 26) + .padding(.vertical, 2) .padding(.leading, 2) } } diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift index d986fc7db..7d570464d 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift @@ -17,11 +17,7 @@ struct AccountsSettingsProviderRow: View { var body: some View { HStack { - Image(iconName) - .resizable() - .aspectRatio(contentMode: .fill) - .clipShape(RoundedRectangle(cornerRadius: 6)) - .frame(width: 28, height: 28) + FeatureIcon(image: Image(iconName), size: 28) Text(name) Spacer() if hovering { diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift index 3d20848f3..7672d50b6 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift @@ -64,11 +64,7 @@ struct AccountsSettingsSigninView: View { }, header: { VStack(alignment: .center, spacing: 10) { - Image(provider.iconName) - .resizable() - .aspectRatio(contentMode: .fill) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .frame(width: 52, height: 52) + FeatureIcon(image: Image(provider.iconName), size: 52) .padding(.top, 5) Text("Sign in to \(provider.name)") .multilineTextAlignment(.center) @@ -81,6 +77,7 @@ struct AccountsSettingsSigninView: View { Text("\(provider.name) personal access tokens must have these scopes set:") .font(.system(size: 10.5)) .foregroundColor(.secondary) + .multilineTextAlignment(.leading) HStack(alignment: .center) { Spacer() VStack(alignment: .leading) { diff --git a/CodeEdit/Features/Settings/Pages/DeveloperSettings/DeveloperSettingsView.swift b/CodeEdit/Features/Settings/Pages/DeveloperSettings/DeveloperSettingsView.swift index fa552ace9..eac495dae 100644 --- a/CodeEdit/Features/Settings/Pages/DeveloperSettings/DeveloperSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/DeveloperSettings/DeveloperSettingsView.swift @@ -13,8 +13,15 @@ struct DeveloperSettingsView: View { @AppSettings(\.developerSettings.lspBinaries) var lspBinaries + @AppSettings(\.developerSettings.showInternalDevelopmentInspector) + var showInternalDevelopmentInspector + var body: some View { SettingsForm { + Section { + Toggle("Show Internal Development Inspector", isOn: $showInternalDevelopmentInspector) + } + Section { KeyValueTable( items: $lspBinaries, diff --git a/CodeEdit/Features/Settings/Pages/DeveloperSettings/Models/DeveloperSettings.swift b/CodeEdit/Features/Settings/Pages/DeveloperSettings/Models/DeveloperSettings.swift index cd142f36b..f52f07538 100644 --- a/CodeEdit/Features/Settings/Pages/DeveloperSettings/Models/DeveloperSettings.swift +++ b/CodeEdit/Features/Settings/Pages/DeveloperSettings/Models/DeveloperSettings.swift @@ -15,7 +15,8 @@ extension SettingsData { [ "Developer", "Language Server Protocol", - "LSP Binaries" + "LSP Binaries", + "Show Internal Development Inspector" ] .map { NSLocalizedString($0, comment: "") } } @@ -23,6 +24,9 @@ extension SettingsData { /// A dictionary that stores a file type and a path to an LSP binary var lspBinaries: [String: String] = [:] + /// Toggle for showing the internal development inspector + var showInternalDevelopmentInspector: Bool = false + /// Default initializer init() {} @@ -34,6 +38,11 @@ extension SettingsData { [String: String].self, forKey: .lspBinaries ) ?? [:] + + self.showInternalDevelopmentInspector = try container.decodeIfPresent( + Bool.self, + forKey: .showInternalDevelopmentInspector + ) ?? false } } } diff --git a/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlSettingsView.swift b/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlSettingsView.swift index 22f0304ca..14ee02523 100644 --- a/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/SourceControlSettings/SourceControlSettingsView.swift @@ -53,7 +53,7 @@ struct SourceControlSettingsView: View { """) .font(.callout) } icon: { - FeatureIcon(symbol: Image(symbol: "vault"), color: Color(.systemBlue), size: 26) + FeatureIcon(symbol: "vault", color: Color(.systemBlue), size: 26) } } .controlSize(.large) diff --git a/CodeEdit/Features/Settings/Views/FeatureIcon.swift b/CodeEdit/Features/Settings/Views/FeatureIcon.swift deleted file mode 100644 index b7ca98e4e..000000000 --- a/CodeEdit/Features/Settings/Views/FeatureIcon.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// FeatureIcon.swift -// CodeEdit -// -// Created by Austin Condiff on 12/2/24. -// - -import SwiftUI - -struct FeatureIcon: View { - private let symbol: Image - private let color: Color - private let size: CGFloat - - init( - symbol: Image?, - color: Color?, - size: CGFloat? - ) { - self.symbol = symbol ?? Image(systemName: "exclamationmark.triangle") - self.color = color ?? .white - self.size = size ?? 20 - } - - var body: some View { - Group { - symbol - .resizable() - .aspectRatio(contentMode: .fit) - } - .shadow(color: Color(NSColor.black).opacity(0.25), radius: size / 40, y: size / 40) - .padding(size / 8) - .foregroundColor(.white) - .frame(width: size, height: size) - .background( - RoundedRectangle( - cornerRadius: size / 4, - style: .continuous - ) - .fill(color.gradient) - .shadow(color: Color(NSColor.black).opacity(0.25), radius: size / 40, y: size / 40) - ) - } -} diff --git a/CodeEdit/Features/Settings/Views/SettingsPageView.swift b/CodeEdit/Features/Settings/Views/SettingsPageView.swift index e1c96460b..caf1c46e4 100644 --- a/CodeEdit/Features/Settings/Views/SettingsPageView.swift +++ b/CodeEdit/Features/Settings/Views/SettingsPageView.swift @@ -16,15 +16,14 @@ struct SettingsPageView: View { self.searchText = searchText } - var symbol: Image? { + private var iconName: String { switch page.icon { - case .system(let name): - Image(systemName: name) - case .symbol(let name): - Image(symbol: name) + case .system(let name), .symbol(let name): + return name case .asset(let name): - Image(name) - case .none: nil + return name + case .none: + return "questionmark.circle" // fallback icon } } @@ -34,7 +33,11 @@ struct SettingsPageView: View { page.name.rawValue.highlightOccurrences(self.searchText) .padding(.leading, 2) } icon: { - FeatureIcon(symbol: symbol, color: page.baseColor, size: 20) + if case .asset(let name) = page.icon { + FeatureIcon(image: Image(name), size: 20) + } else { + FeatureIcon(symbol: iconName, color: page.baseColor, size: 20) + } } } } diff --git a/CodeEdit/WorkspaceView.swift b/CodeEdit/WorkspaceView.swift index 9332b4f16..69b957bcd 100644 --- a/CodeEdit/WorkspaceView.swift +++ b/CodeEdit/WorkspaceView.swift @@ -104,6 +104,9 @@ struct WorkspaceView: View { } .accessibilityElement(children: .contain) } + .overlay(alignment: .topTrailing) { + NotificationPanelView() + } .onChange(of: focusedEditor) { newValue in /// update active tab group only if the new one is not the same with it. if let newValue, editorManager.activeEditor != newValue { diff --git a/CodeEditUI/src/Preferences/ViewOffsetPreferenceKey.swift b/CodeEditUI/src/Preferences/ViewOffsetPreferenceKey.swift new file mode 100644 index 000000000..831ccc8b9 --- /dev/null +++ b/CodeEditUI/src/Preferences/ViewOffsetPreferenceKey.swift @@ -0,0 +1,10 @@ +import SwiftUI + +/// Tracks scroll offset in scrollable views +public struct ViewOffsetPreferenceKey: PreferenceKey { + public typealias Value = CGFloat + public static var defaultValue = CGFloat.zero + public static func reduce(value: inout Value, nextValue: () -> Value) { + value += nextValue() + } +} From 8a3da4b1ca46563c105fc0a997a0c9d8cef1adf3 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 4 Mar 2025 16:37:20 -0600 Subject: [PATCH 05/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cc143c840..f836f2fdc 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@

- - + + From c70b419cb196d540a1306bf8d91c2a685f5e3245 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:19:45 -0600 Subject: [PATCH 06/24] Echo xcodebuild Version In Test Script Adds a line that echos the xcodebuild version in the test script, to make it easier to diagnose version mismatches between the test runner and local Xcode versions. --- .github/scripts/test_app.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/scripts/test_app.sh b/.github/scripts/test_app.sh index 0c6edb7b0..b4ed47056 100755 --- a/.github/scripts/test_app.sh +++ b/.github/scripts/test_app.sh @@ -8,6 +8,7 @@ elif [ $1 = "arm" ]; then ARCH="arm64" fi +echo "Building with Xcode: $(xcodebuild -version)" echo "Building with arch: ${ARCH}" echo "SwiftLint Version: $(swiftlint --version)" From 1f6c33aca09f0a473ad1f3690f0194547c722599 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 5 Mar 2025 15:22:49 -0600 Subject: [PATCH 07/24] chore: Project Cleanup, Group to Folder Conversion, and SwiftLint Upgrade (#2003) * Converted all Xcode groups to folders * Resolved most SwiftLint warnings * Deleted unnecessary project files * Enabled filesystem synchronized groups * Previous attempt to enable filesystem synchronized groups didn't work, trying again. * Changed project file format to Xcode 16 * Minimized project references * Converted some folders back to groups * Converted all top-level folders to groups * That didn't work, reverting * Project cleanup and ugrade to SwiftLint 58. * Reverted project file * Fixed SwiftLint version * Addressed PR issues * retroactive was causing tests to fail. Removing for now * Hiding preview from tests to prevent failure * Removing Preview again * Adding preview and retroactive back in. * Converted Xcode groups to folders * Resolved a small SwiftLint warning * PR issue fixes --- CodeEdit.xcodeproj/project.pbxproj | 4460 +---------------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/swiftpm/Package.resolved | 6 +- .../xcshareddata/xcschemes/CodeEdit.xcscheme | 2 +- CodeEdit/Features/CodeEditExtension/README.md | 3 - .../WorkspaceDocument+Find.swift | 85 +- .../Tabs/Tab/EditorTabCloseButton.swift | 5 +- .../Editor/Views/EditorAreaView.swift | 2 - .../InspectorSidebarToolbarTop.swift | 133 - .../Features/LSP/Service/LSPService.swift | 2 +- .../FindNavigatorResultFileItem.swift | 76 - .../FindNavigatorListViewController.swift | 2 +- .../NavigatorSidebarToolbar.swift | 211 - .../Views/DismissTransition.swift | 12 - .../OpenQuickly/Views/OpenQuicklyView.swift | 6 - .../Settings/Views/ExternalLink.swift | 2 +- .../Settings/Views/MonospacedFontPicker.swift | 4 +- .../Accounts/GitHub/GitHubConfiguration.swift | 5 +- .../Networking/GitJSONPostRouter.swift | 4 - .../Accounts/Networking/GitRouter.swift | 15 - .../Features/Tasks/Models/CEActiveTask.swift | 4 +- .../Resources/en.lproj/Localizable.strings | 19 - .../Features/Welcome/Views/WelcomeView.swift | 6 +- .../codeedit_shell_integration_login.zsh | 0 .../Extensions/URL/URL+Identifiable.swift | 14 + CodeEdit/Utils/FolderMonitor.swift | 70 - .../Utils/KeyChain/CodeEditKeychain.swift | 1 - .../ShellClient/Models/ShellClient.swift | 27 +- .../testBranchPickerDark.1.png | Bin 4465 -> 0 bytes .../testBranchPickerLight.1.png | Bin 4329 -> 0 bytes .../CodeEditUITests/testEffectViewDark.1.png | Bin 1344 -> 0 bytes .../CodeEditUITests/testEffectViewLight.1.png | Bin 1340 -> 0 bytes .../testFontPickerViewDark.1.png | Bin 5125 -> 0 bytes .../testFontPickerViewLight.1.png | Bin 5626 -> 0 bytes .../CodeEditUITests/testHelpButtonDark.1.png | Bin 3691 -> 0 bytes .../CodeEditUITests/testHelpButtonLight.1.png | Bin 3406 -> 0 bytes .../testSegmentedControlDark.1.png | Bin 4842 -> 0 bytes .../testSegmentedControlLight.1.png | Bin 4392 -> 0 bytes .../testSegmentedControlProminentDark.1.png | Bin 4336 -> 0 bytes .../testSegmentedControlProminentLight.1.png | Bin 4175 -> 0 bytes .../LSP/LanguageServer+DocumentTests.swift | 6 +- .../TerminalEmulator/Shell/ShellTests.swift | 12 +- .../testRecentJSFileDarkSnapshot.1.png | Bin 10182 -> 0 bytes .../testRecentJSFileLightSnapshot.1.png | Bin 9494 -> 0 bytes .../testRecentProjectItemDarkSnapshot.1.png | Bin 10175 -> 0 bytes .../testRecentProjectItemLightSnapshot.1.png | Bin 9472 -> 0 bytes .../testWelcomeActionViewDarkSnapshot.1.png | Bin 10753 -> 0 bytes .../testWelcomeActionViewLightSnapshot.1.png | Bin 10148 -> 0 bytes 49 files changed, 254 insertions(+), 4956 deletions(-) delete mode 100644 CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 CodeEdit/Features/CodeEditExtension/README.md delete mode 100644 CodeEdit/Features/InspectorArea/InspectorSidebarToolbarTop.swift delete mode 100644 CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorResultFileItem.swift delete mode 100644 CodeEdit/Features/NavigatorArea/NavigatorSidebarToolbar.swift delete mode 100644 CodeEdit/Features/Notifications/Views/DismissTransition.swift delete mode 100644 CodeEdit/Features/Welcome/Views/Resources/en.lproj/Localizable.strings rename CodeEdit/{Features/TerminalEmulator => ShellIntegration}/codeedit_shell_integration_login.zsh (100%) create mode 100644 CodeEdit/Utils/Extensions/URL/URL+Identifiable.swift delete mode 100644 CodeEdit/Utils/FolderMonitor.swift delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testBranchPickerDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testBranchPickerLight.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewLight.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewLight.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testHelpButtonDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testHelpButtonLight.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlLight.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlProminentDark.1.png delete mode 100644 CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlProminentLight.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentJSFileDarkSnapshot.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentJSFileLightSnapshot.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentProjectItemDarkSnapshot.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentProjectItemLightSnapshot.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testWelcomeActionViewDarkSnapshot.1.png delete mode 100644 CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testWelcomeActionViewLightSnapshot.1.png diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 6a26fcfb4..494a5c1d5 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -3,661 +3,43 @@ archiveVersion = 1; classes = { }; - objectVersion = 55; + objectVersion = 73; objects = { /* Begin PBXBuildFile section */ - 041FC6AD2AE437CE00C1F65A /* SourceControlNewBranchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041FC6AC2AE437CE00C1F65A /* SourceControlNewBranchView.swift */; }; - 043BCF03281DA18A000AC47C /* WorkspaceDocument+SearchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */; }; - 043C321427E31FF6006AE443 /* CodeEditDocumentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C321327E31FF6006AE443 /* CodeEditDocumentController.swift */; }; - 043C321627E3201F006AE443 /* WorkspaceDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C321527E3201F006AE443 /* WorkspaceDocument.swift */; }; - 04540D5E27DD08C300E91B77 /* WorkspaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B658FB3127DA9E0F00EA4DBD /* WorkspaceView.swift */; }; - 04660F6A27E51E5C00477777 /* CodeEditWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04660F6927E51E5C00477777 /* CodeEditWindowController.swift */; }; - 0485EB1F27E7458B00138301 /* EditorAreaFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0485EB1E27E7458B00138301 /* EditorAreaFileView.swift */; }; - 04BA7C0B2AE2A2D100584E1C /* GitBranch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C0A2AE2A2D100584E1C /* GitBranch.swift */; }; - 04BA7C0E2AE2A76E00584E1C /* SourceControlNavigatorChangesCommitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C0D2AE2A76E00584E1C /* SourceControlNavigatorChangesCommitView.swift */; }; - 04BA7C132AE2AA7300584E1C /* GitCheckoutBranchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C112AE2AA7300584E1C /* GitCheckoutBranchViewModel.swift */; }; - 04BA7C142AE2AA7300584E1C /* GitCloneViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C122AE2AA7300584E1C /* GitCloneViewModel.swift */; }; - 04BA7C192AE2D7C600584E1C /* GitClient+Branches.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C182AE2D7C600584E1C /* GitClient+Branches.swift */; }; - 04BA7C1C2AE2D84100584E1C /* GitClient+Commit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C1B2AE2D84100584E1C /* GitClient+Commit.swift */; }; - 04BA7C1E2AE2D8A000584E1C /* GitClient+Clone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C1D2AE2D8A000584E1C /* GitClient+Clone.swift */; }; - 04BA7C202AE2D92B00584E1C /* GitClient+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C1F2AE2D92B00584E1C /* GitClient+Status.swift */; }; - 04BA7C222AE2D95E00584E1C /* GitClient+CommitHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C212AE2D95E00584E1C /* GitClient+CommitHistory.swift */; }; - 04BA7C242AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C232AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift */; }; - 04BA7C272AE2E9F100584E1C /* GitClient+Push.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BA7C262AE2E9F100584E1C /* GitClient+Push.swift */; }; - 04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */; }; - 04C3255B2801F86400C8DA2D /* ProjectNavigatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6D27FE4B4A00E57D53 /* ProjectNavigatorViewController.swift */; }; - 04C3255C2801F86900C8DA2D /* ProjectNavigatorMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC7127FE4EEF00E57D53 /* ProjectNavigatorMenu.swift */; }; - 0FD96BCE2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */; }; - 201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */; }; - 201169DB2837B34000F92B46 /* GitChangedFileListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DA2837B34000F92B46 /* GitChangedFileListView.swift */; }; - 201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */; }; - 201169E22837B3D800F92B46 /* SourceControlNavigatorChangesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169E12837B3D800F92B46 /* SourceControlNavigatorChangesView.swift */; }; - 201169E52837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169E42837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift */; }; - 201169E72837B5CA00F92B46 /* SourceControlManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169E62837B5CA00F92B46 /* SourceControlManager.swift */; }; - 2072FA13280D74ED00C7F8D4 /* HistoryInspectorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2072FA12280D74ED00C7F8D4 /* HistoryInspectorModel.swift */; }; - 20D839AB280DEB2900B27357 /* NoSelectionInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D839AA280DEB2900B27357 /* NoSelectionInspectorView.swift */; }; - 20D839AE280E0CA700B27357 /* HistoryPopoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */; }; - 20EBB501280C325D00F3A5DA /* FileInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB500280C325D00F3A5DA /* FileInspectorView.swift */; }; - 20EBB503280C327C00F3A5DA /* HistoryInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */; }; - 20EBB505280C329800F3A5DA /* CommitListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB504280C329800F3A5DA /* CommitListItemView.swift */; }; - 2806E9022979588B000040F4 /* Contributor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E9012979588B000040F4 /* Contributor.swift */; }; - 2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E903297958B9000040F4 /* ContributorRowView.swift */; }; - 2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E201B327E9989900CB86D0 /* FindNavigatorResultList.swift */; }; - 2813F93927ECC4C300E305E4 /* NavigatorAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287776E627E3413200D46668 /* NavigatorAreaView.swift */; }; 2816F594280CF50500DD548B /* CodeEditSymbols in Frameworks */ = {isa = PBXBuildFile; productRef = 2816F593280CF50500DD548B /* CodeEditSymbols */; }; 283BDCBD2972EEBD002AFF81 /* Package.resolved in Resources */ = {isa = PBXBuildFile; fileRef = 283BDCBC2972EEBD002AFF81 /* Package.resolved */; }; - 283BDCC52972F236002AFF81 /* AcknowledgementsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */; }; - 2847019E27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2847019D27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift */; }; - 284DC84F2978B7B400BF2770 /* ContributorsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284DC84E2978B7B400BF2770 /* ContributorsView.swift */; }; 284DC8512978BA2600BF2770 /* .all-contributorsrc in Resources */ = {isa = PBXBuildFile; fileRef = 284DC8502978BA2600BF2770 /* .all-contributorsrc */; }; - 285FEC7027FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6F27FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift */; }; - 286471AB27ED51FD0039369D /* ProjectNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 286471AA27ED51FD0039369D /* ProjectNavigatorView.swift */; }; - 287776E927E34BC700D46668 /* EditorTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287776E827E34BC700D46668 /* EditorTabBarView.swift */; }; - 2897E1C72979A29200741E32 /* TrackableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2897E1C62979A29200741E32 /* TrackableScrollView.swift */; }; - 28B8F884280FFE4600596236 /* NSTableView+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B8F883280FFE4600596236 /* NSTableView+Background.swift */; }; - 2B7A583527E4BA0100D25D4E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0468438427DC76E200F8E88E /* AppDelegate.swift */; }; - 2B7AC06B282452FB0082A5B8 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2B7AC06A282452FB0082A5B8 /* Media.xcassets */; }; - 2BE487EF28245162003F3F64 /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE487EE28245162003F3F64 /* FinderSync.swift */; }; 2BE487F428245162003F3F64 /* OpenWithCodeEdit.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2BE487EC28245162003F3F64 /* OpenWithCodeEdit.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 300051672BBD3A5D00A98562 /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300051662BBD3A5D00A98562 /* ServiceContainer.swift */; }; - 3000516A2BBD3A8200A98562 /* ServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300051692BBD3A8200A98562 /* ServiceType.swift */; }; - 3000516C2BBD3A9500A98562 /* ServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3000516B2BBD3A9500A98562 /* ServiceWrapper.swift */; }; - 3026F50F2AC006C80061227E /* InspectorAreaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3026F50E2AC006C80061227E /* InspectorAreaViewModel.swift */; }; - 30AB4EBB2BF718A100ED4431 /* DeveloperSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30AB4EBA2BF718A100ED4431 /* DeveloperSettings.swift */; }; - 30AB4EBD2BF71CA800ED4431 /* DeveloperSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30AB4EBC2BF71CA800ED4431 /* DeveloperSettingsView.swift */; }; - 30AB4EC22BF7253200ED4431 /* KeyValueTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30AB4EC12BF7253200ED4431 /* KeyValueTable.swift */; }; - 30B087FC2C0D53080063A882 /* LanguageServer+CallHierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087DF2C0D53080063A882 /* LanguageServer+CallHierarchy.swift */; }; - 30B087FE2C0D53080063A882 /* LanguageServer+ColorPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E12C0D53080063A882 /* LanguageServer+ColorPresentation.swift */; }; - 30B087FF2C0D53080063A882 /* LanguageServer+Completion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E22C0D53080063A882 /* LanguageServer+Completion.swift */; }; - 30B088002C0D53080063A882 /* LanguageServer+Declaration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E32C0D53080063A882 /* LanguageServer+Declaration.swift */; }; - 30B088012C0D53080063A882 /* LanguageServer+Definition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E42C0D53080063A882 /* LanguageServer+Definition.swift */; }; - 30B088022C0D53080063A882 /* LanguageServer+Diagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E52C0D53080063A882 /* LanguageServer+Diagnostics.swift */; }; - 30B088032C0D53080063A882 /* LanguageServer+DocumentColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E62C0D53080063A882 /* LanguageServer+DocumentColor.swift */; }; - 30B088042C0D53080063A882 /* LanguageServer+DocumentHighlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E72C0D53080063A882 /* LanguageServer+DocumentHighlight.swift */; }; - 30B088052C0D53080063A882 /* LanguageServer+DocumentLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E82C0D53080063A882 /* LanguageServer+DocumentLink.swift */; }; - 30B088062C0D53080063A882 /* LanguageServer+DocumentSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087E92C0D53080063A882 /* LanguageServer+DocumentSymbol.swift */; }; - 30B088082C0D53080063A882 /* LanguageServer+FoldingRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087EB2C0D53080063A882 /* LanguageServer+FoldingRange.swift */; }; - 30B088092C0D53080063A882 /* LanguageServer+Formatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087EC2C0D53080063A882 /* LanguageServer+Formatting.swift */; }; - 30B0880A2C0D53080063A882 /* LanguageServer+Hover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087ED2C0D53080063A882 /* LanguageServer+Hover.swift */; }; - 30B0880B2C0D53080063A882 /* LanguageServer+Implementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087EE2C0D53080063A882 /* LanguageServer+Implementation.swift */; }; - 30B0880C2C0D53080063A882 /* LanguageServer+InlayHint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087EF2C0D53080063A882 /* LanguageServer+InlayHint.swift */; }; - 30B0880D2C0D53080063A882 /* LanguageServer+References.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F02C0D53080063A882 /* LanguageServer+References.swift */; }; - 30B0880E2C0D53080063A882 /* LanguageServer+Rename.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F12C0D53080063A882 /* LanguageServer+Rename.swift */; }; - 30B0880F2C0D53080063A882 /* LanguageServer+SelectionRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F22C0D53080063A882 /* LanguageServer+SelectionRange.swift */; }; - 30B088102C0D53080063A882 /* LanguageServer+SemanticTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F32C0D53080063A882 /* LanguageServer+SemanticTokens.swift */; }; - 30B088112C0D53080063A882 /* LanguageServer+SignatureHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F42C0D53080063A882 /* LanguageServer+SignatureHelp.swift */; }; - 30B088122C0D53080063A882 /* LanguageServer+TypeDefinition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F52C0D53080063A882 /* LanguageServer+TypeDefinition.swift */; }; - 30B088142C0D53080063A882 /* LanguageServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F72C0D53080063A882 /* LanguageServer.swift */; }; - 30B088152C0D53080063A882 /* LSPService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087F82C0D53080063A882 /* LSPService.swift */; }; - 30B088172C0D53080063A882 /* LSPUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B087FA2C0D53080063A882 /* LSPUtil.swift */; }; - 30CB648D2C12680F00CC8A9E /* LSPService+Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30CB648C2C12680F00CC8A9E /* LSPService+Events.swift */; }; 30CB64912C16CA8100CC8A9E /* LanguageServerProtocol in Frameworks */ = {isa = PBXBuildFile; productRef = 30CB64902C16CA8100CC8A9E /* LanguageServerProtocol */; }; 30CB64942C16CA9100CC8A9E /* LanguageClient in Frameworks */ = {isa = PBXBuildFile; productRef = 30CB64932C16CA9100CC8A9E /* LanguageClient */; }; - 30E6D0012A6E505200A58B20 /* NavigatorAreaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30E6D0002A6E505200A58B20 /* NavigatorAreaViewModel.swift */; }; - 3E0196732A3921AC002648D8 /* codeedit_shell_integration_rc.zsh in Resources */ = {isa = PBXBuildFile; fileRef = 3E0196722A3921AC002648D8 /* codeedit_shell_integration_rc.zsh */; }; - 3E01967A2A392B45002648D8 /* codeedit_shell_integration.bash in Resources */ = {isa = PBXBuildFile; fileRef = 3E0196792A392B45002648D8 /* codeedit_shell_integration.bash */; }; - 4A6F0DB52CBA462B00499627 /* ProjectNavigatorMenuActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6F0DB42CBA462B00499627 /* ProjectNavigatorMenuActions.swift */; }; - 4E7F066629602E7B00BB3C12 /* CodeEditSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E7F066529602E7B00BB3C12 /* CodeEditSplitViewController.swift */; }; - 4EE96ECB2960565E00FFBEA8 /* DocumentsUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE96ECA2960565E00FFBEA8 /* DocumentsUnitTests.swift */; }; - 4EE96ECE296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE96ECD296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift */; }; - 581550CF29FBD30400684881 /* StandardTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581550CC29FBD30400684881 /* StandardTableViewCell.swift */; }; - 581550D029FBD30400684881 /* FileSystemTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581550CD29FBD30400684881 /* FileSystemTableViewCell.swift */; }; - 581550D129FBD30400684881 /* TextTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581550CE29FBD30400684881 /* TextTableViewCell.swift */; }; - 581550D429FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581550D329FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift */; }; - 581BFB672926431000D251EC /* WelcomeWindowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581BFB5A2926431000D251EC /* WelcomeWindowView.swift */; }; - 581BFB682926431000D251EC /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581BFB5B2926431000D251EC /* WelcomeView.swift */; }; - 581BFB692926431000D251EC /* WelcomeActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581BFB5C2926431000D251EC /* WelcomeActionView.swift */; }; - 581BFB6B2926431000D251EC /* RecentProjectListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581BFB5E2926431000D251EC /* RecentProjectListItem.swift */; }; - 582213F0291834A500EFE361 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582213EF291834A500EFE361 /* AboutView.swift */; }; - 583E528C29361B39001AB554 /* CodeEditUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583E527529361B39001AB554 /* CodeEditUITests.swift */; }; - 583E528D29361B39001AB554 /* testHelpButtonDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527929361B39001AB554 /* testHelpButtonDark.1.png */; }; - 583E528E29361B39001AB554 /* testEffectViewLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527A29361B39001AB554 /* testEffectViewLight.1.png */; }; - 583E528F29361B39001AB554 /* testSegmentedControlLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527B29361B39001AB554 /* testSegmentedControlLight.1.png */; }; - 583E529029361B39001AB554 /* testSegmentedControlProminentLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527C29361B39001AB554 /* testSegmentedControlProminentLight.1.png */; }; - 583E529129361B39001AB554 /* testHelpButtonLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527D29361B39001AB554 /* testHelpButtonLight.1.png */; }; - 583E529229361B39001AB554 /* testBranchPickerDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527E29361B39001AB554 /* testBranchPickerDark.1.png */; }; - 583E529329361B39001AB554 /* testFontPickerViewDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E527F29361B39001AB554 /* testFontPickerViewDark.1.png */; }; - 583E529429361B39001AB554 /* testFontPickerViewLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E528029361B39001AB554 /* testFontPickerViewLight.1.png */; }; - 583E529529361B39001AB554 /* testSegmentedControlProminentDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E528129361B39001AB554 /* testSegmentedControlProminentDark.1.png */; }; - 583E529629361B39001AB554 /* testSegmentedControlDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E528229361B39001AB554 /* testSegmentedControlDark.1.png */; }; - 583E529729361B39001AB554 /* testEffectViewDark.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E528329361B39001AB554 /* testEffectViewDark.1.png */; }; - 583E529829361B39001AB554 /* testBranchPickerLight.1.png in Resources */ = {isa = PBXBuildFile; fileRef = 583E528429361B39001AB554 /* testBranchPickerLight.1.png */; }; 583E529C29361BAB001AB554 /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 583E529B29361BAB001AB554 /* SnapshotTesting */; }; - 58710159298EB80000951BA4 /* CEWorkspaceFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58710158298EB80000951BA4 /* CEWorkspaceFileManager.swift */; }; - 5878DA82291863F900DD95A3 /* AcknowledgementsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA81291863F900DD95A3 /* AcknowledgementsView.swift */; }; - 5878DA842918642000DD95A3 /* ParsePackagesResolved.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */; }; - 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */; }; - 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */; }; - 5878DAA6291AE76700DD95A3 /* OpenQuicklyPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */; }; - 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */; }; - 5878DAA8291AE76700DD95A3 /* OpenQuicklyListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */; }; - 5878DAB0291D627C00DD95A3 /* EditorJumpBarMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAD291D627C00DD95A3 /* EditorJumpBarMenu.swift */; }; - 5878DAB1291D627C00DD95A3 /* EditorJumpBarComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAE291D627C00DD95A3 /* EditorJumpBarComponent.swift */; }; - 5878DAB2291D627C00DD95A3 /* EditorJumpBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAF291D627C00DD95A3 /* EditorJumpBarView.swift */; }; - 58798218292D92370085B254 /* String+SafeOffset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798213292D92370085B254 /* String+SafeOffset.swift */; }; - 58798219292D92370085B254 /* SearchModeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798215292D92370085B254 /* SearchModeModel.swift */; }; - 5879821A292D92370085B254 /* SearchResultModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798216292D92370085B254 /* SearchResultModel.swift */; }; - 5879821B292D92370085B254 /* SearchResultMatchModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798217292D92370085B254 /* SearchResultMatchModel.swift */; }; - 58798233292E30B90085B254 /* FeedbackToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5879822B292E30B90085B254 /* FeedbackToolbar.swift */; }; - 58798234292E30B90085B254 /* FeedbackIssueArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5879822D292E30B90085B254 /* FeedbackIssueArea.swift */; }; - 58798235292E30B90085B254 /* FeedbackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5879822E292E30B90085B254 /* FeedbackModel.swift */; }; - 58798236292E30B90085B254 /* FeedbackType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5879822F292E30B90085B254 /* FeedbackType.swift */; }; - 58798237292E30B90085B254 /* FeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798230292E30B90085B254 /* FeedbackView.swift */; }; - 58798238292E30B90085B254 /* FeedbackWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798232292E30B90085B254 /* FeedbackWindowController.swift */; }; - 5879824F292E78D80085B254 /* CodeFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798248292E78D80085B254 /* CodeFileView.swift */; }; - 58798250292E78D80085B254 /* CodeFileDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798249292E78D80085B254 /* CodeFileDocument.swift */; }; - 58798284292ED0FB0085B254 /* TerminalEmulatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798280292ED0FB0085B254 /* TerminalEmulatorView.swift */; }; - 58798285292ED0FB0085B254 /* TerminalEmulatorView+Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798281292ED0FB0085B254 /* TerminalEmulatorView+Coordinator.swift */; }; - 58798286292ED0FB0085B254 /* SwiftTerm+Color+Init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58798283292ED0FB0085B254 /* SwiftTerm+Color+Init.swift */; }; - 587B60F82934124200D5CD8F /* CEWorkspaceFileManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B60F72934124100D5CD8F /* CEWorkspaceFileManagerTests.swift */; }; - 587B61012934170A00D5CD8F /* UnitTests_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B61002934170A00D5CD8F /* UnitTests_Extensions.swift */; }; - 587B612E293419B700D5CD8F /* CodeFileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B612D293419B700D5CD8F /* CodeFileTests.swift */; }; - 587B9D9F29300ABD00AC7927 /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8829300ABD00AC7927 /* SegmentedControl.swift */; }; - 587B9DA029300ABD00AC7927 /* PanelDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8929300ABD00AC7927 /* PanelDivider.swift */; }; - 587B9DA229300ABD00AC7927 /* EffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8B29300ABD00AC7927 /* EffectView.swift */; }; - 587B9DA329300ABD00AC7927 /* SettingsTextEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8C29300ABD00AC7927 /* SettingsTextEditor.swift */; }; - 587B9DA429300ABD00AC7927 /* SearchPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8D29300ABD00AC7927 /* SearchPanel.swift */; }; - 587B9DA529300ABD00AC7927 /* PressActionsModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8E29300ABD00AC7927 /* PressActionsModifier.swift */; }; - 587B9DA629300ABD00AC7927 /* ToolbarBranchPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D8F29300ABD00AC7927 /* ToolbarBranchPicker.swift */; }; - 587B9DA729300ABD00AC7927 /* HelpButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9D9029300ABD00AC7927 /* HelpButton.swift */; }; - 587B9E5A29301D8F00AC7927 /* GitCloneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0729301D8F00AC7927 /* GitCloneView.swift */; }; - 587B9E5B29301D8F00AC7927 /* GitCheckoutBranchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0829301D8F00AC7927 /* GitCheckoutBranchView.swift */; }; - 587B9E5C29301D8F00AC7927 /* Parameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0A29301D8F00AC7927 /* Parameters.swift */; }; - 587B9E5D29301D8F00AC7927 /* GitLabUserRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0D29301D8F00AC7927 /* GitLabUserRouter.swift */; }; - 587B9E5E29301D8F00AC7927 /* GitLabCommitRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0E29301D8F00AC7927 /* GitLabCommitRouter.swift */; }; - 587B9E5F29301D8F00AC7927 /* GitLabProjectRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E0F29301D8F00AC7927 /* GitLabProjectRouter.swift */; }; - 587B9E6029301D8F00AC7927 /* GitLabOAuthRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1029301D8F00AC7927 /* GitLabOAuthRouter.swift */; }; - 587B9E6129301D8F00AC7927 /* GitLabOAuthConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1129301D8F00AC7927 /* GitLabOAuthConfiguration.swift */; }; - 587B9E6229301D8F00AC7927 /* GitLabConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1229301D8F00AC7927 /* GitLabConfiguration.swift */; }; - 587B9E6329301D8F00AC7927 /* GitLabAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1329301D8F00AC7927 /* GitLabAccount.swift */; }; - 587B9E6429301D8F00AC7927 /* GitLabCommit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1529301D8F00AC7927 /* GitLabCommit.swift */; }; - 587B9E6529301D8F00AC7927 /* GitLabGroupAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1629301D8F00AC7927 /* GitLabGroupAccess.swift */; }; - 587B9E6629301D8F00AC7927 /* GitLabProjectHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1729301D8F00AC7927 /* GitLabProjectHook.swift */; }; - 587B9E6729301D8F00AC7927 /* GitLabEventData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1829301D8F00AC7927 /* GitLabEventData.swift */; }; - 587B9E6829301D8F00AC7927 /* GitLabAccountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1929301D8F00AC7927 /* GitLabAccountModel.swift */; }; - 587B9E6929301D8F00AC7927 /* GitLabEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1A29301D8F00AC7927 /* GitLabEvent.swift */; }; - 587B9E6A29301D8F00AC7927 /* GitLabPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1B29301D8F00AC7927 /* GitLabPermissions.swift */; }; - 587B9E6B29301D8F00AC7927 /* GitLabAvatarURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1C29301D8F00AC7927 /* GitLabAvatarURL.swift */; }; - 587B9E6C29301D8F00AC7927 /* GitLabNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1D29301D8F00AC7927 /* GitLabNamespace.swift */; }; - 587B9E6D29301D8F00AC7927 /* GitLabEventNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1E29301D8F00AC7927 /* GitLabEventNote.swift */; }; - 587B9E6E29301D8F00AC7927 /* GitLabProject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E1F29301D8F00AC7927 /* GitLabProject.swift */; }; - 587B9E6F29301D8F00AC7927 /* GitLabProjectAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2029301D8F00AC7927 /* GitLabProjectAccess.swift */; }; - 587B9E7029301D8F00AC7927 /* GitLabUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2129301D8F00AC7927 /* GitLabUser.swift */; }; - 587B9E7129301D8F00AC7927 /* GitURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2329301D8F00AC7927 /* GitURLSession.swift */; }; - 587B9E7229301D8F00AC7927 /* GitJSONPostRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2429301D8F00AC7927 /* GitJSONPostRouter.swift */; }; - 587B9E7329301D8F00AC7927 /* GitRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2529301D8F00AC7927 /* GitRouter.swift */; }; - 587B9E7429301D8F00AC7927 /* URL+URLParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2729301D8F00AC7927 /* URL+URLParameters.swift */; }; - 587B9E7529301D8F00AC7927 /* String+QueryParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2829301D8F00AC7927 /* String+QueryParameters.swift */; }; - 587B9E7629301D8F00AC7927 /* GitTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2929301D8F00AC7927 /* GitTime.swift */; }; - 587B9E7729301D8F00AC7927 /* String+PercentEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2A29301D8F00AC7927 /* String+PercentEncoding.swift */; }; - 587B9E7929301D8F00AC7927 /* GitHubIssueRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2E29301D8F00AC7927 /* GitHubIssueRouter.swift */; }; - 587B9E7A29301D8F00AC7927 /* GitHubReviewsRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E2F29301D8F00AC7927 /* GitHubReviewsRouter.swift */; }; - 587B9E7B29301D8F00AC7927 /* GitHubRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3029301D8F00AC7927 /* GitHubRouter.swift */; }; - 587B9E7C29301D8F00AC7927 /* GitHubRepositoryRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3129301D8F00AC7927 /* GitHubRepositoryRouter.swift */; }; - 587B9E7D29301D8F00AC7927 /* GitHubPullRequestRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3229301D8F00AC7927 /* GitHubPullRequestRouter.swift */; }; - 587B9E7E29301D8F00AC7927 /* GitHubGistRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3329301D8F00AC7927 /* GitHubGistRouter.swift */; }; - 587B9E7F29301D8F00AC7927 /* GitHubUserRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3429301D8F00AC7927 /* GitHubUserRouter.swift */; }; - 587B9E8029301D8F00AC7927 /* GitHubConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3529301D8F00AC7927 /* GitHubConfiguration.swift */; }; - 587B9E8129301D8F00AC7927 /* PublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3629301D8F00AC7927 /* PublicKey.swift */; }; - 587B9E8229301D8F00AC7927 /* GitHubPreviewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3729301D8F00AC7927 /* GitHubPreviewHeader.swift */; }; - 587B9E8329301D8F00AC7927 /* GitHubPullRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3929301D8F00AC7927 /* GitHubPullRequest.swift */; }; - 587B9E8429301D8F00AC7927 /* GitHubUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3A29301D8F00AC7927 /* GitHubUser.swift */; }; - 587B9E8529301D8F00AC7927 /* GitHubReview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3B29301D8F00AC7927 /* GitHubReview.swift */; }; - 587B9E8729301D8F00AC7927 /* GitHubRepositories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3D29301D8F00AC7927 /* GitHubRepositories.swift */; }; - 587B9E8829301D8F00AC7927 /* GitHubFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3E29301D8F00AC7927 /* GitHubFiles.swift */; }; - 587B9E8929301D8F00AC7927 /* GitHubGist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3F29301D8F00AC7927 /* GitHubGist.swift */; }; - 587B9E8A29301D8F00AC7927 /* GitHubIssue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4029301D8F00AC7927 /* GitHubIssue.swift */; }; - 587B9E8B29301D8F00AC7927 /* GitHubAccount+deleteReference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4129301D8F00AC7927 /* GitHubAccount+deleteReference.swift */; }; - 587B9E8C29301D8F00AC7927 /* GitHubOpenness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4229301D8F00AC7927 /* GitHubOpenness.swift */; }; - 587B9E8D29301D8F00AC7927 /* GitHubAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4329301D8F00AC7927 /* GitHubAccount.swift */; }; - 587B9E8E29301D8F00AC7927 /* BitBucketRepositoryRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4629301D8F00AC7927 /* BitBucketRepositoryRouter.swift */; }; - 587B9E8F29301D8F00AC7927 /* BitBucketUserRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4729301D8F00AC7927 /* BitBucketUserRouter.swift */; }; - 587B9E9029301D8F00AC7927 /* BitBucketTokenRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4829301D8F00AC7927 /* BitBucketTokenRouter.swift */; }; - 587B9E9129301D8F00AC7927 /* BitBucketOAuthRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4929301D8F00AC7927 /* BitBucketOAuthRouter.swift */; }; - 587B9E9229301D8F00AC7927 /* BitBucketAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4A29301D8F00AC7927 /* BitBucketAccount.swift */; }; - 587B9E9329301D8F00AC7927 /* BitBucketOAuthConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4B29301D8F00AC7927 /* BitBucketOAuthConfiguration.swift */; }; - 587B9E9429301D8F00AC7927 /* BitBucketTokenConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4C29301D8F00AC7927 /* BitBucketTokenConfiguration.swift */; }; - 587B9E9529301D8F00AC7927 /* BitBucketUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4E29301D8F00AC7927 /* BitBucketUser.swift */; }; - 587B9E9629301D8F00AC7927 /* BitBucketRepositories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E4F29301D8F00AC7927 /* BitBucketRepositories.swift */; }; - 587B9E9729301D8F00AC7927 /* BitBucketAccount+Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E5029301D8F00AC7927 /* BitBucketAccount+Token.swift */; }; - 587B9E9829301D8F00AC7927 /* GitCommit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E5329301D8F00AC7927 /* GitCommit.swift */; }; - 587B9E9929301D8F00AC7927 /* GitChangedFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E5429301D8F00AC7927 /* GitChangedFile.swift */; }; - 587B9E9A29301D8F00AC7927 /* GitStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E5529301D8F00AC7927 /* GitStatus.swift */; }; - 587FB99029C1246400B519DD /* EditorTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587FB98F29C1246400B519DD /* EditorTabView.swift */; }; - 58822524292C280D00E83CDE /* StatusBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822509292C280D00E83CDE /* StatusBarView.swift */; }; - 58822525292C280D00E83CDE /* StatusBarMenuStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250B292C280D00E83CDE /* StatusBarMenuStyle.swift */; }; - 58822526292C280D00E83CDE /* StatusBarBreakpointButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250C292C280D00E83CDE /* StatusBarBreakpointButton.swift */; }; - 58822527292C280D00E83CDE /* StatusBarIndentSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250D292C280D00E83CDE /* StatusBarIndentSelector.swift */; }; - 58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */; }; - 58822529292C280D00E83CDE /* StatusBarLineEndSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */; }; - 5882252A292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */; }; - 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */; }; - 5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822513292C280D00E83CDE /* UtilityAreaView.swift */; }; - 5882252D292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */; }; - 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */; }; - 5882252F292C280D00E83CDE /* UtilityAreaClearButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */; }; - 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */; }; - 58822531292C280D00E83CDE /* View+isHovering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251A292C280D00E83CDE /* View+isHovering.swift */; }; - 58822532292C280D00E83CDE /* UtilityAreaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */; }; - 588847632992A2A200996D95 /* CEWorkspaceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588847622992A2A200996D95 /* CEWorkspaceFile.swift */; }; - 588847692992ABCA00996D95 /* Array+SortURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588847682992ABCA00996D95 /* Array+SortURLs.swift */; }; - 5894E59729FEF7740077E59C /* CEWorkspaceFile+Recursion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5894E59629FEF7740077E59C /* CEWorkspaceFile+Recursion.swift */; }; - 58A2E40C29C3975D005CB615 /* CEWorkspaceFileIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A2E40629C3975D005CB615 /* CEWorkspaceFileIcon.swift */; }; - 58A5DF7D2931787A00D1BD5D /* ShellClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A5DF7C2931787A00D1BD5D /* ShellClient.swift */; }; - 58A5DF8029325B5A00D1BD5D /* GitClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A5DF7F29325B5A00D1BD5D /* GitClient.swift */; }; - 58A5DFA229339F6400D1BD5D /* KeybindingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A5DF9E29339F6400D1BD5D /* KeybindingManager.swift */; }; - 58A5DFA329339F6400D1BD5D /* CommandManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A5DF9F29339F6400D1BD5D /* CommandManager.swift */; }; - 58A5DFA529339F6400D1BD5D /* default_keybindings.json in Resources */ = {isa = PBXBuildFile; fileRef = 58A5DFA129339F6400D1BD5D /* default_keybindings.json */; }; - 58AFAA2E2933C69E00482B53 /* EditorTabRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AFAA2C2933C69E00482B53 /* EditorTabRepresentable.swift */; }; - 58AFAA2F2933C69E00482B53 /* EditorItemID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AFAA2D2933C69E00482B53 /* EditorItemID.swift */; }; - 58D01C94293167DC00C5B6B4 /* Color+HEX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C88293167DC00C5B6B4 /* Color+HEX.swift */; }; - 58D01C95293167DC00C5B6B4 /* Bundle+Info.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C89293167DC00C5B6B4 /* Bundle+Info.swift */; }; - 58D01C96293167DC00C5B6B4 /* Date+Formatted.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C8A293167DC00C5B6B4 /* Date+Formatted.swift */; }; - 58D01C97293167DC00C5B6B4 /* String+SHA256.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C8C293167DC00C5B6B4 /* String+SHA256.swift */; }; - 58D01C98293167DC00C5B6B4 /* String+RemoveOccurrences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C8D293167DC00C5B6B4 /* String+RemoveOccurrences.swift */; }; - 58D01C99293167DC00C5B6B4 /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C8E293167DC00C5B6B4 /* String+MD5.swift */; }; - 58D01C9A293167DC00C5B6B4 /* CodeEditKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C90293167DC00C5B6B4 /* CodeEditKeychain.swift */; }; - 58D01C9B293167DC00C5B6B4 /* CodeEditKeychainConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C91293167DC00C5B6B4 /* CodeEditKeychainConstants.swift */; }; - 58D01C9D293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D01C93293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift */; }; - 58F2EAEF292FB2B0004A9BDE /* ThemeSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAAF292FB2B0004A9BDE /* ThemeSettingsView.swift */; }; 58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EACE292FB2B0004A9BDE /* Documentation.docc */; }; - 58F2EB04292FB2B0004A9BDE /* SourceControlSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAD1292FB2B0004A9BDE /* SourceControlSettings.swift */; }; - 58F2EB05292FB2B0004A9BDE /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAD2292FB2B0004A9BDE /* Settings.swift */; }; - 58F2EB06292FB2B0004A9BDE /* KeybindingsSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAD4292FB2B0004A9BDE /* KeybindingsSettings.swift */; }; - 58F2EB07292FB2B0004A9BDE /* GeneralSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAD6292FB2B0004A9BDE /* GeneralSettings.swift */; }; - 58F2EB08292FB2B0004A9BDE /* TextEditingSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAD8292FB2B0004A9BDE /* TextEditingSettings.swift */; }; - 58F2EB09292FB2B0004A9BDE /* TerminalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EADA292FB2B0004A9BDE /* TerminalSettings.swift */; }; - 58F2EB0A292FB2B0004A9BDE /* SettingsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EADB292FB2B0004A9BDE /* SettingsData.swift */; }; - 58F2EB0B292FB2B0004A9BDE /* AccountsSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EADD292FB2B0004A9BDE /* AccountsSettings.swift */; }; - 58F2EB0D292FB2B0004A9BDE /* ThemeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAE0292FB2B0004A9BDE /* ThemeSettings.swift */; }; - 58F2EB0E292FB2B0004A9BDE /* SoftwareUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EAE1292FB2B0004A9BDE /* SoftwareUpdater.swift */; }; 58F2EB1E292FB954004A9BDE /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 58F2EB1D292FB954004A9BDE /* Sparkle */; }; - 58FD7608291EA1CB0051D6E4 /* QuickActionsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FD7605291EA1CB0051D6E4 /* QuickActionsViewModel.swift */; }; - 58FD7609291EA1CB0051D6E4 /* QuickActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FD7607291EA1CB0051D6E4 /* QuickActionsView.swift */; }; - 5994B6DA2BD6B408006A4C5F /* Editor+TabSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5994B6D92BD6B408006A4C5F /* Editor+TabSwitch.swift */; }; - 5B698A0A2B262FA000DE9392 /* SearchSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B698A092B262FA000DE9392 /* SearchSettingsView.swift */; }; - 5B698A0D2B26327800DE9392 /* SearchSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B698A0C2B26327800DE9392 /* SearchSettings.swift */; }; - 5B698A0F2B2636A700DE9392 /* SearchSettingsIgnoreGlobPatternItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B698A0E2B2636A700DE9392 /* SearchSettingsIgnoreGlobPatternItemView.swift */; }; - 5B698A162B263BCE00DE9392 /* SearchSettingsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B698A152B263BCE00DE9392 /* SearchSettingsModel.swift */; }; - 5C4BB1E128212B1E00A92FB2 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4BB1E028212B1E00A92FB2 /* World.swift */; }; - 610C0FDA2B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */; }; - 611028C82C8DC7F200DFD845 /* MenuWithButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */; }; - 611191FA2B08CC9000D4459B /* SearchIndexer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191F92B08CC9000D4459B /* SearchIndexer.swift */; }; - 611191FC2B08CCB800D4459B /* SearchIndexer+AsyncController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191FB2B08CCB800D4459B /* SearchIndexer+AsyncController.swift */; }; - 611191FE2B08CCD200D4459B /* SearchIndexer+File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191FD2B08CCD200D4459B /* SearchIndexer+File.swift */; }; - 611192002B08CCD700D4459B /* SearchIndexer+Memory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611191FF2B08CCD700D4459B /* SearchIndexer+Memory.swift */; }; - 611192022B08CCDC00D4459B /* SearchIndexer+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611192012B08CCDC00D4459B /* SearchIndexer+Search.swift */; }; - 611192042B08CCED00D4459B /* SearchIndexer+ProgressiveSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611192032B08CCED00D4459B /* SearchIndexer+ProgressiveSearch.swift */; }; - 611192062B08CCF600D4459B /* SearchIndexer+Add.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611192052B08CCF600D4459B /* SearchIndexer+Add.swift */; }; - 611192082B08CCFD00D4459B /* SearchIndexer+Terms.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611192072B08CCFD00D4459B /* SearchIndexer+Terms.swift */; }; - 6111920C2B08CD0B00D4459B /* SearchIndexer+InternalMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6111920B2B08CD0B00D4459B /* SearchIndexer+InternalMethods.swift */; }; - 6130535C2B23933D00D767E3 /* MemoryIndexingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130535B2B23933D00D767E3 /* MemoryIndexingTests.swift */; }; - 6130535F2B23A31300D767E3 /* MemorySearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130535E2B23A31300D767E3 /* MemorySearchTests.swift */; }; - 613053652B23A49300D767E3 /* TemporaryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613053642B23A49300D767E3 /* TemporaryFile.swift */; }; - 6130536B2B24722C00D767E3 /* AsyncIndexingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130536A2B24722C00D767E3 /* AsyncIndexingTests.swift */; }; - 613899B12B6E6FDC00A5CAF6 /* Collection+FuzzySearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899B02B6E6FDC00A5CAF6 /* Collection+FuzzySearch.swift */; }; - 613899B32B6E6FEE00A5CAF6 /* FuzzySearchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899B22B6E6FEE00A5CAF6 /* FuzzySearchable.swift */; }; - 613899B52B6E700300A5CAF6 /* FuzzySearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899B42B6E700300A5CAF6 /* FuzzySearchModels.swift */; }; - 613899B72B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899B62B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift */; }; - 613899B92B6E704500A5CAF6 /* String+Normalise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899B82B6E704500A5CAF6 /* String+Normalise.swift */; }; - 613899BC2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899BB2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift */; }; - 613899C02B6E70FE00A5CAF6 /* FuzzySearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613899BF2B6E70FE00A5CAF6 /* FuzzySearchTests.swift */; }; - 6139B9142C29B35D00CA584B /* TaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D435CB2C29699800D032B8 /* TaskManager.swift */; }; - 6139B9152C29B36100CA584B /* CEActiveTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D435CD2C2969C300D032B8 /* CEActiveTask.swift */; }; - 6139B9162C29B36500CA584B /* CETaskStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D435D12C2969D800D032B8 /* CETaskStatus.swift */; }; - 613DF55E2B08DD5D00E9D902 /* FileHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613DF55D2B08DD5D00E9D902 /* FileHelper.swift */; }; - 61538B902B111FE800A88846 /* String+AppearancesOfSubstring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61538B8F2B111FE800A88846 /* String+AppearancesOfSubstring.swift */; }; - 61538B932B11201900A88846 /* String+Character.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61538B922B11201900A88846 /* String+Character.swift */; }; - 617DB3D02C25AFAE00B58BFE /* TaskNotificationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3CF2C25AFAE00B58BFE /* TaskNotificationHandler.swift */; }; - 617DB3D32C25AFEA00B58BFE /* TaskNotificationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D22C25AFEA00B58BFE /* TaskNotificationModel.swift */; }; - 617DB3D62C25B02D00B58BFE /* TaskNotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D52C25B02D00B58BFE /* TaskNotificationView.swift */; }; - 617DB3D82C25B04D00B58BFE /* CECircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */; }; - 617DB3DA2C25B07F00B58BFE /* TaskNotificationsDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */; }; - 617DB3DC2C25B14A00B58BFE /* ActivityViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */; }; - 617DB3DF2C25E13800B58BFE /* TaskNotificationHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */; }; - 61816B832C81DC2C00C71BF7 /* SearchField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61816B822C81DC2C00C71BF7 /* SearchField.swift */; }; - 618725A12C29EFCC00987354 /* SchemeDropDownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725A02C29EFCC00987354 /* SchemeDropDownView.swift */; }; - 618725A42C29F00400987354 /* WorkspaceMenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */; }; - 618725A62C29F02500987354 /* DropdownMenuItemStyleModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725A52C29F02500987354 /* DropdownMenuItemStyleModifier.swift */; }; - 618725A82C29F05500987354 /* OptionMenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725A72C29F05500987354 /* OptionMenuItemView.swift */; }; - 618725AB2C29F2C000987354 /* TaskDropDownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725AA2C29F2C000987354 /* TaskDropDownView.swift */; }; - 618725B22C2DBC0C00987354 /* TaskOutputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725B12C2DBC0C00987354 /* TaskOutputView.swift */; }; - 618725B42C2DBC2800987354 /* TaskOutputActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618725B32C2DBC2800987354 /* TaskOutputActionsView.swift */; }; - 6195E30D2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */; }; - 6195E30F2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */; }; - 6195E3112B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */; }; - 61A3E3D92C33126F00076BD3 /* CEWorkspaceSettingsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3D82C33126F00076BD3 /* CEWorkspaceSettingsData.swift */; }; - 61A3E3DD2C33132F00076BD3 /* CEWorkspaceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3DC2C33132F00076BD3 /* CEWorkspaceSettingsView.swift */; }; - 61A3E3DF2C3318C900076BD3 /* CEWorkspaceSettingsTaskListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3DE2C3318C900076BD3 /* CEWorkspaceSettingsTaskListView.swift */; }; - 61A3E3E12C331B4A00076BD3 /* AddCETaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3E02C331B4A00076BD3 /* AddCETaskView.swift */; }; - 61A3E3E32C331B5200076BD3 /* EditCETaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3E22C331B5200076BD3 /* EditCETaskView.swift */; }; - 61A3E3E52C33202300076BD3 /* CETaskFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3E42C33202300076BD3 /* CETaskFormView.swift */; }; - 61A3E3E72C33383100076BD3 /* EnvironmentVariableListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A3E3E62C33383100076BD3 /* EnvironmentVariableListItem.swift */; }; - 61A53A7E2B4449870093BF8A /* WorkspaceDocument+Find.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */; }; - 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */; }; - 61C7E82F2C6CDBA500845336 /* Theme+FuzzySearchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C7E82E2C6CDBA500845336 /* Theme+FuzzySearchable.swift */; }; - 61FB03AC2C3C1FDF001B3671 /* ShellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB03AB2C3C1FDF001B3671 /* ShellTests.swift */; }; - 61FB03AE2C3C2493001B3671 /* CEActiveTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB03AD2C3C2493001B3671 /* CEActiveTaskTests.swift */; }; - 61FB03B02C3C76AF001B3671 /* TaskManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB03AF2C3C76AF001B3671 /* TaskManagerTests.swift */; }; - 661EF7B82BEE215300C3E577 /* ImageFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7B72BEE215300C3E577 /* ImageFileView.swift */; }; - 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */; }; - 664935422C35A5BC00461C35 /* NSTableViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */; }; - 6653EE552C34817900B82DE2 /* QuickSearchResultLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */; }; - 669A50512C380C1800304CD8 /* String+Escaped.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669A50502C380C1800304CD8 /* String+Escaped.swift */; }; - 669A50532C380C8E00304CD8 /* Collection+subscript_safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669A50522C380C8E00304CD8 /* Collection+subscript_safe.swift */; }; - 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; - 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; - 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */; }; - 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */; }; - 66AF6CF02BF183CA00D83C9D /* ImageDimensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */; }; - 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */; }; - 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F370332BEE537B00D3B823 /* NonTextFileView.swift */; }; - 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; }; - 6C05A8AF284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */; }; 6C0617D62BDB4432008C9C42 /* LogStream in Frameworks */ = {isa = PBXBuildFile; productRef = 6C0617D52BDB4432008C9C42 /* LogStream */; }; - 6C07383B2D284ECA0025CBE3 /* TasksMenuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C07383A2D284ECA0025CBE3 /* TasksMenuUITests.swift */; }; - 6C08249C2C556F7400A0751E /* TerminalCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C08249B2C556F7400A0751E /* TerminalCache.swift */; }; - 6C08249E2C55768400A0751E /* UtilityAreaTerminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C08249D2C55768400A0751E /* UtilityAreaTerminal.swift */; }; 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C0824A02C5C0C9700A0751E /* SwiftTerm */; }; - 6C092EDA2A53A58600489202 /* EditorLayout+StateRestoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C092ED92A53A58600489202 /* EditorLayout+StateRestoration.swift */; }; - 6C092EE02A53BFCF00489202 /* WorkspaceStateKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C092EDF2A53BFCF00489202 /* WorkspaceStateKey.swift */; }; - 6C0D0C6829E861B000AE4D3F /* SettingsSidebarFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C0D0C6729E861B000AE4D3F /* SettingsSidebarFix.swift */; }; - 6C147C4029A328BC0089B630 /* SplitViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C3F29A328560089B630 /* SplitViewData.swift */; }; - 6C147C4129A328BF0089B630 /* EditorLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C3E29A3281D0089B630 /* EditorLayout.swift */; }; - 6C147C4229A328C10089B630 /* Editor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C3D29A3281D0089B630 /* Editor.swift */; }; 6C147C4529A329350089B630 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = 6C147C4429A329350089B630 /* OrderedCollections */; }; - 6C147C4929A32A080089B630 /* EditorLayoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C4829A32A080089B630 /* EditorLayoutView.swift */; }; - 6C147C4B29A32A7B0089B630 /* Environment+SplitEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C4A29A32A7B0089B630 /* Environment+SplitEditor.swift */; }; - 6C147C4D29A32AA30089B630 /* EditorAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C147C4C29A32AA30089B630 /* EditorAreaView.swift */; }; - 6C14CEB028777D3C001468FE /* FindNavigatorListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C14CEAF28777D3C001468FE /* FindNavigatorListViewController.swift */; }; - 6C14CEB32877A68F001468FE /* FindNavigatorMatchListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C14CEB22877A68F001468FE /* FindNavigatorMatchListCell.swift */; }; - 6C18620A298BF5A800C663EA /* RecentProjectsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C186209298BF5A800C663EA /* RecentProjectsListView.swift */; }; - 6C1CC9982B1E770B0002349B /* AsyncFileIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C1CC9972B1E770B0002349B /* AsyncFileIterator.swift */; }; - 6C1CC99B2B1E7CBC0002349B /* FindNavigatorIndexBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C1CC99A2B1E7CBC0002349B /* FindNavigatorIndexBar.swift */; }; - 6C1F3DA22C18C55800F6DEF6 /* ShellIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C1F3DA12C18C55800F6DEF6 /* ShellIntegrationTests.swift */; }; - 6C23842F2C796B4C003FBDD4 /* GitChangedFileLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C23842E2C796B4C003FBDD4 /* GitChangedFileLabel.swift */; }; - 6C278CC72C93971F0066F6D9 /* LSPContentCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C278CC62C93971F0066F6D9 /* LSPContentCoordinator.swift */; }; - 6C2C155829B4F49100EA60A5 /* SplitViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C2C155729B4F49100EA60A5 /* SplitViewItem.swift */; }; - 6C2C155A29B4F4CC00EA60A5 /* Variadic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C2C155929B4F4CC00EA60A5 /* Variadic.swift */; }; - 6C2C155D29B4F4E500EA60A5 /* SplitViewReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C2C155C29B4F4E500EA60A5 /* SplitViewReader.swift */; }; - 6C2C156129B4F52F00EA60A5 /* SplitViewModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C2C156029B4F52F00EA60A5 /* SplitViewModifiers.swift */; }; - 6C3B4CD12D0E2C2900C6759E /* SemanticTokenMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3B4CD02D0E2C2900C6759E /* SemanticTokenMap.swift */; }; - 6C3B4CD42D0E2CB000C6759E /* SemanticTokenMapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3B4CD32D0E2CB000C6759E /* SemanticTokenMapTests.swift */; }; - 6C3E12D32CC830D700DD12F1 /* RecentProjectsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3E12D22CC830D700DD12F1 /* RecentProjectsStore.swift */; }; - 6C3E12D62CC8388000DD12F1 /* URL+componentCompare.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3E12D52CC8388000DD12F1 /* URL+componentCompare.swift */; }; - 6C3E12D82CC83CB600DD12F1 /* RecentProjectsMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3E12D72CC83CB600DD12F1 /* RecentProjectsMenu.swift */; }; - 6C4104E3297C87A000F472BA /* BlurButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4104E2297C87A000F472BA /* BlurButtonStyle.swift */; }; - 6C4104E6297C884F00F472BA /* AboutDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4104E5297C884F00F472BA /* AboutDetailView.swift */; }; - 6C4104E9297C970F00F472BA /* AboutDefaultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4104E8297C970F00F472BA /* AboutDefaultView.swift */; }; - 6C48B5C52C0A2835001E9955 /* FileEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48B5C42C0A2835001E9955 /* FileEncoding.swift */; }; - 6C48B5CE2C0C1BE4001E9955 /* Shell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48B5CD2C0C1BE4001E9955 /* Shell.swift */; }; - 6C48B5D12C0D0519001E9955 /* ShellIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48B5D02C0D0519001E9955 /* ShellIntegration.swift */; }; - 6C48B5D42C0D0743001E9955 /* codeedit_shell_integration_env.zsh in Resources */ = {isa = PBXBuildFile; fileRef = 6C48B5D32C0D0743001E9955 /* codeedit_shell_integration_env.zsh */; }; - 6C48B5D62C0D08C5001E9955 /* codeedit_shell_integration_profile.zsh in Resources */ = {isa = PBXBuildFile; fileRef = 6C48B5D52C0D08C5001E9955 /* codeedit_shell_integration_profile.zsh */; }; - 6C48B5D82C0D5DB5001E9955 /* codeedit_shell_integration_login.zsh in Resources */ = {isa = PBXBuildFile; fileRef = 6C48B5D72C0D5DB5001E9955 /* codeedit_shell_integration_login.zsh */; }; - 6C48B5DA2C0D5FC5001E9955 /* CurrentUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48B5D92C0D5FC5001E9955 /* CurrentUser.swift */; }; - 6C48D8F22972DAFC00D6D205 /* Env+IsFullscreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48D8F12972DAFC00D6D205 /* Env+IsFullscreen.swift */; }; - 6C48D8F42972DB1A00D6D205 /* Env+Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48D8F32972DB1A00D6D205 /* Env+Window.swift */; }; - 6C48D8F72972E5F300D6D205 /* WindowObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C48D8F62972E5F300D6D205 /* WindowObserver.swift */; }; - 6C4E37F62C73DA5200AEE7B5 /* UtilityAreaTerminalSidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4E37F52C73DA5200AEE7B5 /* UtilityAreaTerminalSidebar.swift */; }; 6C4E37FC2C73E00700AEE7B5 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C4E37FB2C73E00700AEE7B5 /* SwiftTerm */; }; - 6C510CB82D2E4639006EBE85 /* XCUITest+waitForNonExistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C510CB72D2E4639006EBE85 /* XCUITest+waitForNonExistence.swift */; }; - 6C510CBC2D2ECD68006EBE85 /* UtilityAreaViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C510CBA2D2ECD68006EBE85 /* UtilityAreaViewModelTests.swift */; }; - 6C5228B529A868BD00AC48F6 /* Environment+ContentInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5228B429A868BD00AC48F6 /* Environment+ContentInsets.swift */; }; - 6C53AAD829A6C4FD00EE9ED6 /* SplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C53AAD729A6C4FD00EE9ED6 /* SplitView.swift */; }; - 6C578D8129CD294800DC73B2 /* ExtensionActivatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8029CD294800DC73B2 /* ExtensionActivatorView.swift */; }; - 6C578D8429CD343800DC73B2 /* ExtensionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8329CD343800DC73B2 /* ExtensionDetailView.swift */; }; - 6C578D8729CD345900DC73B2 /* ExtensionSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8629CD345900DC73B2 /* ExtensionSceneView.swift */; }; - 6C578D8929CD36E400DC73B2 /* Commands+ForEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8829CD36E400DC73B2 /* Commands+ForEach.swift */; }; - 6C578D8C29CD372700DC73B2 /* ExtensionCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8B29CD372700DC73B2 /* ExtensionCommands.swift */; }; - 6C5B63DE29C76213005454BA /* WindowCodeFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5B63DD29C76213005454BA /* WindowCodeFileView.swift */; }; - 6C5C891B2A3F736500A94FE1 /* FocusedValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */; }; - 6C5FDF7A29E6160000BC08C0 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5FDF7929E6160000BC08C0 /* AppSettings.swift */; }; - 6C6362D42C3E321A0025570D /* Editor+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6362D32C3E321A0025570D /* Editor+History.swift */; }; 6C66C31329D05CDC00DE9ED2 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 6C66C31229D05CDC00DE9ED2 /* GRDB */; }; - 6C6BD6EF29CD12E900235D17 /* ExtensionManagerWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD6EE29CD12E900235D17 /* ExtensionManagerWindow.swift */; }; - 6C6BD6F129CD13FA00235D17 /* ExtensionDiscovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD6F029CD13FA00235D17 /* ExtensionDiscovery.swift */; }; 6C6BD6F429CD142C00235D17 /* CollectionConcurrencyKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C6BD6F329CD142C00235D17 /* CollectionConcurrencyKit */; }; - 6C6BD6F629CD145F00235D17 /* ExtensionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD6F529CD145F00235D17 /* ExtensionInfo.swift */; }; 6C6BD6F829CD14D100235D17 /* CodeEditKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C6BD6F729CD14D100235D17 /* CodeEditKit */; }; 6C6BD6F929CD14D100235D17 /* CodeEditKit in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 6C6BD6F729CD14D100235D17 /* CodeEditKit */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 6C6BD6FC29CD152400235D17 /* codeedit.extension.appextensionpoint in Resources */ = {isa = PBXBuildFile; fileRef = 6C6BD6FB29CD152400235D17 /* codeedit.extension.appextensionpoint */; }; - 6C6BD6FE29CD155200235D17 /* codeedit.extension.appextensionpoint in Embed ExtensionKit ExtensionPoint */ = {isa = PBXBuildFile; fileRef = 6C6BD6FB29CD152400235D17 /* codeedit.extension.appextensionpoint */; }; - 6C6BD70129CD172700235D17 /* ExtensionsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD70029CD172700235D17 /* ExtensionsListView.swift */; }; - 6C6BD70429CD17B600235D17 /* ExtensionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD70329CD17B600235D17 /* ExtensionsManager.swift */; }; - 6C7256D729A3D7D000C2D3E0 /* SplitViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7256D629A3D7D000C2D3E0 /* SplitViewControllerView.swift */; }; 6C73A6D32D4F1E550012D95C /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6C73A6D22D4F1E550012D95C /* CodeEditSourceEditor */; }; - 6C7D6D462C9092EC00B69EE0 /* BufferingServerConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7D6D452C9092EC00B69EE0 /* BufferingServerConnection.swift */; }; - 6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */; }; - 6C81916729B3E80700B75C92 /* ModifierKeysObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C81916629B3E80700B75C92 /* ModifierKeysObserver.swift */; }; 6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */ = {isa = PBXBuildFile; productRef = 6C81916A29B41DD300B75C92 /* DequeModule */; }; - 6C82D6B329BFD88700495C54 /* NavigateCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82D6B229BFD88700495C54 /* NavigateCommands.swift */; }; - 6C82D6B929BFE34900495C54 /* HelpCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82D6B829BFE34900495C54 /* HelpCommands.swift */; }; - 6C82D6BC29C00CD900495C54 /* FirstResponderPropertyWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82D6BB29C00CD900495C54 /* FirstResponderPropertyWrapper.swift */; }; - 6C82D6C629C012AD00495C54 /* NSApp+openWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82D6C529C012AD00495C54 /* NSApp+openWindow.swift */; }; 6C85BB402C2105ED00EB5DEF /* CodeEditKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C85BB3F2C2105ED00EB5DEF /* CodeEditKit */; }; - 6C85BB412C21061A00EB5DEF /* GitHubComment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587B9E3C29301D8F00AC7927 /* GitHubComment.swift */; }; 6C85BB442C210EFD00EB5DEF /* SwiftUIIntrospect in Frameworks */ = {isa = PBXBuildFile; productRef = 6C85BB432C210EFD00EB5DEF /* SwiftUIIntrospect */; }; - 6C85F7562C3CA638008E9836 /* EditorHistoryMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C85F7552C3CA638008E9836 /* EditorHistoryMenus.swift */; }; - 6C91D57229B176FF0059A90D /* EditorManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C91D57129B176FF0059A90D /* EditorManager.swift */; }; - 6C9619202C3F27E3009733CE /* ProjectNavigatorUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C96191B2C3F27E3009733CE /* ProjectNavigatorUITests.swift */; }; - 6C9619222C3F27F1009733CE /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9619212C3F27F1009733CE /* Query.swift */; }; - 6C9619242C3F2809009733CE /* ProjectPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9619232C3F2809009733CE /* ProjectPath.swift */; }; - 6C97EBCC2978760400302F95 /* AcknowledgementsWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C97EBCB2978760400302F95 /* AcknowledgementsWindowController.swift */; }; - 6C9AE66F2D148DD200FAE8D2 /* URL+FindWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9AE66E2D148DD200FAE8D2 /* URL+FindWorkspace.swift */; }; - 6C9AE6712D14A9F700FAE8D2 /* LazyServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9AE6702D14A9F700FAE8D2 /* LazyServiceWrapper.swift */; }; 6C9DB9E42D55656300ACD86E /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6C9DB9E32D55656300ACD86E /* CodeEditSourceEditor */; }; - 6CA1AE952B46950000378EAB /* EditorInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA1AE942B46950000378EAB /* EditorInstance.swift */; }; 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69229BCC71C00A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69429BCD78600A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; - 6CABB1A129C5593800340467 /* SearchPanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CABB1A029C5593800340467 /* SearchPanelView.swift */; }; 6CB446402B6DFF3A00539ED0 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB4463F2B6DFF3A00539ED0 /* CodeEditSourceEditor */; }; - 6CB52DC92AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */; }; 6CB9144B29BEC7F100BC47F2 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 6CB94CFE2C9F1C9A00E8651C /* TextView+LSPRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CB94CFD2C9F1C9A00E8651C /* TextView+LSPRange.swift */; }; 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB94D022CA1205100E8651C /* AsyncAlgorithms */; }; - 6CBD1BC62978DE53006639D5 /* Font+Caption3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBD1BC52978DE53006639D5 /* Font+Caption3.swift */; }; - 6CBE1CFB2B71DAA6003AC32E /* Loopable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBE1CFA2B71DAA6003AC32E /* Loopable.swift */; }; 6CC00A8B2CBEF150004E8134 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC00A8A2CBEF150004E8134 /* CodeEditSourceEditor */; }; 6CC17B4F2C432AE000834E2C /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC17B4E2C432AE000834E2C /* CodeEditSourceEditor */; }; - 6CC17B512C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC17B502C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift */; }; - 6CC17B532C43314000834E2C /* ProjectNavigatorViewController+NSOutlineViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC17B522C43314000834E2C /* ProjectNavigatorViewController+NSOutlineViewDelegate.swift */; }; - 6CC17B5B2C44258700834E2C /* WindowControllerPropertyWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC17B5A2C44258700834E2C /* WindowControllerPropertyWrapper.swift */; }; - 6CC3D1FB2D1475EC00822B65 /* TextView+SemanticTokenRangeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC3D1FA2D1475EC00822B65 /* TextView+SemanticTokenRangeProvider.swift */; }; - 6CC3D1FD2D14761A00822B65 /* SemanticTokenMapRangeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC3D1FC2D14761A00822B65 /* SemanticTokenMapRangeProvider.swift */; }; - 6CC9E4B229B5669900C97388 /* Environment+ActiveEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC9E4B129B5669900C97388 /* Environment+ActiveEditor.swift */; }; - 6CCEE7F52D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CCEE7F42D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift */; }; - 6CD0358A2C3461160091E1F4 /* KeyWindowControllerObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD035892C3461160091E1F4 /* KeyWindowControllerObserver.swift */; }; - 6CD03B6A29FC773F001BD1D0 /* SettingsInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD03B6929FC773F001BD1D0 /* SettingsInjector.swift */; }; - 6CD26C6E2C8EA1E600ADBA38 /* LanguageServerFileMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C6D2C8EA1E600ADBA38 /* LanguageServerFileMap.swift */; }; - 6CD26C772C8EA83900ADBA38 /* URL+absolutePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C762C8EA83900ADBA38 /* URL+absolutePath.swift */; }; - 6CD26C7A2C8EA8A500ADBA38 /* LSPCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C782C8EA8A500ADBA38 /* LSPCache.swift */; }; - 6CD26C7B2C8EA8A500ADBA38 /* LSPCache+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C792C8EA8A500ADBA38 /* LSPCache+Data.swift */; }; - 6CD26C7D2C8EA8F400ADBA38 /* LanguageServer+DocumentSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C7C2C8EA8F400ADBA38 /* LanguageServer+DocumentSync.swift */; }; - 6CD26C812C8F8A4400ADBA38 /* LanguageIdentifier+CodeLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C802C8F8A4400ADBA38 /* LanguageIdentifier+CodeLanguage.swift */; }; - 6CD26C8A2C8F91ED00ADBA38 /* LanguageServer+DocumentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD26C892C8F91ED00ADBA38 /* LanguageServer+DocumentTests.swift */; }; 6CD3CA552C8B508200D83DCD /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CD3CA542C8B508200D83DCD /* CodeEditSourceEditor */; }; - 6CDA84AD284C1BA000C1CC3A /* EditorTabBarContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDA84AC284C1BA000C1CC3A /* EditorTabBarContextMenu.swift */; }; - 6CDAFDDD2D35B2A0002B2D47 /* CEWorkspaceFileManager+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDAFDDC2D35B2A0002B2D47 /* CEWorkspaceFileManager+Error.swift */; }; - 6CDAFDDF2D35DADD002B2D47 /* String+ValidFileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDAFDDE2D35DADD002B2D47 /* String+ValidFileName.swift */; }; - 6CE21E812C643D8F0031B056 /* CETerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE21E802C643D8F0031B056 /* CETerminalView.swift */; }; 6CE21E872C650D2C0031B056 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6CE21E862C650D2C0031B056 /* SwiftTerm */; }; - 6CE622692A2A174A0013085C /* InspectorTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE622682A2A174A0013085C /* InspectorTab.swift */; }; - 6CE6226B2A2A1C730013085C /* UtilityAreaTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE6226A2A2A1C730013085C /* UtilityAreaTab.swift */; }; - 6CE6226E2A2A1CDE0013085C /* NavigatorTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE6226D2A2A1CDE0013085C /* NavigatorTab.swift */; }; - 6CED16E42A3E660D000EC962 /* String+Lines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CED16E32A3E660D000EC962 /* String+Lines.swift */; }; - 6CFBA54B2C4E168A00E3A914 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFBA54A2C4E168A00E3A914 /* App.swift */; }; - 6CFBA54D2C4E16C900E3A914 /* WindowCloseCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFBA54C2C4E16C900E3A914 /* WindowCloseCommandTests.swift */; }; - 6CFC0C3C2D381D2000F09CD0 /* ProjectNavigatorFileManagementUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFC0C3B2D381D2000F09CD0 /* ProjectNavigatorFileManagementUITests.swift */; }; - 6CFC0C3E2D382B3F00F09CD0 /* UI TESTING.md in Resources */ = {isa = PBXBuildFile; fileRef = 6CFC0C3D2D382B3900F09CD0 /* UI TESTING.md */; }; - 6CFF967429BEBCC300182D6F /* FindCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFF967329BEBCC300182D6F /* FindCommands.swift */; }; - 6CFF967629BEBCD900182D6F /* FileCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFF967529BEBCD900182D6F /* FileCommands.swift */; }; - 6CFF967829BEBCF600182D6F /* MainCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFF967729BEBCF600182D6F /* MainCommands.swift */; }; - 6CFF967A29BEBD2400182D6F /* ViewCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFF967929BEBD2400182D6F /* ViewCommands.swift */; }; - 6CFF967C29BEBD5200182D6F /* WindowCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFF967B29BEBD5200182D6F /* WindowCommands.swift */; }; - 775566502C27FD1B001E7A4D /* CodeFileDocument+UTTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7755664F2C27FD1B001E7A4D /* CodeFileDocument+UTTypeTests.swift */; }; - 77A01E2A2BB424EA00F0EA38 /* CEWorkspaceSettingsData+ProjectSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A01E292BB424EA00F0EA38 /* CEWorkspaceSettingsData+ProjectSettings.swift */; }; - 77A01E2E2BB4261200F0EA38 /* CEWorkspaceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A01E2D2BB4261200F0EA38 /* CEWorkspaceSettings.swift */; }; - 77A01E432BBC3A2800F0EA38 /* CETask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A01E422BBC3A2800F0EA38 /* CETask.swift */; }; - 77A01E6D2BC3EA2A00F0EA38 /* NSWindow+Child.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A01E6C2BC3EA2A00F0EA38 /* NSWindow+Child.swift */; }; - 77EF6C052C57DE4B00984B69 /* URL+ResouceValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77EF6C032C57DE4B00984B69 /* URL+ResouceValues.swift */; }; - 77EF6C0B2C60C80800984B69 /* URL+Filename.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77EF6C0A2C60C80800984B69 /* URL+Filename.swift */; }; - 77EF6C0D2C60E23400984B69 /* CEWorkspaceFileManager+DirectoryEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77EF6C0C2C60E23400984B69 /* CEWorkspaceFileManager+DirectoryEvents.swift */; }; - 850C631029D6B01D00E1444C /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850C630F29D6B01D00E1444C /* SettingsView.swift */; }; - 850C631229D6B03400E1444C /* SettingsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850C631129D6B03400E1444C /* SettingsPage.swift */; }; - 852C7E332A587279006BA599 /* SearchableSettingsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852C7E322A587279006BA599 /* SearchableSettingsPage.swift */; }; - 852E62012A5C17E500447138 /* PageAndSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852E62002A5C17E500447138 /* PageAndSettings.swift */; }; - 85745D632A38F8D900089AAB /* String+HighlightOccurrences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85745D622A38F8D900089AAB /* String+HighlightOccurrences.swift */; }; - 85773E1E2A3E0A1F00C5D926 /* SettingsSearchResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85773E1D2A3E0A1F00C5D926 /* SettingsSearchResult.swift */; }; - 85E4122A2A46C8CA00183F2B /* LocationsSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85E412292A46C8CA00183F2B /* LocationsSettings.swift */; }; - 9D36E1BF2B5E7D7500443C41 /* GitBranchesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D36E1BE2B5E7D7500443C41 /* GitBranchesGroup.swift */; }; - B6041F4D29D7A4E9000F3454 /* SettingsPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6041F4C29D7A4E9000F3454 /* SettingsPageView.swift */; }; - B6041F5229D7D6D6000F3454 /* SettingsWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6041F5129D7D6D6000F3454 /* SettingsWindow.swift */; }; - B607181D2B0C5BE3009CDAB4 /* GitClient+Stash.swift in Sources */ = {isa = PBXBuildFile; fileRef = B607181C2B0C5BE3009CDAB4 /* GitClient+Stash.swift */; }; - B60718202B0C6CE7009CDAB4 /* GitStashEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B607181F2B0C6CE7009CDAB4 /* GitStashEntry.swift */; }; - B60718312B15A9A3009CDAB4 /* CEOutlineGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60718302B15A9A3009CDAB4 /* CEOutlineGroup.swift */; }; - B60718372B170638009CDAB4 /* SourceControlRenameBranchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60718362B170638009CDAB4 /* SourceControlRenameBranchView.swift */; }; - B607183F2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = B607183E2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift */; }; - B60718422B17DB93009CDAB4 /* SourceControlNavigatorRepositoryView+outlineGroupData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60718412B17DB93009CDAB4 /* SourceControlNavigatorRepositoryView+outlineGroupData.swift */; }; - B60718442B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60718432B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift */; }; - B60718462B17DC15009CDAB4 /* RepoOutlineGroupItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60718452B17DC15009CDAB4 /* RepoOutlineGroupItem.swift */; }; - B607184C2B17E037009CDAB4 /* SourceControlStashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B607184B2B17E037009CDAB4 /* SourceControlStashView.swift */; }; - B60BE8BD297A167600841125 /* AcknowledgementRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60BE8BC297A167600841125 /* AcknowledgementRowView.swift */; }; - B6152B802ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */; }; - B616EA882D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */; }; - B616EA892D651ADA00DF9029 /* OverlayButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */; }; - B616EA8D2D65238900DF9029 /* InternalDevelopmentInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */; }; - B616EA8F2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */; }; - B61A606129F188AB009B43F9 /* ExternalLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61A606029F188AB009B43F9 /* ExternalLink.swift */; }; - B61A606929F4481A009B43F9 /* MonospacedFontPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61A606829F4481A009B43F9 /* MonospacedFontPicker.swift */; }; - B61DA9DF29D929E100BF4A43 /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */; }; - B62423302C21EE280096668B /* ThemeModel+CRUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = B624232F2C21EE280096668B /* ThemeModel+CRUD.swift */; }; - B628B7932B18369800F9775A /* GitClient+Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B628B7922B18369800F9775A /* GitClient+Validate.swift */; }; - B628B7B72B223BAD00F9775A /* FindModePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B628B7B62B223BAD00F9775A /* FindModePicker.swift */; }; - B62AEDAA2A1FCBE5009A9F52 /* WorkspacePanelTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDA92A1FCBE5009A9F52 /* WorkspacePanelTabBar.swift */; }; - B62AEDB32A1FD95B009A9F52 /* UtilityAreaTerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDB22A1FD95B009A9F52 /* UtilityAreaTerminalView.swift */; }; - B62AEDB52A1FE295009A9F52 /* UtilityAreaDebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDB42A1FE295009A9F52 /* UtilityAreaDebugView.swift */; }; - B62AEDB82A1FE2DC009A9F52 /* UtilityAreaOutputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDB72A1FE2DC009A9F52 /* UtilityAreaOutputView.swift */; }; - B62AEDBC2A210DBB009A9F52 /* UtilityAreaTerminalTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDBB2A210DBB009A9F52 /* UtilityAreaTerminalTab.swift */; }; - B62AEDC92A2704F3009A9F52 /* UtilityAreaTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDC82A2704F3009A9F52 /* UtilityAreaTabView.swift */; }; - B62AEDD12A27B264009A9F52 /* View+paneToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDD02A27B264009A9F52 /* View+paneToolbar.swift */; }; - B62AEDD42A27B29F009A9F52 /* PaneToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDD32A27B29F009A9F52 /* PaneToolbar.swift */; }; - B62AEDD72A27B3D0009A9F52 /* UtilityAreaTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDD62A27B3D0009A9F52 /* UtilityAreaTabViewModel.swift */; }; - B62AEDDC2A27C1B3009A9F52 /* OSLogType+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62AEDDA2A27C1B3009A9F52 /* OSLogType+Color.swift */; }; - B63F6A792C5618EF003B4342 /* TrimWhitespaceFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63F6A782C5618EF003B4342 /* TrimWhitespaceFormatter.swift */; }; - B63F6A7B2C561BCB003B4342 /* RegexFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63F6A7A2C561BCB003B4342 /* RegexFormatter.swift */; }; - B640A99E29E2184700715F20 /* SettingsForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = B640A99D29E2184700715F20 /* SettingsForm.swift */; }; - B640A9A129E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = B640A9A029E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift */; }; - B658FB3427DA9E1000EA4DBD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B658FB3327DA9E1000EA4DBD /* Assets.xcassets */; }; - B658FB3727DA9E1000EA4DBD /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B658FB3627DA9E1000EA4DBD /* Preview Assets.xcassets */; }; - B65B10EC2B073913002852CF /* CEContentUnavailableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10EB2B073913002852CF /* CEContentUnavailableView.swift */; }; - B65B10EF2B07C454002852CF /* GitClient+Remote.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10EE2B07C454002852CF /* GitClient+Remote.swift */; }; - B65B10F22B07D34F002852CF /* GitRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10F12B07D34F002852CF /* GitRemote.swift */; }; - B65B10F52B081A0C002852CF /* SourceControlAddExistingRemoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10F42B081A0C002852CF /* SourceControlAddExistingRemoteView.swift */; }; - B65B10F82B081A34002852CF /* SourceControlNavigatorNoRemotesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10F72B081A34002852CF /* SourceControlNavigatorNoRemotesView.swift */; }; - B65B10FB2B08B054002852CF /* Divided.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10FA2B08B054002852CF /* Divided.swift */; }; - B65B10FE2B08B07D002852CF /* SourceControlNavigatorChangesList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B10FD2B08B07D002852CF /* SourceControlNavigatorChangesList.swift */; }; - B65B11012B09D5D4002852CF /* GitClient+Pull.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B11002B09D5D4002852CF /* GitClient+Pull.swift */; }; - B65B11042B09DB1C002852CF /* GitClient+Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B11032B09DB1C002852CF /* GitClient+Fetch.swift */; }; - B66460592D600E9500EC1411 /* NotificationManager+Delegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */; }; - B664605A2D600E9500EC1411 /* NotificationManager+System.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66460582D600E9500EC1411 /* NotificationManager+System.swift */; }; - B664C3B02B965F6C00816B4E /* NavigationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B664C3AF2B965F6C00816B4E /* NavigationSettings.swift */; }; - B664C3B32B96634F00816B4E /* NavigationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B664C3B22B96634F00816B4E /* NavigationSettingsView.swift */; }; - B66A4E4529C8E86D004573B4 /* CommandsFixes.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E4429C8E86D004573B4 /* CommandsFixes.swift */; }; - B66A4E4C29C9179B004573B4 /* CodeEditApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E4B29C9179B004573B4 /* CodeEditApp.swift */; }; - B66A4E4F29C917B8004573B4 /* WelcomeWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E4E29C917B8004573B4 /* WelcomeWindow.swift */; }; - B66A4E5129C917D5004573B4 /* AboutWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E5029C917D5004573B4 /* AboutWindow.swift */; }; - B66A4E5329C91831004573B4 /* CodeEditCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E5229C91831004573B4 /* CodeEditCommands.swift */; }; - B66A4E5629C918A0004573B4 /* SceneID.swift in Sources */ = {isa = PBXBuildFile; fileRef = B66A4E5529C918A0004573B4 /* SceneID.swift */; }; - B67431CC2C3E45F30047FCA6 /* SourceControlSwitchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67431CB2C3E45F30047FCA6 /* SourceControlSwitchView.swift */; }; - B67700F92D2A2662004FD61F /* WorkspacePanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67700F82D2A2662004FD61F /* WorkspacePanelView.swift */; }; - B67DB0EF2AF3E381002DC647 /* PaneTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DB0EE2AF3E381002DC647 /* PaneTextField.swift */; }; - B67DB0F62AFC2A7A002DC647 /* FindNavigatorToolbarBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DB0F52AFC2A7A002DC647 /* FindNavigatorToolbarBottom.swift */; }; - B67DB0F92AFDF638002DC647 /* IconButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */; }; - B67DB0FC2AFDF71F002DC647 /* IconToggleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */; }; - B67DBB882CD51C55007F4F18 /* Limiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB872CD51C51007F4F18 /* Limiter.swift */; }; - B67DBB8A2CD5D8F7007F4F18 /* IgnoredFilesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB892CD5D8E4007F4F18 /* IgnoredFilesListView.swift */; }; - B67DBB8C2CD5D9CB007F4F18 /* IgnorePatternModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB8B2CD5D9B4007F4F18 /* IgnorePatternModel.swift */; }; - B67DBB902CD5EA77007F4F18 /* GlobPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB8F2CD5EA71007F4F18 /* GlobPattern.swift */; }; - B67DBB922CD5EAAB007F4F18 /* GlobPatternList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB912CD5EAA4007F4F18 /* GlobPatternList.swift */; }; - B67DBB942CD5FC08007F4F18 /* GlobPatternListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */; }; - B68108042C60287F008B27C1 /* StartTaskToolbarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68108032C60287F008B27C1 /* StartTaskToolbarButton.swift */; }; - B685DE7929CC9CCD002860C8 /* StatusBarIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B685DE7829CC9CCD002860C8 /* StatusBarIcon.swift */; }; - B68DE5DF2D5A61E5009A43EF /* CENotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5D72D5A61E5009A43EF /* CENotification.swift */; }; - B68DE5E02D5A61E5009A43EF /* NotificationBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */; }; - B68DE5E22D5A61E5009A43EF /* NotificationToolbarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */; }; - B68DE5E32D5A61E5009A43EF /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */; }; - B68DE5E52D5A7988009A43EF /* NotificationPanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */; }; - B6966A282C2F683300259C2D /* SourceControlPullView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A272C2F683300259C2D /* SourceControlPullView.swift */; }; - B6966A2A2C2F687A00259C2D /* SourceControlFetchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A292C2F687A00259C2D /* SourceControlFetchView.swift */; }; - B6966A2E2C3056AD00259C2D /* SourceControlCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A2D2C3056AD00259C2D /* SourceControlCommands.swift */; }; - B6966A302C33282200259C2D /* RemoteBranchPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A2F2C33282200259C2D /* RemoteBranchPicker.swift */; }; - B6966A322C3348D300259C2D /* WorkspaceSheets.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A312C3348D300259C2D /* WorkspaceSheets.swift */; }; - B6966A342C34996B00259C2D /* SourceControlManager+GitClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6966A332C34996B00259C2D /* SourceControlManager+GitClient.swift */; }; - B696A7E62CFE20C40048CFE1 /* FeatureIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */; }; - B697937A29FF5668002027EC /* AccountsSettingsAccountLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B697937929FF5668002027EC /* AccountsSettingsAccountLink.swift */; }; - B69970322D63E5C700BB132D /* NotificationPanelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */; }; - B69BFDC72B0686910050D9A6 /* GitClient+Initiate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69BFDC62B0686910050D9A6 /* GitClient+Initiate.swift */; }; - B69D3EDE2C5E85A2005CF43A /* StopTaskToolbarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EDD2C5E85A2005CF43A /* StopTaskToolbarButton.swift */; }; - B69D3EE12C5F5357005CF43A /* TaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EE02C5F5357005CF43A /* TaskView.swift */; }; - B69D3EE32C5F536B005CF43A /* ActiveTaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EE22C5F536B005CF43A /* ActiveTaskView.swift */; }; - B69D3EE52C5F54B3005CF43A /* TasksPopoverMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */; }; - B6A43C5D29FC4AF00027E0E0 /* CreateSSHKeyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6A43C5C29FC4AF00027E0E0 /* CreateSSHKeyView.swift */; }; - B6AB09A12AAABAAE0003A3A6 /* EditorTabs.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09A02AAABAAE0003A3A6 /* EditorTabs.swift */; }; - B6AB09A32AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09A22AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift */; }; - B6AB09A52AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09A42AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift */; }; - B6AB09B32AB919CF0003A3A6 /* View+actionBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */; }; - B6B2D79F2CE8794E00379967 /* GitConfigRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6B2D79E2CE8794200379967 /* GitConfigRepresentable.swift */; }; - B6B2D7A12CE8797B00379967 /* GitConfigExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6B2D7A02CE8797400379967 /* GitConfigExtensions.swift */; }; - B6BF41422C2C672A003AB4B3 /* SourceControlPushView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6BF41412C2C672A003AB4B3 /* SourceControlPushView.swift */; }; - B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */; }; - B6C4F2A32B3CA74800B2B140 /* CommitDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */; }; - B6C4F2A62B3CABD200B2B140 /* HistoryInspectorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */; }; - B6C4F2A92B3CB00100B2B140 /* CommitDetailsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */; }; - B6C6A42A297716A500A3D28F /* EditorTabCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A429297716A500A3D28F /* EditorTabCloseButton.swift */; }; - B6C6A42E29771A8D00A3D28F /* EditorTabButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A42D29771A8D00A3D28F /* EditorTabButtonStyle.swift */; }; - B6C6A43029771F7100A3D28F /* EditorTabBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A42F29771F7100A3D28F /* EditorTabBackground.swift */; }; - B6CFD80D2C1B9A8000E63F1A /* FontWeightPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6CFD80C2C1B9A8000E63F1A /* FontWeightPicker.swift */; }; - B6CFD8112C20A8EE00E63F1A /* NSFont+WithWeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6CFD8102C20A8EE00E63F1A /* NSFont+WithWeight.swift */; }; - B6D7EA592971078500301FAC /* InspectorSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6D7EA582971078500301FAC /* InspectorSection.swift */; }; - B6D7EA5C297107DD00301FAC /* InspectorField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6D7EA5B297107DD00301FAC /* InspectorField.swift */; }; - B6DCDAC62CCDE2B90099FBF9 /* InstantPopoverModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6DCDAC52CCDE2B90099FBF9 /* InstantPopoverModifier.swift */; }; - B6E38E022CD3E63A00F4E65A /* GitConfigClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E38E012CD3E62E00F4E65A /* GitConfigClient.swift */; }; - B6E41C7029DD157F0088F9F4 /* AccountsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C6F29DD157F0088F9F4 /* AccountsSettingsView.swift */; }; - B6E41C7429DD40010088F9F4 /* View+HideSidebarToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C7329DD40010088F9F4 /* View+HideSidebarToggle.swift */; }; - B6E41C7929DE02800088F9F4 /* AccountSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C7829DE02800088F9F4 /* AccountSelectionView.swift */; }; - B6E41C7C29DE2B110088F9F4 /* AccountsSettingsProviderRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C7B29DE2B110088F9F4 /* AccountsSettingsProviderRow.swift */; }; - B6E41C8B29DE7AE80088F9F4 /* AccountsSettingsSigninView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C8A29DE7AE80088F9F4 /* AccountsSettingsSigninView.swift */; }; - B6E41C8F29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C8E29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift */; }; - B6E41C9429DEAE260088F9F4 /* SourceControlAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E41C9329DEAE260088F9F4 /* SourceControlAccount.swift */; }; - B6E55C3B2A95368E003ECC7D /* EditorTabsOverflowShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E55C3A2A95368E003ECC7D /* EditorTabsOverflowShadow.swift */; }; - B6EA1FE529DA33DB001BF195 /* ThemeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FE429DA33DB001BF195 /* ThemeModel.swift */; }; - B6EA1FE729DA341D001BF195 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FE629DA341D001BF195 /* Theme.swift */; }; - B6EA1FF529DA380E001BF195 /* TextEditingSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FF429DA380E001BF195 /* TextEditingSettingsView.swift */; }; - B6EA1FF829DB78DB001BF195 /* ThemeSettingThemeRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FF729DB78DB001BF195 /* ThemeSettingThemeRow.swift */; }; - B6EA1FFB29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FFA29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift */; }; - B6EA1FFD29DB792C001BF195 /* ThemeSettingsColorPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FFC29DB792C001BF195 /* ThemeSettingsColorPreview.swift */; }; - B6EA200029DB7966001BF195 /* SettingsColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA1FFF29DB7966001BF195 /* SettingsColorPicker.swift */; }; - B6EA200229DB7F81001BF195 /* View+ConstrainHeightToWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EA200129DB7F81001BF195 /* View+ConstrainHeightToWindow.swift */; }; - B6EE989027E8879A00CDD8AB /* InspectorAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6EE988F27E8879A00CDD8AB /* InspectorAreaView.swift */; }; - B6F0517029D9E36800D72287 /* LocationsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F0516F29D9E36800D72287 /* LocationsSettingsView.swift */; }; - B6F0517729D9E3AD00D72287 /* SourceControlGeneralView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F0517629D9E3AD00D72287 /* SourceControlGeneralView.swift */; }; - B6F0517929D9E3C900D72287 /* SourceControlGitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F0517829D9E3C900D72287 /* SourceControlGitView.swift */; }; - B6F0517B29D9E46400D72287 /* SourceControlSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F0517A29D9E46400D72287 /* SourceControlSettingsView.swift */; }; - B6F0517D29D9E4B100D72287 /* TerminalSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F0517C29D9E4B100D72287 /* TerminalSettingsView.swift */; }; - B6FA3F882BF41C940023DE9C /* ThemeSettingsThemeToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6FA3F872BF41C940023DE9C /* ThemeSettingsThemeToken.swift */; }; B6FF04782B6C08AC002C2C78 /* DefaultThemes in Resources */ = {isa = PBXBuildFile; fileRef = B6FF04772B6C08AC002C2C78 /* DefaultThemes */; }; - D7012EE827E757850001E1EF /* FindNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7012EE727E757850001E1EF /* FindNavigatorView.swift */; }; - D7211D4327E066CE008F2ED7 /* Localized+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7211D4227E066CE008F2ED7 /* Localized+Ex.swift */; }; - D7211D4727E06BFE008F2ED7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D7211D4927E06BFE008F2ED7 /* Localizable.strings */; }; - D7DC4B76298FFBE900D6C83D /* ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7DC4B75298FFBE900D6C83D /* ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift */; }; - D7E201AE27E8B3C000CB86D0 /* String+Ranges.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E201AD27E8B3C000CB86D0 /* String+Ranges.swift */; }; - D7E201B227E8D50000CB86D0 /* FindNavigatorForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E201B127E8D50000CB86D0 /* FindNavigatorForm.swift */; }; - DE513F52281B672D002260B9 /* EditorTabBarAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE513F51281B672D002260B9 /* EditorTabBarAccessory.swift */; }; - DE6F77872813625500D00A76 /* EditorTabBarDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6F77862813625500D00A76 /* EditorTabBarDivider.swift */; }; - EC0870F72A455F6400EB8692 /* ProjectNavigatorViewController+NSMenuDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0870F62A455F6400EB8692 /* ProjectNavigatorViewController+NSMenuDelegate.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -713,7 +95,6 @@ dstPath = "$(EXTENSIONS_FOLDER_PATH)"; dstSubfolderSpec = 16; files = ( - 6C6BD6FE29CD155200235D17 /* codeedit.extension.appextensionpoint in Embed ExtensionKit ExtensionPoint */, ); name = "Embed ExtensionKit ExtensionPoint"; runOnlyForDeploymentPostprocessing = 0; @@ -721,647 +102,56 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 041FC6AC2AE437CE00C1F65A /* SourceControlNewBranchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNewBranchView.swift; sourceTree = ""; }; - 043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState.swift"; sourceTree = ""; }; - 043C321327E31FF6006AE443 /* CodeEditDocumentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditDocumentController.swift; sourceTree = ""; }; - 043C321527E3201F006AE443 /* WorkspaceDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceDocument.swift; sourceTree = ""; }; - 04660F6027E3A68A00477777 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 04660F6927E51E5C00477777 /* CodeEditWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditWindowController.swift; sourceTree = ""; }; - 0468438427DC76E200F8E88E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 0485EB1E27E7458B00138301 /* EditorAreaFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorAreaFileView.swift; sourceTree = ""; }; - 04BA7C0A2AE2A2D100584E1C /* GitBranch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitBranch.swift; sourceTree = ""; }; - 04BA7C0D2AE2A76E00584E1C /* SourceControlNavigatorChangesCommitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangesCommitView.swift; sourceTree = ""; }; - 04BA7C112AE2AA7300584E1C /* GitCheckoutBranchViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitCheckoutBranchViewModel.swift; sourceTree = ""; }; - 04BA7C122AE2AA7300584E1C /* GitCloneViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitCloneViewModel.swift; sourceTree = ""; }; - 04BA7C182AE2D7C600584E1C /* GitClient+Branches.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Branches.swift"; sourceTree = ""; }; - 04BA7C1B2AE2D84100584E1C /* GitClient+Commit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Commit.swift"; sourceTree = ""; }; - 04BA7C1D2AE2D8A000584E1C /* GitClient+Clone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Clone.swift"; sourceTree = ""; }; - 04BA7C1F2AE2D92B00584E1C /* GitClient+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Status.swift"; sourceTree = ""; }; - 04BA7C212AE2D95E00584E1C /* GitClient+CommitHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+CommitHistory.swift"; sourceTree = ""; }; - 04BA7C232AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorSyncView.swift; sourceTree = ""; }; - 04BA7C262AE2E9F100584E1C /* GitClient+Push.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Push.swift"; sourceTree = ""; }; - 04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorFileTabCloseButton.swift; sourceTree = ""; }; - 0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CodeEditWindowController+Toolbar.swift"; sourceTree = ""; }; - 201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorView.swift; sourceTree = ""; }; - 201169DA2837B34000F92B46 /* GitChangedFileListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitChangedFileListView.swift; sourceTree = ""; }; - 201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorToolbarBottom.swift; sourceTree = ""; }; - 201169E12837B3D800F92B46 /* SourceControlNavigatorChangesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangesView.swift; sourceTree = ""; }; - 201169E42837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorRepositoryView.swift; sourceTree = ""; }; - 201169E62837B5CA00F92B46 /* SourceControlManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlManager.swift; sourceTree = ""; }; - 2072FA12280D74ED00C7F8D4 /* HistoryInspectorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorModel.swift; sourceTree = ""; }; - 20D839AA280DEB2900B27357 /* NoSelectionInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoSelectionInspectorView.swift; sourceTree = ""; }; - 20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryPopoverView.swift; sourceTree = ""; }; - 20EBB500280C325D00F3A5DA /* FileInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileInspectorView.swift; sourceTree = ""; }; - 20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorView.swift; sourceTree = ""; }; - 20EBB504280C329800F3A5DA /* CommitListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitListItemView.swift; sourceTree = ""; }; - 28052DFB29730DE300F4F90A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 28052DFC29730DF600F4F90A /* Alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Alpha.xcconfig; sourceTree = ""; }; - 28052DFD29730E0300F4F90A /* Beta.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Beta.xcconfig; sourceTree = ""; }; - 28052DFE29730E0B00F4F90A /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 2806E9012979588B000040F4 /* Contributor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contributor.swift; sourceTree = ""; }; - 2806E903297958B9000040F4 /* ContributorRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorRowView.swift; sourceTree = ""; }; 283BDCBC2972EEBD002AFF81 /* Package.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; name = Package.resolved; path = CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; sourceTree = ""; }; - 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementsTests.swift; sourceTree = ""; }; - 2847019D27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorOutlineView.swift; sourceTree = ""; }; - 284DC84E2978B7B400BF2770 /* ContributorsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorsView.swift; sourceTree = ""; }; 284DC8502978BA2600BF2770 /* .all-contributorsrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ".all-contributorsrc"; sourceTree = ""; }; - 285FEC6D27FE4B4A00E57D53 /* ProjectNavigatorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorViewController.swift; sourceTree = ""; }; - 285FEC6F27FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorTableViewCell.swift; sourceTree = ""; }; - 285FEC7127FE4EEF00E57D53 /* ProjectNavigatorMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorMenu.swift; sourceTree = ""; }; - 286471AA27ED51FD0039369D /* ProjectNavigatorView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorView.swift; sourceTree = ""; tabWidth = 4; }; - 287776E627E3413200D46668 /* NavigatorAreaView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = NavigatorAreaView.swift; sourceTree = ""; tabWidth = 4; }; - 287776E827E34BC700D46668 /* EditorTabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarView.swift; sourceTree = ""; }; - 2897E1C62979A29200741E32 /* TrackableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackableScrollView.swift; sourceTree = ""; }; - 28B8F883280FFE4600596236 /* NSTableView+Background.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTableView+Background.swift"; sourceTree = ""; }; - 2B15CA0028254139004E8F22 /* OpenWithCodeEdit.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = OpenWithCodeEdit.entitlements; sourceTree = ""; }; - 2B7AC06A282452FB0082A5B8 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; 2BE487EC28245162003F3F64 /* OpenWithCodeEdit.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenWithCodeEdit.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 2BE487EE28245162003F3F64 /* FinderSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; }; - 2BE487F028245162003F3F64 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 300051662BBD3A5D00A98562 /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = ""; }; - 300051692BBD3A8200A98562 /* ServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceType.swift; sourceTree = ""; }; - 3000516B2BBD3A9500A98562 /* ServiceWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceWrapper.swift; sourceTree = ""; }; - 3026F50E2AC006C80061227E /* InspectorAreaViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorAreaViewModel.swift; sourceTree = ""; }; - 30AB4EBA2BF718A100ED4431 /* DeveloperSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperSettings.swift; sourceTree = ""; }; - 30AB4EBC2BF71CA800ED4431 /* DeveloperSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperSettingsView.swift; sourceTree = ""; }; - 30AB4EC12BF7253200ED4431 /* KeyValueTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyValueTable.swift; sourceTree = ""; }; - 30B087DF2C0D53080063A882 /* LanguageServer+CallHierarchy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+CallHierarchy.swift"; sourceTree = ""; }; - 30B087E12C0D53080063A882 /* LanguageServer+ColorPresentation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+ColorPresentation.swift"; sourceTree = ""; }; - 30B087E22C0D53080063A882 /* LanguageServer+Completion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Completion.swift"; sourceTree = ""; }; - 30B087E32C0D53080063A882 /* LanguageServer+Declaration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Declaration.swift"; sourceTree = ""; }; - 30B087E42C0D53080063A882 /* LanguageServer+Definition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Definition.swift"; sourceTree = ""; }; - 30B087E52C0D53080063A882 /* LanguageServer+Diagnostics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Diagnostics.swift"; sourceTree = ""; }; - 30B087E62C0D53080063A882 /* LanguageServer+DocumentColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentColor.swift"; sourceTree = ""; }; - 30B087E72C0D53080063A882 /* LanguageServer+DocumentHighlight.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentHighlight.swift"; sourceTree = ""; }; - 30B087E82C0D53080063A882 /* LanguageServer+DocumentLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentLink.swift"; sourceTree = ""; }; - 30B087E92C0D53080063A882 /* LanguageServer+DocumentSymbol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentSymbol.swift"; sourceTree = ""; }; - 30B087EB2C0D53080063A882 /* LanguageServer+FoldingRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+FoldingRange.swift"; sourceTree = ""; }; - 30B087EC2C0D53080063A882 /* LanguageServer+Formatting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Formatting.swift"; sourceTree = ""; }; - 30B087ED2C0D53080063A882 /* LanguageServer+Hover.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Hover.swift"; sourceTree = ""; }; - 30B087EE2C0D53080063A882 /* LanguageServer+Implementation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Implementation.swift"; sourceTree = ""; }; - 30B087EF2C0D53080063A882 /* LanguageServer+InlayHint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+InlayHint.swift"; sourceTree = ""; }; - 30B087F02C0D53080063A882 /* LanguageServer+References.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+References.swift"; sourceTree = ""; }; - 30B087F12C0D53080063A882 /* LanguageServer+Rename.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+Rename.swift"; sourceTree = ""; }; - 30B087F22C0D53080063A882 /* LanguageServer+SelectionRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+SelectionRange.swift"; sourceTree = ""; }; - 30B087F32C0D53080063A882 /* LanguageServer+SemanticTokens.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+SemanticTokens.swift"; sourceTree = ""; }; - 30B087F42C0D53080063A882 /* LanguageServer+SignatureHelp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+SignatureHelp.swift"; sourceTree = ""; }; - 30B087F52C0D53080063A882 /* LanguageServer+TypeDefinition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+TypeDefinition.swift"; sourceTree = ""; }; - 30B087F72C0D53080063A882 /* LanguageServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageServer.swift; sourceTree = ""; }; - 30B087F82C0D53080063A882 /* LSPService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LSPService.swift; sourceTree = ""; }; - 30B087FA2C0D53080063A882 /* LSPUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LSPUtil.swift; sourceTree = ""; }; - 30CB648C2C12680F00CC8A9E /* LSPService+Events.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LSPService+Events.swift"; sourceTree = ""; }; - 30E6D0002A6E505200A58B20 /* NavigatorAreaViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigatorAreaViewModel.swift; sourceTree = ""; }; - 3E0196722A3921AC002648D8 /* codeedit_shell_integration_rc.zsh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = codeedit_shell_integration_rc.zsh; sourceTree = ""; }; - 3E0196792A392B45002648D8 /* codeedit_shell_integration.bash */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = codeedit_shell_integration.bash; sourceTree = ""; }; - 4A6F0DB42CBA462B00499627 /* ProjectNavigatorMenuActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorMenuActions.swift; sourceTree = ""; }; - 4E7F066529602E7B00BB3C12 /* CodeEditSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditSplitViewController.swift; sourceTree = ""; }; - 4EE96ECA2960565E00FFBEA8 /* DocumentsUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentsUnitTests.swift; sourceTree = ""; }; - 4EE96ECD296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSHapticFeedbackPerformerMock.swift; sourceTree = ""; }; - 581550CC29FBD30400684881 /* StandardTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StandardTableViewCell.swift; sourceTree = ""; }; - 581550CD29FBD30400684881 /* FileSystemTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileSystemTableViewCell.swift; sourceTree = ""; }; - 581550CE29FBD30400684881 /* TextTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextTableViewCell.swift; sourceTree = ""; }; - 581550D329FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorToolbarBottom.swift; sourceTree = ""; }; - 581BFB5A2926431000D251EC /* WelcomeWindowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomeWindowView.swift; sourceTree = ""; }; - 581BFB5B2926431000D251EC /* WelcomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; - 581BFB5C2926431000D251EC /* WelcomeActionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomeActionView.swift; sourceTree = ""; }; - 581BFB5E2926431000D251EC /* RecentProjectListItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentProjectListItem.swift; sourceTree = ""; }; - 582213EF291834A500EFE361 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; - 583E527529361B39001AB554 /* CodeEditUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEditUITests.swift; sourceTree = ""; }; - 583E527929361B39001AB554 /* testHelpButtonDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testHelpButtonDark.1.png; sourceTree = ""; }; - 583E527A29361B39001AB554 /* testEffectViewLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testEffectViewLight.1.png; sourceTree = ""; }; - 583E527B29361B39001AB554 /* testSegmentedControlLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testSegmentedControlLight.1.png; sourceTree = ""; }; - 583E527C29361B39001AB554 /* testSegmentedControlProminentLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testSegmentedControlProminentLight.1.png; sourceTree = ""; }; - 583E527D29361B39001AB554 /* testHelpButtonLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testHelpButtonLight.1.png; sourceTree = ""; }; - 583E527E29361B39001AB554 /* testBranchPickerDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testBranchPickerDark.1.png; sourceTree = ""; }; - 583E527F29361B39001AB554 /* testFontPickerViewDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testFontPickerViewDark.1.png; sourceTree = ""; }; - 583E528029361B39001AB554 /* testFontPickerViewLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testFontPickerViewLight.1.png; sourceTree = ""; }; - 583E528129361B39001AB554 /* testSegmentedControlProminentDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testSegmentedControlProminentDark.1.png; sourceTree = ""; }; - 583E528229361B39001AB554 /* testSegmentedControlDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testSegmentedControlDark.1.png; sourceTree = ""; }; - 583E528329361B39001AB554 /* testEffectViewDark.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testEffectViewDark.1.png; sourceTree = ""; }; - 583E528429361B39001AB554 /* testBranchPickerLight.1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testBranchPickerLight.1.png; sourceTree = ""; }; - 583E52A129361BFD001AB554 /* CodeEditUITests-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CodeEditUITests-Bridging-Header.h"; sourceTree = ""; }; - 58710158298EB80000951BA4 /* CEWorkspaceFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceFileManager.swift; sourceTree = ""; }; - 5878DA81291863F900DD95A3 /* AcknowledgementsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsView.swift; sourceTree = ""; }; - 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParsePackagesResolved.swift; sourceTree = ""; }; - 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsViewModel.swift; sourceTree = ""; }; - 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyView.swift; sourceTree = ""; wrapsLines = 1; }; - 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyPreviewView.swift; sourceTree = ""; }; - 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyViewModel.swift; sourceTree = ""; }; - 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyListItemView.swift; sourceTree = ""; }; - 5878DAAD291D627C00DD95A3 /* EditorJumpBarMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorJumpBarMenu.swift; sourceTree = ""; }; - 5878DAAE291D627C00DD95A3 /* EditorJumpBarComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorJumpBarComponent.swift; sourceTree = ""; }; - 5878DAAF291D627C00DD95A3 /* EditorJumpBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorJumpBarView.swift; sourceTree = ""; }; - 58798213292D92370085B254 /* String+SafeOffset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+SafeOffset.swift"; sourceTree = ""; }; - 58798215292D92370085B254 /* SearchModeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchModeModel.swift; sourceTree = ""; }; - 58798216292D92370085B254 /* SearchResultModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchResultModel.swift; sourceTree = ""; }; - 58798217292D92370085B254 /* SearchResultMatchModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchResultMatchModel.swift; sourceTree = ""; }; - 5879822B292E30B90085B254 /* FeedbackToolbar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackToolbar.swift; sourceTree = ""; }; - 5879822D292E30B90085B254 /* FeedbackIssueArea.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackIssueArea.swift; sourceTree = ""; }; - 5879822E292E30B90085B254 /* FeedbackModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackModel.swift; sourceTree = ""; }; - 5879822F292E30B90085B254 /* FeedbackType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackType.swift; sourceTree = ""; }; - 58798230292E30B90085B254 /* FeedbackView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackView.swift; sourceTree = ""; }; - 58798232292E30B90085B254 /* FeedbackWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackWindowController.swift; sourceTree = ""; }; - 58798248292E78D80085B254 /* CodeFileView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeFileView.swift; sourceTree = ""; }; - 58798249292E78D80085B254 /* CodeFileDocument.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeFileDocument.swift; sourceTree = ""; }; - 58798280292ED0FB0085B254 /* TerminalEmulatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TerminalEmulatorView.swift; sourceTree = ""; }; - 58798281292ED0FB0085B254 /* TerminalEmulatorView+Coordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TerminalEmulatorView+Coordinator.swift"; sourceTree = ""; }; - 58798283292ED0FB0085B254 /* SwiftTerm+Color+Init.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftTerm+Color+Init.swift"; sourceTree = ""; }; - 587B60F72934124100D5CD8F /* CEWorkspaceFileManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CEWorkspaceFileManagerTests.swift; sourceTree = ""; }; - 587B61002934170A00D5CD8F /* UnitTests_Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnitTests_Extensions.swift; sourceTree = ""; }; - 587B612D293419B700D5CD8F /* CodeFileTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeFileTests.swift; sourceTree = ""; }; - 587B9D8829300ABD00AC7927 /* SegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; - 587B9D8929300ABD00AC7927 /* PanelDivider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PanelDivider.swift; sourceTree = ""; }; - 587B9D8B29300ABD00AC7927 /* EffectView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EffectView.swift; sourceTree = ""; }; - 587B9D8C29300ABD00AC7927 /* SettingsTextEditor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTextEditor.swift; sourceTree = ""; }; - 587B9D8D29300ABD00AC7927 /* SearchPanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPanel.swift; sourceTree = ""; }; - 587B9D8E29300ABD00AC7927 /* PressActionsModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PressActionsModifier.swift; sourceTree = ""; }; - 587B9D8F29300ABD00AC7927 /* ToolbarBranchPicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToolbarBranchPicker.swift; sourceTree = ""; }; - 587B9D9029300ABD00AC7927 /* HelpButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HelpButton.swift; sourceTree = ""; }; - 587B9E0729301D8F00AC7927 /* GitCloneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitCloneView.swift; sourceTree = ""; }; - 587B9E0829301D8F00AC7927 /* GitCheckoutBranchView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitCheckoutBranchView.swift; sourceTree = ""; }; - 587B9E0A29301D8F00AC7927 /* Parameters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Parameters.swift; sourceTree = ""; }; - 587B9E0D29301D8F00AC7927 /* GitLabUserRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabUserRouter.swift; sourceTree = ""; }; - 587B9E0E29301D8F00AC7927 /* GitLabCommitRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabCommitRouter.swift; sourceTree = ""; }; - 587B9E0F29301D8F00AC7927 /* GitLabProjectRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabProjectRouter.swift; sourceTree = ""; }; - 587B9E1029301D8F00AC7927 /* GitLabOAuthRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabOAuthRouter.swift; sourceTree = ""; }; - 587B9E1129301D8F00AC7927 /* GitLabOAuthConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabOAuthConfiguration.swift; sourceTree = ""; }; - 587B9E1229301D8F00AC7927 /* GitLabConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabConfiguration.swift; sourceTree = ""; }; - 587B9E1329301D8F00AC7927 /* GitLabAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabAccount.swift; sourceTree = ""; }; - 587B9E1529301D8F00AC7927 /* GitLabCommit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabCommit.swift; sourceTree = ""; }; - 587B9E1629301D8F00AC7927 /* GitLabGroupAccess.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabGroupAccess.swift; sourceTree = ""; }; - 587B9E1729301D8F00AC7927 /* GitLabProjectHook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabProjectHook.swift; sourceTree = ""; }; - 587B9E1829301D8F00AC7927 /* GitLabEventData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabEventData.swift; sourceTree = ""; }; - 587B9E1929301D8F00AC7927 /* GitLabAccountModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabAccountModel.swift; sourceTree = ""; }; - 587B9E1A29301D8F00AC7927 /* GitLabEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabEvent.swift; sourceTree = ""; }; - 587B9E1B29301D8F00AC7927 /* GitLabPermissions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabPermissions.swift; sourceTree = ""; }; - 587B9E1C29301D8F00AC7927 /* GitLabAvatarURL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabAvatarURL.swift; sourceTree = ""; }; - 587B9E1D29301D8F00AC7927 /* GitLabNamespace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabNamespace.swift; sourceTree = ""; }; - 587B9E1E29301D8F00AC7927 /* GitLabEventNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabEventNote.swift; sourceTree = ""; }; - 587B9E1F29301D8F00AC7927 /* GitLabProject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabProject.swift; sourceTree = ""; }; - 587B9E2029301D8F00AC7927 /* GitLabProjectAccess.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabProjectAccess.swift; sourceTree = ""; }; - 587B9E2129301D8F00AC7927 /* GitLabUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitLabUser.swift; sourceTree = ""; }; - 587B9E2329301D8F00AC7927 /* GitURLSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitURLSession.swift; sourceTree = ""; }; - 587B9E2429301D8F00AC7927 /* GitJSONPostRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitJSONPostRouter.swift; sourceTree = ""; }; - 587B9E2529301D8F00AC7927 /* GitRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitRouter.swift; sourceTree = ""; }; - 587B9E2729301D8F00AC7927 /* URL+URLParameters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+URLParameters.swift"; sourceTree = ""; }; - 587B9E2829301D8F00AC7927 /* String+QueryParameters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+QueryParameters.swift"; sourceTree = ""; }; - 587B9E2929301D8F00AC7927 /* GitTime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitTime.swift; sourceTree = ""; }; - 587B9E2A29301D8F00AC7927 /* String+PercentEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+PercentEncoding.swift"; sourceTree = ""; }; - 587B9E2E29301D8F00AC7927 /* GitHubIssueRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubIssueRouter.swift; sourceTree = ""; }; - 587B9E2F29301D8F00AC7927 /* GitHubReviewsRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubReviewsRouter.swift; sourceTree = ""; }; - 587B9E3029301D8F00AC7927 /* GitHubRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubRouter.swift; sourceTree = ""; }; - 587B9E3129301D8F00AC7927 /* GitHubRepositoryRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubRepositoryRouter.swift; sourceTree = ""; }; - 587B9E3229301D8F00AC7927 /* GitHubPullRequestRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubPullRequestRouter.swift; sourceTree = ""; }; - 587B9E3329301D8F00AC7927 /* GitHubGistRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubGistRouter.swift; sourceTree = ""; }; - 587B9E3429301D8F00AC7927 /* GitHubUserRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubUserRouter.swift; sourceTree = ""; }; - 587B9E3529301D8F00AC7927 /* GitHubConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubConfiguration.swift; sourceTree = ""; }; - 587B9E3629301D8F00AC7927 /* PublicKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PublicKey.swift; sourceTree = ""; }; - 587B9E3729301D8F00AC7927 /* GitHubPreviewHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubPreviewHeader.swift; sourceTree = ""; }; - 587B9E3929301D8F00AC7927 /* GitHubPullRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubPullRequest.swift; sourceTree = ""; }; - 587B9E3A29301D8F00AC7927 /* GitHubUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubUser.swift; sourceTree = ""; }; - 587B9E3B29301D8F00AC7927 /* GitHubReview.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubReview.swift; sourceTree = ""; }; - 587B9E3C29301D8F00AC7927 /* GitHubComment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubComment.swift; sourceTree = ""; }; - 587B9E3D29301D8F00AC7927 /* GitHubRepositories.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubRepositories.swift; sourceTree = ""; }; - 587B9E3E29301D8F00AC7927 /* GitHubFiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubFiles.swift; sourceTree = ""; }; - 587B9E3F29301D8F00AC7927 /* GitHubGist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubGist.swift; sourceTree = ""; }; - 587B9E4029301D8F00AC7927 /* GitHubIssue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubIssue.swift; sourceTree = ""; }; - 587B9E4129301D8F00AC7927 /* GitHubAccount+deleteReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GitHubAccount+deleteReference.swift"; sourceTree = ""; }; - 587B9E4229301D8F00AC7927 /* GitHubOpenness.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubOpenness.swift; sourceTree = ""; }; - 587B9E4329301D8F00AC7927 /* GitHubAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubAccount.swift; sourceTree = ""; }; - 587B9E4629301D8F00AC7927 /* BitBucketRepositoryRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketRepositoryRouter.swift; sourceTree = ""; }; - 587B9E4729301D8F00AC7927 /* BitBucketUserRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketUserRouter.swift; sourceTree = ""; }; - 587B9E4829301D8F00AC7927 /* BitBucketTokenRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketTokenRouter.swift; sourceTree = ""; }; - 587B9E4929301D8F00AC7927 /* BitBucketOAuthRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketOAuthRouter.swift; sourceTree = ""; }; - 587B9E4A29301D8F00AC7927 /* BitBucketAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketAccount.swift; sourceTree = ""; }; - 587B9E4B29301D8F00AC7927 /* BitBucketOAuthConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketOAuthConfiguration.swift; sourceTree = ""; }; - 587B9E4C29301D8F00AC7927 /* BitBucketTokenConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketTokenConfiguration.swift; sourceTree = ""; }; - 587B9E4E29301D8F00AC7927 /* BitBucketUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketUser.swift; sourceTree = ""; }; - 587B9E4F29301D8F00AC7927 /* BitBucketRepositories.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitBucketRepositories.swift; sourceTree = ""; }; - 587B9E5029301D8F00AC7927 /* BitBucketAccount+Token.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BitBucketAccount+Token.swift"; sourceTree = ""; }; - 587B9E5329301D8F00AC7927 /* GitCommit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitCommit.swift; sourceTree = ""; }; - 587B9E5429301D8F00AC7927 /* GitChangedFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitChangedFile.swift; sourceTree = ""; }; - 587B9E5529301D8F00AC7927 /* GitStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitStatus.swift; sourceTree = ""; }; - 587FB98F29C1246400B519DD /* EditorTabView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorTabView.swift; sourceTree = ""; }; - 58822509292C280D00E83CDE /* StatusBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarView.swift; sourceTree = ""; }; - 5882250B292C280D00E83CDE /* StatusBarMenuStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarMenuStyle.swift; sourceTree = ""; }; - 5882250C292C280D00E83CDE /* StatusBarBreakpointButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarBreakpointButton.swift; sourceTree = ""; }; - 5882250D292C280D00E83CDE /* StatusBarIndentSelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarIndentSelector.swift; sourceTree = ""; }; - 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarEncodingSelector.swift; sourceTree = ""; }; - 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarLineEndSelector.swift; sourceTree = ""; }; - 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarToggleUtilityAreaButton.swift; sourceTree = ""; }; - 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarCursorPositionLabel.swift; sourceTree = ""; }; - 58822513292C280D00E83CDE /* UtilityAreaView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaView.swift; sourceTree = ""; }; - 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaSplitTerminalButton.swift; sourceTree = ""; }; - 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaMaximizeButton.swift; sourceTree = ""; }; - 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaClearButton.swift; sourceTree = ""; }; - 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaFilterTextField.swift; sourceTree = ""; }; - 5882251A292C280D00E83CDE /* View+isHovering.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+isHovering.swift"; sourceTree = ""; }; - 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaViewModel.swift; sourceTree = ""; }; - 588847622992A2A200996D95 /* CEWorkspaceFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceFile.swift; sourceTree = ""; }; - 588847682992ABCA00996D95 /* Array+SortURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+SortURLs.swift"; sourceTree = ""; }; - 5894E59629FEF7740077E59C /* CEWorkspaceFile+Recursion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFile+Recursion.swift"; sourceTree = ""; }; 589F3E342936185400E1A4DA /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 58A2E40629C3975D005CB615 /* CEWorkspaceFileIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CEWorkspaceFileIcon.swift; sourceTree = ""; }; - 58A5DF7C2931787A00D1BD5D /* ShellClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShellClient.swift; sourceTree = ""; }; - 58A5DF7F29325B5A00D1BD5D /* GitClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitClient.swift; sourceTree = ""; }; - 58A5DF9E29339F6400D1BD5D /* KeybindingManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeybindingManager.swift; sourceTree = ""; }; - 58A5DF9F29339F6400D1BD5D /* CommandManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandManager.swift; sourceTree = ""; }; - 58A5DFA129339F6400D1BD5D /* default_keybindings.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = default_keybindings.json; sourceTree = ""; }; - 58AFAA2C2933C69E00482B53 /* EditorTabRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorTabRepresentable.swift; sourceTree = ""; }; - 58AFAA2D2933C69E00482B53 /* EditorItemID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorItemID.swift; sourceTree = ""; }; - 58D01C88293167DC00C5B6B4 /* Color+HEX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Color+HEX.swift"; sourceTree = ""; }; - 58D01C89293167DC00C5B6B4 /* Bundle+Info.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Info.swift"; sourceTree = ""; }; - 58D01C8A293167DC00C5B6B4 /* Date+Formatted.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Formatted.swift"; sourceTree = ""; }; - 58D01C8C293167DC00C5B6B4 /* String+SHA256.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+SHA256.swift"; sourceTree = ""; }; - 58D01C8D293167DC00C5B6B4 /* String+RemoveOccurrences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+RemoveOccurrences.swift"; sourceTree = ""; }; - 58D01C8E293167DC00C5B6B4 /* String+MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+MD5.swift"; sourceTree = ""; }; - 58D01C90293167DC00C5B6B4 /* CodeEditKeychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEditKeychain.swift; sourceTree = ""; }; - 58D01C91293167DC00C5B6B4 /* CodeEditKeychainConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEditKeychainConstants.swift; sourceTree = ""; }; - 58D01C93293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainSwiftAccessOptions.swift; sourceTree = ""; }; - 58F2EAAF292FB2B0004A9BDE /* ThemeSettingsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettingsView.swift; sourceTree = ""; }; 58F2EACE292FB2B0004A9BDE /* Documentation.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = Documentation.docc; sourceTree = ""; }; - 58F2EAD1292FB2B0004A9BDE /* SourceControlSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceControlSettings.swift; sourceTree = ""; }; - 58F2EAD2292FB2B0004A9BDE /* Settings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; - 58F2EAD4292FB2B0004A9BDE /* KeybindingsSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeybindingsSettings.swift; sourceTree = ""; }; - 58F2EAD6292FB2B0004A9BDE /* GeneralSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralSettings.swift; sourceTree = ""; }; - 58F2EAD8292FB2B0004A9BDE /* TextEditingSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextEditingSettings.swift; sourceTree = ""; }; - 58F2EADA292FB2B0004A9BDE /* TerminalSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TerminalSettings.swift; sourceTree = ""; }; - 58F2EADB292FB2B0004A9BDE /* SettingsData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsData.swift; sourceTree = ""; }; - 58F2EADD292FB2B0004A9BDE /* AccountsSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsSettings.swift; sourceTree = ""; }; - 58F2EAE0292FB2B0004A9BDE /* ThemeSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeSettings.swift; sourceTree = ""; }; - 58F2EAE1292FB2B0004A9BDE /* SoftwareUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoftwareUpdater.swift; sourceTree = ""; }; - 58FD7605291EA1CB0051D6E4 /* QuickActionsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickActionsViewModel.swift; sourceTree = ""; }; - 58FD7607291EA1CB0051D6E4 /* QuickActionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickActionsView.swift; sourceTree = ""; }; - 5994B6D92BD6B408006A4C5F /* Editor+TabSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Editor+TabSwitch.swift"; sourceTree = ""; }; - 5B698A092B262FA000DE9392 /* SearchSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSettingsView.swift; sourceTree = ""; }; - 5B698A0C2B26327800DE9392 /* SearchSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSettings.swift; sourceTree = ""; }; - 5B698A0E2B2636A700DE9392 /* SearchSettingsIgnoreGlobPatternItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSettingsIgnoreGlobPatternItemView.swift; sourceTree = ""; }; - 5B698A152B263BCE00DE9392 /* SearchSettingsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSettingsModel.swift; sourceTree = ""; }; - 5C4BB1E028212B1E00A92FB2 /* World.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = World.swift; sourceTree = ""; }; - 610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+FindAndReplace.swift"; sourceTree = ""; }; - 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuWithButtonStyle.swift; sourceTree = ""; }; - 611191F92B08CC9000D4459B /* SearchIndexer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndexer.swift; sourceTree = ""; }; - 611191FB2B08CCB800D4459B /* SearchIndexer+AsyncController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+AsyncController.swift"; sourceTree = ""; }; - 611191FD2B08CCD200D4459B /* SearchIndexer+File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+File.swift"; sourceTree = ""; }; - 611191FF2B08CCD700D4459B /* SearchIndexer+Memory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+Memory.swift"; sourceTree = ""; }; - 611192012B08CCDC00D4459B /* SearchIndexer+Search.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+Search.swift"; sourceTree = ""; }; - 611192032B08CCED00D4459B /* SearchIndexer+ProgressiveSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+ProgressiveSearch.swift"; sourceTree = ""; }; - 611192052B08CCF600D4459B /* SearchIndexer+Add.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+Add.swift"; sourceTree = ""; }; - 611192072B08CCFD00D4459B /* SearchIndexer+Terms.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+Terms.swift"; sourceTree = ""; }; - 6111920B2B08CD0B00D4459B /* SearchIndexer+InternalMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchIndexer+InternalMethods.swift"; sourceTree = ""; }; - 6130535B2B23933D00D767E3 /* MemoryIndexingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryIndexingTests.swift; sourceTree = ""; }; - 6130535E2B23A31300D767E3 /* MemorySearchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemorySearchTests.swift; sourceTree = ""; }; - 613053642B23A49300D767E3 /* TemporaryFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemporaryFile.swift; sourceTree = ""; }; - 6130536A2B24722C00D767E3 /* AsyncIndexingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncIndexingTests.swift; sourceTree = ""; }; - 613899B02B6E6FDC00A5CAF6 /* Collection+FuzzySearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+FuzzySearch.swift"; sourceTree = ""; }; - 613899B22B6E6FEE00A5CAF6 /* FuzzySearchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FuzzySearchable.swift; sourceTree = ""; }; - 613899B42B6E700300A5CAF6 /* FuzzySearchModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FuzzySearchModels.swift; sourceTree = ""; }; - 613899B62B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+LengthOfMatchingPrefix.swift"; sourceTree = ""; }; - 613899B82B6E704500A5CAF6 /* String+Normalise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Normalise.swift"; sourceTree = ""; }; - 613899BB2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+FuzzySearchable.swift"; sourceTree = ""; }; - 613899BF2B6E70FE00A5CAF6 /* FuzzySearchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FuzzySearchTests.swift; sourceTree = ""; }; - 613DF55D2B08DD5D00E9D902 /* FileHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileHelper.swift; sourceTree = ""; }; - 61538B8F2B111FE800A88846 /* String+AppearancesOfSubstring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AppearancesOfSubstring.swift"; sourceTree = ""; }; - 61538B922B11201900A88846 /* String+Character.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Character.swift"; sourceTree = ""; }; - 617DB3CF2C25AFAE00B58BFE /* TaskNotificationHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskNotificationHandler.swift; sourceTree = ""; }; - 617DB3D22C25AFEA00B58BFE /* TaskNotificationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskNotificationModel.swift; sourceTree = ""; }; - 617DB3D52C25B02D00B58BFE /* TaskNotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskNotificationView.swift; sourceTree = ""; }; - 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CECircularProgressView.swift; sourceTree = ""; }; - 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskNotificationsDetailView.swift; sourceTree = ""; }; - 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityViewer.swift; sourceTree = ""; }; - 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskNotificationHandlerTests.swift; sourceTree = ""; }; - 61816B822C81DC2C00C71BF7 /* SearchField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchField.swift; sourceTree = ""; }; - 618725A02C29EFCC00987354 /* SchemeDropDownView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchemeDropDownView.swift; sourceTree = ""; }; - 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceMenuItemView.swift; sourceTree = ""; }; - 618725A52C29F02500987354 /* DropdownMenuItemStyleModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropdownMenuItemStyleModifier.swift; sourceTree = ""; }; - 618725A72C29F05500987354 /* OptionMenuItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionMenuItemView.swift; sourceTree = ""; }; - 618725AA2C29F2C000987354 /* TaskDropDownView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskDropDownView.swift; sourceTree = ""; }; - 618725B12C2DBC0C00987354 /* TaskOutputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskOutputView.swift; sourceTree = ""; }; - 618725B32C2DBC2800987354 /* TaskOutputActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskOutputActionsView.swift; sourceTree = ""; }; - 6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+FindTests.swift"; sourceTree = ""; }; - 6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+FindAndReplaceTests.swift"; sourceTree = ""; }; - 6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+SearchState+IndexTests.swift"; sourceTree = ""; }; - 61A3E3D82C33126F00076BD3 /* CEWorkspaceSettingsData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceSettingsData.swift; sourceTree = ""; }; - 61A3E3DC2C33132F00076BD3 /* CEWorkspaceSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceSettingsView.swift; sourceTree = ""; }; - 61A3E3DE2C3318C900076BD3 /* CEWorkspaceSettingsTaskListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceSettingsTaskListView.swift; sourceTree = ""; }; - 61A3E3E02C331B4A00076BD3 /* AddCETaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCETaskView.swift; sourceTree = ""; }; - 61A3E3E22C331B5200076BD3 /* EditCETaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCETaskView.swift; sourceTree = ""; }; - 61A3E3E42C33202300076BD3 /* CETaskFormView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CETaskFormView.swift; sourceTree = ""; }; - 61A3E3E62C33383100076BD3 /* EnvironmentVariableListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvironmentVariableListItem.swift; sourceTree = ""; }; - 61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Find.swift"; sourceTree = ""; }; - 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Index.swift"; sourceTree = ""; }; - 61C7E82E2C6CDBA500845336 /* Theme+FuzzySearchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+FuzzySearchable.swift"; sourceTree = ""; }; - 61D435CB2C29699800D032B8 /* TaskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskManager.swift; sourceTree = ""; }; - 61D435CD2C2969C300D032B8 /* CEActiveTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEActiveTask.swift; sourceTree = ""; }; - 61D435D12C2969D800D032B8 /* CETaskStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CETaskStatus.swift; sourceTree = ""; }; - 61FB03AB2C3C1FDF001B3671 /* ShellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShellTests.swift; sourceTree = ""; }; - 61FB03AD2C3C2493001B3671 /* CEActiveTaskTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEActiveTaskTests.swift; sourceTree = ""; }; - 61FB03AF2C3C76AF001B3671 /* TaskManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskManagerTests.swift; sourceTree = ""; }; - 661EF7B72BEE215300C3E577 /* ImageFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFileView.swift; sourceTree = ""; }; - 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingFileView.swift; sourceTree = ""; }; - 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSTableViewWrapper.swift; sourceTree = ""; }; - 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchResultLabel.swift; sourceTree = ""; }; - 669A50502C380C1800304CD8 /* String+Escaped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Escaped.swift"; sourceTree = ""; }; - 669A50522C380C8E00304CD8 /* Collection+subscript_safe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+subscript_safe.swift"; sourceTree = ""; }; - 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; - 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; - 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarFileInfoView.swift; sourceTree = ""; }; - 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateStatusBarInfo.swift; sourceTree = ""; }; - 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageDimensions.swift; sourceTree = ""; }; - 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFFileView.swift; sourceTree = ""; }; - 66F370332BEE537B00D3B823 /* NonTextFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTextFileView.swift; sourceTree = ""; }; - 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = ""; }; - 6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Listeners.swift"; sourceTree = ""; }; - 6C07383A2D284ECA0025CBE3 /* TasksMenuUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksMenuUITests.swift; sourceTree = ""; }; - 6C08249B2C556F7400A0751E /* TerminalCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalCache.swift; sourceTree = ""; }; - 6C08249D2C55768400A0751E /* UtilityAreaTerminal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminal.swift; sourceTree = ""; }; - 6C092ED92A53A58600489202 /* EditorLayout+StateRestoration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EditorLayout+StateRestoration.swift"; sourceTree = ""; }; - 6C092EDF2A53BFCF00489202 /* WorkspaceStateKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceStateKey.swift; sourceTree = ""; }; - 6C0D0C6729E861B000AE4D3F /* SettingsSidebarFix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSidebarFix.swift; sourceTree = ""; }; - 6C147C3D29A3281D0089B630 /* Editor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Editor.swift; sourceTree = ""; }; - 6C147C3E29A3281D0089B630 /* EditorLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorLayout.swift; sourceTree = ""; }; - 6C147C3F29A328560089B630 /* SplitViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewData.swift; sourceTree = ""; }; - 6C147C4829A32A080089B630 /* EditorLayoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorLayoutView.swift; sourceTree = ""; }; - 6C147C4A29A32A7B0089B630 /* Environment+SplitEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Environment+SplitEditor.swift"; sourceTree = ""; }; - 6C147C4C29A32AA30089B630 /* EditorAreaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorAreaView.swift; sourceTree = ""; }; - 6C14CEAF28777D3C001468FE /* FindNavigatorListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorListViewController.swift; sourceTree = ""; }; - 6C14CEB22877A68F001468FE /* FindNavigatorMatchListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorMatchListCell.swift; sourceTree = ""; }; - 6C186209298BF5A800C663EA /* RecentProjectsListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentProjectsListView.swift; sourceTree = ""; }; - 6C1CC9972B1E770B0002349B /* AsyncFileIterator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncFileIterator.swift; sourceTree = ""; }; - 6C1CC99A2B1E7CBC0002349B /* FindNavigatorIndexBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorIndexBar.swift; sourceTree = ""; }; - 6C1F3DA12C18C55800F6DEF6 /* ShellIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShellIntegrationTests.swift; sourceTree = ""; }; - 6C23842E2C796B4C003FBDD4 /* GitChangedFileLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitChangedFileLabel.swift; sourceTree = ""; }; - 6C278CC62C93971F0066F6D9 /* LSPContentCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LSPContentCoordinator.swift; sourceTree = ""; wrapsLines = 0; }; - 6C2C155729B4F49100EA60A5 /* SplitViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewItem.swift; sourceTree = ""; }; - 6C2C155929B4F4CC00EA60A5 /* Variadic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Variadic.swift; sourceTree = ""; }; - 6C2C155C29B4F4E500EA60A5 /* SplitViewReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewReader.swift; sourceTree = ""; }; - 6C2C156029B4F52F00EA60A5 /* SplitViewModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewModifiers.swift; sourceTree = ""; }; - 6C3B4CD02D0E2C2900C6759E /* SemanticTokenMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SemanticTokenMap.swift; sourceTree = ""; }; - 6C3B4CD32D0E2CB000C6759E /* SemanticTokenMapTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SemanticTokenMapTests.swift; sourceTree = ""; }; - 6C3E12D22CC830D700DD12F1 /* RecentProjectsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentProjectsStore.swift; sourceTree = ""; }; - 6C3E12D52CC8388000DD12F1 /* URL+componentCompare.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+componentCompare.swift"; sourceTree = ""; }; - 6C3E12D72CC83CB600DD12F1 /* RecentProjectsMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentProjectsMenu.swift; sourceTree = ""; }; - 6C4104E2297C87A000F472BA /* BlurButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurButtonStyle.swift; sourceTree = ""; }; - 6C4104E5297C884F00F472BA /* AboutDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutDetailView.swift; sourceTree = ""; }; - 6C4104E8297C970F00F472BA /* AboutDefaultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutDefaultView.swift; sourceTree = ""; }; - 6C48B5C42C0A2835001E9955 /* FileEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileEncoding.swift; sourceTree = ""; }; - 6C48B5CD2C0C1BE4001E9955 /* Shell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shell.swift; sourceTree = ""; }; - 6C48B5D02C0D0519001E9955 /* ShellIntegration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShellIntegration.swift; sourceTree = ""; }; - 6C48B5D32C0D0743001E9955 /* codeedit_shell_integration_env.zsh */ = {isa = PBXFileReference; lastKnownFileType = text; path = codeedit_shell_integration_env.zsh; sourceTree = ""; }; - 6C48B5D52C0D08C5001E9955 /* codeedit_shell_integration_profile.zsh */ = {isa = PBXFileReference; lastKnownFileType = text; path = codeedit_shell_integration_profile.zsh; sourceTree = ""; }; - 6C48B5D72C0D5DB5001E9955 /* codeedit_shell_integration_login.zsh */ = {isa = PBXFileReference; lastKnownFileType = text; name = codeedit_shell_integration_login.zsh; path = ../Features/TerminalEmulator/codeedit_shell_integration_login.zsh; sourceTree = ""; }; - 6C48B5D92C0D5FC5001E9955 /* CurrentUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentUser.swift; sourceTree = ""; }; - 6C48D8F12972DAFC00D6D205 /* Env+IsFullscreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Env+IsFullscreen.swift"; sourceTree = ""; }; - 6C48D8F32972DB1A00D6D205 /* Env+Window.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Env+Window.swift"; sourceTree = ""; }; - 6C48D8F62972E5F300D6D205 /* WindowObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowObserver.swift; sourceTree = ""; }; - 6C4E37F52C73DA5200AEE7B5 /* UtilityAreaTerminalSidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalSidebar.swift; sourceTree = ""; }; - 6C510CB72D2E4639006EBE85 /* XCUITest+waitForNonExistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUITest+waitForNonExistence.swift"; sourceTree = ""; }; - 6C510CBA2D2ECD68006EBE85 /* UtilityAreaViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaViewModelTests.swift; sourceTree = ""; }; - 6C5228B429A868BD00AC48F6 /* Environment+ContentInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Environment+ContentInsets.swift"; sourceTree = ""; }; - 6C53AAD729A6C4FD00EE9ED6 /* SplitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitView.swift; sourceTree = ""; }; - 6C578D8029CD294800DC73B2 /* ExtensionActivatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionActivatorView.swift; sourceTree = ""; }; - 6C578D8329CD343800DC73B2 /* ExtensionDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDetailView.swift; sourceTree = ""; }; - 6C578D8629CD345900DC73B2 /* ExtensionSceneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionSceneView.swift; sourceTree = ""; }; - 6C578D8829CD36E400DC73B2 /* Commands+ForEach.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Commands+ForEach.swift"; sourceTree = ""; }; - 6C578D8B29CD372700DC73B2 /* ExtensionCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionCommands.swift; sourceTree = ""; }; - 6C5B63DD29C76213005454BA /* WindowCodeFileView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowCodeFileView.swift; sourceTree = ""; }; - 6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusedValues.swift; sourceTree = ""; }; - 6C5FDF7929E6160000BC08C0 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = ""; }; - 6C6362D32C3E321A0025570D /* Editor+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Editor+History.swift"; sourceTree = ""; }; 6C67413D2C44A28C00AABDF5 /* ProjectNavigatorViewController+DataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+DataSource.swift"; sourceTree = ""; }; 6C67413F2C44A2A200AABDF5 /* ProjectNavigatorViewController+Delegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+Delegate.swift"; sourceTree = ""; }; - 6C6BD6EE29CD12E900235D17 /* ExtensionManagerWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionManagerWindow.swift; sourceTree = ""; }; - 6C6BD6F029CD13FA00235D17 /* ExtensionDiscovery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDiscovery.swift; sourceTree = ""; }; - 6C6BD6F529CD145F00235D17 /* ExtensionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionInfo.swift; sourceTree = ""; }; - 6C6BD6FB29CD152400235D17 /* codeedit.extension.appextensionpoint */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = codeedit.extension.appextensionpoint; sourceTree = ""; }; - 6C6BD70029CD172700235D17 /* ExtensionsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionsListView.swift; sourceTree = ""; }; - 6C6BD70329CD17B600235D17 /* ExtensionsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionsManager.swift; sourceTree = ""; }; - 6C7256D629A3D7D000C2D3E0 /* SplitViewControllerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewControllerView.swift; sourceTree = ""; }; - 6C7D6D452C9092EC00B69EE0 /* BufferingServerConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BufferingServerConnection.swift; sourceTree = ""; }; - 6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+focusedValue.swift"; sourceTree = ""; }; - 6C81916629B3E80700B75C92 /* ModifierKeysObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModifierKeysObserver.swift; sourceTree = ""; }; - 6C82D6B229BFD88700495C54 /* NavigateCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigateCommands.swift; sourceTree = ""; }; - 6C82D6B829BFE34900495C54 /* HelpCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelpCommands.swift; sourceTree = ""; }; - 6C82D6BB29C00CD900495C54 /* FirstResponderPropertyWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstResponderPropertyWrapper.swift; sourceTree = ""; }; - 6C82D6C529C012AD00495C54 /* NSApp+openWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSApp+openWindow.swift"; sourceTree = ""; }; - 6C85F7552C3CA638008E9836 /* EditorHistoryMenus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorHistoryMenus.swift; sourceTree = ""; }; - 6C91D57129B176FF0059A90D /* EditorManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorManager.swift; sourceTree = ""; }; - 6C96191B2C3F27E3009733CE /* ProjectNavigatorUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorUITests.swift; sourceTree = ""; }; - 6C9619212C3F27F1009733CE /* Query.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; }; - 6C9619232C3F2809009733CE /* ProjectPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectPath.swift; sourceTree = ""; }; 6C9619262C3F285C009733CE /* CodeEditTestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CodeEditTestPlan.xctestplan; sourceTree = ""; }; - 6C97EBCB2978760400302F95 /* AcknowledgementsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementsWindowController.swift; sourceTree = ""; }; - 6C9AE66E2D148DD200FAE8D2 /* URL+FindWorkspace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+FindWorkspace.swift"; sourceTree = ""; }; - 6C9AE6702D14A9F700FAE8D2 /* LazyServiceWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyServiceWrapper.swift; sourceTree = ""; }; - 6CA1AE942B46950000378EAB /* EditorInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorInstance.swift; sourceTree = ""; }; - 6CABB1A029C5593800340467 /* SearchPanelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPanelView.swift; sourceTree = ""; }; - 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFileManager+FileManagement.swift"; sourceTree = ""; }; - 6CB94CFD2C9F1C9A00E8651C /* TextView+LSPRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TextView+LSPRange.swift"; sourceTree = ""; }; - 6CBD1BC52978DE53006639D5 /* Font+Caption3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font+Caption3.swift"; sourceTree = ""; }; - 6CBE1CFA2B71DAA6003AC32E /* Loopable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Loopable.swift; sourceTree = ""; }; - 6CC17B502C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+NSOutlineViewDataSource.swift"; sourceTree = ""; }; - 6CC17B522C43314000834E2C /* ProjectNavigatorViewController+NSOutlineViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+NSOutlineViewDelegate.swift"; sourceTree = ""; }; - 6CC17B5A2C44258700834E2C /* WindowControllerPropertyWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowControllerPropertyWrapper.swift; sourceTree = ""; }; - 6CC3D1FA2D1475EC00822B65 /* TextView+SemanticTokenRangeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TextView+SemanticTokenRangeProvider.swift"; sourceTree = ""; }; - 6CC3D1FC2D14761A00822B65 /* SemanticTokenMapRangeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SemanticTokenMapRangeProvider.swift; sourceTree = ""; }; - 6CC9E4B129B5669900C97388 /* Environment+ActiveEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Environment+ActiveEditor.swift"; sourceTree = ""; }; - 6CCEE7F42D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalPicker.swift; sourceTree = ""; }; - 6CD035892C3461160091E1F4 /* KeyWindowControllerObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyWindowControllerObserver.swift; sourceTree = ""; }; - 6CD03B6929FC773F001BD1D0 /* SettingsInjector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInjector.swift; sourceTree = ""; }; - 6CD26C6D2C8EA1E600ADBA38 /* LanguageServerFileMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageServerFileMap.swift; sourceTree = ""; }; - 6CD26C762C8EA83900ADBA38 /* URL+absolutePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+absolutePath.swift"; sourceTree = ""; }; - 6CD26C782C8EA8A500ADBA38 /* LSPCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LSPCache.swift; sourceTree = ""; }; - 6CD26C792C8EA8A500ADBA38 /* LSPCache+Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LSPCache+Data.swift"; sourceTree = ""; }; - 6CD26C7C2C8EA8F400ADBA38 /* LanguageServer+DocumentSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentSync.swift"; sourceTree = ""; }; - 6CD26C802C8F8A4400ADBA38 /* LanguageIdentifier+CodeLanguage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LanguageIdentifier+CodeLanguage.swift"; sourceTree = ""; }; - 6CD26C892C8F91ED00ADBA38 /* LanguageServer+DocumentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LanguageServer+DocumentTests.swift"; sourceTree = ""; }; - 6CDA84AC284C1BA000C1CC3A /* EditorTabBarContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarContextMenu.swift; sourceTree = ""; }; - 6CDAFDDC2D35B2A0002B2D47 /* CEWorkspaceFileManager+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFileManager+Error.swift"; sourceTree = ""; }; - 6CDAFDDE2D35DADD002B2D47 /* String+ValidFileName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ValidFileName.swift"; sourceTree = ""; }; - 6CE21E802C643D8F0031B056 /* CETerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CETerminalView.swift; sourceTree = ""; }; - 6CE622682A2A174A0013085C /* InspectorTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorTab.swift; sourceTree = ""; }; - 6CE6226A2A2A1C730013085C /* UtilityAreaTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTab.swift; sourceTree = ""; }; - 6CE6226D2A2A1CDE0013085C /* NavigatorTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigatorTab.swift; sourceTree = ""; }; - 6CED16E32A3E660D000EC962 /* String+Lines.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Lines.swift"; sourceTree = ""; }; - 6CFBA54A2C4E168A00E3A914 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; - 6CFBA54C2C4E16C900E3A914 /* WindowCloseCommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowCloseCommandTests.swift; sourceTree = ""; }; - 6CFC0C3B2D381D2000F09CD0 /* ProjectNavigatorFileManagementUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorFileManagementUITests.swift; sourceTree = ""; }; - 6CFC0C3D2D382B3900F09CD0 /* UI TESTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "UI TESTING.md"; sourceTree = ""; }; - 6CFF967329BEBCC300182D6F /* FindCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindCommands.swift; sourceTree = ""; }; - 6CFF967529BEBCD900182D6F /* FileCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCommands.swift; sourceTree = ""; }; - 6CFF967729BEBCF600182D6F /* MainCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainCommands.swift; sourceTree = ""; }; - 6CFF967929BEBD2400182D6F /* ViewCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewCommands.swift; sourceTree = ""; }; - 6CFF967B29BEBD5200182D6F /* WindowCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowCommands.swift; sourceTree = ""; }; - 7755664F2C27FD1B001E7A4D /* CodeFileDocument+UTTypeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CodeFileDocument+UTTypeTests.swift"; sourceTree = ""; }; - 77A01E292BB424EA00F0EA38 /* CEWorkspaceSettingsData+ProjectSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceSettingsData+ProjectSettings.swift"; sourceTree = ""; }; - 77A01E2D2BB4261200F0EA38 /* CEWorkspaceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceSettings.swift; sourceTree = ""; }; - 77A01E422BBC3A2800F0EA38 /* CETask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CETask.swift; sourceTree = ""; }; - 77A01E6C2BC3EA2A00F0EA38 /* NSWindow+Child.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Child.swift"; sourceTree = ""; }; - 77EF6C032C57DE4B00984B69 /* URL+ResouceValues.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+ResouceValues.swift"; sourceTree = ""; }; - 77EF6C0A2C60C80800984B69 /* URL+Filename.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Filename.swift"; sourceTree = ""; }; - 77EF6C0C2C60E23400984B69 /* CEWorkspaceFileManager+DirectoryEvents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFileManager+DirectoryEvents.swift"; sourceTree = ""; }; - 850C630F29D6B01D00E1444C /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - 850C631129D6B03400E1444C /* SettingsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsPage.swift; sourceTree = ""; }; - 852C7E322A587279006BA599 /* SearchableSettingsPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchableSettingsPage.swift; sourceTree = ""; }; - 852E62002A5C17E500447138 /* PageAndSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageAndSettings.swift; sourceTree = ""; }; - 85745D622A38F8D900089AAB /* String+HighlightOccurrences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+HighlightOccurrences.swift"; sourceTree = ""; }; - 85773E1D2A3E0A1F00C5D926 /* SettingsSearchResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchResult.swift; sourceTree = ""; }; - 85E412292A46C8CA00183F2B /* LocationsSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsSettings.swift; sourceTree = ""; }; - 8B9A0E162B9FE84B007E2DBF /* Pre.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Pre.xcconfig; sourceTree = ""; }; - 9D36E1BE2B5E7D7500443C41 /* GitBranchesGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitBranchesGroup.swift; sourceTree = ""; }; - B6041F4C29D7A4E9000F3454 /* SettingsPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsPageView.swift; sourceTree = ""; }; - B6041F5129D7D6D6000F3454 /* SettingsWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsWindow.swift; sourceTree = ""; }; - B607181C2B0C5BE3009CDAB4 /* GitClient+Stash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Stash.swift"; sourceTree = ""; }; - B607181F2B0C6CE7009CDAB4 /* GitStashEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitStashEntry.swift; sourceTree = ""; }; - B60718302B15A9A3009CDAB4 /* CEOutlineGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEOutlineGroup.swift; sourceTree = ""; }; - B60718362B170638009CDAB4 /* SourceControlRenameBranchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlRenameBranchView.swift; sourceTree = ""; }; - B607183E2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceControlNavigatorRepositoryView+contextMenu.swift"; sourceTree = ""; }; - B60718412B17DB93009CDAB4 /* SourceControlNavigatorRepositoryView+outlineGroupData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceControlNavigatorRepositoryView+outlineGroupData.swift"; sourceTree = ""; }; - B60718432B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorRepositoryItem.swift; sourceTree = ""; }; - B60718452B17DC15009CDAB4 /* RepoOutlineGroupItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepoOutlineGroupItem.swift; sourceTree = ""; }; - B607184B2B17E037009CDAB4 /* SourceControlStashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlStashView.swift; sourceTree = ""; }; - B60BE8BC297A167600841125 /* AcknowledgementRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementRowView.swift; sourceTree = ""; }; - B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeEditWindowControllerExtensions.swift; sourceTree = ""; }; - B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayButtonStyle.swift; sourceTree = ""; }; - B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollOffsetPreferenceKey.swift; sourceTree = ""; }; - B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentInspectorView.swift; sourceTree = ""; }; - B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentNotificationsView.swift; sourceTree = ""; }; - B61A606029F188AB009B43F9 /* ExternalLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLink.swift; sourceTree = ""; }; - B61A606829F4481A009B43F9 /* MonospacedFontPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonospacedFontPicker.swift; sourceTree = ""; }; - B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; }; - B624232F2C21EE280096668B /* ThemeModel+CRUD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ThemeModel+CRUD.swift"; sourceTree = ""; }; - B628B7922B18369800F9775A /* GitClient+Validate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Validate.swift"; sourceTree = ""; }; - B628B7B62B223BAD00F9775A /* FindModePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindModePicker.swift; sourceTree = ""; }; - B62AEDA92A1FCBE5009A9F52 /* WorkspacePanelTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspacePanelTabBar.swift; sourceTree = ""; }; - B62AEDB22A1FD95B009A9F52 /* UtilityAreaTerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalView.swift; sourceTree = ""; }; - B62AEDB42A1FE295009A9F52 /* UtilityAreaDebugView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaDebugView.swift; sourceTree = ""; }; - B62AEDB72A1FE2DC009A9F52 /* UtilityAreaOutputView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaOutputView.swift; sourceTree = ""; }; - B62AEDBB2A210DBB009A9F52 /* UtilityAreaTerminalTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalTab.swift; sourceTree = ""; }; - B62AEDC82A2704F3009A9F52 /* UtilityAreaTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTabView.swift; sourceTree = ""; }; - B62AEDD02A27B264009A9F52 /* View+paneToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+paneToolbar.swift"; sourceTree = ""; }; - B62AEDD32A27B29F009A9F52 /* PaneToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneToolbar.swift; sourceTree = ""; }; - B62AEDD62A27B3D0009A9F52 /* UtilityAreaTabViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityAreaTabViewModel.swift; sourceTree = ""; }; - B62AEDDA2A27C1B3009A9F52 /* OSLogType+Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OSLogType+Color.swift"; sourceTree = ""; }; - B63F6A782C5618EF003B4342 /* TrimWhitespaceFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrimWhitespaceFormatter.swift; sourceTree = ""; }; - B63F6A7A2C561BCB003B4342 /* RegexFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegexFormatter.swift; sourceTree = ""; }; - B640A99D29E2184700715F20 /* SettingsForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsForm.swift; sourceTree = ""; }; - B640A9A029E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+NavigationBarBackButtonVisible.swift"; sourceTree = ""; }; B658FB2C27DA9E0F00EA4DBD /* CodeEdit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CodeEdit.app; sourceTree = BUILT_PRODUCTS_DIR; }; - B658FB3127DA9E0F00EA4DBD /* WorkspaceView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = WorkspaceView.swift; sourceTree = ""; tabWidth = 4; }; - B658FB3327DA9E1000EA4DBD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - B658FB3627DA9E1000EA4DBD /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - B658FB3827DA9E1000EA4DBD /* CodeEdit.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = CodeEdit.entitlements; sourceTree = ""; }; B658FB3D27DA9E1000EA4DBD /* CodeEditTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CodeEditTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; B658FB4727DA9E1000EA4DBD /* CodeEditUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CodeEditUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - B65B10EB2B073913002852CF /* CEContentUnavailableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEContentUnavailableView.swift; sourceTree = ""; }; - B65B10EE2B07C454002852CF /* GitClient+Remote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Remote.swift"; sourceTree = ""; }; - B65B10F12B07D34F002852CF /* GitRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitRemote.swift; sourceTree = ""; }; - B65B10F42B081A0C002852CF /* SourceControlAddExistingRemoteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlAddExistingRemoteView.swift; sourceTree = ""; }; - B65B10F72B081A34002852CF /* SourceControlNavigatorNoRemotesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorNoRemotesView.swift; sourceTree = ""; }; - B65B10FA2B08B054002852CF /* Divided.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Divided.swift; sourceTree = ""; }; - B65B10FD2B08B07D002852CF /* SourceControlNavigatorChangesList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangesList.swift; sourceTree = ""; }; - B65B11002B09D5D4002852CF /* GitClient+Pull.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Pull.swift"; sourceTree = ""; }; - B65B11032B09DB1C002852CF /* GitClient+Fetch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Fetch.swift"; sourceTree = ""; }; - B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationManager+Delegate.swift"; sourceTree = ""; }; - B66460582D600E9500EC1411 /* NotificationManager+System.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationManager+System.swift"; sourceTree = ""; }; - B664C3AF2B965F6C00816B4E /* NavigationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSettings.swift; sourceTree = ""; }; - B664C3B22B96634F00816B4E /* NavigationSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSettingsView.swift; sourceTree = ""; }; - B66A4E4429C8E86D004573B4 /* CommandsFixes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandsFixes.swift; sourceTree = ""; }; - B66A4E4B29C9179B004573B4 /* CodeEditApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEditApp.swift; sourceTree = ""; }; - B66A4E4E29C917B8004573B4 /* WelcomeWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomeWindow.swift; sourceTree = ""; }; - B66A4E5029C917D5004573B4 /* AboutWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindow.swift; sourceTree = ""; }; - B66A4E5229C91831004573B4 /* CodeEditCommands.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEditCommands.swift; sourceTree = ""; }; - B66A4E5529C918A0004573B4 /* SceneID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneID.swift; sourceTree = ""; }; - B67431CB2C3E45F30047FCA6 /* SourceControlSwitchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlSwitchView.swift; sourceTree = ""; }; - B67700F82D2A2662004FD61F /* WorkspacePanelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspacePanelView.swift; sourceTree = ""; }; - B67DB0EE2AF3E381002DC647 /* PaneTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaneTextField.swift; sourceTree = ""; }; - B67DB0F52AFC2A7A002DC647 /* FindNavigatorToolbarBottom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorToolbarBottom.swift; sourceTree = ""; }; - B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconButtonStyle.swift; sourceTree = ""; }; - B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconToggleStyle.swift; sourceTree = ""; }; - B67DBB872CD51C51007F4F18 /* Limiter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Limiter.swift; sourceTree = ""; }; - B67DBB892CD5D8E4007F4F18 /* IgnoredFilesListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IgnoredFilesListView.swift; sourceTree = ""; }; - B67DBB8B2CD5D9B4007F4F18 /* IgnorePatternModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IgnorePatternModel.swift; sourceTree = ""; }; - B67DBB8F2CD5EA71007F4F18 /* GlobPattern.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobPattern.swift; sourceTree = ""; }; - B67DBB912CD5EAA4007F4F18 /* GlobPatternList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobPatternList.swift; sourceTree = ""; }; - B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobPatternListItem.swift; sourceTree = ""; }; - B68108032C60287F008B27C1 /* StartTaskToolbarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartTaskToolbarButton.swift; sourceTree = ""; }; - B685DE7829CC9CCD002860C8 /* StatusBarIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarIcon.swift; sourceTree = ""; }; - B68DE5D72D5A61E5009A43EF /* CENotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CENotification.swift; sourceTree = ""; }; - B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationBannerView.swift; sourceTree = ""; }; - B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationToolbarItem.swift; sourceTree = ""; }; - B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; - B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPanelView.swift; sourceTree = ""; }; - B6966A272C2F683300259C2D /* SourceControlPullView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlPullView.swift; sourceTree = ""; }; - B6966A292C2F687A00259C2D /* SourceControlFetchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlFetchView.swift; sourceTree = ""; }; - B6966A2D2C3056AD00259C2D /* SourceControlCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlCommands.swift; sourceTree = ""; }; - B6966A2F2C33282200259C2D /* RemoteBranchPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteBranchPicker.swift; sourceTree = ""; }; - B6966A312C3348D300259C2D /* WorkspaceSheets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceSheets.swift; sourceTree = ""; }; - B6966A332C34996B00259C2D /* SourceControlManager+GitClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SourceControlManager+GitClient.swift"; sourceTree = ""; }; - B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIcon.swift; sourceTree = ""; }; - B697937929FF5668002027EC /* AccountsSettingsAccountLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsAccountLink.swift; sourceTree = ""; }; - B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPanelViewModel.swift; sourceTree = ""; }; - B69BFDC62B0686910050D9A6 /* GitClient+Initiate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Initiate.swift"; sourceTree = ""; }; - B69D3EDD2C5E85A2005CF43A /* StopTaskToolbarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopTaskToolbarButton.swift; sourceTree = ""; }; - B69D3EE02C5F5357005CF43A /* TaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskView.swift; sourceTree = ""; }; - B69D3EE22C5F536B005CF43A /* ActiveTaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveTaskView.swift; sourceTree = ""; }; - B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksPopoverMenuItem.swift; sourceTree = ""; }; - B6A43C5C29FC4AF00027E0E0 /* CreateSSHKeyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateSSHKeyView.swift; sourceTree = ""; }; - B6AB09A02AAABAAE0003A3A6 /* EditorTabs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabs.swift; sourceTree = ""; }; - B6AB09A22AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarLeadingAccessories.swift; sourceTree = ""; }; - B6AB09A42AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarTrailingAccessories.swift; sourceTree = ""; }; - B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+actionBar.swift"; sourceTree = ""; }; - B6B2D79E2CE8794200379967 /* GitConfigRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitConfigRepresentable.swift; sourceTree = ""; }; - B6B2D7A02CE8797400379967 /* GitConfigExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitConfigExtensions.swift; sourceTree = ""; }; - B6BF41412C2C672A003AB4B3 /* SourceControlPushView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlPushView.swift; sourceTree = ""; }; - B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorHistoryView.swift; sourceTree = ""; }; - B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitDetailsView.swift; sourceTree = ""; }; - B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorItemView.swift; sourceTree = ""; }; - B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitDetailsHeaderView.swift; sourceTree = ""; }; - B6C6A429297716A500A3D28F /* EditorTabCloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabCloseButton.swift; sourceTree = ""; }; - B6C6A42D29771A8D00A3D28F /* EditorTabButtonStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorTabButtonStyle.swift; sourceTree = ""; }; - B6C6A42F29771F7100A3D28F /* EditorTabBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBackground.swift; sourceTree = ""; }; - B6CFD80C2C1B9A8000E63F1A /* FontWeightPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontWeightPicker.swift; sourceTree = ""; }; - B6CFD8102C20A8EE00E63F1A /* NSFont+WithWeight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSFont+WithWeight.swift"; sourceTree = ""; }; - B6D7EA582971078500301FAC /* InspectorSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorSection.swift; sourceTree = ""; }; - B6D7EA5B297107DD00301FAC /* InspectorField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorField.swift; sourceTree = ""; }; - B6DCDAC52CCDE2B90099FBF9 /* InstantPopoverModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPopoverModifier.swift; sourceTree = ""; }; - B6E38E012CD3E62E00F4E65A /* GitConfigClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitConfigClient.swift; sourceTree = ""; }; - B6E41C6F29DD157F0088F9F4 /* AccountsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsView.swift; sourceTree = ""; }; - B6E41C7329DD40010088F9F4 /* View+HideSidebarToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+HideSidebarToggle.swift"; sourceTree = ""; }; - B6E41C7829DE02800088F9F4 /* AccountSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSelectionView.swift; sourceTree = ""; }; - B6E41C7B29DE2B110088F9F4 /* AccountsSettingsProviderRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsProviderRow.swift; sourceTree = ""; }; - B6E41C8A29DE7AE80088F9F4 /* AccountsSettingsSigninView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsSigninView.swift; sourceTree = ""; }; - B6E41C8E29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsSettingsDetailsView.swift; sourceTree = ""; }; - B6E41C9329DEAE260088F9F4 /* SourceControlAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlAccount.swift; sourceTree = ""; }; - B6E55C3A2A95368E003ECC7D /* EditorTabsOverflowShadow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabsOverflowShadow.swift; sourceTree = ""; }; - B6EA1FE429DA33DB001BF195 /* ThemeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeModel.swift; sourceTree = ""; }; - B6EA1FE629DA341D001BF195 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; - B6EA1FF429DA380E001BF195 /* TextEditingSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEditingSettingsView.swift; sourceTree = ""; }; - B6EA1FF729DB78DB001BF195 /* ThemeSettingThemeRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingThemeRow.swift; sourceTree = ""; }; - B6EA1FFA29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsThemeDetails.swift; sourceTree = ""; }; - B6EA1FFC29DB792C001BF195 /* ThemeSettingsColorPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsColorPreview.swift; sourceTree = ""; }; - B6EA1FFF29DB7966001BF195 /* SettingsColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsColorPicker.swift; sourceTree = ""; }; - B6EA200129DB7F81001BF195 /* View+ConstrainHeightToWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+ConstrainHeightToWindow.swift"; sourceTree = ""; }; - B6EE988F27E8879A00CDD8AB /* InspectorAreaView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = InspectorAreaView.swift; sourceTree = ""; tabWidth = 4; }; - B6F0516F29D9E36800D72287 /* LocationsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsSettingsView.swift; sourceTree = ""; }; - B6F0517629D9E3AD00D72287 /* SourceControlGeneralView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlGeneralView.swift; sourceTree = ""; }; - B6F0517829D9E3C900D72287 /* SourceControlGitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlGitView.swift; sourceTree = ""; }; - B6F0517A29D9E46400D72287 /* SourceControlSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlSettingsView.swift; sourceTree = ""; }; - B6F0517C29D9E4B100D72287 /* TerminalSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSettingsView.swift; sourceTree = ""; }; - B6FA3F872BF41C940023DE9C /* ThemeSettingsThemeToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsThemeToken.swift; sourceTree = ""; }; B6FF04772B6C08AC002C2C78 /* DefaultThemes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = DefaultThemes; sourceTree = ""; }; - D7012EE727E757850001E1EF /* FindNavigatorView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = FindNavigatorView.swift; sourceTree = ""; tabWidth = 4; }; - D7211D4227E066CE008F2ED7 /* Localized+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Localized+Ex.swift"; sourceTree = ""; }; - D7211D4827E06BFE008F2ED7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - D7DC4B75298FFBE900D6C83D /* ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift"; sourceTree = ""; }; - D7E201AD27E8B3C000CB86D0 /* String+Ranges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Ranges.swift"; sourceTree = ""; }; - D7E201B127E8D50000CB86D0 /* FindNavigatorForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorForm.swift; sourceTree = ""; }; - D7E201B327E9989900CB86D0 /* FindNavigatorResultList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindNavigatorResultList.swift; sourceTree = ""; }; - DE513F51281B672D002260B9 /* EditorTabBarAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarAccessory.swift; sourceTree = ""; }; - DE6F77862813625500D00A76 /* EditorTabBarDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarDivider.swift; sourceTree = ""; }; - EC0870F62A455F6400EB8692 /* ProjectNavigatorViewController+NSMenuDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProjectNavigatorViewController+NSMenuDelegate.swift"; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + B62454482D78A3CC009A86D1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = B658FB2B27DA9E0F00EA4DBD /* CodeEdit */; + }; + B62454D02D78A3D8009A86D1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + FinderSync.swift, + Media.xcassets, + ); + target = 2BE487EB28245162003F3F64 /* OpenWithCodeEdit */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */ + B62454492D78A3CC009A86D1 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */ = { + isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet; + buildPhase = 6C6BD6FD29CD154900235D17 /* Embed ExtensionKit ExtensionPoint */; + membershipExceptions = ( + Features/Extensions/codeedit.extension.appextensionpoint, + ); + }; +/* End PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + B624520B2D78A3CC009A86D1 /* CodeEdit */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (B62454482D78A3CC009A86D1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, B62454492D78A3CC009A86D1 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = CodeEdit; sourceTree = ""; }; + B624544F2D78A3D3009A86D1 /* Configs */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = Configs; sourceTree = ""; }; + B62454602D78A3D4009A86D1 /* CodeEditUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = CodeEditUITests; sourceTree = ""; }; + B62454A32D78A3D4009A86D1 /* CodeEditTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = CodeEditTests; sourceTree = ""; }; + B62454CD2D78A3D8009A86D1 /* OpenWithCodeEdit */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (B62454D02D78A3D8009A86D1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = OpenWithCodeEdit; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 2BE487E928245162003F3F64 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; @@ -1392,1984 +182,58 @@ 2816F594280CF50500DD548B /* CodeEditSymbols in Frameworks */, 30CB64942C16CA9100CC8A9E /* LanguageClient in Frameworks */, 6C6BD6F829CD14D100235D17 /* CodeEditKit in Frameworks */, - 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */, - 6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */, - 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */, - 6C9DB9E42D55656300ACD86E /* CodeEditSourceEditor in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B658FB3A27DA9E1000EA4DBD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 583E529C29361BAB001AB554 /* SnapshotTesting in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B658FB4427DA9E1000EA4DBD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 043C321227E31FE8006AE443 /* Documents */ = { - isa = PBXGroup; - children = ( - 6CC17B552C4344F100834E2C /* CodeFileDocument */, - 5831E3CE2933F3DE00D5A6D2 /* Controllers */, - 611191F82B08CC8000D4459B /* Indexer */, - 6CC17B542C43448C00834E2C /* WorkspaceDocument */, - ); - path = Documents; - sourceTree = ""; - }; - 04BA7C102AE2AA7300584E1C /* ViewModels */ = { - isa = PBXGroup; - children = ( - 04BA7C112AE2AA7300584E1C /* GitCheckoutBranchViewModel.swift */, - 04BA7C122AE2AA7300584E1C /* GitCloneViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 201169D52837B29600F92B46 /* SourceControlNavigator */ = { - isa = PBXGroup; - children = ( - 201169E02837B3D100F92B46 /* Changes */, - B66DD19E2B3C0E0C0004FFEC /* History */, - 201169E32837B3EF00F92B46 /* Repository */, - 201169DE2837B3C700F92B46 /* Views */, - ); - path = SourceControlNavigator; - sourceTree = ""; - }; - 201169DE2837B3C700F92B46 /* Views */ = { - isa = PBXGroup; - children = ( - 6C2384302C796EBD003FBDD4 /* ChangedFile */, - 201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */, - 201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */, - ); - path = Views; - sourceTree = ""; - }; - 201169E02837B3D100F92B46 /* Changes */ = { - isa = PBXGroup; - children = ( - B60718492B17DC85009CDAB4 /* Views */, - ); - path = Changes; - sourceTree = ""; - }; - 201169E32837B3EF00F92B46 /* Repository */ = { - isa = PBXGroup; - children = ( - B60718482B17DC64009CDAB4 /* Models */, - B60718472B17DC5B009CDAB4 /* Views */, - ); - path = Repository; - sourceTree = ""; - }; - 20EBB4FF280C325000F3A5DA /* Views */ = { - isa = PBXGroup; - children = ( - B6EE988F27E8879A00CDD8AB /* InspectorAreaView.swift */, - B6D7EA582971078500301FAC /* InspectorSection.swift */, - B6D7EA5B297107DD00301FAC /* InspectorField.swift */, - 20D839AA280DEB2900B27357 /* NoSelectionInspectorView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 20EBB50B280C382800F3A5DA /* Models */ = { - isa = PBXGroup; - children = ( - 6CE622682A2A174A0013085C /* InspectorTab.swift */, - ); - path = Models; - sourceTree = ""; - }; - 28052E0129730F2F00F4F90A /* Configs */ = { - isa = PBXGroup; - children = ( - 28052DFB29730DE300F4F90A /* Debug.xcconfig */, - 28052DFC29730DF600F4F90A /* Alpha.xcconfig */, - 28052DFD29730E0300F4F90A /* Beta.xcconfig */, - 28052DFE29730E0B00F4F90A /* Release.xcconfig */, - 8B9A0E162B9FE84B007E2DBF /* Pre.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 2806E8FE2979587A000040F4 /* Model */ = { - isa = PBXGroup; - children = ( - 2806E9012979588B000040F4 /* Contributor.swift */, - ); - path = Model; - sourceTree = ""; - }; - 283BDCC22972F211002AFF81 /* Acknowledgements */ = { - isa = PBXGroup; - children = ( - 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */, - ); - path = Acknowledgements; - sourceTree = ""; - }; - 284DC84B2978B5EB00BF2770 /* Contributors */ = { - isa = PBXGroup; - children = ( - 2806E8FE2979587A000040F4 /* Model */, - 284DC84E2978B7B400BF2770 /* ContributorsView.swift */, - 2806E903297958B9000040F4 /* ContributorRowView.swift */, - ); - path = Contributors; - sourceTree = ""; - }; - 285FEC6C27FE4AC700E57D53 /* OutlineView */ = { - isa = PBXGroup; - children = ( - 2847019D27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift */, - 285FEC6D27FE4B4A00E57D53 /* ProjectNavigatorViewController.swift */, - 6CC17B522C43314000834E2C /* ProjectNavigatorViewController+NSOutlineViewDelegate.swift */, - 6CC17B502C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift */, - 285FEC6F27FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift */, - 285FEC7127FE4EEF00E57D53 /* ProjectNavigatorMenu.swift */, - 4A6F0DB42CBA462B00499627 /* ProjectNavigatorMenuActions.swift */, - D7DC4B75298FFBE900D6C83D /* ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift */, - EC0870F62A455F6400EB8692 /* ProjectNavigatorViewController+NSMenuDelegate.swift */, - ); - path = OutlineView; - sourceTree = ""; - }; - 286471AC27ED52950039369D /* ProjectNavigator */ = { - isa = PBXGroup; - children = ( - 285FEC6C27FE4AC700E57D53 /* OutlineView */, - 581550D329FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift */, - 286471AA27ED51FD0039369D /* ProjectNavigatorView.swift */, - ); - path = ProjectNavigator; - sourceTree = ""; - }; - 287776EA27E350A100D46668 /* NavigatorArea */ = { - isa = PBXGroup; - children = ( - D7012EE627E757660001E1EF /* FindNavigator */, - 581550CB29FBD30400684881 /* OutlineView */, - 286471AC27ED52950039369D /* ProjectNavigator */, - 201169D52837B29600F92B46 /* SourceControlNavigator */, - B67660682AA972D400CD56B0 /* Models */, - B67660692AA972DC00CD56B0 /* Views */, - 307AC4CB2ABABD9800163376 /* ViewModels */, - ); - path = NavigatorArea; - sourceTree = ""; - }; - 287776EB27E350BA00D46668 /* TabBar */ = { - isa = PBXGroup; - children = ( - B6AB09AB2AAACBF70003A3A6 /* Tabs */, - 58AFAA262933C65000482B53 /* Views */, - ); - path = TabBar; - sourceTree = ""; - }; - 2BE487ED28245162003F3F64 /* OpenWithCodeEdit */ = { - isa = PBXGroup; - children = ( - 2BE487EE28245162003F3F64 /* FinderSync.swift */, - 2BE487F028245162003F3F64 /* Info.plist */, - 2B7AC06A282452FB0082A5B8 /* Media.xcassets */, - 2B15CA0028254139004E8F22 /* OpenWithCodeEdit.entitlements */, - ); - path = OpenWithCodeEdit; - sourceTree = ""; - }; - 300051652BBD3A4400A98562 /* DependencyInjection */ = { - isa = PBXGroup; - children = ( - 300051662BBD3A5D00A98562 /* ServiceContainer.swift */, - 300051692BBD3A8200A98562 /* ServiceType.swift */, - 3000516B2BBD3A9500A98562 /* ServiceWrapper.swift */, - 6C9AE6702D14A9F700FAE8D2 /* LazyServiceWrapper.swift */, - ); - path = DependencyInjection; - sourceTree = ""; - }; - 3026F50B2AC006A10061227E /* ViewModels */ = { - isa = PBXGroup; - children = ( - 3026F50E2AC006C80061227E /* InspectorAreaViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 307AC4CB2ABABD9800163376 /* ViewModels */ = { - isa = PBXGroup; - children = ( - 30E6D0002A6E505200A58B20 /* NavigatorAreaViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 30AB4EB72BF7170B00ED4431 /* DeveloperSettings */ = { - isa = PBXGroup; - children = ( - 30AB4EB92BF7189300ED4431 /* Models */, - 30AB4EBC2BF71CA800ED4431 /* DeveloperSettingsView.swift */, - ); - path = DeveloperSettings; - sourceTree = ""; - }; - 30AB4EB92BF7189300ED4431 /* Models */ = { - isa = PBXGroup; - children = ( - 30AB4EBA2BF718A100ED4431 /* DeveloperSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - 30B087FB2C0D53080063A882 /* LSP */ = { - isa = PBXGroup; - children = ( - 6C3B4CD22D0E2C5400C6759E /* Editor */, - 6CD26C732C8EA71F00ADBA38 /* LanguageServer */, - 6CD26C742C8EA79100ADBA38 /* Service */, - 30B087FA2C0D53080063A882 /* LSPUtil.swift */, - ); - path = LSP; - sourceTree = ""; - }; - 30B0881E2C12626B0063A882 /* Capabilities */ = { - isa = PBXGroup; - children = ( - 30B087DF2C0D53080063A882 /* LanguageServer+CallHierarchy.swift */, - 30B087E12C0D53080063A882 /* LanguageServer+ColorPresentation.swift */, - 30B087E22C0D53080063A882 /* LanguageServer+Completion.swift */, - 30B087E32C0D53080063A882 /* LanguageServer+Declaration.swift */, - 30B087E42C0D53080063A882 /* LanguageServer+Definition.swift */, - 30B087E52C0D53080063A882 /* LanguageServer+Diagnostics.swift */, - 6CD26C7C2C8EA8F400ADBA38 /* LanguageServer+DocumentSync.swift */, - 30B087E62C0D53080063A882 /* LanguageServer+DocumentColor.swift */, - 30B087E72C0D53080063A882 /* LanguageServer+DocumentHighlight.swift */, - 30B087E82C0D53080063A882 /* LanguageServer+DocumentLink.swift */, - 30B087E92C0D53080063A882 /* LanguageServer+DocumentSymbol.swift */, - 30B087EB2C0D53080063A882 /* LanguageServer+FoldingRange.swift */, - 30B087EC2C0D53080063A882 /* LanguageServer+Formatting.swift */, - 30B087ED2C0D53080063A882 /* LanguageServer+Hover.swift */, - 30B087EE2C0D53080063A882 /* LanguageServer+Implementation.swift */, - 30B087EF2C0D53080063A882 /* LanguageServer+InlayHint.swift */, - 30B087F02C0D53080063A882 /* LanguageServer+References.swift */, - 30B087F12C0D53080063A882 /* LanguageServer+Rename.swift */, - 30B087F22C0D53080063A882 /* LanguageServer+SelectionRange.swift */, - 30B087F32C0D53080063A882 /* LanguageServer+SemanticTokens.swift */, - 30B087F42C0D53080063A882 /* LanguageServer+SignatureHelp.swift */, - 30B087F52C0D53080063A882 /* LanguageServer+TypeDefinition.swift */, - ); - path = Capabilities; - sourceTree = ""; - }; - 3E0196712A392170002648D8 /* ShellIntegration */ = { - isa = PBXGroup; - children = ( - 3E0196792A392B45002648D8 /* codeedit_shell_integration.bash */, - 3E0196722A3921AC002648D8 /* codeedit_shell_integration_rc.zsh */, - 6C48B5D52C0D08C5001E9955 /* codeedit_shell_integration_profile.zsh */, - 6C48B5D72C0D5DB5001E9955 /* codeedit_shell_integration_login.zsh */, - 6C48B5D32C0D0743001E9955 /* codeedit_shell_integration_env.zsh */, - ); - path = ShellIntegration; - sourceTree = ""; - }; - 4EE96EC82960562000FFBEA8 /* Documents */ = { - isa = PBXGroup; - children = ( - 4EE96ECC296059D200FFBEA8 /* Mocks */, - 7755664F2C27FD1B001E7A4D /* CodeFileDocument+UTTypeTests.swift */, - 4EE96ECA2960565E00FFBEA8 /* DocumentsUnitTests.swift */, - 6195E3102B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift */, - 6195E30C2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift */, - 6195E30E2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift */, - 613053582B23916D00D767E3 /* Indexer */, - ); - path = Documents; - sourceTree = ""; - }; - 4EE96ECC296059D200FFBEA8 /* Mocks */ = { - isa = PBXGroup; - children = ( - 4EE96ECD296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift */, - ); - path = Mocks; - sourceTree = ""; - }; - 581550CB29FBD30400684881 /* OutlineView */ = { - isa = PBXGroup; - children = ( - 581550CC29FBD30400684881 /* StandardTableViewCell.swift */, - 581550CD29FBD30400684881 /* FileSystemTableViewCell.swift */, - 581550CE29FBD30400684881 /* TextTableViewCell.swift */, - ); - path = OutlineView; - sourceTree = ""; - }; - 581BFB4B2926431000D251EC /* Welcome */ = { - isa = PBXGroup; - children = ( - 6C3E12D42CC830DE00DD12F1 /* Model */, - 581BFB562926431000D251EC /* Views */, - ); - path = Welcome; - sourceTree = ""; - }; - 581BFB562926431000D251EC /* Views */ = { - isa = PBXGroup; - children = ( - B66A4E4E29C917B8004573B4 /* WelcomeWindow.swift */, - 581BFB5A2926431000D251EC /* WelcomeWindowView.swift */, - 581BFB5B2926431000D251EC /* WelcomeView.swift */, - 581BFB5C2926431000D251EC /* WelcomeActionView.swift */, - 6C186209298BF5A800C663EA /* RecentProjectsListView.swift */, - 581BFB5E2926431000D251EC /* RecentProjectListItem.swift */, - ); - path = Views; - sourceTree = ""; - }; - 582213EE2918345500EFE361 /* About */ = { - isa = PBXGroup; - children = ( - 5878DA7D291862BC00DD95A3 /* Acknowledgements */, - 284DC84B2978B5EB00BF2770 /* Contributors */, - 582213F1291834E500EFE361 /* Views */, - ); - path = About; - sourceTree = ""; - }; - 582213F1291834E500EFE361 /* Views */ = { - isa = PBXGroup; - children = ( - 582213EF291834A500EFE361 /* AboutView.swift */, - 6C4104E8297C970F00F472BA /* AboutDefaultView.swift */, - 6C4104E5297C884F00F472BA /* AboutDetailView.swift */, - 6C4104E2297C87A000F472BA /* BlurButtonStyle.swift */, - B66A4E5029C917D5004573B4 /* AboutWindow.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5831E3C52933E6CB00D5A6D2 /* Features */ = { - isa = PBXGroup; - children = ( - 582213EE2918345500EFE361 /* About */, - 618725B92C33107C00987354 /* CEWorkspaceSettings */, - 588847642992A30900996D95 /* CEWorkspace */, - 61D435C52C29684100D032B8 /* Tasks */, - 617DB3CE2C25AF5B00B58BFE /* ActivityViewer */, - 587B9D7529300ABD00AC7927 /* CodeEditUI */, - 58FD7603291EA1CB0051D6E4 /* Commands */, - 043C321227E31FE8006AE443 /* Documents */, - 6C147C3C29A328020089B630 /* Editor */, - 6C6BD6ED29CD123000235D17 /* Extensions */, - 58798228292E30B90085B254 /* Feedback */, - 587B9E0129301D8F00AC7927 /* SourceControl */, - B6EE988E27E8877C00CDD8AB /* InspectorArea */, - 58A5DF9D29339F6400D1BD5D /* Keybindings */, - 30B087FB2C0D53080063A882 /* LSP */, - 287776EA27E350A100D46668 /* NavigatorArea */, - B68DE5DE2D5A61E5009A43EF /* Notifications */, - 5878DAA0291AE76700DD95A3 /* OpenQuickly */, - 58798210292D92370085B254 /* Search */, - B67B270029D7868000FB9301 /* Settings */, - 6C147C4729A329E50089B630 /* SplitView */, - 588224FF292C280D00E83CDE /* StatusBar */, - 5879827E292ED0FB0085B254 /* TerminalEmulator */, - 58822512292C280D00E83CDE /* UtilityArea */, - 581BFB4B2926431000D251EC /* Welcome */, - 6CAAF68F29BCC6F900A1F48A /* WindowCommands */, - ); - path = Features; - sourceTree = ""; - }; - 5831E3C62933E7E600D5A6D2 /* Color */ = { - isa = PBXGroup; - children = ( - 58D01C88293167DC00C5B6B4 /* Color+HEX.swift */, - ); - path = Color; - sourceTree = ""; - }; - 5831E3C72933E7F700D5A6D2 /* Bundle */ = { - isa = PBXGroup; - children = ( - 58D01C89293167DC00C5B6B4 /* Bundle+Info.swift */, - ); - path = Bundle; - sourceTree = ""; - }; - 5831E3C82933E80500D5A6D2 /* Date */ = { - isa = PBXGroup; - children = ( - 58D01C8A293167DC00C5B6B4 /* Date+Formatted.swift */, - ); - path = Date; - sourceTree = ""; - }; - 5831E3C92933E83400D5A6D2 /* Protocols */ = { - isa = PBXGroup; - children = ( - 6CBE1CFA2B71DAA6003AC32E /* Loopable.swift */, - 852C7E322A587279006BA599 /* SearchableSettingsPage.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - 5831E3CA2933E86F00D5A6D2 /* View */ = { - isa = PBXGroup; - children = ( - 5882251A292C280D00E83CDE /* View+isHovering.swift */, - 6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */, - ); - path = View; - sourceTree = ""; - }; - 5831E3CB2933E89A00D5A6D2 /* SwiftTerm */ = { - isa = PBXGroup; - children = ( - 5831E3CC2933E8BE00D5A6D2 /* Color */, - ); - path = SwiftTerm; - sourceTree = ""; - }; - 5831E3CC2933E8BE00D5A6D2 /* Color */ = { - isa = PBXGroup; - children = ( - 58798283292ED0FB0085B254 /* SwiftTerm+Color+Init.swift */, - ); - path = Color; - sourceTree = ""; - }; - 5831E3CE2933F3DE00D5A6D2 /* Controllers */ = { - isa = PBXGroup; - children = ( - 043C321327E31FF6006AE443 /* CodeEditDocumentController.swift */, - 04660F6927E51E5C00477777 /* CodeEditWindowController.swift */, - B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */, - 0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */, - 4E7F066529602E7B00BB3C12 /* CodeEditSplitViewController.swift */, - ); - path = Controllers; - sourceTree = ""; - }; - 5831E3D02934036D00D5A6D2 /* NSTableView */ = { - isa = PBXGroup; - children = ( - 28B8F883280FFE4600596236 /* NSTableView+Background.swift */, - ); - path = NSTableView; - sourceTree = ""; - }; - 583E527429361B39001AB554 /* CodeEditUI */ = { - isa = PBXGroup; - children = ( - 583E527729361B39001AB554 /* __Snapshots__ */, - 583E527529361B39001AB554 /* CodeEditUITests.swift */, - 583E52A129361BFD001AB554 /* CodeEditUITests-Bridging-Header.h */, - ); - path = CodeEditUI; - sourceTree = ""; - }; - 583E527729361B39001AB554 /* __Snapshots__ */ = { - isa = PBXGroup; - children = ( - 583E527829361B39001AB554 /* UnitTests */, - ); - path = __Snapshots__; - sourceTree = ""; - }; - 583E527829361B39001AB554 /* UnitTests */ = { - isa = PBXGroup; - children = ( - 583E527929361B39001AB554 /* testHelpButtonDark.1.png */, - 583E527A29361B39001AB554 /* testEffectViewLight.1.png */, - 583E527B29361B39001AB554 /* testSegmentedControlLight.1.png */, - 583E527C29361B39001AB554 /* testSegmentedControlProminentLight.1.png */, - 583E527D29361B39001AB554 /* testHelpButtonLight.1.png */, - 583E527E29361B39001AB554 /* testBranchPickerDark.1.png */, - 583E527F29361B39001AB554 /* testFontPickerViewDark.1.png */, - 583E528029361B39001AB554 /* testFontPickerViewLight.1.png */, - 583E528129361B39001AB554 /* testSegmentedControlProminentDark.1.png */, - 583E528229361B39001AB554 /* testSegmentedControlDark.1.png */, - 583E528329361B39001AB554 /* testEffectViewDark.1.png */, - 583E528429361B39001AB554 /* testBranchPickerLight.1.png */, - ); - path = UnitTests; - sourceTree = ""; - }; - 5875680E29316BDC00C965A3 /* ShellClient */ = { - isa = PBXGroup; - children = ( - 58A5DF7B2931784D00D1BD5D /* Models */, - ); - path = ShellClient; - sourceTree = ""; - }; - 5878DA7D291862BC00DD95A3 /* Acknowledgements */ = { - isa = PBXGroup; - children = ( - 5878DA852918642F00DD95A3 /* ViewModels */, - 5878DA7E291862F200DD95A3 /* Views */, - ); - path = Acknowledgements; - sourceTree = ""; - }; - 5878DA7E291862F200DD95A3 /* Views */ = { - isa = PBXGroup; - children = ( - 5878DA81291863F900DD95A3 /* AcknowledgementsView.swift */, - B60BE8BC297A167600841125 /* AcknowledgementRowView.swift */, - 6C97EBCB2978760400302F95 /* AcknowledgementsWindowController.swift */, - 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5878DA852918642F00DD95A3 /* ViewModels */ = { - isa = PBXGroup; - children = ( - 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 5878DAA0291AE76700DD95A3 /* OpenQuickly */ = { - isa = PBXGroup; - children = ( - 5878DAAA291D5CAA00DD95A3 /* ViewModels */, - 5878DAA9291D5CA100DD95A3 /* Views */, - ); - path = OpenQuickly; - sourceTree = ""; - }; - 5878DAA9291D5CA100DD95A3 /* Views */ = { - isa = PBXGroup; - children = ( - 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */, - 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */, - 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */, - 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5878DAAA291D5CAA00DD95A3 /* ViewModels */ = { - isa = PBXGroup; - children = ( - 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 5878DAAB291D627C00DD95A3 /* JumpBar */ = { - isa = PBXGroup; - children = ( - 5878DAAC291D627C00DD95A3 /* Views */, - ); - path = JumpBar; - sourceTree = ""; - }; - 5878DAAC291D627C00DD95A3 /* Views */ = { - isa = PBXGroup; - children = ( - 5878DAAD291D627C00DD95A3 /* EditorJumpBarMenu.swift */, - 5878DAAE291D627C00DD95A3 /* EditorJumpBarComponent.swift */, - 5878DAAF291D627C00DD95A3 /* EditorJumpBarView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 58798210292D92370085B254 /* Search */ = { - isa = PBXGroup; - children = ( - 6653EE532C34816F00B82DE2 /* Views */, - 613899AF2B6E6FB800A5CAF6 /* FuzzySearch */, - 58798212292D92370085B254 /* Extensions */, - 58798214292D92370085B254 /* Model */, - ); - path = Search; - sourceTree = ""; - }; - 58798212292D92370085B254 /* Extensions */ = { - isa = PBXGroup; - children = ( - 58798213292D92370085B254 /* String+SafeOffset.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - 58798214292D92370085B254 /* Model */ = { - isa = PBXGroup; - children = ( - 58798215292D92370085B254 /* SearchModeModel.swift */, - 58798216292D92370085B254 /* SearchResultModel.swift */, - 58798217292D92370085B254 /* SearchResultMatchModel.swift */, - ); - path = Model; - sourceTree = ""; - }; - 58798228292E30B90085B254 /* Feedback */ = { - isa = PBXGroup; - children = ( - 58798231292E30B90085B254 /* Controllers */, - 5879822A292E30B90085B254 /* HelperView */, - 5879822C292E30B90085B254 /* Model */, - 58798230292E30B90085B254 /* FeedbackView.swift */, - ); - path = Feedback; - sourceTree = ""; - }; - 5879822A292E30B90085B254 /* HelperView */ = { - isa = PBXGroup; - children = ( - 5879822B292E30B90085B254 /* FeedbackToolbar.swift */, - ); - path = HelperView; - sourceTree = ""; - }; - 5879822C292E30B90085B254 /* Model */ = { - isa = PBXGroup; - children = ( - 5879822D292E30B90085B254 /* FeedbackIssueArea.swift */, - 5879822E292E30B90085B254 /* FeedbackModel.swift */, - 5879822F292E30B90085B254 /* FeedbackType.swift */, - ); - path = Model; - sourceTree = ""; - }; - 58798231292E30B90085B254 /* Controllers */ = { - isa = PBXGroup; - children = ( - 58798232292E30B90085B254 /* FeedbackWindowController.swift */, - ); - path = Controllers; - sourceTree = ""; - }; - 5879827E292ED0FB0085B254 /* TerminalEmulator */ = { - isa = PBXGroup; - children = ( - 6C48B5DB2C0D664A001E9955 /* Model */, - 6C48B5DC2C0D6654001E9955 /* Views */, - ); - path = TerminalEmulator; - sourceTree = ""; - }; - 587B60F329340A8000D5CD8F /* CodeEditTests */ = { - isa = PBXGroup; - children = ( - 587B60FE293416C900D5CD8F /* Features */, - 587B60F42934122D00D5CD8F /* Utils */, - ); - path = CodeEditTests; - sourceTree = ""; - }; - 587B60F42934122D00D5CD8F /* Utils */ = { - isa = PBXGroup; - children = ( - 587B61002934170A00D5CD8F /* UnitTests_Extensions.swift */, - 587B60F52934124100D5CD8F /* CEWorkspaceFileManager */, - ); - path = Utils; - sourceTree = ""; - }; - 587B60F52934124100D5CD8F /* CEWorkspaceFileManager */ = { - isa = PBXGroup; - children = ( - 587B60F72934124100D5CD8F /* CEWorkspaceFileManagerTests.swift */, - ); - path = CEWorkspaceFileManager; - sourceTree = ""; - }; - 587B60FE293416C900D5CD8F /* Features */ = { - isa = PBXGroup; - children = ( - 283BDCC22972F211002AFF81 /* Acknowledgements */, - 617DB3DD2C25E11500B58BFE /* ActivityViewer */, - 583E527429361B39001AB554 /* CodeEditUI */, - 587B612C2934199800D5CD8F /* CodeFile */, - 4EE96EC82960562000FFBEA8 /* Documents */, - 6CD26C882C8F91B600ADBA38 /* LSP */, - 613899BD2B6E70E200A5CAF6 /* Search */, - 61FB03A92C3C1FC4001B3671 /* Tasks */, - 6141CF392C3DA4180073BC9F /* TerminalEmulator */, - 6C510CBB2D2ECD68006EBE85 /* UtilityArea */, - ); - path = Features; - sourceTree = ""; - }; - 587B612C2934199800D5CD8F /* CodeFile */ = { - isa = PBXGroup; - children = ( - 587B612D293419B700D5CD8F /* CodeFileTests.swift */, - ); - path = CodeFile; - sourceTree = ""; - }; - 587B9D7529300ABD00AC7927 /* CodeEditUI */ = { - isa = PBXGroup; - children = ( - B616EA8A2D651B0A00DF9029 /* Styles */, - 587B9D8629300ABD00AC7927 /* Views */, - ); - path = CodeEditUI; - sourceTree = ""; - }; - 587B9D8629300ABD00AC7927 /* Views */ = { - isa = PBXGroup; - children = ( - B67700F82D2A2662004FD61F /* WorkspacePanelView.swift */, - B62AEDA92A1FCBE5009A9F52 /* WorkspacePanelTabBar.swift */, - 30AB4EC12BF7253200ED4431 /* KeyValueTable.swift */, - B65B10EB2B073913002852CF /* CEContentUnavailableView.swift */, - B65B10FA2B08B054002852CF /* Divided.swift */, - 587B9D8B29300ABD00AC7927 /* EffectView.swift */, - 587B9D9029300ABD00AC7927 /* HelpButton.swift */, - B616EA872D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift */, - 587B9D8D29300ABD00AC7927 /* SearchPanel.swift */, - 6CABB1A029C5593800340467 /* SearchPanelView.swift */, - 61816B822C81DC2C00C71BF7 /* SearchField.swift */, - 587B9D8929300ABD00AC7927 /* PanelDivider.swift */, - B67DB0EE2AF3E381002DC647 /* PaneTextField.swift */, - 587B9D8E29300ABD00AC7927 /* PressActionsModifier.swift */, - 587B9D8829300ABD00AC7927 /* SegmentedControl.swift */, - 587B9D8C29300ABD00AC7927 /* SettingsTextEditor.swift */, - 587B9D8F29300ABD00AC7927 /* ToolbarBranchPicker.swift */, - B6DCDAC52CCDE2B90099FBF9 /* InstantPopoverModifier.swift */, - 2897E1C62979A29200741E32 /* TrackableScrollView.swift */, - B696A7E52CFE20C40048CFE1 /* FeatureIcon.swift */, - B60718302B15A9A3009CDAB4 /* CEOutlineGroup.swift */, - ); - path = Views; - sourceTree = ""; - }; - 587B9E0129301D8F00AC7927 /* SourceControl */ = { - isa = PBXGroup; - children = ( - 587B9E5229301D8F00AC7927 /* Models */, - B6966A262C2F673A00259C2D /* Views */, - 587B9E0929301D8F00AC7927 /* Accounts */, - 587B9E5129301D8F00AC7927 /* Client */, - 587B9E0529301D8F00AC7927 /* Clone */, - 201169E62837B5CA00F92B46 /* SourceControlManager.swift */, - B6966A332C34996B00259C2D /* SourceControlManager+GitClient.swift */, - ); - path = SourceControl; - sourceTree = ""; - }; - 587B9E0529301D8F00AC7927 /* Clone */ = { - isa = PBXGroup; - children = ( - 04BA7C102AE2AA7300584E1C /* ViewModels */, - 587B9E0829301D8F00AC7927 /* GitCheckoutBranchView.swift */, - 587B9E0729301D8F00AC7927 /* GitCloneView.swift */, - ); - path = Clone; - sourceTree = ""; - }; - 587B9E0929301D8F00AC7927 /* Accounts */ = { - isa = PBXGroup; - children = ( - 587B9E4429301D8F00AC7927 /* Bitbucket */, - 587B9E2C29301D8F00AC7927 /* GitHub */, - 587B9E0B29301D8F00AC7927 /* GitLab */, - 587B9E2229301D8F00AC7927 /* Networking */, - 587B9E2629301D8F00AC7927 /* Utils */, - 587B9E0A29301D8F00AC7927 /* Parameters.swift */, - ); - path = Accounts; - sourceTree = ""; - }; - 587B9E0B29301D8F00AC7927 /* GitLab */ = { - isa = PBXGroup; - children = ( - 587B9E1429301D8F00AC7927 /* Model */, - 587B9E0C29301D8F00AC7927 /* Routers */, - 587B9E1329301D8F00AC7927 /* GitLabAccount.swift */, - 587B9E1229301D8F00AC7927 /* GitLabConfiguration.swift */, - 587B9E1129301D8F00AC7927 /* GitLabOAuthConfiguration.swift */, - ); - path = GitLab; - sourceTree = ""; - }; - 587B9E0C29301D8F00AC7927 /* Routers */ = { - isa = PBXGroup; - children = ( - 587B9E0E29301D8F00AC7927 /* GitLabCommitRouter.swift */, - 587B9E1029301D8F00AC7927 /* GitLabOAuthRouter.swift */, - 587B9E0F29301D8F00AC7927 /* GitLabProjectRouter.swift */, - 587B9E0D29301D8F00AC7927 /* GitLabUserRouter.swift */, - ); - path = Routers; - sourceTree = ""; - }; - 587B9E1429301D8F00AC7927 /* Model */ = { - isa = PBXGroup; - children = ( - 587B9E1929301D8F00AC7927 /* GitLabAccountModel.swift */, - 587B9E1C29301D8F00AC7927 /* GitLabAvatarURL.swift */, - 587B9E1529301D8F00AC7927 /* GitLabCommit.swift */, - 587B9E1A29301D8F00AC7927 /* GitLabEvent.swift */, - 587B9E1829301D8F00AC7927 /* GitLabEventData.swift */, - 587B9E1E29301D8F00AC7927 /* GitLabEventNote.swift */, - 587B9E1629301D8F00AC7927 /* GitLabGroupAccess.swift */, - 587B9E1D29301D8F00AC7927 /* GitLabNamespace.swift */, - 587B9E1B29301D8F00AC7927 /* GitLabPermissions.swift */, - 587B9E1F29301D8F00AC7927 /* GitLabProject.swift */, - 587B9E2029301D8F00AC7927 /* GitLabProjectAccess.swift */, - 587B9E1729301D8F00AC7927 /* GitLabProjectHook.swift */, - 587B9E2129301D8F00AC7927 /* GitLabUser.swift */, - ); - path = Model; - sourceTree = ""; - }; - 587B9E2229301D8F00AC7927 /* Networking */ = { - isa = PBXGroup; - children = ( - 587B9E2429301D8F00AC7927 /* GitJSONPostRouter.swift */, - 587B9E2529301D8F00AC7927 /* GitRouter.swift */, - 587B9E2329301D8F00AC7927 /* GitURLSession.swift */, - ); - path = Networking; - sourceTree = ""; - }; - 587B9E2629301D8F00AC7927 /* Utils */ = { - isa = PBXGroup; - children = ( - 587B9E2929301D8F00AC7927 /* GitTime.swift */, - 587B9E2A29301D8F00AC7927 /* String+PercentEncoding.swift */, - 587B9E2829301D8F00AC7927 /* String+QueryParameters.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 587B9E2C29301D8F00AC7927 /* GitHub */ = { - isa = PBXGroup; - children = ( - 587B9E3829301D8F00AC7927 /* Model */, - 587B9E2D29301D8F00AC7927 /* Routers */, - 587B9E4329301D8F00AC7927 /* GitHubAccount.swift */, - 587B9E3529301D8F00AC7927 /* GitHubConfiguration.swift */, - 587B9E4229301D8F00AC7927 /* GitHubOpenness.swift */, - 587B9E3729301D8F00AC7927 /* GitHubPreviewHeader.swift */, - 587B9E3629301D8F00AC7927 /* PublicKey.swift */, - ); - path = GitHub; - sourceTree = ""; - }; - 587B9E2D29301D8F00AC7927 /* Routers */ = { - isa = PBXGroup; - children = ( - 587B9E3329301D8F00AC7927 /* GitHubGistRouter.swift */, - 587B9E2E29301D8F00AC7927 /* GitHubIssueRouter.swift */, - 587B9E3229301D8F00AC7927 /* GitHubPullRequestRouter.swift */, - 587B9E3129301D8F00AC7927 /* GitHubRepositoryRouter.swift */, - 587B9E2F29301D8F00AC7927 /* GitHubReviewsRouter.swift */, - 587B9E3029301D8F00AC7927 /* GitHubRouter.swift */, - 587B9E3429301D8F00AC7927 /* GitHubUserRouter.swift */, - ); - path = Routers; - sourceTree = ""; - }; - 587B9E3829301D8F00AC7927 /* Model */ = { - isa = PBXGroup; - children = ( - 587B9E4129301D8F00AC7927 /* GitHubAccount+deleteReference.swift */, - 587B9E3C29301D8F00AC7927 /* GitHubComment.swift */, - 587B9E3E29301D8F00AC7927 /* GitHubFiles.swift */, - 587B9E3F29301D8F00AC7927 /* GitHubGist.swift */, - 587B9E4029301D8F00AC7927 /* GitHubIssue.swift */, - 587B9E3929301D8F00AC7927 /* GitHubPullRequest.swift */, - 587B9E3D29301D8F00AC7927 /* GitHubRepositories.swift */, - 587B9E3B29301D8F00AC7927 /* GitHubReview.swift */, - 587B9E3A29301D8F00AC7927 /* GitHubUser.swift */, - ); - path = Model; - sourceTree = ""; - }; - 587B9E4429301D8F00AC7927 /* Bitbucket */ = { - isa = PBXGroup; - children = ( - 587B9E4D29301D8F00AC7927 /* Model */, - 587B9E4529301D8F00AC7927 /* Routers */, - 587B9E4A29301D8F00AC7927 /* BitBucketAccount.swift */, - 587B9E5029301D8F00AC7927 /* BitBucketAccount+Token.swift */, - 587B9E4B29301D8F00AC7927 /* BitBucketOAuthConfiguration.swift */, - 587B9E4C29301D8F00AC7927 /* BitBucketTokenConfiguration.swift */, - ); - path = Bitbucket; - sourceTree = ""; - }; - 587B9E4529301D8F00AC7927 /* Routers */ = { - isa = PBXGroup; - children = ( - 587B9E4929301D8F00AC7927 /* BitBucketOAuthRouter.swift */, - 587B9E4629301D8F00AC7927 /* BitBucketRepositoryRouter.swift */, - 587B9E4829301D8F00AC7927 /* BitBucketTokenRouter.swift */, - 587B9E4729301D8F00AC7927 /* BitBucketUserRouter.swift */, - ); - path = Routers; - sourceTree = ""; - }; - 587B9E4D29301D8F00AC7927 /* Model */ = { - isa = PBXGroup; - children = ( - 587B9E4F29301D8F00AC7927 /* BitBucketRepositories.swift */, - 587B9E4E29301D8F00AC7927 /* BitBucketUser.swift */, - ); - path = Model; - sourceTree = ""; - }; - 587B9E5129301D8F00AC7927 /* Client */ = { - isa = PBXGroup; - children = ( - 58A5DF7F29325B5A00D1BD5D /* GitClient.swift */, - B6E38E012CD3E62E00F4E65A /* GitConfigClient.swift */, - B6B2D79E2CE8794200379967 /* GitConfigRepresentable.swift */, - B6B2D7A02CE8797400379967 /* GitConfigExtensions.swift */, - 04BA7C182AE2D7C600584E1C /* GitClient+Branches.swift */, - 04BA7C1D2AE2D8A000584E1C /* GitClient+Clone.swift */, - 04BA7C1B2AE2D84100584E1C /* GitClient+Commit.swift */, - 04BA7C212AE2D95E00584E1C /* GitClient+CommitHistory.swift */, - B65B11032B09DB1C002852CF /* GitClient+Fetch.swift */, - B69BFDC62B0686910050D9A6 /* GitClient+Initiate.swift */, - B65B10EE2B07C454002852CF /* GitClient+Remote.swift */, - B65B11002B09D5D4002852CF /* GitClient+Pull.swift */, - 04BA7C262AE2E9F100584E1C /* GitClient+Push.swift */, - B607181C2B0C5BE3009CDAB4 /* GitClient+Stash.swift */, - 04BA7C1F2AE2D92B00584E1C /* GitClient+Status.swift */, - B628B7922B18369800F9775A /* GitClient+Validate.swift */, - ); - path = Client; - sourceTree = ""; - }; - 587B9E5229301D8F00AC7927 /* Models */ = { - isa = PBXGroup; - children = ( - 04BA7C0A2AE2A2D100584E1C /* GitBranch.swift */, - 9D36E1BE2B5E7D7500443C41 /* GitBranchesGroup.swift */, - 587B9E5429301D8F00AC7927 /* GitChangedFile.swift */, - 587B9E5329301D8F00AC7927 /* GitCommit.swift */, - B65B10F12B07D34F002852CF /* GitRemote.swift */, - B607181F2B0C6CE7009CDAB4 /* GitStashEntry.swift */, - 587B9E5529301D8F00AC7927 /* GitStatus.swift */, - ); - path = Models; - sourceTree = ""; - }; - 588224FF292C280D00E83CDE /* StatusBar */ = { - isa = PBXGroup; - children = ( - 66AF6CEE2BF183C500D83C9D /* Models */, - 66AF6CE52BF17FEF00D83C9D /* ViewModifiers */, - 66AF6CE02BF17CB100D83C9D /* ViewModels */, - 58822508292C280D00E83CDE /* Views */, - ); - path = StatusBar; - sourceTree = ""; - }; - 58822508292C280D00E83CDE /* Views */ = { - isa = PBXGroup; - children = ( - 5882250A292C280D00E83CDE /* StatusBarItems */, - 58822509292C280D00E83CDE /* StatusBarView.swift */, - B685DE7829CC9CCD002860C8 /* StatusBarIcon.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5882250A292C280D00E83CDE /* StatusBarItems */ = { - isa = PBXGroup; - children = ( - 5882250B292C280D00E83CDE /* StatusBarMenuStyle.swift */, - 5882250C292C280D00E83CDE /* StatusBarBreakpointButton.swift */, - 5882250D292C280D00E83CDE /* StatusBarIndentSelector.swift */, - 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */, - 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */, - 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */, - 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */, - 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */, - ); - path = StatusBarItems; - sourceTree = ""; - }; - 58822512292C280D00E83CDE /* UtilityArea */ = { - isa = PBXGroup; - children = ( - B676606A2AA973A500CD56B0 /* TerminalUtility */, - B676606B2AA973B200CD56B0 /* DebugUtility */, - B676606C2AA973C000CD56B0 /* OutputUtility */, - 58822514292C280D00E83CDE /* Toolbar */, - B676606D2AA9741900CD56B0 /* Models */, - 58822539292C333600E83CDE /* ViewModels */, - B62AEDB12A1FD7F0009A9F52 /* Views */, - ); - path = UtilityArea; - sourceTree = ""; - }; - 58822514292C280D00E83CDE /* Toolbar */ = { - isa = PBXGroup; - children = ( - 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */, - 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */, - 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */, - 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */, - ); - path = Toolbar; - sourceTree = ""; - }; - 58822539292C333600E83CDE /* ViewModels */ = { - isa = PBXGroup; - children = ( - 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */, - B62AEDD62A27B3D0009A9F52 /* UtilityAreaTabViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 588847642992A30900996D95 /* CEWorkspace */ = { - isa = PBXGroup; - children = ( - 588847652992A35800996D95 /* Models */, - ); - path = CEWorkspace; - sourceTree = ""; - }; - 588847652992A35800996D95 /* Models */ = { - isa = PBXGroup; - children = ( - 588847622992A2A200996D95 /* CEWorkspaceFile.swift */, - 5894E59629FEF7740077E59C /* CEWorkspaceFile+Recursion.swift */, - 58A2E40629C3975D005CB615 /* CEWorkspaceFileIcon.swift */, - 58710158298EB80000951BA4 /* CEWorkspaceFileManager.swift */, - 77EF6C0C2C60E23400984B69 /* CEWorkspaceFileManager+DirectoryEvents.swift */, - 6CDAFDDC2D35B2A0002B2D47 /* CEWorkspaceFileManager+Error.swift */, - 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */, - 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */, - ); - path = Models; - sourceTree = ""; - }; - 588847672992AAB800996D95 /* Array */ = { - isa = PBXGroup; - children = ( - 588847682992ABCA00996D95 /* Array+SortURLs.swift */, - ); - path = Array; - sourceTree = ""; - }; - 58A5DF7B2931784D00D1BD5D /* Models */ = { - isa = PBXGroup; - children = ( - 58A5DF7C2931787A00D1BD5D /* ShellClient.swift */, - ); - path = Models; - sourceTree = ""; - }; - 58A5DF9D29339F6400D1BD5D /* Keybindings */ = { - isa = PBXGroup; - children = ( - 58A5DF9F29339F6400D1BD5D /* CommandManager.swift */, - 6C81916629B3E80700B75C92 /* ModifierKeysObserver.swift */, - 58A5DFA129339F6400D1BD5D /* default_keybindings.json */, - 58A5DF9E29339F6400D1BD5D /* KeybindingManager.swift */, - ); - path = Keybindings; - sourceTree = ""; - }; - 58AFAA262933C65000482B53 /* Views */ = { - isa = PBXGroup; - children = ( - DE513F51281B672D002260B9 /* EditorTabBarAccessory.swift */, - 6CDA84AC284C1BA000C1CC3A /* EditorTabBarContextMenu.swift */, - DE6F77862813625500D00A76 /* EditorTabBarDivider.swift */, - 287776E827E34BC700D46668 /* EditorTabBarView.swift */, - B6AB09A22AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift */, - 6C85F7552C3CA638008E9836 /* EditorHistoryMenus.swift */, - B6AB09A42AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift */, - ); - path = Views; - sourceTree = ""; - }; - 58AFAA272933C65C00482B53 /* Models */ = { - isa = PBXGroup; - children = ( - 58AFAA2D2933C69E00482B53 /* EditorItemID.swift */, - 58AFAA2C2933C69E00482B53 /* EditorTabRepresentable.swift */, - ); - path = Models; - sourceTree = ""; - }; - 58D01C85293167DC00C5B6B4 /* Utils */ = { - isa = PBXGroup; - children = ( - B63F6A752C5618BF003B4342 /* Formatters */, - 300051652BBD3A4400A98562 /* DependencyInjection */, - 6C48D8EF2972DAC300D6D205 /* Environment */, - 58D01C87293167DC00C5B6B4 /* Extensions */, - 58D01C8F293167DC00C5B6B4 /* KeyChain */, - 5831E3C92933E83400D5A6D2 /* Protocols */, - 5875680E29316BDC00C965A3 /* ShellClient */, - 6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */, - B67DBB872CD51C51007F4F18 /* Limiter.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 58D01C87293167DC00C5B6B4 /* Extensions */ = { - isa = PBXGroup; - children = ( - 588847672992AAB800996D95 /* Array */, - 5831E3C72933E7F700D5A6D2 /* Bundle */, - 669A504F2C380BFD00304CD8 /* Collection */, - 5831E3C62933E7E600D5A6D2 /* Color */, - 5831E3C82933E80500D5A6D2 /* Date */, - 6CB94D002C9F1CF900E8651C /* LanguageIdentifier */, - 6C82D6C429C0129E00495C54 /* NSApplication */, - 5831E3D02934036D00D5A6D2 /* NSTableView */, - 77A01E922BCA9C0400F0EA38 /* NSWindow */, - 58D01C8B293167DC00C5B6B4 /* String */, - 5831E3CB2933E89A00D5A6D2 /* SwiftTerm */, - 6CBD1BC42978DE3E006639D5 /* Text */, - 6CB94CFF2C9F1CB600E8651C /* TextView */, - 77EF6C042C57DE4B00984B69 /* URL */, - 6CD26C752C8EA80000ADBA38 /* URL */, - 5831E3CA2933E86F00D5A6D2 /* View */, - ); - path = Extensions; - sourceTree = ""; - }; - 58D01C8B293167DC00C5B6B4 /* String */ = { - isa = PBXGroup; - children = ( - 61538B8F2B111FE800A88846 /* String+AppearancesOfSubstring.swift */, - 61538B922B11201900A88846 /* String+Character.swift */, - 669A50502C380C1800304CD8 /* String+Escaped.swift */, - 85745D622A38F8D900089AAB /* String+HighlightOccurrences.swift */, - 6CED16E32A3E660D000EC962 /* String+Lines.swift */, - 58D01C8E293167DC00C5B6B4 /* String+MD5.swift */, - D7E201AD27E8B3C000CB86D0 /* String+Ranges.swift */, - 58D01C8D293167DC00C5B6B4 /* String+RemoveOccurrences.swift */, - 58D01C8C293167DC00C5B6B4 /* String+SHA256.swift */, - 6CDAFDDE2D35DADD002B2D47 /* String+ValidFileName.swift */, - ); - path = String; - sourceTree = ""; - }; - 58D01C8F293167DC00C5B6B4 /* KeyChain */ = { - isa = PBXGroup; - children = ( - 58D01C90293167DC00C5B6B4 /* CodeEditKeychain.swift */, - 58D01C91293167DC00C5B6B4 /* CodeEditKeychainConstants.swift */, - 58D01C93293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift */, - ); - path = KeyChain; - sourceTree = ""; - }; - 58F2EAA9292FB2B0004A9BDE /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EAD1292FB2B0004A9BDE /* SourceControlSettings.swift */, - B67DBB8B2CD5D9B4007F4F18 /* IgnorePatternModel.swift */, - ); - path = Models; - sourceTree = ""; - }; - 58F2EAAE292FB2B0004A9BDE /* ThemeSettings */ = { - isa = PBXGroup; - children = ( - B6F0518D29DA29F900D72287 /* Models */, - 58F2EAAF292FB2B0004A9BDE /* ThemeSettingsView.swift */, - B6EA1FF729DB78DB001BF195 /* ThemeSettingThemeRow.swift */, - B6EA1FFA29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift */, - B6EA1FFC29DB792C001BF195 /* ThemeSettingsColorPreview.swift */, - B6FA3F872BF41C940023DE9C /* ThemeSettingsThemeToken.swift */, - ); - path = ThemeSettings; - sourceTree = ""; - }; - 58FD7603291EA1CB0051D6E4 /* Commands */ = { - isa = PBXGroup; - children = ( - 58FD7604291EA1CB0051D6E4 /* ViewModels */, - 58FD7606291EA1CB0051D6E4 /* Views */, - ); - path = Commands; - sourceTree = ""; - }; - 58FD7604291EA1CB0051D6E4 /* ViewModels */ = { - isa = PBXGroup; - children = ( - 58FD7605291EA1CB0051D6E4 /* QuickActionsViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 58FD7606291EA1CB0051D6E4 /* Views */ = { - isa = PBXGroup; - children = ( - 58FD7607291EA1CB0051D6E4 /* QuickActionsView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5B698A082B262F8400DE9392 /* SearchSettings */ = { - isa = PBXGroup; - children = ( - 5B698A0B2B26326000DE9392 /* Models */, - 5B698A092B262FA000DE9392 /* SearchSettingsView.swift */, - 5B698A0E2B2636A700DE9392 /* SearchSettingsIgnoreGlobPatternItemView.swift */, - ); - path = SearchSettings; - sourceTree = ""; - }; - 5B698A0B2B26326000DE9392 /* Models */ = { - isa = PBXGroup; - children = ( - 5B698A0C2B26327800DE9392 /* SearchSettings.swift */, - 5B698A152B263BCE00DE9392 /* SearchSettingsModel.swift */, - ); - path = Models; - sourceTree = ""; - }; - 5C403B8D27E20F8000788241 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 589F3E342936185400E1A4DA /* XCTest.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 611191F82B08CC8000D4459B /* Indexer */ = { - isa = PBXGroup; - children = ( - 6C1CC9972B1E770B0002349B /* AsyncFileIterator.swift */, - 611191F92B08CC9000D4459B /* SearchIndexer.swift */, - 611191FB2B08CCB800D4459B /* SearchIndexer+AsyncController.swift */, - 611191FF2B08CCD700D4459B /* SearchIndexer+Memory.swift */, - 611191FD2B08CCD200D4459B /* SearchIndexer+File.swift */, - 611192012B08CCDC00D4459B /* SearchIndexer+Search.swift */, - 611192032B08CCED00D4459B /* SearchIndexer+ProgressiveSearch.swift */, - 611192052B08CCF600D4459B /* SearchIndexer+Add.swift */, - 611192072B08CCFD00D4459B /* SearchIndexer+Terms.swift */, - 6111920B2B08CD0B00D4459B /* SearchIndexer+InternalMethods.swift */, - 613DF55D2B08DD5D00E9D902 /* FileHelper.swift */, - ); - path = Indexer; - sourceTree = ""; - }; - 613053582B23916D00D767E3 /* Indexer */ = { - isa = PBXGroup; - children = ( - 6130535B2B23933D00D767E3 /* MemoryIndexingTests.swift */, - 6130535E2B23A31300D767E3 /* MemorySearchTests.swift */, - 6130536A2B24722C00D767E3 /* AsyncIndexingTests.swift */, - 613053642B23A49300D767E3 /* TemporaryFile.swift */, - ); - path = Indexer; - sourceTree = ""; - }; - 613899AF2B6E6FB800A5CAF6 /* FuzzySearch */ = { - isa = PBXGroup; - children = ( - 613899B02B6E6FDC00A5CAF6 /* Collection+FuzzySearch.swift */, - 613899B22B6E6FEE00A5CAF6 /* FuzzySearchable.swift */, - 613899B42B6E700300A5CAF6 /* FuzzySearchModels.swift */, - 613899B62B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift */, - 613899B82B6E704500A5CAF6 /* String+Normalise.swift */, - ); - path = FuzzySearch; - sourceTree = ""; - }; - 613899BD2B6E70E200A5CAF6 /* Search */ = { - isa = PBXGroup; - children = ( - 613899BE2B6E70EA00A5CAF6 /* FuzzySearch */, - ); - path = Search; - sourceTree = ""; - }; - 613899BE2B6E70EA00A5CAF6 /* FuzzySearch */ = { - isa = PBXGroup; - children = ( - 613899BF2B6E70FE00A5CAF6 /* FuzzySearchTests.swift */, - ); - path = FuzzySearch; - sourceTree = ""; - }; - 6141CF392C3DA4180073BC9F /* TerminalEmulator */ = { - isa = PBXGroup; - children = ( - 6C1F3DA12C18C55800F6DEF6 /* ShellIntegrationTests.swift */, - 61FB03AA2C3C1FD5001B3671 /* Shell */, - ); - path = TerminalEmulator; - sourceTree = ""; - }; - 617DB3CE2C25AF5B00B58BFE /* ActivityViewer */ = { - isa = PBXGroup; - children = ( - 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */, - 618725A22C29EFE200987354 /* Tasks */, - 618725A92C29F09900987354 /* Notifications */, - 617DB3D12C25AFD300B58BFE /* Models */, - ); - path = ActivityViewer; - sourceTree = ""; - }; - 617DB3D12C25AFD300B58BFE /* Models */ = { - isa = PBXGroup; - children = ( - 617DB3D22C25AFEA00B58BFE /* TaskNotificationModel.swift */, - ); - path = Models; - sourceTree = ""; - }; - 617DB3DD2C25E11500B58BFE /* ActivityViewer */ = { - isa = PBXGroup; - children = ( - 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */, - ); - path = ActivityViewer; - sourceTree = ""; - }; - 618725A22C29EFE200987354 /* Tasks */ = { - isa = PBXGroup; - children = ( - B69D3EE22C5F536B005CF43A /* ActiveTaskView.swift */, - 618725A52C29F02500987354 /* DropdownMenuItemStyleModifier.swift */, - 618725A72C29F05500987354 /* OptionMenuItemView.swift */, - 618725A02C29EFCC00987354 /* SchemeDropDownView.swift */, - 618725AA2C29F2C000987354 /* TaskDropDownView.swift */, - B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */, - B69D3EE02C5F5357005CF43A /* TaskView.swift */, - 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */, - ); - path = Tasks; - sourceTree = ""; - }; - 618725A92C29F09900987354 /* Notifications */ = { - isa = PBXGroup; - children = ( - 617DB3D52C25B02D00B58BFE /* TaskNotificationView.swift */, - 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */, - 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */, - 617DB3CF2C25AFAE00B58BFE /* TaskNotificationHandler.swift */, - ); - path = Notifications; - sourceTree = ""; - }; - 618725B92C33107C00987354 /* CEWorkspaceSettings */ = { - isa = PBXGroup; - children = ( - 61A3E3DB2C33131B00076BD3 /* Views */, - 61A3E3DA2C33130B00076BD3 /* Models */, - ); - name = CEWorkspaceSettings; - path = CEWorkSpaceSettings; - sourceTree = ""; - }; - 61A3E3DA2C33130B00076BD3 /* Models */ = { - isa = PBXGroup; - children = ( - 77A01E2D2BB4261200F0EA38 /* CEWorkspaceSettings.swift */, - 61A3E3D82C33126F00076BD3 /* CEWorkspaceSettingsData.swift */, - 77A01E292BB424EA00F0EA38 /* CEWorkspaceSettingsData+ProjectSettings.swift */, - 77A01E422BBC3A2800F0EA38 /* CETask.swift */, - ); - path = Models; - sourceTree = ""; - }; - 61A3E3DB2C33131B00076BD3 /* Views */ = { - isa = PBXGroup; - children = ( - 61A3E3DC2C33132F00076BD3 /* CEWorkspaceSettingsView.swift */, - 61A3E3DE2C3318C900076BD3 /* CEWorkspaceSettingsTaskListView.swift */, - 61A3E3E02C331B4A00076BD3 /* AddCETaskView.swift */, - 61A3E3E22C331B5200076BD3 /* EditCETaskView.swift */, - 61A3E3E42C33202300076BD3 /* CETaskFormView.swift */, - 61A3E3E62C33383100076BD3 /* EnvironmentVariableListItem.swift */, - ); - path = Views; - sourceTree = ""; - }; - 61D435C52C29684100D032B8 /* Tasks */ = { - isa = PBXGroup; - children = ( - B69D3EDF2C5E85B8005CF43A /* Models */, - B69D3EDC2C5E856F005CF43A /* Views */, - 61D435CB2C29699800D032B8 /* TaskManager.swift */, - ); - path = Tasks; - sourceTree = ""; - }; - 61FB03A92C3C1FC4001B3671 /* Tasks */ = { - isa = PBXGroup; - children = ( - 61FB03AD2C3C2493001B3671 /* CEActiveTaskTests.swift */, - 61FB03AF2C3C76AF001B3671 /* TaskManagerTests.swift */, - ); - path = Tasks; - sourceTree = ""; - }; - 61FB03AA2C3C1FD5001B3671 /* Shell */ = { - isa = PBXGroup; - children = ( - 61FB03AB2C3C1FDF001B3671 /* ShellTests.swift */, - ); - path = Shell; - sourceTree = ""; - }; - 6653EE532C34816F00B82DE2 /* Views */ = { - isa = PBXGroup; - children = ( - 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */, - ); - path = Views; - sourceTree = ""; - }; - 669A504F2C380BFD00304CD8 /* Collection */ = { - isa = PBXGroup; - children = ( - 669A50522C380C8E00304CD8 /* Collection+subscript_safe.swift */, - ); - path = Collection; - sourceTree = ""; - }; - 66AF6CE02BF17CB100D83C9D /* ViewModels */ = { - isa = PBXGroup; - children = ( - 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 66AF6CE52BF17FEF00D83C9D /* ViewModifiers */ = { - isa = PBXGroup; - children = ( - 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */, - ); - path = ViewModifiers; - sourceTree = ""; - }; - 66AF6CEE2BF183C500D83C9D /* Models */ = { - isa = PBXGroup; - children = ( - 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */, - ); - path = Models; - sourceTree = ""; - }; - 6C01F25D2C4820B600AA951B /* Recovered References */ = { - isa = PBXGroup; - children = ( - 6C67413D2C44A28C00AABDF5 /* ProjectNavigatorViewController+DataSource.swift */, - 6C67413F2C44A2A200AABDF5 /* ProjectNavigatorViewController+Delegate.swift */, - ); - name = "Recovered References"; - sourceTree = ""; - }; - 6C0738382D284EA20025CBE3 /* ActivityViewer */ = { - isa = PBXGroup; - children = ( - 6C0738392D284EAE0025CBE3 /* Tasks */, - ); - path = ActivityViewer; - sourceTree = ""; - }; - 6C0738392D284EAE0025CBE3 /* Tasks */ = { - isa = PBXGroup; - children = ( - 6C07383A2D284ECA0025CBE3 /* TasksMenuUITests.swift */, - ); - path = Tasks; - sourceTree = ""; - }; - 6C092EDC2A53A63E00489202 /* Views */ = { - isa = PBXGroup; - children = ( - 6C53AAD729A6C4FD00EE9ED6 /* SplitView.swift */, - 6C2C156029B4F52F00EA60A5 /* SplitViewModifiers.swift */, - 6C2C155C29B4F4E500EA60A5 /* SplitViewReader.swift */, - 6C2C155929B4F4CC00EA60A5 /* Variadic.swift */, - 6C7256D629A3D7D000C2D3E0 /* SplitViewControllerView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 6C092EDD2A53A64900489202 /* Model */ = { - isa = PBXGroup; - children = ( - 6C147C4A29A32A7B0089B630 /* Environment+SplitEditor.swift */, - 6C5228B429A868BD00AC48F6 /* Environment+ContentInsets.swift */, - 6C2C155729B4F49100EA60A5 /* SplitViewItem.swift */, - 6C147C3F29A328560089B630 /* SplitViewData.swift */, - ); - path = Model; - sourceTree = ""; - }; - 6C147C3C29A328020089B630 /* Editor */ = { - isa = PBXGroup; - children = ( - 5878DAAB291D627C00DD95A3 /* JumpBar */, - 287776EB27E350BA00D46668 /* TabBar */, - B67660642AA970ED00CD56B0 /* Models */, - B67660632AA970E300CD56B0 /* Views */, - ); - path = Editor; - sourceTree = ""; - }; - 6C147C4729A329E50089B630 /* SplitView */ = { - isa = PBXGroup; - children = ( - 6C092EDD2A53A64900489202 /* Model */, - 6C092EDC2A53A63E00489202 /* Views */, - ); - path = SplitView; - sourceTree = ""; - }; - 6C14CEB12877A5BE001468FE /* FindNavigatorResultList */ = { - isa = PBXGroup; - children = ( - D7E201B327E9989900CB86D0 /* FindNavigatorResultList.swift */, - 6C14CEAF28777D3C001468FE /* FindNavigatorListViewController.swift */, - 6C14CEB22877A68F001468FE /* FindNavigatorMatchListCell.swift */, - ); - path = FindNavigatorResultList; - sourceTree = ""; - }; - 6C2384302C796EBD003FBDD4 /* ChangedFile */ = { - isa = PBXGroup; - children = ( - 201169DA2837B34000F92B46 /* GitChangedFileListView.swift */, - 6C23842E2C796B4C003FBDD4 /* GitChangedFileLabel.swift */, - ); - path = ChangedFile; - sourceTree = ""; - }; - 6C3B4CD22D0E2C5400C6759E /* Editor */ = { - isa = PBXGroup; - children = ( - 6C278CC62C93971F0066F6D9 /* LSPContentCoordinator.swift */, - 6C3B4CD02D0E2C2900C6759E /* SemanticTokenMap.swift */, - 6CC3D1FC2D14761A00822B65 /* SemanticTokenMapRangeProvider.swift */, - ); - path = Editor; - sourceTree = ""; - }; - 6C3E12D42CC830DE00DD12F1 /* Model */ = { - isa = PBXGroup; - children = ( - 6C3E12D22CC830D700DD12F1 /* RecentProjectsStore.swift */, - ); - path = Model; - sourceTree = ""; - }; - 6C48B5DB2C0D664A001E9955 /* Model */ = { - isa = PBXGroup; - children = ( - 6C08249B2C556F7400A0751E /* TerminalCache.swift */, - 6C48B5D92C0D5FC5001E9955 /* CurrentUser.swift */, - 6C48B5CD2C0C1BE4001E9955 /* Shell.swift */, - 6C48B5D02C0D0519001E9955 /* ShellIntegration.swift */, - ); - path = Model; - sourceTree = ""; - }; - 6C48B5DC2C0D6654001E9955 /* Views */ = { - isa = PBXGroup; - children = ( - 6CE21E802C643D8F0031B056 /* CETerminalView.swift */, - 58798280292ED0FB0085B254 /* TerminalEmulatorView.swift */, - 58798281292ED0FB0085B254 /* TerminalEmulatorView+Coordinator.swift */, - ); - path = Views; - sourceTree = ""; - }; - 6C48D8EF2972DAC300D6D205 /* Environment */ = { - isa = PBXGroup; - children = ( - 6C48D8F12972DAFC00D6D205 /* Env+IsFullscreen.swift */, - 6C48D8F32972DB1A00D6D205 /* Env+Window.swift */, - ); - path = Environment; - sourceTree = ""; - }; - 6C510CB62D2E462D006EBE85 /* Extensions */ = { - isa = PBXGroup; - children = ( - 6C510CB72D2E4639006EBE85 /* XCUITest+waitForNonExistence.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - 6C510CBB2D2ECD68006EBE85 /* UtilityArea */ = { - isa = PBXGroup; - children = ( - 6C510CBA2D2ECD68006EBE85 /* UtilityAreaViewModelTests.swift */, - ); - path = UtilityArea; - sourceTree = ""; - }; - 6C6BD6ED29CD123000235D17 /* Extensions */ = { - isa = PBXGroup; - children = ( - 6C6BD6FB29CD152400235D17 /* codeedit.extension.appextensionpoint */, - 6C6BD6EE29CD12E900235D17 /* ExtensionManagerWindow.swift */, - 6C6BD70029CD172700235D17 /* ExtensionsListView.swift */, - 6C578D8629CD345900DC73B2 /* ExtensionSceneView.swift */, - 6C578D8329CD343800DC73B2 /* ExtensionDetailView.swift */, - 6C6BD70329CD17B600235D17 /* ExtensionsManager.swift */, - 6C6BD6F029CD13FA00235D17 /* ExtensionDiscovery.swift */, - 6C6BD6F529CD145F00235D17 /* ExtensionInfo.swift */, - 6C578D8029CD294800DC73B2 /* ExtensionActivatorView.swift */, - 6C578D8829CD36E400DC73B2 /* Commands+ForEach.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - 6C82D6BF29C00EE300495C54 /* Utils */ = { - isa = PBXGroup; - children = ( - B66A4E4429C8E86D004573B4 /* CommandsFixes.swift */, - 6C82D6BB29C00CD900495C54 /* FirstResponderPropertyWrapper.swift */, - 6C3E12D72CC83CB600DD12F1 /* RecentProjectsMenu.swift */, - 6CD035892C3461160091E1F4 /* KeyWindowControllerObserver.swift */, - 6CC17B5A2C44258700834E2C /* WindowControllerPropertyWrapper.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 6C82D6C429C0129E00495C54 /* NSApplication */ = { - isa = PBXGroup; - children = ( - 6C82D6C529C012AD00495C54 /* NSApp+openWindow.swift */, - ); - path = NSApplication; - sourceTree = ""; - }; - 6C96191C2C3F27E3009733CE /* ProjectNavigator */ = { - isa = PBXGroup; - children = ( - 6CFC0C3B2D381D2000F09CD0 /* ProjectNavigatorFileManagementUITests.swift */, - 6C96191B2C3F27E3009733CE /* ProjectNavigatorUITests.swift */, - ); - path = ProjectNavigator; - sourceTree = ""; - }; - 6C96191D2C3F27E3009733CE /* NavigatorArea */ = { - isa = PBXGroup; - children = ( - 6C96191C2C3F27E3009733CE /* ProjectNavigator */, - ); - path = NavigatorArea; - sourceTree = ""; - }; - 6C96191E2C3F27E3009733CE /* Features */ = { - isa = PBXGroup; - children = ( - 6C0738382D284EA20025CBE3 /* ActivityViewer */, - 6C96191D2C3F27E3009733CE /* NavigatorArea */, - ); - path = Features; - sourceTree = ""; - }; - 6C96191F2C3F27E3009733CE /* CodeEditUITests */ = { - isa = PBXGroup; - children = ( - 6CFC0C3D2D382B3900F09CD0 /* UI TESTING.md */, - 6CFBA54A2C4E168A00E3A914 /* App.swift */, - 6C510CB62D2E462D006EBE85 /* Extensions */, - 6C96191E2C3F27E3009733CE /* Features */, - 6CFBA54E2C4E182100E3A914 /* Other Tests */, - 6C9619232C3F2809009733CE /* ProjectPath.swift */, - 6C9619212C3F27F1009733CE /* Query.swift */, - ); - path = CodeEditUITests; - sourceTree = ""; - }; - 6CAAF68F29BCC6F900A1F48A /* WindowCommands */ = { - isa = PBXGroup; - children = ( - 6C82D6BF29C00EE300495C54 /* Utils */, - B66A4E5229C91831004573B4 /* CodeEditCommands.swift */, - 6CFF967729BEBCF600182D6F /* MainCommands.swift */, - 6CFF967529BEBCD900182D6F /* FileCommands.swift */, - 6CFF967929BEBD2400182D6F /* ViewCommands.swift */, - 6CFF967329BEBCC300182D6F /* FindCommands.swift */, - 6C82D6B229BFD88700495C54 /* NavigateCommands.swift */, - B6966A2D2C3056AD00259C2D /* SourceControlCommands.swift */, - 6C578D8B29CD372700DC73B2 /* ExtensionCommands.swift */, - 6CFF967B29BEBD5200182D6F /* WindowCommands.swift */, - 6C82D6B829BFE34900495C54 /* HelpCommands.swift */, - ); - path = WindowCommands; - sourceTree = ""; - }; - 6CB94CFF2C9F1CB600E8651C /* TextView */ = { - isa = PBXGroup; - children = ( - 6CB94CFD2C9F1C9A00E8651C /* TextView+LSPRange.swift */, - 6CC3D1FA2D1475EC00822B65 /* TextView+SemanticTokenRangeProvider.swift */, - ); - path = TextView; - sourceTree = ""; - }; - 6CB94D002C9F1CF900E8651C /* LanguageIdentifier */ = { - isa = PBXGroup; - children = ( - 6CD26C802C8F8A4400ADBA38 /* LanguageIdentifier+CodeLanguage.swift */, - ); - path = LanguageIdentifier; - sourceTree = ""; - }; - 6CBD1BC42978DE3E006639D5 /* Text */ = { - isa = PBXGroup; - children = ( - 6CBD1BC52978DE53006639D5 /* Font+Caption3.swift */, - ); - path = Text; - sourceTree = ""; - }; - 6CC17B542C43448C00834E2C /* WorkspaceDocument */ = { - isa = PBXGroup; - children = ( - 043C321527E3201F006AE443 /* WorkspaceDocument.swift */, - 043BCF02281DA18A000AC47C /* WorkspaceDocument+SearchState.swift */, - 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */, - 61A53A7D2B4449870093BF8A /* WorkspaceDocument+Find.swift */, - 610C0FD92B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift */, - 6C05A8AE284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift */, - 6C092EDF2A53BFCF00489202 /* WorkspaceStateKey.swift */, - ); - path = WorkspaceDocument; - sourceTree = ""; - }; - 6CC17B552C4344F100834E2C /* CodeFileDocument */ = { - isa = PBXGroup; - children = ( - 58798249292E78D80085B254 /* CodeFileDocument.swift */, - 6C48B5C42C0A2835001E9955 /* FileEncoding.swift */, - ); - path = CodeFileDocument; - sourceTree = ""; - }; - 6CD26C732C8EA71F00ADBA38 /* LanguageServer */ = { - isa = PBXGroup; - children = ( - 30B087F72C0D53080063A882 /* LanguageServer.swift */, - 6CD26C6D2C8EA1E600ADBA38 /* LanguageServerFileMap.swift */, - 6CD26C782C8EA8A500ADBA38 /* LSPCache.swift */, - 6CD26C792C8EA8A500ADBA38 /* LSPCache+Data.swift */, - 30B0881E2C12626B0063A882 /* Capabilities */, - ); - path = LanguageServer; - sourceTree = ""; - }; - 6CD26C742C8EA79100ADBA38 /* Service */ = { - isa = PBXGroup; - children = ( - 30B087F82C0D53080063A882 /* LSPService.swift */, - 30CB648C2C12680F00CC8A9E /* LSPService+Events.swift */, - ); - path = Service; - sourceTree = ""; - }; - 6CD26C752C8EA80000ADBA38 /* URL */ = { - isa = PBXGroup; - children = ( - 613899BB2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift */, - 6CD26C762C8EA83900ADBA38 /* URL+absolutePath.swift */, - 587B9E2729301D8F00AC7927 /* URL+URLParameters.swift */, - 6C9AE66E2D148DD200FAE8D2 /* URL+FindWorkspace.swift */, - ); - path = URL; - sourceTree = ""; - }; - 6CD26C882C8F91B600ADBA38 /* LSP */ = { - isa = PBXGroup; - children = ( - 6C7D6D452C9092EC00B69EE0 /* BufferingServerConnection.swift */, - 6CD26C892C8F91ED00ADBA38 /* LanguageServer+DocumentTests.swift */, - 6C3B4CD32D0E2CB000C6759E /* SemanticTokenMapTests.swift */, - ); - path = LSP; - sourceTree = ""; - }; - 6CFBA54E2C4E182100E3A914 /* Other Tests */ = { - isa = PBXGroup; - children = ( - 6CFBA54C2C4E16C900E3A914 /* WindowCloseCommandTests.swift */, - ); - path = "Other Tests"; - sourceTree = ""; - }; - 77A01E922BCA9C0400F0EA38 /* NSWindow */ = { - isa = PBXGroup; - children = ( - 77A01E6C2BC3EA2A00F0EA38 /* NSWindow+Child.swift */, - ); - path = NSWindow; - sourceTree = ""; - }; - 77EF6C042C57DE4B00984B69 /* URL */ = { - isa = PBXGroup; - children = ( - 77EF6C032C57DE4B00984B69 /* URL+ResouceValues.swift */, - 77EF6C0A2C60C80800984B69 /* URL+Filename.swift */, - 6C3E12D52CC8388000DD12F1 /* URL+componentCompare.swift */, - ); - path = URL; - sourceTree = ""; - }; - 85E412282A46C8B900183F2B /* Models */ = { - isa = PBXGroup; - children = ( - 85E412292A46C8CA00183F2B /* LocationsSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B60718472B17DC5B009CDAB4 /* Views */ = { - isa = PBXGroup; - children = ( - 201169E42837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift */, - B60718432B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift */, - B607183E2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift */, - B60718412B17DB93009CDAB4 /* SourceControlNavigatorRepositoryView+outlineGroupData.swift */, - ); - path = Views; - sourceTree = ""; - }; - B60718482B17DC64009CDAB4 /* Models */ = { - isa = PBXGroup; - children = ( - B60718452B17DC15009CDAB4 /* RepoOutlineGroupItem.swift */, - ); - path = Models; - sourceTree = ""; - }; - B60718492B17DC85009CDAB4 /* Views */ = { - isa = PBXGroup; - children = ( - 201169E12837B3D800F92B46 /* SourceControlNavigatorChangesView.swift */, - 04BA7C0D2AE2A76E00584E1C /* SourceControlNavigatorChangesCommitView.swift */, - B65B10FD2B08B07D002852CF /* SourceControlNavigatorChangesList.swift */, - 04BA7C232AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift */, - B65B10F72B081A34002852CF /* SourceControlNavigatorNoRemotesView.swift */, - ); - path = Views; - sourceTree = ""; - }; - B616EA8A2D651B0A00DF9029 /* Styles */ = { - isa = PBXGroup; - children = ( - B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */, - B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */, - B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */, - 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */, - ); - path = Styles; - sourceTree = ""; - }; - B616EA8C2D65238900DF9029 /* InternalDevelopmentInspector */ = { - isa = PBXGroup; - children = ( - B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */, - B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */, - ); - path = InternalDevelopmentInspector; - sourceTree = ""; - }; - B61DA9DD29D929BF00BF4A43 /* Pages */ = { - isa = PBXGroup; - children = ( - B6E41C6E29DD15540088F9F4 /* AccountsSettings */, - 30AB4EB72BF7170B00ED4431 /* DeveloperSettings */, - B61DA9E129D929F900BF4A43 /* GeneralSettings */, - B6CF632629E5417C0085880A /* Keybindings */, - B6F0516E29D9E35300D72287 /* LocationsSettings */, - B664C3AD2B965F4500816B4E /* NavigationSettings */, - 5B698A082B262F8400DE9392 /* SearchSettings */, - B6F0516D29D9E34200D72287 /* SourceControlSettings */, - B6F0516C29D9E32700D72287 /* TerminalSettings */, - B6EA1FF329DA37D3001BF195 /* TextEditingSettings */, - 58F2EAAE292FB2B0004A9BDE /* ThemeSettings */, + 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */, + 6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */, + 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */, + 6C9DB9E42D55656300ACD86E /* CodeEditSourceEditor in Frameworks */, ); - path = Pages; - sourceTree = ""; + runOnlyForDeploymentPostprocessing = 0; }; - B61DA9E129D929F900BF4A43 /* GeneralSettings */ = { - isa = PBXGroup; - children = ( - B6CF632529E541520085880A /* Models */, - B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */, - B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */, + B658FB3A27DA9E1000EA4DBD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 583E529C29361BAB001AB554 /* SnapshotTesting in Frameworks */, ); - path = GeneralSettings; - sourceTree = ""; + runOnlyForDeploymentPostprocessing = 0; }; - B62AEDB12A1FD7F0009A9F52 /* Views */ = { - isa = PBXGroup; - children = ( - B62AEDD32A27B29F009A9F52 /* PaneToolbar.swift */, - 58822513292C280D00E83CDE /* UtilityAreaView.swift */, - B62AEDC82A2704F3009A9F52 /* UtilityAreaTabView.swift */, - B62AEDDA2A27C1B3009A9F52 /* OSLogType+Color.swift */, - B62AEDD02A27B264009A9F52 /* View+paneToolbar.swift */, + B658FB4427DA9E1000EA4DBD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( ); - path = Views; - sourceTree = ""; + runOnlyForDeploymentPostprocessing = 0; }; - B63F6A752C5618BF003B4342 /* Formatters */ = { +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5C403B8D27E20F8000788241 /* Frameworks */ = { isa = PBXGroup; children = ( - B63F6A7A2C561BCB003B4342 /* RegexFormatter.swift */, - B63F6A782C5618EF003B4342 /* TrimWhitespaceFormatter.swift */, + 589F3E342936185400E1A4DA /* XCTest.framework */, ); - path = Formatters; + name = Frameworks; sourceTree = ""; }; - B640A9A329E218E300715F20 /* Models */ = { + 6C01F25D2C4820B600AA951B /* Recovered References */ = { isa = PBXGroup; children = ( - B67DBB8F2CD5EA71007F4F18 /* GlobPattern.swift */, - 58F2EADB292FB2B0004A9BDE /* SettingsData.swift */, - 58F2EAD2292FB2B0004A9BDE /* Settings.swift */, - 6C5FDF7929E6160000BC08C0 /* AppSettings.swift */, - 6CD03B6929FC773F001BD1D0 /* SettingsInjector.swift */, - 6C0D0C6729E861B000AE4D3F /* SettingsSidebarFix.swift */, - 850C631129D6B03400E1444C /* SettingsPage.swift */, - 85773E1D2A3E0A1F00C5D926 /* SettingsSearchResult.swift */, - 852E62002A5C17E500447138 /* PageAndSettings.swift */, + 6C67413D2C44A28C00AABDF5 /* ProjectNavigatorViewController+DataSource.swift */, + 6C67413F2C44A2A200AABDF5 /* ProjectNavigatorViewController+Delegate.swift */, ); - path = Models; + name = "Recovered References"; sourceTree = ""; }; B658FB2327DA9E0F00EA4DBD = { isa = PBXGroup; children = ( - B658FB2E27DA9E0F00EA4DBD /* CodeEdit */, - 587B60F329340A8000D5CD8F /* CodeEditTests */, - 6C96191F2C3F27E3009733CE /* CodeEditUITests */, - 28052E0129730F2F00F4F90A /* Configs */, + B624520B2D78A3CC009A86D1 /* CodeEdit */, + B62454A32D78A3D4009A86D1 /* CodeEditTests */, + B62454602D78A3D4009A86D1 /* CodeEditUITests */, + B624544F2D78A3D3009A86D1 /* Configs */, B6FF04772B6C08AC002C2C78 /* DefaultThemes */, 58F2EACE292FB2B0004A9BDE /* Documentation.docc */, - 2BE487ED28245162003F3F64 /* OpenWithCodeEdit */, + B62454CD2D78A3D8009A86D1 /* OpenWithCodeEdit */, 6C9619262C3F285C009733CE /* CodeEditTestPlan.xctestplan */, 284DC8502978BA2600BF2770 /* .all-contributorsrc */, 283BDCBC2972EEBD002AFF81 /* Package.resolved */, @@ -3392,463 +256,6 @@ name = Products; sourceTree = ""; }; - B658FB2E27DA9E0F00EA4DBD /* CodeEdit */ = { - isa = PBXGroup; - children = ( - 5831E3C52933E6CB00D5A6D2 /* Features */, - D7211D4427E066D4008F2ED7 /* Localization */, - B658FB3527DA9E1000EA4DBD /* Preview Content */, - 3E0196712A392170002648D8 /* ShellIntegration */, - 58D01C85293167DC00C5B6B4 /* Utils */, - B66A4E5529C918A0004573B4 /* SceneID.swift */, - 0468438427DC76E200F8E88E /* AppDelegate.swift */, - B658FB3327DA9E1000EA4DBD /* Assets.xcassets */, - B658FB3827DA9E1000EA4DBD /* CodeEdit.entitlements */, - B66A4E4B29C9179B004573B4 /* CodeEditApp.swift */, - 04660F6027E3A68A00477777 /* Info.plist */, - 6C48D8F62972E5F300D6D205 /* WindowObserver.swift */, - B658FB3127DA9E0F00EA4DBD /* WorkspaceView.swift */, - B6966A312C3348D300259C2D /* WorkspaceSheets.swift */, - 5C4BB1E028212B1E00A92FB2 /* World.swift */, - ); - path = CodeEdit; - sourceTree = ""; - }; - B658FB3527DA9E1000EA4DBD /* Preview Content */ = { - isa = PBXGroup; - children = ( - B658FB3627DA9E1000EA4DBD /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - B664C3AD2B965F4500816B4E /* NavigationSettings */ = { - isa = PBXGroup; - children = ( - B664C3AE2B965F5500816B4E /* Models */, - B664C3B22B96634F00816B4E /* NavigationSettingsView.swift */, - ); - path = NavigationSettings; - sourceTree = ""; - }; - B664C3AE2B965F5500816B4E /* Models */ = { - isa = PBXGroup; - children = ( - B664C3AF2B965F6C00816B4E /* NavigationSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B66DD19E2B3C0E0C0004FFEC /* History */ = { - isa = PBXGroup; - children = ( - B66DD19F2B3C0E160004FFEC /* Views */, - ); - path = History; - sourceTree = ""; - }; - B66DD19F2B3C0E160004FFEC /* Views */ = { - isa = PBXGroup; - children = ( - B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */, - 20EBB504280C329800F3A5DA /* CommitListItemView.swift */, - B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */, - B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */, - ); - path = Views; - sourceTree = ""; - }; - B67660622AA961E900CD56B0 /* Tab */ = { - isa = PBXGroup; - children = ( - 58AFAA272933C65C00482B53 /* Models */, - B6C6A42F29771F7100A3D28F /* EditorTabBackground.swift */, - B6C6A42D29771A8D00A3D28F /* EditorTabButtonStyle.swift */, - 04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */, - B6C6A429297716A500A3D28F /* EditorTabCloseButton.swift */, - 587FB98F29C1246400B519DD /* EditorTabView.swift */, - ); - path = Tab; - sourceTree = ""; - }; - B67660632AA970E300CD56B0 /* Views */ = { - isa = PBXGroup; - children = ( - 669BC4072BED306400D1197C /* AnyFileView.swift */, - 58798248292E78D80085B254 /* CodeFileView.swift */, - 6C147C4C29A32AA30089B630 /* EditorAreaView.swift */, - 0485EB1E27E7458B00138301 /* EditorAreaFileView.swift */, - 6C147C4829A32A080089B630 /* EditorLayoutView.swift */, - 661EF7B72BEE215300C3E577 /* ImageFileView.swift */, - 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */, - 66F370332BEE537B00D3B823 /* NonTextFileView.swift */, - 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */, - 6C5B63DD29C76213005454BA /* WindowCodeFileView.swift */, - ); - path = Views; - sourceTree = ""; - }; - B67660642AA970ED00CD56B0 /* Models */ = { - isa = PBXGroup; - children = ( - 6C147C3D29A3281D0089B630 /* Editor.swift */, - 6C6362D32C3E321A0025570D /* Editor+History.swift */, - 5994B6D92BD6B408006A4C5F /* Editor+TabSwitch.swift */, - 6CA1AE942B46950000378EAB /* EditorInstance.swift */, - 6C147C3E29A3281D0089B630 /* EditorLayout.swift */, - 6C092ED92A53A58600489202 /* EditorLayout+StateRestoration.swift */, - 6C91D57129B176FF0059A90D /* EditorManager.swift */, - 6CC9E4B129B5669900C97388 /* Environment+ActiveEditor.swift */, - ); - path = Models; - sourceTree = ""; - }; - B67660662AA9726F00CD56B0 /* HistoryInspector */ = { - isa = PBXGroup; - children = ( - 2072FA12280D74ED00C7F8D4 /* HistoryInspectorModel.swift */, - 20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */, - 20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */, - B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */, - ); - path = HistoryInspector; - sourceTree = ""; - }; - B67660672AA972B000CD56B0 /* FileInspector */ = { - isa = PBXGroup; - children = ( - 20EBB500280C325D00F3A5DA /* FileInspectorView.swift */, - ); - path = FileInspector; - sourceTree = ""; - }; - B67660682AA972D400CD56B0 /* Models */ = { - isa = PBXGroup; - children = ( - 6CE6226D2A2A1CDE0013085C /* NavigatorTab.swift */, - ); - path = Models; - sourceTree = ""; - }; - B67660692AA972DC00CD56B0 /* Views */ = { - isa = PBXGroup; - children = ( - 287776E627E3413200D46668 /* NavigatorAreaView.swift */, - ); - path = Views; - sourceTree = ""; - }; - B676606A2AA973A500CD56B0 /* TerminalUtility */ = { - isa = PBXGroup; - children = ( - 6CCEE7F42D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift */, - 6C4E37F52C73DA5200AEE7B5 /* UtilityAreaTerminalSidebar.swift */, - B62AEDBB2A210DBB009A9F52 /* UtilityAreaTerminalTab.swift */, - B62AEDB22A1FD95B009A9F52 /* UtilityAreaTerminalView.swift */, - ); - path = TerminalUtility; - sourceTree = ""; - }; - B676606B2AA973B200CD56B0 /* DebugUtility */ = { - isa = PBXGroup; - children = ( - B62AEDB42A1FE295009A9F52 /* UtilityAreaDebugView.swift */, - 618725B32C2DBC2800987354 /* TaskOutputActionsView.swift */, - 618725B12C2DBC0C00987354 /* TaskOutputView.swift */, - ); - path = DebugUtility; - sourceTree = ""; - }; - B676606C2AA973C000CD56B0 /* OutputUtility */ = { - isa = PBXGroup; - children = ( - B62AEDB72A1FE2DC009A9F52 /* UtilityAreaOutputView.swift */, - ); - path = OutputUtility; - sourceTree = ""; - }; - B676606D2AA9741900CD56B0 /* Models */ = { - isa = PBXGroup; - children = ( - 6CE6226A2A2A1C730013085C /* UtilityAreaTab.swift */, - 6C08249D2C55768400A0751E /* UtilityAreaTerminal.swift */, - ); - path = Models; - sourceTree = ""; - }; - B67B270029D7868000FB9301 /* Settings */ = { - isa = PBXGroup; - children = ( - B640A9A329E218E300715F20 /* Models */, - B6CF632A29E5436C0085880A /* Views */, - B61DA9DD29D929BF00BF4A43 /* Pages */, - B6041F5129D7D6D6000F3454 /* SettingsWindow.swift */, - 850C630F29D6B01D00E1444C /* SettingsView.swift */, - 58F2EAE1292FB2B0004A9BDE /* SoftwareUpdater.swift */, - ); - path = Settings; - sourceTree = ""; - }; - B68DE5D82D5A61E5009A43EF /* Models */ = { - isa = PBXGroup; - children = ( - B68DE5D72D5A61E5009A43EF /* CENotification.swift */, - ); - path = Models; - sourceTree = ""; - }; - B68DE5DC2D5A61E5009A43EF /* Views */ = { - isa = PBXGroup; - children = ( - B68DE5D92D5A61E5009A43EF /* NotificationBannerView.swift */, - B68DE5E42D5A7988009A43EF /* NotificationPanelView.swift */, - B68DE5DB2D5A61E5009A43EF /* NotificationToolbarItem.swift */, - ); - path = Views; - sourceTree = ""; - }; - B68DE5DE2D5A61E5009A43EF /* Notifications */ = { - isa = PBXGroup; - children = ( - B68DE5D82D5A61E5009A43EF /* Models */, - B69970312D63E5C700BB132D /* ViewModels */, - B68DE5DC2D5A61E5009A43EF /* Views */, - B68DE5DD2D5A61E5009A43EF /* NotificationManager.swift */, - B66460572D600E9500EC1411 /* NotificationManager+Delegate.swift */, - B66460582D600E9500EC1411 /* NotificationManager+System.swift */, - ); - path = Notifications; - sourceTree = ""; - }; - B6966A262C2F673A00259C2D /* Views */ = { - isa = PBXGroup; - children = ( - B6BF41412C2C672A003AB4B3 /* SourceControlPushView.swift */, - B6966A272C2F683300259C2D /* SourceControlPullView.swift */, - B607184B2B17E037009CDAB4 /* SourceControlStashView.swift */, - B6966A292C2F687A00259C2D /* SourceControlFetchView.swift */, - B67431CB2C3E45F30047FCA6 /* SourceControlSwitchView.swift */, - B65B10F42B081A0C002852CF /* SourceControlAddExistingRemoteView.swift */, - 041FC6AC2AE437CE00C1F65A /* SourceControlNewBranchView.swift */, - B60718362B170638009CDAB4 /* SourceControlRenameBranchView.swift */, - B6966A2F2C33282200259C2D /* RemoteBranchPicker.swift */, - ); - path = Views; - sourceTree = ""; - }; - B69970312D63E5C700BB132D /* ViewModels */ = { - isa = PBXGroup; - children = ( - B69970302D63E5C700BB132D /* NotificationPanelViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - B69D3EDC2C5E856F005CF43A /* Views */ = { - isa = PBXGroup; - children = ( - B69D3EDD2C5E85A2005CF43A /* StopTaskToolbarButton.swift */, - B68108032C60287F008B27C1 /* StartTaskToolbarButton.swift */, - ); - path = Views; - sourceTree = ""; - }; - B69D3EDF2C5E85B8005CF43A /* Models */ = { - isa = PBXGroup; - children = ( - 61D435CD2C2969C300D032B8 /* CEActiveTask.swift */, - 61D435D12C2969D800D032B8 /* CETaskStatus.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6AB09AB2AAACBF70003A3A6 /* Tabs */ = { - isa = PBXGroup; - children = ( - B67660622AA961E900CD56B0 /* Tab */, - B6AB09AC2AAACC190003A3A6 /* Views */, - ); - path = Tabs; - sourceTree = ""; - }; - B6AB09AC2AAACC190003A3A6 /* Views */ = { - isa = PBXGroup; - children = ( - B6AB09A02AAABAAE0003A3A6 /* EditorTabs.swift */, - B6E55C3A2A95368E003ECC7D /* EditorTabsOverflowShadow.swift */, - ); - path = Views; - sourceTree = ""; - }; - B6CF632529E541520085880A /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EAD6292FB2B0004A9BDE /* GeneralSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6CF632629E5417C0085880A /* Keybindings */ = { - isa = PBXGroup; - children = ( - B6CF632729E5418A0085880A /* Models */, - ); - path = Keybindings; - sourceTree = ""; - }; - B6CF632729E5418A0085880A /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EAD4292FB2B0004A9BDE /* KeybindingsSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6CF632829E541AC0085880A /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EADA292FB2B0004A9BDE /* TerminalSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6CF632929E541C00085880A /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EAD8292FB2B0004A9BDE /* TextEditingSettings.swift */, - B6CFD8102C20A8EE00E63F1A /* NSFont+WithWeight.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6CF632A29E5436C0085880A /* Views */ = { - isa = PBXGroup; - children = ( - B67DBB932CD5FBE2007F4F18 /* GlobPatternListItem.swift */, - B67DBB912CD5EAA4007F4F18 /* GlobPatternList.swift */, - B6041F4C29D7A4E9000F3454 /* SettingsPageView.swift */, - B640A99D29E2184700715F20 /* SettingsForm.swift */, - B6EA1FFF29DB7966001BF195 /* SettingsColorPicker.swift */, - B61A606829F4481A009B43F9 /* MonospacedFontPicker.swift */, - B61A606029F188AB009B43F9 /* ExternalLink.swift */, - B640A9A029E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift */, - B6EA200129DB7F81001BF195 /* View+ConstrainHeightToWindow.swift */, - B6E41C7329DD40010088F9F4 /* View+HideSidebarToggle.swift */, - B6CFD80C2C1B9A8000E63F1A /* FontWeightPicker.swift */, - ); - path = Views; - sourceTree = ""; - }; - B6E41C6E29DD15540088F9F4 /* AccountsSettings */ = { - isa = PBXGroup; - children = ( - B6E41C9229DEAE0A0088F9F4 /* Models */, - B6E41C6F29DD157F0088F9F4 /* AccountsSettingsView.swift */, - B697937929FF5668002027EC /* AccountsSettingsAccountLink.swift */, - B6E41C7B29DE2B110088F9F4 /* AccountsSettingsProviderRow.swift */, - B6E41C7829DE02800088F9F4 /* AccountSelectionView.swift */, - B6E41C8A29DE7AE80088F9F4 /* AccountsSettingsSigninView.swift */, - B6E41C8E29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift */, - B6A43C5C29FC4AF00027E0E0 /* CreateSSHKeyView.swift */, - ); - path = AccountsSettings; - sourceTree = ""; - }; - B6E41C9229DEAE0A0088F9F4 /* Models */ = { - isa = PBXGroup; - children = ( - B6E41C9329DEAE260088F9F4 /* SourceControlAccount.swift */, - 58F2EADD292FB2B0004A9BDE /* AccountsSettings.swift */, - ); - path = Models; - sourceTree = ""; - }; - B6EA1FF329DA37D3001BF195 /* TextEditingSettings */ = { - isa = PBXGroup; - children = ( - B6CF632929E541C00085880A /* Models */, - B6EA1FF429DA380E001BF195 /* TextEditingSettingsView.swift */, - ); - path = TextEditingSettings; - sourceTree = ""; - }; - B6EE988E27E8877C00CDD8AB /* InspectorArea */ = { - isa = PBXGroup; - children = ( - 3026F50B2AC006A10061227E /* ViewModels */, - B67660672AA972B000CD56B0 /* FileInspector */, - B67660662AA9726F00CD56B0 /* HistoryInspector */, - B616EA8C2D65238900DF9029 /* InternalDevelopmentInspector */, - 20EBB50B280C382800F3A5DA /* Models */, - 20EBB4FF280C325000F3A5DA /* Views */, - ); - path = InspectorArea; - sourceTree = ""; - }; - B6F0516C29D9E32700D72287 /* TerminalSettings */ = { - isa = PBXGroup; - children = ( - B6CF632829E541AC0085880A /* Models */, - B6F0517C29D9E4B100D72287 /* TerminalSettingsView.swift */, - ); - path = TerminalSettings; - sourceTree = ""; - }; - B6F0516D29D9E34200D72287 /* SourceControlSettings */ = { - isa = PBXGroup; - children = ( - 58F2EAA9292FB2B0004A9BDE /* Models */, - B6F0517A29D9E46400D72287 /* SourceControlSettingsView.swift */, - B6F0517629D9E3AD00D72287 /* SourceControlGeneralView.swift */, - B6F0517829D9E3C900D72287 /* SourceControlGitView.swift */, - B67DBB892CD5D8E4007F4F18 /* IgnoredFilesListView.swift */, - ); - path = SourceControlSettings; - sourceTree = ""; - }; - B6F0516E29D9E35300D72287 /* LocationsSettings */ = { - isa = PBXGroup; - children = ( - 85E412282A46C8B900183F2B /* Models */, - B6F0516F29D9E36800D72287 /* LocationsSettingsView.swift */, - ); - path = LocationsSettings; - sourceTree = ""; - }; - B6F0518D29DA29F900D72287 /* Models */ = { - isa = PBXGroup; - children = ( - 58F2EAE0292FB2B0004A9BDE /* ThemeSettings.swift */, - B6EA1FE429DA33DB001BF195 /* ThemeModel.swift */, - B624232F2C21EE280096668B /* ThemeModel+CRUD.swift */, - B6EA1FE629DA341D001BF195 /* Theme.swift */, - 61C7E82E2C6CDBA500845336 /* Theme+FuzzySearchable.swift */, - ); - path = Models; - sourceTree = ""; - }; - D7012EE627E757660001E1EF /* FindNavigator */ = { - isa = PBXGroup; - children = ( - D7012EE727E757850001E1EF /* FindNavigatorView.swift */, - 6C1CC99A2B1E7CBC0002349B /* FindNavigatorIndexBar.swift */, - D7E201B127E8D50000CB86D0 /* FindNavigatorForm.swift */, - 6C14CEB12877A5BE001468FE /* FindNavigatorResultList */, - B67DB0F52AFC2A7A002DC647 /* FindNavigatorToolbarBottom.swift */, - B628B7B62B223BAD00F9775A /* FindModePicker.swift */, - ); - path = FindNavigator; - sourceTree = ""; - }; - D7211D4427E066D4008F2ED7 /* Localization */ = { - isa = PBXGroup; - children = ( - D7211D4227E066CE008F2ED7 /* Localized+Ex.swift */, - D7211D4927E06BFE008F2ED7 /* Localizable.strings */, - ); - path = Localization; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -3888,6 +295,9 @@ 6C7B1C762A1D57CE005CBBFC /* PBXTargetDependency */, 2BE487F328245162003F3F64 /* PBXTargetDependency */, ); + fileSystemSynchronizedGroups = ( + B624520B2D78A3CC009A86D1 /* CodeEdit */, + ); name = CodeEdit; packageProductDependencies = ( 2816F593280CF50500DD548B /* CodeEditSymbols */, @@ -3928,6 +338,9 @@ dependencies = ( B658FB3F27DA9E1000EA4DBD /* PBXTargetDependency */, ); + fileSystemSynchronizedGroups = ( + B62454A32D78A3D4009A86D1 /* CodeEditTests */, + ); name = CodeEditTests; packageProductDependencies = ( 583E529B29361BAB001AB554 /* SnapshotTesting */, @@ -3949,6 +362,9 @@ dependencies = ( B658FB4927DA9E1000EA4DBD /* PBXTargetDependency */, ); + fileSystemSynchronizedGroups = ( + B62454602D78A3D4009A86D1 /* CodeEditUITests */, + ); name = CodeEditUITests; packageProductDependencies = ( ); @@ -3984,7 +400,6 @@ }; }; buildConfigurationList = B658FB2727DA9E0F00EA4DBD /* Build configuration list for PBXProject "CodeEdit" */; - compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -4009,6 +424,7 @@ 6CB94D012CA1205100E8651C /* XCRemoteSwiftPackageReference "swift-async-algorithms" */, 6C9DB9E22D55656300ACD86E /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */, ); + preferredProjectObjectVersion = 55; productRefGroup = B658FB2D27DA9E0F00EA4DBD /* Products */; projectDirPath = ""; projectRoot = ""; @@ -4026,7 +442,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2B7AC06B282452FB0082A5B8 /* Media.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4036,17 +451,7 @@ files = ( B6FF04782B6C08AC002C2C78 /* DefaultThemes in Resources */, 283BDCBD2972EEBD002AFF81 /* Package.resolved in Resources */, - B658FB3727DA9E1000EA4DBD /* Preview Assets.xcassets in Resources */, - 3E0196732A3921AC002648D8 /* codeedit_shell_integration_rc.zsh in Resources */, - 58A5DFA529339F6400D1BD5D /* default_keybindings.json in Resources */, - 6C48B5D42C0D0743001E9955 /* codeedit_shell_integration_env.zsh in Resources */, - 3E01967A2A392B45002648D8 /* codeedit_shell_integration.bash in Resources */, - D7211D4727E06BFE008F2ED7 /* Localizable.strings in Resources */, - 6C48B5D62C0D08C5001E9955 /* codeedit_shell_integration_profile.zsh in Resources */, 284DC8512978BA2600BF2770 /* .all-contributorsrc in Resources */, - B658FB3427DA9E1000EA4DBD /* Assets.xcassets in Resources */, - 6C48B5D82C0D5DB5001E9955 /* codeedit_shell_integration_login.zsh in Resources */, - 6C6BD6FC29CD152400235D17 /* codeedit.extension.appextensionpoint in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4054,18 +459,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 583E529329361B39001AB554 /* testFontPickerViewDark.1.png in Resources */, - 583E529129361B39001AB554 /* testHelpButtonLight.1.png in Resources */, - 583E529029361B39001AB554 /* testSegmentedControlProminentLight.1.png in Resources */, - 583E528F29361B39001AB554 /* testSegmentedControlLight.1.png in Resources */, - 583E529429361B39001AB554 /* testFontPickerViewLight.1.png in Resources */, - 583E529729361B39001AB554 /* testEffectViewDark.1.png in Resources */, - 583E529829361B39001AB554 /* testBranchPickerLight.1.png in Resources */, - 583E528E29361B39001AB554 /* testEffectViewLight.1.png in Resources */, - 583E529229361B39001AB554 /* testBranchPickerDark.1.png in Resources */, - 583E529529361B39001AB554 /* testSegmentedControlProminentDark.1.png in Resources */, - 583E528D29361B39001AB554 /* testHelpButtonDark.1.png in Resources */, - 583E529629361B39001AB554 /* testSegmentedControlDark.1.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4073,7 +466,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6CFC0C3E2D382B3F00F09CD0 /* UI TESTING.md in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4125,7 +517,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2BE487EF28245162003F3F64 /* FinderSync.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4133,570 +524,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 58798285292ED0FB0085B254 /* TerminalEmulatorView+Coordinator.swift in Sources */, - 30B0880E2C0D53080063A882 /* LanguageServer+Rename.swift in Sources */, - 587B9E7D29301D8F00AC7927 /* GitHubPullRequestRouter.swift in Sources */, - B67DB0EF2AF3E381002DC647 /* PaneTextField.swift in Sources */, - 5878DA842918642000DD95A3 /* ParsePackagesResolved.swift in Sources */, - 61A3E3E52C33202300076BD3 /* CETaskFormView.swift in Sources */, - B628B7932B18369800F9775A /* GitClient+Validate.swift in Sources */, - 30B088142C0D53080063A882 /* LanguageServer.swift in Sources */, - 5879824F292E78D80085B254 /* CodeFileView.swift in Sources */, - 6C0D0C6829E861B000AE4D3F /* SettingsSidebarFix.swift in Sources */, - B6BF41422C2C672A003AB4B3 /* SourceControlPushView.swift in Sources */, - 587B9E8429301D8F00AC7927 /* GitHubUser.swift in Sources */, - 04BA7C1C2AE2D84100584E1C /* GitClient+Commit.swift in Sources */, - B68DE5DF2D5A61E5009A43EF /* CENotification.swift in Sources */, - B68DE5E02D5A61E5009A43EF /* NotificationBannerView.swift in Sources */, - B68DE5E22D5A61E5009A43EF /* NotificationToolbarItem.swift in Sources */, - B68DE5E32D5A61E5009A43EF /* NotificationManager.swift in Sources */, - B65B10EC2B073913002852CF /* CEContentUnavailableView.swift in Sources */, - 5B698A0A2B262FA000DE9392 /* SearchSettingsView.swift in Sources */, - B65B10FB2B08B054002852CF /* Divided.swift in Sources */, - B65B11012B09D5D4002852CF /* GitClient+Pull.swift in Sources */, - 2072FA13280D74ED00C7F8D4 /* HistoryInspectorModel.swift in Sources */, - 852E62012A5C17E500447138 /* PageAndSettings.swift in Sources */, - 3000516C2BBD3A9500A98562 /* ServiceWrapper.swift in Sources */, - 587B9DA029300ABD00AC7927 /* PanelDivider.swift in Sources */, - 201169E52837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift in Sources */, - 6CD26C6E2C8EA1E600ADBA38 /* LanguageServerFileMap.swift in Sources */, - 587B9E6A29301D8F00AC7927 /* GitLabPermissions.swift in Sources */, - B6EA1FF529DA380E001BF195 /* TextEditingSettingsView.swift in Sources */, - D7DC4B76298FFBE900D6C83D /* ProjectNavigatorViewController+OutlineTableViewCellDelegate.swift in Sources */, - 587B9E9229301D8F00AC7927 /* BitBucketAccount.swift in Sources */, - DE513F52281B672D002260B9 /* EditorTabBarAccessory.swift in Sources */, - 6CD26C7A2C8EA8A500ADBA38 /* LSPCache.swift in Sources */, - 618725A42C29F00400987354 /* WorkspaceMenuItemView.swift in Sources */, - 2813F93927ECC4C300E305E4 /* NavigatorAreaView.swift in Sources */, - B664C3B02B965F6C00816B4E /* NavigationSettings.swift in Sources */, - 5B698A0F2B2636A700DE9392 /* SearchSettingsIgnoreGlobPatternItemView.swift in Sources */, - 587B9E8A29301D8F00AC7927 /* GitHubIssue.swift in Sources */, - EC0870F72A455F6400EB8692 /* ProjectNavigatorViewController+NSMenuDelegate.swift in Sources */, - B60718202B0C6CE7009CDAB4 /* GitStashEntry.swift in Sources */, 6CAAF69429BCD78600A1F48A /* (null) in Sources */, - 6CDAFDDF2D35DADD002B2D47 /* String+ValidFileName.swift in Sources */, - 3026F50F2AC006C80061227E /* InspectorAreaViewModel.swift in Sources */, - 6C82D6C629C012AD00495C54 /* NSApp+openWindow.swift in Sources */, - 6C14CEB028777D3C001468FE /* FindNavigatorListViewController.swift in Sources */, - 587B9E7F29301D8F00AC7927 /* GitHubUserRouter.swift in Sources */, - 30B088042C0D53080063A882 /* LanguageServer+DocumentHighlight.swift in Sources */, - B62AEDBC2A210DBB009A9F52 /* UtilityAreaTerminalTab.swift in Sources */, - B67DB0F62AFC2A7A002DC647 /* FindNavigatorToolbarBottom.swift in Sources */, - 04BA7C142AE2AA7300584E1C /* GitCloneViewModel.swift in Sources */, - B61A606129F188AB009B43F9 /* ExternalLink.swift in Sources */, - 587B9E9729301D8F00AC7927 /* BitBucketAccount+Token.swift in Sources */, - 617DB3D62C25B02D00B58BFE /* TaskNotificationView.swift in Sources */, - 587B9E7729301D8F00AC7927 /* String+PercentEncoding.swift in Sources */, - 587B9E5B29301D8F00AC7927 /* GitCheckoutBranchView.swift in Sources */, - 2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */, - 30B088152C0D53080063A882 /* LSPService.swift in Sources */, - 61A3E3E32C331B5200076BD3 /* EditCETaskView.swift in Sources */, - 613899B92B6E704500A5CAF6 /* String+Normalise.swift in Sources */, - 30B088002C0D53080063A882 /* LanguageServer+Declaration.swift in Sources */, - 04BA7C192AE2D7C600584E1C /* GitClient+Branches.swift in Sources */, - 587B9E8829301D8F00AC7927 /* GitHubFiles.swift in Sources */, - 587B9DA729300ABD00AC7927 /* HelpButton.swift in Sources */, - 77EF6C0B2C60C80800984B69 /* URL+Filename.swift in Sources */, - B616EA8D2D65238900DF9029 /* InternalDevelopmentInspectorView.swift in Sources */, - 30B088172C0D53080063A882 /* LSPUtil.swift in Sources */, - 6C5B63DE29C76213005454BA /* WindowCodeFileView.swift in Sources */, - 58F2EB08292FB2B0004A9BDE /* TextEditingSettings.swift in Sources */, - 201169DB2837B34000F92B46 /* GitChangedFileListView.swift in Sources */, - 61A3E3DD2C33132F00076BD3 /* CEWorkspaceSettingsView.swift in Sources */, - 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */, - 30B0880D2C0D53080063A882 /* LanguageServer+References.swift in Sources */, - 77A01E2E2BB4261200F0EA38 /* CEWorkspaceSettings.swift in Sources */, - 6C4104E9297C970F00F472BA /* AboutDefaultView.swift in Sources */, - B696A7E62CFE20C40048CFE1 /* FeatureIcon.swift in Sources */, - 587B9E6F29301D8F00AC7927 /* GitLabProjectAccess.swift in Sources */, - 587B9E6929301D8F00AC7927 /* GitLabEvent.swift in Sources */, - B63F6A7B2C561BCB003B4342 /* RegexFormatter.swift in Sources */, - B60718442B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift in Sources */, - B67DB0F92AFDF638002DC647 /* IconButtonStyle.swift in Sources */, - 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */, - 587B9E5E29301D8F00AC7927 /* GitLabCommitRouter.swift in Sources */, - 58F2EB0D292FB2B0004A9BDE /* ThemeSettings.swift in Sources */, - 587B9D9F29300ABD00AC7927 /* SegmentedControl.swift in Sources */, - 6C7256D729A3D7D000C2D3E0 /* SplitViewControllerView.swift in Sources */, - B6EA1FE529DA33DB001BF195 /* ThemeModel.swift in Sources */, - B6EA200029DB7966001BF195 /* SettingsColorPicker.swift in Sources */, - 58FD7609291EA1CB0051D6E4 /* QuickActionsView.swift in Sources */, - 58A2E40C29C3975D005CB615 /* CEWorkspaceFileIcon.swift in Sources */, - 587B9E8F29301D8F00AC7927 /* BitBucketUserRouter.swift in Sources */, - B66A4E5129C917D5004573B4 /* AboutWindow.swift in Sources */, - 6C08249C2C556F7400A0751E /* TerminalCache.swift in Sources */, - B6C4F2A62B3CABD200B2B140 /* HistoryInspectorItemView.swift in Sources */, - B65B10FE2B08B07D002852CF /* SourceControlNavigatorChangesList.swift in Sources */, 58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */, - 30B087FE2C0D53080063A882 /* LanguageServer+ColorPresentation.swift in Sources */, - 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */, - 611192042B08CCED00D4459B /* SearchIndexer+ProgressiveSearch.swift in Sources */, - 611192022B08CCDC00D4459B /* SearchIndexer+Search.swift in Sources */, - 04BA7C272AE2E9F100584E1C /* GitClient+Push.swift in Sources */, - B664C3B32B96634F00816B4E /* NavigationSettingsView.swift in Sources */, - 6C48B5D12C0D0519001E9955 /* ShellIntegration.swift in Sources */, - 2B7A583527E4BA0100D25D4E /* AppDelegate.swift in Sources */, - D7012EE827E757850001E1EF /* FindNavigatorView.swift in Sources */, - 58A5DF8029325B5A00D1BD5D /* GitClient.swift in Sources */, - D7E201AE27E8B3C000CB86D0 /* String+Ranges.swift in Sources */, - 6CDAFDDD2D35B2A0002B2D47 /* CEWorkspaceFileManager+Error.swift in Sources */, - 6CE6226E2A2A1CDE0013085C /* NavigatorTab.swift in Sources */, - 041FC6AD2AE437CE00C1F65A /* SourceControlNewBranchView.swift in Sources */, - 77A01E432BBC3A2800F0EA38 /* CETask.swift in Sources */, - 6C48D8F72972E5F300D6D205 /* WindowObserver.swift in Sources */, - 6CED16E42A3E660D000EC962 /* String+Lines.swift in Sources */, - 587B9E6B29301D8F00AC7927 /* GitLabAvatarURL.swift in Sources */, - 58798233292E30B90085B254 /* FeedbackToolbar.swift in Sources */, - 6CC17B5B2C44258700834E2C /* WindowControllerPropertyWrapper.swift in Sources */, - 587B9E6829301D8F00AC7927 /* GitLabAccountModel.swift in Sources */, - B67DBB882CD51C55007F4F18 /* Limiter.swift in Sources */, - 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */, - 6CFF967429BEBCC300182D6F /* FindCommands.swift in Sources */, - 587B9E6529301D8F00AC7927 /* GitLabGroupAccess.swift in Sources */, - 6C91D57229B176FF0059A90D /* EditorManager.swift in Sources */, - B6DCDAC62CCDE2B90099FBF9 /* InstantPopoverModifier.swift in Sources */, - 6C82D6BC29C00CD900495C54 /* FirstResponderPropertyWrapper.swift in Sources */, - 58D01C9B293167DC00C5B6B4 /* CodeEditKeychainConstants.swift in Sources */, - B640A99E29E2184700715F20 /* SettingsForm.swift in Sources */, - B62AEDD12A27B264009A9F52 /* View+paneToolbar.swift in Sources */, - 5878DAB1291D627C00DD95A3 /* EditorJumpBarComponent.swift in Sources */, - B628B7B72B223BAD00F9775A /* FindModePicker.swift in Sources */, - 587B9E6E29301D8F00AC7927 /* GitLabProject.swift in Sources */, - 58798234292E30B90085B254 /* FeedbackIssueArea.swift in Sources */, - 77A01E2A2BB424EA00F0EA38 /* CEWorkspaceSettingsData+ProjectSettings.swift in Sources */, - 852C7E332A587279006BA599 /* SearchableSettingsPage.swift in Sources */, - 587B9E5F29301D8F00AC7927 /* GitLabProjectRouter.swift in Sources */, - B6B2D7A12CE8797B00379967 /* GitConfigExtensions.swift in Sources */, - 587B9E7329301D8F00AC7927 /* GitRouter.swift in Sources */, - 6C2C156129B4F52F00EA60A5 /* SplitViewModifiers.swift in Sources */, - B69970322D63E5C700BB132D /* NotificationPanelViewModel.swift in Sources */, - B68DE5E52D5A7988009A43EF /* NotificationPanelView.swift in Sources */, - 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */, - 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */, - 30CB648D2C12680F00CC8A9E /* LSPService+Events.swift in Sources */, - 201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */, - 587B9E8B29301D8F00AC7927 /* GitHubAccount+deleteReference.swift in Sources */, - 6CD0358A2C3461160091E1F4 /* KeyWindowControllerObserver.swift in Sources */, - 58798237292E30B90085B254 /* FeedbackView.swift in Sources */, - 587B9E9829301D8F00AC7927 /* GitCommit.swift in Sources */, - 6C5228B529A868BD00AC48F6 /* Environment+ContentInsets.swift in Sources */, - 587B9E9429301D8F00AC7927 /* BitBucketTokenConfiguration.swift in Sources */, - 04BA7C222AE2D95E00584E1C /* GitClient+CommitHistory.swift in Sources */, - 581BFB672926431000D251EC /* WelcomeWindowView.swift in Sources */, - 58A5DFA329339F6400D1BD5D /* CommandManager.swift in Sources */, - 58798284292ED0FB0085B254 /* TerminalEmulatorView.swift in Sources */, - 61A3E3E12C331B4A00076BD3 /* AddCETaskView.swift in Sources */, - 6C82D6B329BFD88700495C54 /* NavigateCommands.swift in Sources */, - 617DB3D82C25B04D00B58BFE /* CECircularProgressView.swift in Sources */, - B6CFD8112C20A8EE00E63F1A /* NSFont+WithWeight.swift in Sources */, - B66A4E4C29C9179B004573B4 /* CodeEditApp.swift in Sources */, - 661EF7B82BEE215300C3E577 /* ImageFileView.swift in Sources */, - 4E7F066629602E7B00BB3C12 /* CodeEditSplitViewController.swift in Sources */, - 30B088022C0D53080063A882 /* LanguageServer+Diagnostics.swift in Sources */, - 587B9E8D29301D8F00AC7927 /* GitHubAccount.swift in Sources */, - 201169E72837B5CA00F92B46 /* SourceControlManager.swift in Sources */, - 58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */, - 0FD96BCE2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift in Sources */, - 6CC3D1FB2D1475EC00822B65 /* TextView+SemanticTokenRangeProvider.swift in Sources */, - 6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */, - 6653EE552C34817900B82DE2 /* QuickSearchResultLabel.swift in Sources */, - 6139B9152C29B36100CA584B /* CEActiveTask.swift in Sources */, - B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */, - 6CBE1CFB2B71DAA6003AC32E /* Loopable.swift in Sources */, - 30B088092C0D53080063A882 /* LanguageServer+Formatting.swift in Sources */, - 30B088102C0D53080063A882 /* LanguageServer+SemanticTokens.swift in Sources */, - B6C6A43029771F7100A3D28F /* EditorTabBackground.swift in Sources */, - 6C23842F2C796B4C003FBDD4 /* GitChangedFileLabel.swift in Sources */, - B60718372B170638009CDAB4 /* SourceControlRenameBranchView.swift in Sources */, - 6C578D8129CD294800DC73B2 /* ExtensionActivatorView.swift in Sources */, - B6F0517D29D9E4B100D72287 /* TerminalSettingsView.swift in Sources */, - 6CC17B532C43314000834E2C /* ProjectNavigatorViewController+NSOutlineViewDelegate.swift in Sources */, - 587B9E8C29301D8F00AC7927 /* GitHubOpenness.swift in Sources */, - 5894E59729FEF7740077E59C /* CEWorkspaceFile+Recursion.swift in Sources */, - 9D36E1BF2B5E7D7500443C41 /* GitBranchesGroup.swift in Sources */, - 587B9E8229301D8F00AC7927 /* GitHubPreviewHeader.swift in Sources */, - 611191FC2B08CCB800D4459B /* SearchIndexer+AsyncController.swift in Sources */, - B6966A282C2F683300259C2D /* SourceControlPullView.swift in Sources */, - 6C3E12D32CC830D700DD12F1 /* RecentProjectsStore.swift in Sources */, - 30B088112C0D53080063A882 /* LanguageServer+SignatureHelp.swift in Sources */, - 6C578D8929CD36E400DC73B2 /* Commands+ForEach.swift in Sources */, - 611192082B08CCFD00D4459B /* SearchIndexer+Terms.swift in Sources */, - B67DBB902CD5EA77007F4F18 /* GlobPattern.swift in Sources */, - 28B8F884280FFE4600596236 /* NSTableView+Background.swift in Sources */, - 58F2EB06292FB2B0004A9BDE /* KeybindingsSettings.swift in Sources */, - 618725A12C29EFCC00987354 /* SchemeDropDownView.swift in Sources */, - 587B9E8E29301D8F00AC7927 /* BitBucketRepositoryRouter.swift in Sources */, - B61A606929F4481A009B43F9 /* MonospacedFontPicker.swift in Sources */, - B61DA9DF29D929E100BF4A43 /* GeneralSettingsView.swift in Sources */, - 618725B22C2DBC0C00987354 /* TaskOutputView.swift in Sources */, - B6D7EA5C297107DD00301FAC /* InspectorField.swift in Sources */, - 043C321427E31FF6006AE443 /* CodeEditDocumentController.swift in Sources */, - 85E4122A2A46C8CA00183F2B /* LocationsSettings.swift in Sources */, - 613899B12B6E6FDC00A5CAF6 /* Collection+FuzzySearch.swift in Sources */, - 581550D129FBD30400684881 /* TextTableViewCell.swift in Sources */, - 587B9E6629301D8F00AC7927 /* GitLabProjectHook.swift in Sources */, - 30B088032C0D53080063A882 /* LanguageServer+DocumentColor.swift in Sources */, - 587B9E9329301D8F00AC7927 /* BitBucketOAuthConfiguration.swift in Sources */, - 6C18620A298BF5A800C663EA /* RecentProjectsListView.swift in Sources */, - 58F2EB0A292FB2B0004A9BDE /* SettingsData.swift in Sources */, - 20EBB503280C327C00F3A5DA /* HistoryInspectorView.swift in Sources */, - B6EA1FE729DA341D001BF195 /* Theme.swift in Sources */, - 587B9E7529301D8F00AC7927 /* String+QueryParameters.swift in Sources */, - B60718312B15A9A3009CDAB4 /* CEOutlineGroup.swift in Sources */, - 58798219292D92370085B254 /* SearchModeModel.swift in Sources */, - 6C5C891B2A3F736500A94FE1 /* FocusedValues.swift in Sources */, - 611192062B08CCF600D4459B /* SearchIndexer+Add.swift in Sources */, - B62423302C21EE280096668B /* ThemeModel+CRUD.swift in Sources */, - B67DBB942CD5FC08007F4F18 /* GlobPatternListItem.swift in Sources */, - B62AEDD72A27B3D0009A9F52 /* UtilityAreaTabViewModel.swift in Sources */, - 85773E1E2A3E0A1F00C5D926 /* SettingsSearchResult.swift in Sources */, - B66A4E4F29C917B8004573B4 /* WelcomeWindow.swift in Sources */, - 58D01C9D293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift in Sources */, - B6E41C8B29DE7AE80088F9F4 /* AccountsSettingsSigninView.swift in Sources */, - 6C2C155A29B4F4CC00EA60A5 /* Variadic.swift in Sources */, - 618725B42C2DBC2800987354 /* TaskOutputActionsView.swift in Sources */, - B6E41C8F29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift in Sources */, - 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */, - 5882252D292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift in Sources */, - 58798238292E30B90085B254 /* FeedbackWindowController.swift in Sources */, - B6CFD80D2C1B9A8000E63F1A /* FontWeightPicker.swift in Sources */, - 587B9E6C29301D8F00AC7927 /* GitLabNamespace.swift in Sources */, - 6C3E12D82CC83CB600DD12F1 /* RecentProjectsMenu.swift in Sources */, - 30AB4EC22BF7253200ED4431 /* KeyValueTable.swift in Sources */, - 6139B9142C29B35D00CA584B /* TaskManager.swift in Sources */, - 6C48D8F22972DAFC00D6D205 /* Env+IsFullscreen.swift in Sources */, - 587B9E8729301D8F00AC7927 /* GitHubRepositories.swift in Sources */, - 6CE6226B2A2A1C730013085C /* UtilityAreaTab.swift in Sources */, - 6C48B5C52C0A2835001E9955 /* FileEncoding.swift in Sources */, - 587B9DA329300ABD00AC7927 /* SettingsTextEditor.swift in Sources */, - B6F0517B29D9E46400D72287 /* SourceControlSettingsView.swift in Sources */, - 6C147C4D29A32AA30089B630 /* EditorAreaView.swift in Sources */, - B6152B802ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift in Sources */, - 587B9E7B29301D8F00AC7927 /* GitHubRouter.swift in Sources */, - B68108042C60287F008B27C1 /* StartTaskToolbarButton.swift in Sources */, - 201169E22837B3D800F92B46 /* SourceControlNavigatorChangesView.swift in Sources */, - B67DBB922CD5EAAB007F4F18 /* GlobPatternList.swift in Sources */, - 850C631029D6B01D00E1444C /* SettingsView.swift in Sources */, - B67DBB8A2CD5D8F7007F4F18 /* IgnoredFilesListView.swift in Sources */, - 77A01E6D2BC3EA2A00F0EA38 /* NSWindow+Child.swift in Sources */, - 77EF6C0D2C60E23400984B69 /* CEWorkspaceFileManager+DirectoryEvents.swift in Sources */, - 581550CF29FBD30400684881 /* StandardTableViewCell.swift in Sources */, - B62AEDB82A1FE2DC009A9F52 /* UtilityAreaOutputView.swift in Sources */, - B67DB0FC2AFDF71F002DC647 /* IconToggleStyle.swift in Sources */, - 6CD26C812C8F8A4400ADBA38 /* LanguageIdentifier+CodeLanguage.swift in Sources */, - 5994B6DA2BD6B408006A4C5F /* Editor+TabSwitch.swift in Sources */, - 587B9E5C29301D8F00AC7927 /* Parameters.swift in Sources */, - 61538B932B11201900A88846 /* String+Character.swift in Sources */, - 613DF55E2B08DD5D00E9D902 /* FileHelper.swift in Sources */, - B67DBB8C2CD5D9CB007F4F18 /* IgnorePatternModel.swift in Sources */, - 58798235292E30B90085B254 /* FeedbackModel.swift in Sources */, - 04C3255C2801F86900C8DA2D /* ProjectNavigatorMenu.swift in Sources */, - 6CC17B512C43311900834E2C /* ProjectNavigatorViewController+NSOutlineViewDataSource.swift in Sources */, - 587B9E6429301D8F00AC7927 /* GitLabCommit.swift in Sources */, - B6E55C3B2A95368E003ECC7D /* EditorTabsOverflowShadow.swift in Sources */, - B69D3EE12C5F5357005CF43A /* TaskView.swift in Sources */, - 58A5DFA229339F6400D1BD5D /* KeybindingManager.swift in Sources */, - B62AEDB32A1FD95B009A9F52 /* UtilityAreaTerminalView.swift in Sources */, - 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */, - 58AFAA2E2933C69E00482B53 /* EditorTabRepresentable.swift in Sources */, - 6C4104E6297C884F00F472BA /* AboutDetailView.swift in Sources */, - 6C6BD6F129CD13FA00235D17 /* ExtensionDiscovery.swift in Sources */, - 587B9E7A29301D8F00AC7927 /* GitHubReviewsRouter.swift in Sources */, - 04BA7C132AE2AA7300584E1C /* GitCheckoutBranchViewModel.swift in Sources */, - 04540D5E27DD08C300E91B77 /* WorkspaceView.swift in Sources */, - DE6F77872813625500D00A76 /* EditorTabBarDivider.swift in Sources */, - 6111920C2B08CD0B00D4459B /* SearchIndexer+InternalMethods.swift in Sources */, - 6CABB1A129C5593800340467 /* SearchPanelView.swift in Sources */, - D7211D4327E066CE008F2ED7 /* Localized+Ex.swift in Sources */, - 581BFB692926431000D251EC /* WelcomeActionView.swift in Sources */, - 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */, - 20D839AE280E0CA700B27357 /* HistoryPopoverView.swift in Sources */, - B6E41C7029DD157F0088F9F4 /* AccountsSettingsView.swift in Sources */, - 30B088122C0D53080063A882 /* LanguageServer+TypeDefinition.swift in Sources */, - 6CFF967A29BEBD2400182D6F /* ViewCommands.swift in Sources */, - 850C631229D6B03400E1444C /* SettingsPage.swift in Sources */, - 587B9E6729301D8F00AC7927 /* GitLabEventData.swift in Sources */, - 61A3E3E72C33383100076BD3 /* EnvironmentVariableListItem.swift in Sources */, - B66A4E4529C8E86D004573B4 /* CommandsFixes.swift in Sources */, - B6966A2A2C2F687A00259C2D /* SourceControlFetchView.swift in Sources */, - 5882252F292C280D00E83CDE /* UtilityAreaClearButton.swift in Sources */, - 6CD26C7D2C8EA8F400ADBA38 /* LanguageServer+DocumentSync.swift in Sources */, - 6CE622692A2A174A0013085C /* InspectorTab.swift in Sources */, - 58F2EB04292FB2B0004A9BDE /* SourceControlSettings.swift in Sources */, - 618725AB2C29F2C000987354 /* TaskDropDownView.swift in Sources */, - 58710159298EB80000951BA4 /* CEWorkspaceFileManager.swift in Sources */, - 582213F0291834A500EFE361 /* AboutView.swift in Sources */, - 6CC9E4B229B5669900C97388 /* Environment+ActiveEditor.swift in Sources */, - 58822526292C280D00E83CDE /* StatusBarBreakpointButton.swift in Sources */, - 58D01C96293167DC00C5B6B4 /* Date+Formatted.swift in Sources */, - B66A4E5629C918A0004573B4 /* SceneID.swift in Sources */, - 6C53AAD829A6C4FD00EE9ED6 /* SplitView.swift in Sources */, - B66A4E5329C91831004573B4 /* CodeEditCommands.swift in Sources */, - 58822529292C280D00E83CDE /* StatusBarLineEndSelector.swift in Sources */, - 5C4BB1E128212B1E00A92FB2 /* World.swift in Sources */, - 581550D029FBD30400684881 /* FileSystemTableViewCell.swift in Sources */, - B607183F2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift in Sources */, - B62AEDD42A27B29F009A9F52 /* PaneToolbar.swift in Sources */, - 617DB3D32C25AFEA00B58BFE /* TaskNotificationModel.swift in Sources */, - D7E201B227E8D50000CB86D0 /* FindNavigatorForm.swift in Sources */, - 287776E927E34BC700D46668 /* EditorTabBarView.swift in Sources */, - B60BE8BD297A167600841125 /* AcknowledgementRowView.swift in Sources */, - B6F0517029D9E36800D72287 /* LocationsSettingsView.swift in Sources */, - B62AEDDC2A27C1B3009A9F52 /* OSLogType+Color.swift in Sources */, - 587B9E6329301D8F00AC7927 /* GitLabAccount.swift in Sources */, - 6C1CC99B2B1E7CBC0002349B /* FindNavigatorIndexBar.swift in Sources */, - 285FEC7027FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift in Sources */, - B69D3EE32C5F536B005CF43A /* ActiveTaskView.swift in Sources */, - 300051672BBD3A5D00A98562 /* ServiceContainer.swift in Sources */, 6CB9144B29BEC7F100BC47F2 /* (null) in Sources */, - 587B9E7429301D8F00AC7927 /* URL+URLParameters.swift in Sources */, - 61538B902B111FE800A88846 /* String+AppearancesOfSubstring.swift in Sources */, - 581BFB6B2926431000D251EC /* RecentProjectListItem.swift in Sources */, - 587FB99029C1246400B519DD /* EditorTabView.swift in Sources */, - 587B9DA429300ABD00AC7927 /* SearchPanel.swift in Sources */, - 58D01C95293167DC00C5B6B4 /* Bundle+Info.swift in Sources */, - B6C6A42A297716A500A3D28F /* EditorTabCloseButton.swift in Sources */, - B60718422B17DB93009CDAB4 /* SourceControlNavigatorRepositoryView+outlineGroupData.swift in Sources */, - 58A5DF7D2931787A00D1BD5D /* ShellClient.swift in Sources */, - 5879821A292D92370085B254 /* SearchResultModel.swift in Sources */, - B6F0517729D9E3AD00D72287 /* SourceControlGeneralView.swift in Sources */, - 587B9E8929301D8F00AC7927 /* GitHubGist.swift in Sources */, - 0485EB1F27E7458B00138301 /* EditorAreaFileView.swift in Sources */, - 6C092EDA2A53A58600489202 /* EditorLayout+StateRestoration.swift in Sources */, - 6C092EE02A53BFCF00489202 /* WorkspaceStateKey.swift in Sources */, - 618725A82C29F05500987354 /* OptionMenuItemView.swift in Sources */, - 613899B52B6E700300A5CAF6 /* FuzzySearchModels.swift in Sources */, - 6C9AE66F2D148DD200FAE8D2 /* URL+FindWorkspace.swift in Sources */, - 58D01C94293167DC00C5B6B4 /* Color+HEX.swift in Sources */, - 6C578D8729CD345900DC73B2 /* ExtensionSceneView.swift in Sources */, - 617DB3D02C25AFAE00B58BFE /* TaskNotificationHandler.swift in Sources */, - 77EF6C052C57DE4B00984B69 /* URL+ResouceValues.swift in Sources */, - B640A9A129E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift in Sources */, - 587B9E7929301D8F00AC7927 /* GitHubIssueRouter.swift in Sources */, - B67700F92D2A2662004FD61F /* WorkspacePanelView.swift in Sources */, - 587B9E8029301D8F00AC7927 /* GitHubConfiguration.swift in Sources */, - B616EA8F2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift in Sources */, - 58822524292C280D00E83CDE /* StatusBarView.swift in Sources */, - 581550D429FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift in Sources */, - 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */, - 587B9E7E29301D8F00AC7927 /* GitHubGistRouter.swift in Sources */, - B6E38E022CD3E63A00F4E65A /* GitConfigClient.swift in Sources */, - 6C3E12D62CC8388000DD12F1 /* URL+componentCompare.swift in Sources */, - B6AB09A52AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift in Sources */, - 04BA7C0B2AE2A2D100584E1C /* GitBranch.swift in Sources */, 6CAAF69229BCC71C00A1F48A /* (null) in Sources */, - 581BFB682926431000D251EC /* WelcomeView.swift in Sources */, - 6CFF967829BEBCF600182D6F /* MainCommands.swift in Sources */, - 587B9E7129301D8F00AC7927 /* GitURLSession.swift in Sources */, - 610C0FDA2B44438F00A01CA7 /* WorkspaceDocument+FindAndReplace.swift in Sources */, - B67431CC2C3E45F30047FCA6 /* SourceControlSwitchView.swift in Sources */, - 5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */, - 2847019E27FDDF7600F87B6B /* ProjectNavigatorOutlineView.swift in Sources */, - B607184C2B17E037009CDAB4 /* SourceControlStashView.swift in Sources */, - 6C14CEB32877A68F001468FE /* FindNavigatorMatchListCell.swift in Sources */, - 20EBB501280C325D00F3A5DA /* FileInspectorView.swift in Sources */, - 5B698A162B263BCE00DE9392 /* SearchSettingsModel.swift in Sources */, - 58822531292C280D00E83CDE /* View+isHovering.swift in Sources */, - 587B9E9929301D8F00AC7927 /* GitChangedFile.swift in Sources */, - 6C147C4B29A32A7B0089B630 /* Environment+SplitEditor.swift in Sources */, - 2897E1C72979A29200741E32 /* TrackableScrollView.swift in Sources */, - B69D3EDE2C5E85A2005CF43A /* StopTaskToolbarButton.swift in Sources */, - 58F2EB0E292FB2B0004A9BDE /* SoftwareUpdater.swift in Sources */, - 587B9E9529301D8F00AC7927 /* BitBucketUser.swift in Sources */, - 587B9E7C29301D8F00AC7927 /* GitHubRepositoryRouter.swift in Sources */, - 286471AB27ED51FD0039369D /* ProjectNavigatorView.swift in Sources */, - B6E41C7C29DE2B110088F9F4 /* AccountsSettingsProviderRow.swift in Sources */, - B6966A342C34996B00259C2D /* SourceControlManager+GitClient.swift in Sources */, - B62AEDB52A1FE295009A9F52 /* UtilityAreaDebugView.swift in Sources */, - 30B0880B2C0D53080063A882 /* LanguageServer+Implementation.swift in Sources */, - 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */, - 30B088062C0D53080063A882 /* LanguageServer+DocumentSymbol.swift in Sources */, - 04BA7C0E2AE2A76E00584E1C /* SourceControlNavigatorChangesCommitView.swift in Sources */, 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */, - 30AB4EBD2BF71CA800ED4431 /* DeveloperSettingsView.swift in Sources */, - 6C6BD6EF29CD12E900235D17 /* ExtensionManagerWindow.swift in Sources */, - 30B087FF2C0D53080063A882 /* LanguageServer+Completion.swift in Sources */, - 61C7E82F2C6CDBA500845336 /* Theme+FuzzySearchable.swift in Sources */, - 6C3B4CD12D0E2C2900C6759E /* SemanticTokenMap.swift in Sources */, - 6CFF967629BEBCD900182D6F /* FileCommands.swift in Sources */, - B60718462B17DC15009CDAB4 /* RepoOutlineGroupItem.swift in Sources */, - 613899B32B6E6FEE00A5CAF6 /* FuzzySearchable.swift in Sources */, - B697937A29FF5668002027EC /* AccountsSettingsAccountLink.swift in Sources */, - 5B698A0D2B26327800DE9392 /* SearchSettings.swift in Sources */, - B685DE7929CC9CCD002860C8 /* StatusBarIcon.swift in Sources */, - 587B9DA629300ABD00AC7927 /* ToolbarBranchPicker.swift in Sources */, - 6C6BD6F629CD145F00235D17 /* ExtensionInfo.swift in Sources */, - 04BA7C202AE2D92B00584E1C /* GitClient+Status.swift in Sources */, - 4A6F0DB52CBA462B00499627 /* ProjectNavigatorMenuActions.swift in Sources */, - 58F2EB05292FB2B0004A9BDE /* Settings.swift in Sources */, - 6CBD1BC62978DE53006639D5 /* Font+Caption3.swift in Sources */, - 30E6D0012A6E505200A58B20 /* NavigatorAreaViewModel.swift in Sources */, - 6CD26C7B2C8EA8A500ADBA38 /* LSPCache+Data.swift in Sources */, - B6E41C9429DEAE260088F9F4 /* SourceControlAccount.swift in Sources */, - 2806E9022979588B000040F4 /* Contributor.swift in Sources */, - 58D01C98293167DC00C5B6B4 /* String+RemoveOccurrences.swift in Sources */, - 5878DAA8291AE76700DD95A3 /* OpenQuicklyListItemView.swift in Sources */, - 58FD7608291EA1CB0051D6E4 /* QuickActionsViewModel.swift in Sources */, - B65B11042B09DB1C002852CF /* GitClient+Fetch.swift in Sources */, - 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */, - 6C4E37F62C73DA5200AEE7B5 /* UtilityAreaTerminalSidebar.swift in Sources */, - B6E41C7929DE02800088F9F4 /* AccountSelectionView.swift in Sources */, - 6C48B5CE2C0C1BE4001E9955 /* Shell.swift in Sources */, - 6CA1AE952B46950000378EAB /* EditorInstance.swift in Sources */, - B6B2D79F2CE8794E00379967 /* GitConfigRepresentable.swift in Sources */, - 30AB4EBB2BF718A100ED4431 /* DeveloperSettings.swift in Sources */, - B6C4F2A92B3CB00100B2B140 /* CommitDetailsHeaderView.swift in Sources */, - 30B088012C0D53080063A882 /* LanguageServer+Definition.swift in Sources */, - 611028C82C8DC7F200DFD845 /* MenuWithButtonStyle.swift in Sources */, - B6EA1FFB29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift in Sources */, - 618725A62C29F02500987354 /* DropdownMenuItemStyleModifier.swift in Sources */, - 587B9E7029301D8F00AC7927 /* GitLabUser.swift in Sources */, - 04660F6A27E51E5C00477777 /* CodeEditWindowController.swift in Sources */, - 58798218292D92370085B254 /* String+SafeOffset.swift in Sources */, - 6C6BD70429CD17B600235D17 /* ExtensionsManager.swift in Sources */, - 587B9E6129301D8F00AC7927 /* GitLabOAuthConfiguration.swift in Sources */, - 617DB3DC2C25B14A00B58BFE /* ActivityViewer.swift in Sources */, - 587B9E6229301D8F00AC7927 /* GitLabConfiguration.swift in Sources */, - 61A53A7E2B4449870093BF8A /* WorkspaceDocument+Find.swift in Sources */, - 30B0880A2C0D53080063A882 /* LanguageServer+Hover.swift in Sources */, - 5879821B292D92370085B254 /* SearchResultMatchModel.swift in Sources */, - 6C48B5DA2C0D5FC5001E9955 /* CurrentUser.swift in Sources */, - 04BA7C1E2AE2D8A000584E1C /* GitClient+Clone.swift in Sources */, - 58F2EB09292FB2B0004A9BDE /* TerminalSettings.swift in Sources */, - 6C578D8429CD343800DC73B2 /* ExtensionDetailView.swift in Sources */, - B607181D2B0C5BE3009CDAB4 /* GitClient+Stash.swift in Sources */, - B65B10F22B07D34F002852CF /* GitRemote.swift in Sources */, - B6A43C5D29FC4AF00027E0E0 /* CreateSSHKeyView.swift in Sources */, - B6EA200229DB7F81001BF195 /* View+ConstrainHeightToWindow.swift in Sources */, - 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */, - B66460592D600E9500EC1411 /* NotificationManager+Delegate.swift in Sources */, - B664605A2D600E9500EC1411 /* NotificationManager+System.swift in Sources */, - 613899B72B6E702F00A5CAF6 /* String+LengthOfMatchingPrefix.swift in Sources */, - 6C48D8F42972DB1A00D6D205 /* Env+Window.swift in Sources */, - 6C5FDF7A29E6160000BC08C0 /* AppSettings.swift in Sources */, - 61A3E3DF2C3318C900076BD3 /* CEWorkspaceSettingsTaskListView.swift in Sources */, - 58F2EB07292FB2B0004A9BDE /* GeneralSettings.swift in Sources */, - B6041F4D29D7A4E9000F3454 /* SettingsPageView.swift in Sources */, - 587B9E9A29301D8F00AC7927 /* GitStatus.swift in Sources */, - B65B10F82B081A34002852CF /* SourceControlNavigatorNoRemotesView.swift in Sources */, - 58D01C97293167DC00C5B6B4 /* String+SHA256.swift in Sources */, - 61A3E3D92C33126F00076BD3 /* CEWorkspaceSettingsData.swift in Sources */, - B6EA1FFD29DB792C001BF195 /* ThemeSettingsColorPreview.swift in Sources */, - 66AF6CF02BF183CA00D83C9D /* ImageDimensions.swift in Sources */, - 2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */, - 3000516A2BBD3A8200A98562 /* ServiceType.swift in Sources */, - 6C578D8C29CD372700DC73B2 /* ExtensionCommands.swift in Sources */, - B6041F5229D7D6D6000F3454 /* SettingsWindow.swift in Sources */, - 6139B9162C29B36500CA584B /* CETaskStatus.swift in Sources */, - B6EA1FF829DB78DB001BF195 /* ThemeSettingThemeRow.swift in Sources */, - 587B9E7629301D8F00AC7927 /* GitTime.swift in Sources */, - 587B9E5D29301D8F00AC7927 /* GitLabUserRouter.swift in Sources */, - 588847692992ABCA00996D95 /* Array+SortURLs.swift in Sources */, - 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */, - 6C82D6B929BFE34900495C54 /* HelpCommands.swift in Sources */, - 6C147C4929A32A080089B630 /* EditorLayoutView.swift in Sources */, - 6C147C4129A328BF0089B630 /* EditorLayout.swift in Sources */, - B6D7EA592971078500301FAC /* InspectorSection.swift in Sources */, - B6AB09A32AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift in Sources */, - 6CD26C772C8EA83900ADBA38 /* URL+absolutePath.swift in Sources */, - B69BFDC72B0686910050D9A6 /* GitClient+Initiate.swift in Sources */, - 58F2EAEF292FB2B0004A9BDE /* ThemeSettingsView.swift in Sources */, - 85745D632A38F8D900089AAB /* String+HighlightOccurrences.swift in Sources */, - B63F6A792C5618EF003B4342 /* TrimWhitespaceFormatter.swift in Sources */, - B6EE989027E8879A00CDD8AB /* InspectorAreaView.swift in Sources */, - 587B9DA229300ABD00AC7927 /* EffectView.swift in Sources */, - 6C97EBCC2978760400302F95 /* AcknowledgementsWindowController.swift in Sources */, - 284DC84F2978B7B400BF2770 /* ContributorsView.swift in Sources */, - B62AEDC92A2704F3009A9F52 /* UtilityAreaTabView.swift in Sources */, - 61816B832C81DC2C00C71BF7 /* SearchField.swift in Sources */, - 30B088052C0D53080063A882 /* LanguageServer+DocumentLink.swift in Sources */, - 58798250292E78D80085B254 /* CodeFileDocument.swift in Sources */, - 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */, - B6966A302C33282200259C2D /* RemoteBranchPicker.swift in Sources */, - 201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */, - B6F0517929D9E3C900D72287 /* SourceControlGitView.swift in Sources */, - 587B9E8329301D8F00AC7927 /* GitHubPullRequest.swift in Sources */, - 6C85F7562C3CA638008E9836 /* EditorHistoryMenus.swift in Sources */, - 5878DA82291863F900DD95A3 /* AcknowledgementsView.swift in Sources */, - 587B9E8529301D8F00AC7927 /* GitHubReview.swift in Sources */, - 58D01C9A293167DC00C5B6B4 /* CodeEditKeychain.swift in Sources */, - 6CB94CFE2C9F1C9A00E8651C /* TextView+LSPRange.swift in Sources */, - B6966A2E2C3056AD00259C2D /* SourceControlCommands.swift in Sources */, - B62AEDAA2A1FCBE5009A9F52 /* WorkspacePanelTabBar.swift in Sources */, - 20D839AB280DEB2900B27357 /* NoSelectionInspectorView.swift in Sources */, - 30B0880F2C0D53080063A882 /* LanguageServer+SelectionRange.swift in Sources */, - 30B0880C2C0D53080063A882 /* LanguageServer+InlayHint.swift in Sources */, - 587B9E5A29301D8F00AC7927 /* GitCloneView.swift in Sources */, - B65B10F52B081A0C002852CF /* SourceControlAddExistingRemoteView.swift in Sources */, - 58D01C99293167DC00C5B6B4 /* String+MD5.swift in Sources */, - 20EBB505280C329800F3A5DA /* CommitListItemView.swift in Sources */, - 669A50512C380C1800304CD8 /* String+Escaped.swift in Sources */, - 5878DAB2291D627C00DD95A3 /* EditorJumpBarView.swift in Sources */, - 664935422C35A5BC00461C35 /* NSTableViewWrapper.swift in Sources */, - 04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */, - 6C6BD70129CD172700235D17 /* ExtensionsListView.swift in Sources */, - 043C321627E3201F006AE443 /* WorkspaceDocument.swift in Sources */, - 6CD03B6A29FC773F001BD1D0 /* SettingsInjector.swift in Sources */, - 58798236292E30B90085B254 /* FeedbackType.swift in Sources */, - 6CE21E812C643D8F0031B056 /* CETerminalView.swift in Sources */, - 587B9E6D29301D8F00AC7927 /* GitLabEventNote.swift in Sources */, - 587B9E9129301D8F00AC7927 /* BitBucketOAuthRouter.swift in Sources */, - B6FA3F882BF41C940023DE9C /* ThemeSettingsThemeToken.swift in Sources */, - B6E41C7429DD40010088F9F4 /* View+HideSidebarToggle.swift in Sources */, - 611191FA2B08CC9000D4459B /* SearchIndexer.swift in Sources */, - 58822532292C280D00E83CDE /* UtilityAreaViewModel.swift in Sources */, - 043BCF03281DA18A000AC47C /* WorkspaceDocument+SearchState.swift in Sources */, - 6CC3D1FD2D14761A00822B65 /* SemanticTokenMapRangeProvider.swift in Sources */, - 58822527292C280D00E83CDE /* StatusBarIndentSelector.swift in Sources */, - 587B9E9629301D8F00AC7927 /* BitBucketRepositories.swift in Sources */, - 5878DAA6291AE76700DD95A3 /* OpenQuicklyPreviewView.swift in Sources */, - 58798286292ED0FB0085B254 /* SwiftTerm+Color+Init.swift in Sources */, - 30B087FC2C0D53080063A882 /* LanguageServer+CallHierarchy.swift in Sources */, - 6CFF967C29BEBD5200182D6F /* WindowCommands.swift in Sources */, - 587B9E7229301D8F00AC7927 /* GitJSONPostRouter.swift in Sources */, - 6C6362D42C3E321A0025570D /* Editor+History.swift in Sources */, - 6C85BB412C21061A00EB5DEF /* GitHubComment.swift in Sources */, - 5878DAB0291D627C00DD95A3 /* EditorJumpBarMenu.swift in Sources */, - 04BA7C242AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift in Sources */, - 587B9DA529300ABD00AC7927 /* PressActionsModifier.swift in Sources */, - 6C147C4029A328BC0089B630 /* SplitViewData.swift in Sources */, - 6C1CC9982B1E770B0002349B /* AsyncFileIterator.swift in Sources */, - 587B9E9029301D8F00AC7927 /* BitBucketTokenRouter.swift in Sources */, - B6C6A42E29771A8D00A3D28F /* EditorTabButtonStyle.swift in Sources */, - 6C278CC72C93971F0066F6D9 /* LSPContentCoordinator.swift in Sources */, - 58822525292C280D00E83CDE /* StatusBarMenuStyle.swift in Sources */, - 6C147C4229A328C10089B630 /* Editor.swift in Sources */, - B6C4F2A32B3CA74800B2B140 /* CommitDetailsView.swift in Sources */, - 6C2C155829B4F49100EA60A5 /* SplitViewItem.swift in Sources */, - 6CDA84AD284C1BA000C1CC3A /* EditorTabBarContextMenu.swift in Sources */, - 6C81916729B3E80700B75C92 /* ModifierKeysObserver.swift in Sources */, - B6966A322C3348D300259C2D /* WorkspaceSheets.swift in Sources */, - 613899BC2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift in Sources */, - 611192002B08CCD700D4459B /* SearchIndexer+Memory.swift in Sources */, - 587B9E8129301D8F00AC7927 /* PublicKey.swift in Sources */, - B616EA882D651ADA00DF9029 /* ScrollOffsetPreferenceKey.swift in Sources */, - B616EA892D651ADA00DF9029 /* OverlayButtonStyle.swift in Sources */, - 6CCEE7F52D2C91F700B2B854 /* UtilityAreaTerminalPicker.swift in Sources */, - 611191FE2B08CCD200D4459B /* SearchIndexer+File.swift in Sources */, - B69D3EE52C5F54B3005CF43A /* TasksPopoverMenuItem.swift in Sources */, - 669A50532C380C8E00304CD8 /* Collection+subscript_safe.swift in Sources */, - 6C08249E2C55768400A0751E /* UtilityAreaTerminal.swift in Sources */, - 6CB52DC92AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift in Sources */, - 58F2EB0B292FB2B0004A9BDE /* AccountsSettings.swift in Sources */, - 5882252A292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift in Sources */, - B6AB09A12AAABAAE0003A3A6 /* EditorTabs.swift in Sources */, - 04C3255B2801F86400C8DA2D /* ProjectNavigatorViewController.swift in Sources */, - 587B9E6029301D8F00AC7927 /* GitLabOAuthRouter.swift in Sources */, - B6AB09B32AB919CF0003A3A6 /* View+actionBar.swift in Sources */, - 617DB3DA2C25B07F00B58BFE /* TaskNotificationsDetailView.swift in Sources */, - 6C05A8AF284D0CA3007F4EAA /* WorkspaceDocument+Listeners.swift in Sources */, - 6C9AE6712D14A9F700FAE8D2 /* LazyServiceWrapper.swift in Sources */, - 588847632992A2A200996D95 /* CEWorkspaceFile.swift in Sources */, - 30B088082C0D53080063A882 /* LanguageServer+FoldingRange.swift in Sources */, - 6C2C155D29B4F4E500EA60A5 /* SplitViewReader.swift in Sources */, - B65B10EF2B07C454002852CF /* GitClient+Remote.swift in Sources */, - 58AFAA2F2933C69E00482B53 /* EditorItemID.swift in Sources */, - 6C4104E3297C87A000F472BA /* BlurButtonStyle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4704,31 +536,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 61FB03B02C3C76AF001B3671 /* TaskManagerTests.swift in Sources */, - 61FB03AC2C3C1FDF001B3671 /* ShellTests.swift in Sources */, - 583E528C29361B39001AB554 /* CodeEditUITests.swift in Sources */, - 6C7D6D462C9092EC00B69EE0 /* BufferingServerConnection.swift in Sources */, - 613053652B23A49300D767E3 /* TemporaryFile.swift in Sources */, - 6C510CBC2D2ECD68006EBE85 /* UtilityAreaViewModelTests.swift in Sources */, - 617DB3DF2C25E13800B58BFE /* TaskNotificationHandlerTests.swift in Sources */, - 775566502C27FD1B001E7A4D /* CodeFileDocument+UTTypeTests.swift in Sources */, - 587B60F82934124200D5CD8F /* CEWorkspaceFileManagerTests.swift in Sources */, - 6130535F2B23A31300D767E3 /* MemorySearchTests.swift in Sources */, - 587B61012934170A00D5CD8F /* UnitTests_Extensions.swift in Sources */, - 6C1F3DA22C18C55800F6DEF6 /* ShellIntegrationTests.swift in Sources */, - 283BDCC52972F236002AFF81 /* AcknowledgementsTests.swift in Sources */, - 6CD26C8A2C8F91ED00ADBA38 /* LanguageServer+DocumentTests.swift in Sources */, - 4EE96ECB2960565E00FFBEA8 /* DocumentsUnitTests.swift in Sources */, - 4EE96ECE296059E000FFBEA8 /* NSHapticFeedbackPerformerMock.swift in Sources */, - 61FB03AE2C3C2493001B3671 /* CEActiveTaskTests.swift in Sources */, - 6130535C2B23933D00D767E3 /* MemoryIndexingTests.swift in Sources */, - 6195E3112B640485007261CA /* WorkspaceDocument+SearchState+IndexTests.swift in Sources */, - 6130536B2B24722C00D767E3 /* AsyncIndexingTests.swift in Sources */, - 613899C02B6E70FE00A5CAF6 /* FuzzySearchTests.swift in Sources */, - 6C3B4CD42D0E2CB000C6759E /* SemanticTokenMapTests.swift in Sources */, - 6195E30D2B64044F007261CA /* WorkspaceDocument+SearchState+FindTests.swift in Sources */, - 6195E30F2B640474007261CA /* WorkspaceDocument+SearchState+FindAndReplaceTests.swift in Sources */, - 587B612E293419B700D5CD8F /* CodeFileTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4736,14 +543,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6C510CB82D2E4639006EBE85 /* XCUITest+waitForNonExistence.swift in Sources */, - 6C9619242C3F2809009733CE /* ProjectPath.swift in Sources */, - 6CFBA54B2C4E168A00E3A914 /* App.swift in Sources */, - 6CFBA54D2C4E16C900E3A914 /* WindowCloseCommandTests.swift in Sources */, - 6C9619222C3F27F1009733CE /* Query.swift in Sources */, - 6C07383B2D284ECA0025CBE3 /* TasksMenuUITests.swift in Sources */, - 6CFC0C3C2D381D2000F09CD0 /* ProjectNavigatorFileManagementUITests.swift in Sources */, - 6C9619202C3F27E3009733CE /* ProjectNavigatorUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4771,21 +570,11 @@ }; /* End PBXTargetDependency section */ -/* Begin PBXVariantGroup section */ - D7211D4927E06BFE008F2ED7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - D7211D4827E06BFE008F2ED7 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ 28052DEA2973045200F4F90A /* Alpha */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -4849,9 +638,9 @@ }; 28052DEB2973045200F4F90A /* Alpha */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = "${CE_APPICON_NAME}"; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = CodeEdit/CodeEdit.entitlements; @@ -4889,9 +678,9 @@ }; 28052DEC2973045200F4F90A /* Alpha */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -4916,9 +705,9 @@ }; 28052DED2973045200F4F90A /* Alpha */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; @@ -4944,7 +733,8 @@ }; 28052DEE2973045200F4F90A /* Alpha */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { CODE_SIGN_ENTITLEMENTS = OpenWithCodeEdit/OpenWithCodeEdit.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -4977,7 +767,8 @@ }; 28052DEF2973045C00F4F90A /* Beta */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFD29730E0300F4F90A /* Beta.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -5041,9 +832,9 @@ }; 28052DF02973045C00F4F90A /* Beta */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFD29730E0300F4F90A /* Beta.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = "${CE_APPICON_NAME}"; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = CodeEdit/CodeEdit.entitlements; @@ -5081,9 +872,9 @@ }; 28052DF12973045C00F4F90A /* Beta */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFD29730E0300F4F90A /* Beta.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -5108,9 +899,9 @@ }; 28052DF22973045C00F4F90A /* Beta */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFD29730E0300F4F90A /* Beta.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; @@ -5136,7 +927,8 @@ }; 28052DF32973045C00F4F90A /* Beta */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFD29730E0300F4F90A /* Beta.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { CODE_SIGN_ENTITLEMENTS = OpenWithCodeEdit/OpenWithCodeEdit.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -5169,7 +961,8 @@ }; 2BE487F628245162003F3F64 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFB29730DE300F4F90A /* Debug.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { CODE_SIGN_ENTITLEMENTS = OpenWithCodeEdit/OpenWithCodeEdit.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -5202,7 +995,8 @@ }; 2BE487F728245162003F3F64 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFE29730E0B00F4F90A /* Release.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { CODE_SIGN_ENTITLEMENTS = OpenWithCodeEdit/OpenWithCodeEdit.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -5235,7 +1029,8 @@ }; 8B9A0E112B9FE7D7007E2DBF /* Pre */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CE_APPICON_NAME = AppIconPre; @@ -5300,9 +1095,9 @@ }; 8B9A0E122B9FE7D7007E2DBF /* Pre */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = "${CE_APPICON_NAME}"; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CE_APPICON_NAME = AppIconPre; @@ -5341,9 +1136,9 @@ }; 8B9A0E132B9FE7D7007E2DBF /* Pre */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -5368,9 +1163,9 @@ }; 8B9A0E142B9FE7D7007E2DBF /* Pre */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; @@ -5396,7 +1191,8 @@ }; 8B9A0E152B9FE7D7007E2DBF /* Pre */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFC29730DF600F4F90A /* Alpha.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { CODE_SIGN_ENTITLEMENTS = OpenWithCodeEdit/OpenWithCodeEdit.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -5429,7 +1225,8 @@ }; B658FB4F27DA9E1000EA4DBD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFB29730DE300F4F90A /* Debug.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -5499,7 +1296,8 @@ }; B658FB5027DA9E1000EA4DBD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFE29730E0B00F4F90A /* Release.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -5562,9 +1360,9 @@ }; B658FB5227DA9E1000EA4DBD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFB29730DE300F4F90A /* Debug.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = "${CE_APPICON_NAME}"; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = CodeEdit/CodeEdit.entitlements; @@ -5602,9 +1400,9 @@ }; B658FB5327DA9E1000EA4DBD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFE29730E0B00F4F90A /* Release.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = "${CE_APPICON_NAME}"; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = CodeEdit/CodeEdit.entitlements; @@ -5642,9 +1440,9 @@ }; B658FB5527DA9E1000EA4DBD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFB29730DE300F4F90A /* Debug.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -5669,9 +1467,9 @@ }; B658FB5627DA9E1000EA4DBD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFE29730E0B00F4F90A /* Release.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -5696,9 +1494,9 @@ }; B658FB5827DA9E1000EA4DBD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFB29730DE300F4F90A /* Debug.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; @@ -5725,9 +1523,9 @@ }; B658FB5927DA9E1000EA4DBD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28052DFE29730E0B00F4F90A /* Release.xcconfig */; + baseConfigurationReferenceAnchor = B624544F2D78A3D3009A86D1 /* Configs */; + baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; @@ -5830,7 +1628,7 @@ repositoryURL = "https://github.com/lukepistrol/SwiftLintPlugin"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 0.56.2; + minimumVersion = 0.58.2; }; }; 303E88452C276FD100EEA8D9 /* XCRemoteSwiftPackageReference "LanguageClient" */ = { diff --git a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5e..000000000 --- a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8440b8a74..958dc198d 100644 --- a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "aef43d6aa0c467418565c574c33495a50d6e24057eb350c17704ab4ae2aead6c", + "originHash" : "ac57a6899925c3e4ac6d43aed791c845c6fc24a4441b6a10297a207d951b7836", "pins" : [ { "identity" : "anycodable", @@ -222,8 +222,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/lukepistrol/SwiftLintPlugin", "state" : { - "revision" : "5a65f4074975f811da666dfe31a19850950b1ea4", - "version" : "0.56.2" + "revision" : "3825ebf8d55bb877c91bc897e8e3d0c001f16fba", + "version" : "0.58.2" } }, { diff --git a/CodeEdit.xcodeproj/xcshareddata/xcschemes/CodeEdit.xcscheme b/CodeEdit.xcodeproj/xcshareddata/xcschemes/CodeEdit.xcscheme index 0fe688535..e54aab3c0 100644 --- a/CodeEdit.xcodeproj/xcshareddata/xcschemes/CodeEdit.xcscheme +++ b/CodeEdit.xcodeproj/xcshareddata/xcschemes/CodeEdit.xcscheme @@ -1,6 +1,6 @@ $1.score } - self.searchResultsCount = self.tempSearchResults.map { $0.lineMatches.count }.reduce(0, +) - self.searchResultsFileCount = self.tempSearchResults.count - self.findNavigatorStatus = .found - self.tempSearchResults = [] - } + self.searchResult = self.tempSearchResults.sorted { $0.score > $1.score } + self.searchResultsCount = self.tempSearchResults.map { $0.lineMatches.count }.reduce(0, +) + self.searchResultsFileCount = self.tempSearchResults.count + self.findNavigatorStatus = .found + self.tempSearchResults = [] } /// Evaluates a search query within the content of a file and updates @@ -183,7 +190,10 @@ extension WorkspaceDocument.SearchState { guard let data = try? Data(contentsOf: searchResult.file.url) else { return } - let fileContent = String(decoding: data, as: UTF8.self) + guard let fileContent = String(bytes: data, encoding: .utf8) else { + await setStatus(.failed(errorMessage: "Failed to decode file content.")) + return + } // Attempt to create a regular expression from the provided query guard let regex = try? NSRegularExpression( @@ -343,4 +353,29 @@ extension WorkspaceDocument.SearchState { self.findNavigatorStatus = .none } } + + /// Evaluates a matched file to determine if it contains any search matches. + /// Requires a file score from the search model. + /// + /// Evaluates the file's contents asynchronously. + /// + /// - Parameters: + /// - fileURL: The `URL` of the file to evaluate. + /// - fileScore: The file's score from a ``SearchIndexer`` + /// - regexPattern: The pattern to evaluate against the file's contents. + /// - Returns: `nil` if there are no relevant search matches, or a search result if matches are found. + private func evaluateSearchResult( + fileURL: URL, + fileScore: Float, + regexPattern: String + ) async -> SearchResultModel? { + var newResult = SearchResultModel( + file: CEWorkspaceFile(url: fileURL), + score: fileScore + ) + + await evaluateFile(query: regexPattern, searchResult: &newResult) + + return newResult.lineMatches.isEmpty ? nil : newResult + } } diff --git a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabCloseButton.swift b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabCloseButton.swift index 1e4fba468..98c10258c 100644 --- a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabCloseButton.swift +++ b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabCloseButton.swift @@ -105,9 +105,10 @@ struct EditorTabCloseButton: View { } } +@available(macOS 14.0, *) #Preview { - @State var closeButtonGestureActive: Bool = false - @State var isHoveringClose: Bool = false + @Previewable @State var closeButtonGestureActive: Bool = false + @Previewable @State var isHoveringClose: Bool = false return EditorTabCloseButton( isActive: false, diff --git a/CodeEdit/Features/Editor/Views/EditorAreaView.swift b/CodeEdit/Features/Editor/Views/EditorAreaView.swift index e67b9f81d..0af361655 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaView.swift @@ -148,8 +148,6 @@ struct EditorAreaView: View { editor.openTab(file: file) editorManager.activeEditor = editor focus = editor - NSApp.activate(ignoringOtherApps: true) - window?.makeKeyAndOrderFront(nil) } } } diff --git a/CodeEdit/Features/InspectorArea/InspectorSidebarToolbarTop.swift b/CodeEdit/Features/InspectorArea/InspectorSidebarToolbarTop.swift deleted file mode 100644 index 2c9236abc..000000000 --- a/CodeEdit/Features/InspectorArea/InspectorSidebarToolbarTop.swift +++ /dev/null @@ -1,133 +0,0 @@ -// -// InspectorSidebarToolbarTop.swift -// CodeEdit -// -// Created by Austin Condiff on 3/21/22. -// - -import SwiftUI - -struct InspectorSidebarToolbarTop: View { - var items: [InspectorTab] - - @Binding var selection: InspectorTab - @State private var targeted: Bool = true - @State private var icons = [ - InspectorDockIcon(imageName: "doc", title: "File Inspector", id: 0), - InspectorDockIcon(imageName: "clock", title: "History Inspector", id: 1), - InspectorDockIcon(imageName: "questionmark.circle", title: "Quick Help Inspector", id: 2) - ] - - @State private var hasChangedLocation: Bool = false - @State private var draggingItem: InspectorDockIcon? - @State private var drugItemLocation: CGPoint? - -// init(selection: Binding) { -// self._selection = selection -// } - - var body: some View { - VStack(alignment: .center, spacing: 0) { - Divider() - HStack(spacing: 10) { - ForEach(items, id: \.self) { icon in - makeInspectorIcon(tab: icon) -// .opacity(draggingItem?.imageName == icon.imageName && -// hasChangedLocation && -// drugItemLocation != nil ? 0.0: 1.0) -// .onDrop( -// of: [.utf8PlainText], -// delegate: InspectorSidebarDockIconDelegate( -// item: icon, -// current: $draggingItem, -// icons: $icons, -// hasChangedLocation: $hasChangedLocation, -// drugItemLocation: $drugItemLocation -// ) -// ) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) - .animation(.default, value: items) - Divider() - } - .frame(height: TabBarView.height) - } - - func makeInspectorIcon(tab: InspectorTab) -> some View { - Button { - selection = tab - } label: { - Image(systemName: tab.systemImage) - .help(tab.title) - .symbolVariant(tab == selection ? .fill : .none) - .foregroundColor(tab == selection ? .accentColor : .secondary) - .frame(width: 16, alignment: .center) -// .onDrag { -// if let index = icons.firstIndex(where: { $0.imageName == systemImage }) { -// draggingItem = icons[index] -// } -// return .init(object: NSString(string: systemImage)) -// } preview: { -// RoundedRectangle(cornerRadius: .zero) -// .frame(width: .zero) -// } - } - .buttonStyle(.plain) - } - - private func getSafeImage(named: String, accessibilityDescription: String?) -> Image { - if let nsImage = NSImage(systemSymbolName: named, accessibilityDescription: accessibilityDescription) { - return Image(nsImage: nsImage) - } else { - return Image(symbol: named) - } - } - - private struct InspectorDockIcon: Identifiable, Equatable { - let imageName: String - let title: String - var id: Int - } - - private struct InspectorSidebarDockIconDelegate: DropDelegate { - let item: InspectorDockIcon - @Binding var current: InspectorDockIcon? - @Binding var icons: [InspectorDockIcon] - @Binding var hasChangedLocation: Bool - @Binding var drugItemLocation: CGPoint? - - func dropEntered(info: DropInfo) { - if current == nil { - current = item - drugItemLocation = info.location - } - - guard item != current, let current = current, - let from = icons.firstIndex(of: current), - let toIndex = icons.firstIndex(of: item) else { return } - - hasChangedLocation = true - drugItemLocation = info.location - - if icons[toIndex] != current { - icons.move(fromOffsets: IndexSet(integer: from), toOffset: toIndex > from ? toIndex + 1 : toIndex) - } - } - - func dropExited(info: DropInfo) { - drugItemLocation = nil - } - - func dropUpdated(info: DropInfo) -> DropProposal? { - DropProposal(operation: .move) - } - - func performDrop(info: DropInfo) -> Bool { - hasChangedLocation = false - drugItemLocation = nil - current = nil - return true - } - } -} diff --git a/CodeEdit/Features/LSP/Service/LSPService.swift b/CodeEdit/Features/LSP/Service/LSPService.swift index 2eaab98d6..5110c6c3e 100644 --- a/CodeEdit/Features/LSP/Service/LSPService.swift +++ b/CodeEdit/Features/LSP/Service/LSPService.swift @@ -218,7 +218,7 @@ final class LSPService: ObservableObject { do { try await languageServer.openDocument(document) } catch { - let uri = await document.languageServerURI + let uri = document.languageServerURI // swiftlint:disable:next line_length self.logger.error("Failed to close document: \(uri ?? "", privacy: .private), language: \(lspLanguage.rawValue). Error \(error)") } diff --git a/CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorResultFileItem.swift b/CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorResultFileItem.swift deleted file mode 100644 index c29f6c47f..000000000 --- a/CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorResultFileItem.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// SearchResultFileItem.swift -// CodeEdit -// -// Created by Ziyuan Zhao on 2022/3/22. -// - -import SwiftUI -import WorkspaceClient -import Search -import AppPreferences - -struct FindNavigatorResultFileItem: View { - @ObservedObject private var state: WorkspaceDocument.SearchState - @StateObject private var prefs: AppPreferencesModel = .shared - @State private var isExpanded: Bool = true - - private var fileItem: WorkspaceClient.FileItem - private var results: [SearchResultModel] - private var jumpToFile: () -> Void - - init( - state: WorkspaceDocument.SearchState, - isExpanded: Bool = true, - fileItem: WorkspaceClient.FileItem, - results: [SearchResultModel], - jumpToFile: @escaping () -> Void - ) { - self.state = state - self.isExpanded = isExpanded - self.fileItem = fileItem - self.results = results - self.jumpToFile = jumpToFile - } - - @ViewBuilder - private func foundLineResult(_ lineContent: String?, keywordRange: Range?) -> some View { - if let lineContent = lineContent, - let keywordRange = keywordRange { - Text(lineContent[lineContent.startIndex.. Bool { - return item as? SearchResultModel != nil + item is SearchResultModel } func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool { diff --git a/CodeEdit/Features/NavigatorArea/NavigatorSidebarToolbar.swift b/CodeEdit/Features/NavigatorArea/NavigatorSidebarToolbar.swift deleted file mode 100644 index c6d2ace5a..000000000 --- a/CodeEdit/Features/NavigatorArea/NavigatorSidebarToolbar.swift +++ /dev/null @@ -1,211 +0,0 @@ -// -// SideBarToolbarTop.swift -// CodeEdit -// -// Created by Lukas Pistrol on 17.03.22. -// - -import SwiftUI -import CodeEditSymbols - -struct NavigatorSidebarToolbar: View { - @Environment(\.controlActiveState) - private var activeState - - var alignment: SidebarToolbarAlignment - - @Binding private var selection: Int - - @State private var icons = [ - SidebarDockIcon(imageName: "folder", title: "Project", id: 0), - SidebarDockIcon(imageName: "vault", title: "Version Control", id: 1), - SidebarDockIcon(imageName: "magnifyingglass", title: "Search", id: 2), - SidebarDockIcon(imageName: "shippingbox", title: "...", id: 3, disabled: true), - SidebarDockIcon(imageName: "play", title: "...", id: 4, disabled: true), - SidebarDockIcon(imageName: "exclamationmark.triangle", title: "...", id: 5, disabled: true), - SidebarDockIcon(imageName: "curlybraces.square", title: "...", id: 6, disabled: true), - SidebarDockIcon(imageName: "puzzlepiece.extension", title: "...", id: 7, disabled: true), - SidebarDockIcon(imageName: "square.grid.2x2", title: "...", id: 8, disabled: true) - ] - @State private var hasChangedLocation: Bool = false - @State private var draggingItem: SidebarDockIcon? - @State private var drugItemLocation: CGPoint? - - init(selection: Binding, alignment: SidebarToolbarAlignment) { - self._selection = selection - self.alignment = alignment - } - - var body: some View { - if alignment == .top { - topBody - } else { - leadingBody - } - } - - var topBody: some View { - GeometryReader { proxy in - iconsView(size: proxy.size) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .overlay(alignment: .top) { - Divider() - } - .overlay(alignment: .bottom) { - Divider() - } - .animation(.default, value: icons) - } - .frame(maxWidth: .infinity, idealHeight: 29) - .fixedSize(horizontal: false, vertical: true) - } - - var leadingBody: some View { - GeometryReader { proxy in - iconsView(size: proxy.size) - .padding(.vertical, 8) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .overlay(alignment: .trailing) { - HStack { - Divider() - } - } - .animation(.default, value: icons) - } - .frame(idealWidth: 29, maxHeight: .infinity) - .fixedSize(horizontal: true, vertical: false) - } - - @ViewBuilder - func iconsView(size: CGSize) -> some View { - let layout = alignment == .top ? - AnyLayout(HStackLayout(spacing: 0)) : - AnyLayout(VStackLayout(spacing: 10)) - layout { - ForEach(icons) { icon in - makeIcon(named: icon.imageName, title: icon.title, id: icon.id, sidebarWidth: size.width) - .opacity(draggingItem?.imageName == icon.imageName && - hasChangedLocation && - drugItemLocation != nil ? 0.0: icon.disabled ? 0.3 : 1.0) - .onDrop( - of: [.utf8PlainText], - delegate: NavigatorSidebarDockIconDelegate( - item: icon, - current: $draggingItem, - icons: $icons, - hasChangedLocation: $hasChangedLocation, - drugItemLocation: $drugItemLocation - ) - ) - .disabled(icon.disabled) - } - if alignment == .leading { - Spacer() - } - } - } - - private func makeIcon( - named: String, - title: String, - id: Int, - scale: Image.Scale = .medium, - sidebarWidth: CGFloat - ) -> some View { - Button { - selection = id - } label: { - getSafeImage(named: named, accessibilityDescription: title) - .help(title) - .onDrag { - if let index = icons.firstIndex(where: { $0.imageName == named }) { - draggingItem = icons[index] - } - return .init(object: NSString(string: named)) - } preview: { - RoundedRectangle(cornerRadius: .zero) - .frame(width: .zero) - } - } - .buttonStyle( - NavigatorToolbarButtonStyle( - id: id, - selection: selection, - activeState: activeState, - sidebarWidth: sidebarWidth - ) - ) - } - - private func getSafeImage(named: String, accessibilityDescription: String?) -> Image { - // We still use the NSImage init to check if a symbol with the name exists. - if NSImage(systemSymbolName: named, accessibilityDescription: nil) != nil { - return Image(systemName: named) - } else { - return Image(symbol: named) - } - } - - struct NavigatorToolbarButtonStyle: ButtonStyle { - var id: Int - var selection: Int - var activeState: ControlActiveState - var sidebarWidth: CGFloat - - func makeBody(configuration: Configuration) -> some View { - configuration.label - .symbolVariant(id == selection ? .fill : .none) - .foregroundColor(id == selection ? .accentColor : configuration.isPressed ? .primary : .secondary) - .frame(width: (sidebarWidth < 272 ? 24 : 30), alignment: .center) - .opacity(activeState == .inactive ? 0.45 : 1) - } - } - - private struct SidebarDockIcon: Identifiable, Equatable { - let imageName: String - let title: String - var id: Int - var disabled: Bool = false - } - - private struct NavigatorSidebarDockIconDelegate: DropDelegate { - let item: SidebarDockIcon - @Binding var current: SidebarDockIcon? - @Binding var icons: [SidebarDockIcon] - @Binding var hasChangedLocation: Bool - @Binding var drugItemLocation: CGPoint? - - func dropEntered(info: DropInfo) { - if current == nil { - current = item - drugItemLocation = info.location - } - - guard item != current, let current = current, - let from = icons.firstIndex(of: current), - let toIndex = icons.firstIndex(of: item) else { return } - - hasChangedLocation = true - drugItemLocation = info.location - - if icons[toIndex] != current { - icons.move(fromOffsets: IndexSet(integer: from), toOffset: toIndex > from ? toIndex + 1 : toIndex) - } - } - - func dropExited(info: DropInfo) { - drugItemLocation = nil - } - - func dropUpdated(info: DropInfo) -> DropProposal? { - DropProposal(operation: .move) - } - - func performDrop(info: DropInfo) -> Bool { - hasChangedLocation = false - drugItemLocation = nil - current = nil - return true - } - } -} diff --git a/CodeEdit/Features/Notifications/Views/DismissTransition.swift b/CodeEdit/Features/Notifications/Views/DismissTransition.swift deleted file mode 100644 index d977a2e92..000000000 --- a/CodeEdit/Features/Notifications/Views/DismissTransition.swift +++ /dev/null @@ -1,12 +0,0 @@ -import SwiftUI - -struct DismissTransition: ViewModifier { - let useOpactityTransition: Bool - let isIdentity: Bool - - func body(content: Content) -> some View { - content - .opacity(useOpactityTransition ? (isIdentity ? 1 : 0) : 1) - .offset(x: useOpactityTransition ? 0 : (isIdentity ? 0 : 350)) - } -} diff --git a/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift index 5bbbbd09c..4525a5083 100644 --- a/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift +++ b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift @@ -7,12 +7,6 @@ import SwiftUI -extension URL: Identifiable { - public var id: String { - absoluteString - } -} - struct OpenQuicklyView: View { @EnvironmentObject private var workspace: WorkspaceDocument diff --git a/CodeEdit/Features/Settings/Views/ExternalLink.swift b/CodeEdit/Features/Settings/Views/ExternalLink.swift index 9995df553..4a6453184 100644 --- a/CodeEdit/Features/Settings/Views/ExternalLink.swift +++ b/CodeEdit/Features/Settings/Views/ExternalLink.swift @@ -55,7 +55,7 @@ struct ExternalLink: View { @ViewBuilder content: @escaping () -> Content, title: String? = nil, subtitle: String? = nil, - @ViewBuilder icon: @escaping() -> Icon = { EmptyView() } + @ViewBuilder icon: @escaping () -> Icon = { EmptyView() } ) { self.showInFinder = showInFinder self.title = title diff --git a/CodeEdit/Features/Settings/Views/MonospacedFontPicker.swift b/CodeEdit/Features/Settings/Views/MonospacedFontPicker.swift index 3c294a09c..bf6be5001 100644 --- a/CodeEdit/Features/Settings/Views/MonospacedFontPicker.swift +++ b/CodeEdit/Features/Settings/Views/MonospacedFontPicker.swift @@ -90,14 +90,14 @@ extension MonospacedFontPicker { private func getFonts() async { await withTaskGroup(of: Void.self) { group in group.addTask { - let monospacedFontFamilyNames = getMonospacedFamilyNames() + let monospacedFontFamilyNames = await getMonospacedFamilyNames() await MainActor.run { self.monospacedFontFamilyNames = monospacedFontFamilyNames } } group.addTask { - let otherFontFamilyNames = getOtherFontFamilyNames() + let otherFontFamilyNames = await getOtherFontFamilyNames() await MainActor.run { self.otherFontFamilyNames = otherFontFamilyNames } diff --git a/CodeEdit/Features/SourceControl/Accounts/GitHub/GitHubConfiguration.swift b/CodeEdit/Features/SourceControl/Accounts/GitHub/GitHubConfiguration.swift index c7447877d..4194b49ba 100644 --- a/CodeEdit/Features/SourceControl/Accounts/GitHub/GitHubConfiguration.swift +++ b/CodeEdit/Features/SourceControl/Accounts/GitHub/GitHubConfiguration.swift @@ -81,7 +81,6 @@ struct GitHubOAuthConfiguration: GitRouterConfiguration { code: String, completion: @escaping (_ config: GitHubTokenConfiguration) -> Void ) { - let request = GitHubOAuthRouter.accessToken(self, code).URLRequest if let request { let task = session.dataTask(with: request) { data, response, _ in @@ -89,8 +88,8 @@ struct GitHubOAuthConfiguration: GitRouterConfiguration { if response.statusCode != 200 { return } else { - if let data { - let string = String(decoding: data, as: UTF8.self) + if let data, + let string = String(bytes: data, encoding: .utf8) { let accessToken = self.accessTokenFromResponse(string) if let accessToken { let config = GitHubTokenConfiguration(accessToken, url: self.apiEndpoint ?? "") diff --git a/CodeEdit/Features/SourceControl/Accounts/Networking/GitJSONPostRouter.swift b/CodeEdit/Features/SourceControl/Accounts/Networking/GitJSONPostRouter.swift index 9500e6cd1..59412a49e 100644 --- a/CodeEdit/Features/SourceControl/Accounts/Networking/GitJSONPostRouter.swift +++ b/CodeEdit/Features/SourceControl/Accounts/Networking/GitJSONPostRouter.swift @@ -70,7 +70,6 @@ extension GitJSONPostRouter { options: .mutableContainers ) as? [String: Any] { userInfo[gitErrorKey] = json as Any? - // swiftlint:disable:next non_optional_string_data_conversion } else if let data, let string = String(data: data, encoding: .utf8) { userInfo[gitErrorKey] = string as Any? } @@ -124,7 +123,6 @@ extension GitJSONPostRouter { options: .mutableContainers ) as? [String: Any] { userInfo[gitErrorKey] = json as Any? - // swiftlint:disable:next non_optional_string_data_conversion } else if let string = String(data: responseTuple.0, encoding: .utf8) { userInfo[gitErrorKey] = string as Any? } @@ -163,7 +161,6 @@ extension GitJSONPostRouter { options: .mutableContainers ) as? [String: Any] { userInfo[gitErrorKey] = json as Any? - // swiftlint:disable:next non_optional_string_data_conversion } else if let data, let string = String(data: data, encoding: String.Encoding.utf8) { userInfo[gitErrorKey] = string as Any? } @@ -216,7 +213,6 @@ extension GitJSONPostRouter { options: .mutableContainers ) as? [String: Any] { userInfo[gitErrorKey] = json as Any? - // swiftlint:disable:next non_optional_string_data_conversion } else if let string = String(data: responseTuple.0, encoding: String.Encoding.utf8) { userInfo[gitErrorKey] = string as Any? } diff --git a/CodeEdit/Features/SourceControl/Accounts/Networking/GitRouter.swift b/CodeEdit/Features/SourceControl/Accounts/Networking/GitRouter.swift index c1d16e44d..2dedbd43f 100644 --- a/CodeEdit/Features/SourceControl/Accounts/Networking/GitRouter.swift +++ b/CodeEdit/Features/SourceControl/Accounts/Networking/GitRouter.swift @@ -61,12 +61,6 @@ protocol GitRouter { func request(_ urlComponents: URLComponents, parameters: [String: Any]) -> URLRequest? - func loadJSON( - _ session: GitURLSession, - expectedResultType: T.Type, - completion: @escaping (_ json: T?, _ error: Error?) -> Void - ) -> GitURLSessionDataTaskProtocol? - func load( _ session: GitURLSession, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy?, @@ -192,15 +186,6 @@ extension GitRouter { } } - @available(*, deprecated, message: "Plase use `load` method instead") - func loadJSON( - _ session: GitURLSession = URLSession.shared, - expectedResultType: T.Type, - completion: @escaping (_ json: T?, _ error: Error?) -> Void - ) -> GitURLSessionDataTaskProtocol? { - load(session, expectedResultType: expectedResultType, completion: completion) - } - func load( _ session: GitURLSession = URLSession.shared, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy?, diff --git a/CodeEdit/Features/Tasks/Models/CEActiveTask.swift b/CodeEdit/Features/Tasks/Models/CEActiveTask.swift index cd0e30454..3b6d94cdb 100644 --- a/CodeEdit/Features/Tasks/Models/CEActiveTask.swift +++ b/CodeEdit/Features/Tasks/Models/CEActiveTask.swift @@ -58,8 +58,8 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { } outputPipe.fileHandleForReading.readabilityHandler = { fileHandle in - let data = String(decoding: fileHandle.availableData, as: UTF8.self) - if !data.isEmpty { + if let data = String(bytes: fileHandle.availableData, encoding: .utf8), + !data.isEmpty { Task { await self.updateOutput(data) } diff --git a/CodeEdit/Features/Welcome/Views/Resources/en.lproj/Localizable.strings b/CodeEdit/Features/Welcome/Views/Resources/en.lproj/Localizable.strings deleted file mode 100644 index 44a11f612..000000000 --- a/CodeEdit/Features/Welcome/Views/Resources/en.lproj/Localizable.strings +++ /dev/null @@ -1,19 +0,0 @@ -// Welcome Screen -"Welcome to CodeEdit" = "Welcome to CodeEdit"; -"Version %@ (%@)" = "Version %@ (%@)"; -"No Recent Projects" = "No Recent Projects"; - -// Welcome Screen - New File -"Create a new file" = "Create a new file"; -"Clone an existing project" = "Clone an existing project"; - -// Welcome Screen - Open File -"Open a file or folder" = "Open a file or folder"; -"Open an existing file or folder on your Mac" = "Open an existing file or folder on your Mac"; - -// Welcome Screen - SCM -"Start working on something from a Git repository" = "Start working on something from a Git repository"; - -"Remove from Recent Projects" = "Remove from Recent Projects"; -"Show in Finder" = "Show in Finder"; -"Copy Path" = "Copy Path"; diff --git a/CodeEdit/Features/Welcome/Views/WelcomeView.swift b/CodeEdit/Features/Welcome/Views/WelcomeView.swift index 8e1d7e60d..a1529859e 100644 --- a/CodeEdit/Features/Welcome/Views/WelcomeView.swift +++ b/CodeEdit/Features/Welcome/Views/WelcomeView.swift @@ -123,14 +123,14 @@ struct WelcomeView: View { } ) } - .sheet(item: $showCheckoutBranchItem, content: { repoPath in + .sheet(item: $showCheckoutBranchItem) { url in GitCheckoutBranchView( - repoLocalPath: repoPath, + repoLocalPath: url, openDocument: { url in openDocument(url, dismissWindow) } ) - }) + } } private var mainContent: some View { diff --git a/CodeEdit/Features/TerminalEmulator/codeedit_shell_integration_login.zsh b/CodeEdit/ShellIntegration/codeedit_shell_integration_login.zsh similarity index 100% rename from CodeEdit/Features/TerminalEmulator/codeedit_shell_integration_login.zsh rename to CodeEdit/ShellIntegration/codeedit_shell_integration_login.zsh diff --git a/CodeEdit/Utils/Extensions/URL/URL+Identifiable.swift b/CodeEdit/Utils/Extensions/URL/URL+Identifiable.swift new file mode 100644 index 000000000..f67ce5108 --- /dev/null +++ b/CodeEdit/Utils/Extensions/URL/URL+Identifiable.swift @@ -0,0 +1,14 @@ +// +// URL+Identifiable.swift +// CodeEdit +// +// Created by Austin Condiff on 3/5/25. +// + +import Foundation + +extension URL: @retroactive Identifiable { + public var id: String { + absoluteString + } +} diff --git a/CodeEdit/Utils/FolderMonitor.swift b/CodeEdit/Utils/FolderMonitor.swift deleted file mode 100644 index 7047056e7..000000000 --- a/CodeEdit/Utils/FolderMonitor.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// File.swift -// -// -// Created by Matthijs Eikelenboom on 09/10/2022. -// - -import Foundation - -final class FolderMonitor { - - private let folderToMonitor: URL - - /// A file descriptor for the monitored folder. - private var monitoredFolderFileDescriptor: CInt = -1 - - /// A dispatch source to monitor a file descriptor created from the folder. - private var folderMonitorSource: DispatchSourceFileSystemObject? - - /// A dispatch queue used for sending file changes in the folder. - private let folderMonitorQueue = DispatchQueue(label: "FolderMonitorQueue", attributes: .concurrent) - - /// When there are changes in the folder, this is the function that gets triggered - internal var folderDidChange: () -> Void = { } - - init(url: URL) { - self.folderToMonitor = url - } - - /// Start monitoring the folder - func startMonitoring() { - guard folderMonitorSource == nil && monitoredFolderFileDescriptor == -1 else { - return - } - // Open the folder referenced by URL for monitoring only. - monitoredFolderFileDescriptor = open(folderToMonitor.path, O_EVTONLY) - - // Define a dispatch source monitoring the folder for additions, deletions, and renamings. - folderMonitorSource = DispatchSource.makeFileSystemObjectSource( - fileDescriptor: monitoredFolderFileDescriptor, - eventMask: .write, - queue: folderMonitorQueue - ) - - // Define the block to call when a file change is detected. - folderMonitorSource?.setEventHandler { [weak self] in - self?.folderDidChange() - } - - // Define a cancel handler to ensure the directory is closed when the source is cancelled. - folderMonitorSource?.setCancelHandler { [weak self] in - guard let self else { return } - close(self.monitoredFolderFileDescriptor) - self.monitoredFolderFileDescriptor = -1 - self.folderMonitorSource = nil - } - - // Start monitoring the directory via the source. - folderMonitorSource?.resume() - } - - func stopMonitoring() { - folderMonitorSource?.cancel() - } - - deinit { - self.folderMonitorSource?.cancel() - } - -} diff --git a/CodeEdit/Utils/KeyChain/CodeEditKeychain.swift b/CodeEdit/Utils/KeyChain/CodeEditKeychain.swift index 3da6738f0..6d6a7128a 100644 --- a/CodeEdit/Utils/KeyChain/CodeEditKeychain.swift +++ b/CodeEdit/Utils/KeyChain/CodeEditKeychain.swift @@ -128,7 +128,6 @@ class CodeEditKeychain { func get(_ key: String) -> String? { if let data = getData(key) { // Use the optional version here - // swiftlint:disable:next non_optional_string_data_conversion if let currentString = String(data: data, encoding: .utf8) { return currentString } diff --git a/CodeEdit/Utils/ShellClient/Models/ShellClient.swift b/CodeEdit/Utils/ShellClient/Models/ShellClient.swift index 810a463e3..de6249313 100644 --- a/CodeEdit/Utils/ShellClient/Models/ShellClient.swift +++ b/CodeEdit/Utils/ShellClient/Models/ShellClient.swift @@ -8,6 +8,12 @@ import Combine import Foundation +/// Errors that can occur during shell operations +enum ShellClientError: Error { + case failedToDecodeOutput + case taskTerminated(code: Int) +} + /// Shell Client /// Run commands in shell class ShellClient { @@ -37,7 +43,10 @@ class ShellClient { let (task, pipe) = generateProcessAndPipe(args) try task.run() let data = pipe.fileHandleForReading.readDataToEndOfFile() - return String(decoding: data, as: UTF8.self) + guard let output = String(bytes: data, encoding: .utf8) else { + throw ShellClientError.failedToDecodeOutput + } + return output } /// Run a command with Publisher @@ -65,8 +74,11 @@ class ShellClient { subject.send(completion: .finished) return } - String(decoding: data, as: UTF8.self) - .split(whereSeparator: \.isNewline) + guard let output = String(bytes: data, encoding: .utf8) else { + subject.send(completion: .finished) + return + } + output.split(whereSeparator: \.isNewline) .forEach({ subject.send(String($0)) }) outputHandler.waitForDataInBackgroundAndNotify() } @@ -84,13 +96,16 @@ class ShellClient { pipe.fileHandleForReading.readabilityHandler = { [unowned pipe] fileHandle in let data = fileHandle.availableData if !data.isEmpty { - String(decoding: data, as: UTF8.self) - .split(whereSeparator: \.isNewline) + guard let output = String(bytes: data, encoding: .utf8) else { + continuation.finish(throwing: ShellClientError.failedToDecodeOutput) + return + } + output.split(whereSeparator: \.isNewline) .forEach({ continuation.yield(String($0)) }) } else { if !task.isRunning && task.terminationStatus != 0 { continuation.finish( - throwing: NSError(domain: "ShellClient", code: Int(task.terminationStatus)) + throwing: ShellClientError.taskTerminated(code: Int(task.terminationStatus)) ) } else { continuation.finish() diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testBranchPickerDark.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testBranchPickerDark.1.png deleted file mode 100644 index 33caaf708daaa12ae5e91110460103bb8c694697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4465 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 TT)ocUAA^>fo@#}%UBv$YJ}Mm> diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewDark.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewDark.1.png deleted file mode 100644 index f564d2318a8530fc54af74143677076b144836f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcmYL}dpOez7{`CRge{kygPfKpvWBqI#U(MhwN{5Dm*Qw*V`DCDbdZ_TC?~|RqB=As z%H>3j&?si^J(*hZm`vufnrl6wXghPxc{=a&eBbZ)d7sbwy#Kwwdwb!u;7B+C09yFN z?mj9vUzdiOs%I-2qX7V_O>uMcj&j4f#ZqHwC*sb8k#M9K5{(k(gL4G{`d>%^o@L(Dw@6 z3Mv>ygRPJcFq5ywxm{BNfkS*7L#V|NVl1y*v$$po+9KsY8=jpv?i?LlYFJiA$RBv) zK$&kdhN|s*O~y%pLcilta2nKQwHr1Vx&jj%pcWaA|JYs+1pIVMXW>!*jX(Be5ai;n-YAFz^PG1mTakRPr*AA0Dj~?5qn_j3_Ev!}MV~@8{0x|1YF4vl&CxJ9B z6C%O@V zkgyUH+8ld3=iJxocN2=>38_9sno~Mkfw6H5Ol|TqYHO`0#UisWCxC3*^)Yj$acWaI zm@$Wmpg0T)_m_oVcCnhvl79Tb{~lHlP;sl!^&0`xpx23Zx_G)sGrrq8VeRwRa{R!1M1E0A_$M;nYrU5-JW80FNpJugPinc8?k49!3y-R=ky$G zOHZ27w+_*D&okDcqy&YO-h(4$1%|jxP$J!8cOTEtd^gyOt|a3&KkN zJlPM`teKibu1XNX!sAe)-S}PjeAbGg346kN^R`mse6yYt#BAb#!x3$pt^yM}@l(@) zC<%n};n-z0XUTqb=~P4zuaDLBcO2o^A%^;g`lEWU4aS^yV8jGu@ecWOcyH+M1snANjHX1MMub|>+Qf2?bAD9Ma=wu%Q#v|fVi(z=7kcG3tm!dW9a z2Nx+yn%@^SS5x{BK1C@!KEiPg9Ktx76EmFn?R?_VV>11V>98}qlF!*y>E;*&^VGU( zV~JIa>NJB2`b2R@4VS0Bbt|-KKr@+T5Ejy4WTK7lzmt|XMP-Ovn1>3@tH*t?fs)Z?eT0%ab5k*50~3}CZwV8nmrbqG$&h2 z%;isHJi~!}< zpc-4Axa5;)CJ2>)?O(In+X9Xu`>TxPpMw%((4)XmO3P{G>bGRZCx}P_G?pkKN_67J zj<7dQsJe~g#P*DFt@ z^__nmTmt@1n3q8Q&+91Sd2Xf3U~z{}(E(r+dR-vA&-Mk?Fa+=J;(HP{`|_bytF;gt6sk?+taa yELdgQQna;;zVNA*>3#5ULmSlZ;HvF9tOSX3L08EY{;jH80N%sP{ef%9g}(vQYFn59 diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewLight.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testEffectViewLight.1.png deleted file mode 100644 index 73d8797f580cbf0c54c5c4d07e81ded55dc13898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1340 zcmYL}dpOez7{`CRxNN!XoLo-J6Im|FO35WL&84-9B$pyhY;11RMh6*Aqnr?j6V;)K zP$*6#G^)*9*U8k12bs)evD@5V2CG70XM z=GED9{&1$+G-^2jszzTNzUpXm_x^TcfqRc_%}r0#t2X9p>Ld5Jk^Euiv0SzlLq`m0 zUM{kr6~4QSVEImr#AVj)q_8^>3Q`LNwuAzLIIS5p_!5R6>U*KpKpJa`{R?H|cbmI9)nZtP$636~FfR%X$Bj z8|vfv`}8*;vrTsSH7>byr}{UV-9Zo@#iizsk92zs7xaQyPg%%GuL8q@xziZF?)99W z1Kjk)SzW8(jc$2H+LYwL;PNUsQcAuptsvi)y&jtt^S1vb2bz2$~}bXmK|cSZ?G@2_u4?r83#s;e-`JUAB*#b{yuJ7 zI5Gkq*F7XEq4gDLOvFatRnjJDL+SoOta#;*n!g-An1Pv%8Yc+tqB$(GTLN zcGXjfHH_Lc{d@G;m|FImcg{Ws3sudMD&fxiB@ylYLxI+KHl?JY@#cps?L8Bc5P01l3q6g= zXQk#dkEI-g{z|RJBJw0qe_@Y3kBXOn)gMl*AkkT>_G@PQR{|dG(;lmZ2v^Ah+q7^= z+X7IFsZ3b*PB7z#h{5)+neANvW5~W5!KiZX$e!hkk^%LhT`0OX%J7yvF)0O)^=r_$Fe zPpS2te;r&3{zjOWLjKR|DB^i;wbEd*hfdJ}K+j}dAiVdsMdk1`-VN(>5;pges|g@< zRIq=Ft;;f6>}yv|oh5%T#4_3aTZQ^^Wv;_&m=DmST6#yXtRI1Q_jG&U5`6J*fo@ye diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewDark.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewDark.1.png deleted file mode 100644 index add2588172bd3e8420cd55a981bfdaa1d288d5db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5125 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 A&;S4c diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewLight.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testFontPickerViewLight.1.png deleted file mode 100644 index 1648835b64fda49e7ac4fc04ab7fd29db786fffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5626 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 diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testHelpButtonDark.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testHelpButtonDark.1.png deleted file mode 100644 index 7ca2a455a5e4292464cbab69b145cd1ad80f3b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3691 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ⅅmZq=!@%f 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 CjqH2? diff --git a/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlProminentLight.1.png b/CodeEditTests/Features/CodeEditUI/__Snapshots__/CodeEditUITests/testSegmentedControlProminentLight.1.png deleted file mode 100644 index bc57bbbbce1943e25dd02e503c8669b7d4eb2420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4175 zcmb7`WmME%+r|GgL(Py9f`D{)D&0s(r{vJXNH<8Q;C?nwf6b#b*+7UJL{|+r=z7p2&0Ap06?gws-$o zU!R0`ckm=(@FXucDxE8x4Mc

0CTKW*AtR|J!(Wi`f69qXLRuj$Wt~8)n+D2QU=< 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 diff --git a/CodeEditTests/Features/LSP/LanguageServer+DocumentTests.swift b/CodeEditTests/Features/LSP/LanguageServer+DocumentTests.swift index e4a726b57..d5bee0c13 100644 --- a/CodeEditTests/Features/LSP/LanguageServer+DocumentTests.swift +++ b/CodeEditTests/Features/LSP/LanguageServer+DocumentTests.swift @@ -138,7 +138,7 @@ final class LanguageServerDocumentTests: XCTestCase { CodeEditDocumentController.shared.addDocument(workspace) // Add a CEWorkspaceFile - try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") + _ = try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") guard let file = fileManager.childrenOfFile(fileManager.workspaceItem)?.first else { XCTFail("No File") return @@ -201,7 +201,7 @@ final class LanguageServerDocumentTests: XCTestCase { let (_, fileManager) = try makeTestWorkspace() // Make our example file - try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") + _ = try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") guard let file = fileManager.childrenOfFile(fileManager.workspaceItem)?.first else { XCTFail("No File") return @@ -261,7 +261,7 @@ final class LanguageServerDocumentTests: XCTestCase { let (_, fileManager) = try makeTestWorkspace() // Make our example file - try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") + _ = try fileManager.addFile(fileName: "example", toFile: fileManager.workspaceItem, useExtension: "swift") guard let file = fileManager.childrenOfFile(fileManager.workspaceItem)?.first else { XCTFail("No File") return diff --git a/CodeEditTests/Features/TerminalEmulator/Shell/ShellTests.swift b/CodeEditTests/Features/TerminalEmulator/Shell/ShellTests.swift index b5f76cd62..034417417 100644 --- a/CodeEditTests/Features/TerminalEmulator/Shell/ShellTests.swift +++ b/CodeEditTests/Features/TerminalEmulator/Shell/ShellTests.swift @@ -24,7 +24,7 @@ final class ShellTests: XCTestCase { super.tearDown() } - func testExecuteCommandWithShellInitialization() { + func testExecuteCommandWithShellInitialization() throws { let command = "echo $STATE" let environmentVariables = ["STATE": "Testing"] let shell: Shell = .bash @@ -45,11 +45,13 @@ final class ShellTests: XCTestCase { // Additional assertion to check output let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() - let outputString = String(decoding: outputData, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines) + let outputString = try XCTUnwrap( + String(bytes: outputData, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) + ) XCTAssertTrue(outputString.contains("Testing")) } - func testExecuteCommandWithShellOutput() { + func testExecuteCommandWithShellOutput() throws { let command = "echo $STATE" let environmentVariables = ["STATE": "Testing"] let shell: Shell = .bash @@ -63,7 +65,9 @@ final class ShellTests: XCTestCase { )) let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() - let outputString = String(decoding: outputData, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines) + let outputString = try XCTUnwrap( + String(bytes: outputData, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) + ) XCTAssertTrue(outputString.contains("Testing")) } diff --git a/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentJSFileDarkSnapshot.1.png b/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentJSFileDarkSnapshot.1.png deleted file mode 100644 index 785ae088a0d7d31f671df25e544a5dd1cd422a1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10182 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 diff --git a/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentProjectItemLightSnapshot.1.png b/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testRecentProjectItemLightSnapshot.1.png deleted file mode 100644 index 7e7c8f87f8981772782e8fb07b425b9388d54116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9472 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 diff --git a/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testWelcomeActionViewDarkSnapshot.1.png b/CodeEditTests/Features/Welcome/__Snapshots__/WelcomeTests/testWelcomeActionViewDarkSnapshot.1.png deleted file mode 100644 index d2447e7beaac35210736c35cfb2100d0a8685398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10753 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 AY5)KL From f52062e85c9ad3a7c4b7abdd15c01d961323fcd8 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Fri, 7 Mar 2025 20:10:29 -0600 Subject: [PATCH 08/24] Fixed editor tabs from being non-interactive (#2004) > [!IMPORTANT] > This is a temporary fix for a bug introduced in the latest version of macOS. This should be periodically checked to see if it is fixed and when it is, revert this fix. ### Description Restored editor tabs interactivity. It seems like the topmost item loses interactivity so we fix this by placing a 1pt Rectangle at the top, effectively tricking the system. We then apply negative top padding inside to correct spacing issues. ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code --- .../TabBar/Tabs/Tab/EditorTabView.swift | 2 - .../TabBar/Views/EditorTabBarView.swift | 6 ++- .../Editor/Views/EditorAreaView.swift | 47 +++++++++++-------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift index 659d73e0a..7cf4187d3 100644 --- a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift +++ b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift @@ -226,8 +226,6 @@ struct EditorTabView: View { } } ) - // This padding is to avoid background color overlapping with top divider. - .padding(.top, 1) .zIndex(isActive ? 2 : (isDragging ? 3 : (isPressing ? 1 : 0))) .id(item.id) .tabBarContextMenu(item: item, isTemporary: isTemporary) diff --git a/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarView.swift b/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarView.swift index 5f289cfd7..879a99020 100644 --- a/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarView.swift +++ b/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarView.swift @@ -8,6 +8,7 @@ import SwiftUI struct EditorTabBarView: View { + let hasTopInsets: Bool /// The height of tab bar. /// I am not making it a private variable because it may need to be used in outside views. static let height = 28.0 @@ -15,13 +16,16 @@ struct EditorTabBarView: View { var body: some View { HStack(alignment: .center, spacing: 0) { EditorTabBarLeadingAccessories() + .padding(.top, hasTopInsets ? -1 : 0) EditorTabs() .accessibilityElement(children: .contain) .accessibilityLabel("Tab Bar") .accessibilityIdentifier("TabBar") EditorTabBarTrailingAccessories() + .padding(.top, hasTopInsets ? -1 : 0) } - .frame(height: EditorTabBarView.height) + .frame(height: EditorTabBarView.height - (hasTopInsets ? 1 : 0)) + .clipped() .padding(.leading, -1) } } diff --git a/CodeEdit/Features/Editor/Views/EditorAreaView.swift b/CodeEdit/Features/Editor/Views/EditorAreaView.swift index 0af361655..4868edc21 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaView.swift @@ -94,29 +94,38 @@ struct EditorAreaView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea(.all) .safeAreaInset(edge: .top, spacing: 0) { - VStack(spacing: 0) { - if shouldShowTabBar { - EditorTabBarView() - .id("TabBarView" + editor.id.uuidString) - .environmentObject(editor) - Divider() - } - if showEditorJumpBar { - EditorJumpBarView( - file: editor.selectedTab?.file, - shouldShowTabBar: shouldShowTabBar - ) { [weak editor] newFile in - if let file = editor?.selectedTab, let index = editor?.tabs.firstIndex(of: file) { - editor?.openTab(file: newFile, at: index) + GeometryReader { geometry in + let topSafeArea = geometry.safeAreaInsets.top + VStack(spacing: 0) { + if topSafeArea > 0 { + Rectangle() + .fill(.clear) + .frame(height: 1) + .background(.clear) + } + if shouldShowTabBar { + EditorTabBarView(hasTopInsets: topSafeArea > 0) + .id("TabBarView" + editor.id.uuidString) + .environmentObject(editor) + Divider() + } + if showEditorJumpBar { + EditorJumpBarView( + file: editor.selectedTab?.file, + shouldShowTabBar: shouldShowTabBar + ) { [weak editor] newFile in + if let file = editor?.selectedTab, let index = editor?.tabs.firstIndex(of: file) { + editor?.openTab(file: newFile, at: index) + } } + .environmentObject(editor) + .padding(.top, shouldShowTabBar ? -1 : 0) + Divider() } - .environmentObject(editor) - .padding(.top, shouldShowTabBar ? -1 : 0) - Divider() } + .environment(\.isActiveEditor, editor == editorManager.activeEditor) + .background(EffectView(.headerView)) } - .environment(\.isActiveEditor, editor == editorManager.activeEditor) - .background(EffectView(.headerView)) } .focused($focus, equals: editor) // Fixing this is causing a malloc exception when a file is edited & closed. See #1886 From 9cabecda1a7b796907b08a37b7af7050e3da74c6 Mon Sep 17 00:00:00 2001 From: Filipp Kuznetsov Date: Thu, 13 Mar 2025 20:52:48 +0500 Subject: [PATCH 09/24] Add indication for externally deleted files (#1999) * Add tab bar indication whether file was deleted or restored externally * Add externally deleted file saving * Add handling for simultaneous FSEvent on a single file * Fix check for a file being deleted --- .../Models/DirectoryEventStream.swift | 63 ++++++++++++------- .../CodeFileDocument/CodeFileDocument.swift | 17 +++++ .../TabBar/Tabs/Tab/EditorTabView.swift | 47 ++++++++------ .../Tab/Models/EditorTabFileObserver.swift | 30 +++++++++ .../Editor/TabBar/Tabs/Views/EditorTabs.swift | 2 +- 5 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 CodeEdit/Features/Editor/TabBar/Tabs/Tab/Models/EditorTabFileObserver.swift diff --git a/CodeEdit/Features/CEWorkspace/Models/DirectoryEventStream.swift b/CodeEdit/Features/CEWorkspace/Models/DirectoryEventStream.swift index cc125cad4..bfab19f41 100644 --- a/CodeEdit/Features/CEWorkspace/Models/DirectoryEventStream.swift +++ b/CodeEdit/Features/CEWorkspace/Models/DirectoryEventStream.swift @@ -138,43 +138,58 @@ class DirectoryEventStream { for (index, dictionary) in eventDictionaries.enumerated() { // Get get file id use dictionary[kFSEventStreamEventExtendedFileIDKey] as? UInt64 - guard let path = dictionary[kFSEventStreamEventExtendedDataPathKey] as? String, - let event = getEventFromFlags(eventFlags[index]) + guard let path = dictionary[kFSEventStreamEventExtendedDataPathKey] as? String else { continue } - events.append(.init(path: path, eventType: event)) + let fsEvents = getEventsFromFlags(eventFlags[index]) + + for event in fsEvents { + events.append(.init(path: path, eventType: event)) + } } callback(events) } - /// Parses an ``FSEvent`` from the raw flag value. + /// Parses ``FSEvent`` from the raw flag value. + /// + /// There can be multiple events in the raw flag value, + /// bacause of how OS processes almost simlutaneous actions – thus this functions returns a `Set` of `FSEvent`. /// - /// Often returns ``FSEvent/changeInDirectory`` as `FSEventStream` returns + /// Often returns ``[FSEvent/changeInDirectory]`` as `FSEventStream` returns /// `kFSEventStreamEventFlagNone (0x00000000)` frequently without more information. /// - Parameter raw: The int value received from the FSEventStream - /// - Returns: An ``FSEvent`` if a valid one was found, or `nil` otherwise. - func getEventFromFlags(_ raw: FSEventStreamEventFlags) -> FSEvent? { + /// - Returns: A `Set` of ``FSEvent``'s if at least one valid was found, or `[]` otherwise. + private func getEventsFromFlags(_ raw: FSEventStreamEventFlags) -> Set { + var events: Set = [] + if raw == 0 { - return .changeInDirectory - } else if raw & UInt32(kFSEventStreamEventFlagRootChanged) > 0 { - return .rootChanged - } else if raw & UInt32(kFSEventStreamEventFlagItemChangeOwner) > 0 { - return .itemChangedOwner - } else if raw & UInt32(kFSEventStreamEventFlagItemCreated) > 0 { - return .itemCreated - } else if raw & UInt32(kFSEventStreamEventFlagItemCloned) > 0 { - return .itemCloned - } else if raw & UInt32(kFSEventStreamEventFlagItemModified) > 0 { - return .itemModified - } else if raw & UInt32(kFSEventStreamEventFlagItemRemoved) > 0 { - return .itemRemoved - } else if raw & UInt32(kFSEventStreamEventFlagItemRenamed) > 0 { - return .itemRenamed - } else { - return nil + events.insert(.changeInDirectory) + } + if raw & UInt32(kFSEventStreamEventFlagRootChanged) > 0 { + events.insert(.rootChanged) + } + if raw & UInt32(kFSEventStreamEventFlagItemChangeOwner) > 0 { + events.insert(.itemChangedOwner) } + if raw & UInt32(kFSEventStreamEventFlagItemCreated) > 0 { + events.insert(.itemCreated) + } + if raw & UInt32(kFSEventStreamEventFlagItemCloned) > 0 { + events.insert(.itemCloned) + } + if raw & UInt32(kFSEventStreamEventFlagItemModified) > 0 { + events.insert(.itemModified) + } + if raw & UInt32(kFSEventStreamEventFlagItemRemoved) > 0 { + events.insert(.itemRemoved) + } + if raw & UInt32(kFSEventStreamEventFlagItemRenamed) > 0 { + events.insert(.itemRenamed) + } + + return events } } diff --git a/CodeEdit/Features/Documents/CodeFileDocument/CodeFileDocument.swift b/CodeEdit/Features/Documents/CodeFileDocument/CodeFileDocument.swift index 4e1638b9d..8fd36004b 100644 --- a/CodeEdit/Features/Documents/CodeFileDocument/CodeFileDocument.swift +++ b/CodeEdit/Features/Documents/CodeFileDocument/CodeFileDocument.swift @@ -191,6 +191,23 @@ final class CodeFileDocument: NSDocument, ObservableObject { NotificationCenter.default.post(name: Self.didCloseNotification, object: fileURL) } + override func save(_ sender: Any?) { + guard let fileURL else { + super.save(sender) + return + } + + do { + // Get parent directory for cases when entire folders were deleted – and recreate them as needed + let directory = fileURL.deletingLastPathComponent() + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + + try data(ofType: fileType ?? "").write(to: fileURL, options: .atomic) + } catch { + presentError(error) + } + } + func getLanguage() -> CodeLanguage { guard let url = fileURL else { return .default diff --git a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift index 7cf4187d3..b0f3a1baa 100644 --- a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift +++ b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/EditorTabView.swift @@ -21,8 +21,11 @@ struct EditorTabView: View { @Environment(\.isFullscreen) private var isFullscreen + @EnvironmentObject var workspace: WorkspaceDocument @EnvironmentObject private var editorManager: EditorManager + @StateObject private var fileObserver: EditorTabFileObserver + @AppSettings(\.general.fileIconStyle) var fileIconStyle @@ -54,25 +57,25 @@ struct EditorTabView: View { @EnvironmentObject private var editor: Editor - /// The item associated with the current tab. + /// The file item associated with the current tab. /// /// You can get tab-related information from here, like `label`, `icon`, etc. - private var item: CEWorkspaceFile + private let tabFile: CEWorkspaceFile var index: Int private var isTemporary: Bool { - editor.temporaryTab?.file == item + editor.temporaryTab?.file == tabFile } /// Is the current tab the active tab. private var isActive: Bool { - item == editor.selectedTab?.file + tabFile == editor.selectedTab?.file } /// Is the current tab being dragged. private var isDragging: Bool { - draggingTabId == item.id + draggingTabId == tabFile.id } /// Is the current tab being held (by click and hold, not drag). @@ -86,9 +89,9 @@ struct EditorTabView: View { private func switchAction() { // Only set the `selectedId` when they are not equal to avoid performance issue for now. editorManager.activeEditor = editor - if editor.selectedTab?.file != item { - let tabItem = EditorInstance(file: item) - editor.setSelectedTab(item) + if editor.selectedTab?.file != tabFile { + let tabItem = EditorInstance(file: tabFile) + editor.setSelectedTab(tabFile) editor.clearFuture() editor.addToHistory(tabItem) } @@ -97,21 +100,22 @@ struct EditorTabView: View { /// Close the current tab. func closeAction() { isAppeared = false - editor.closeTab(file: item) + editor.closeTab(file: tabFile) } init( - item: CEWorkspaceFile, + file: CEWorkspaceFile, index: Int, draggingTabId: CEWorkspaceFile.ID?, onDragTabId: CEWorkspaceFile.ID?, closeButtonGestureActive: Binding ) { - self.item = item + self.tabFile = file self.index = index self.draggingTabId = draggingTabId self.onDragTabId = onDragTabId self._closeButtonGestureActive = closeButtonGestureActive + self._fileObserver = StateObject(wrappedValue: EditorTabFileObserver(file: file)) } @ViewBuilder var content: some View { @@ -122,26 +126,27 @@ struct EditorTabView: View { ) // Tab content (icon and text). HStack(alignment: .center, spacing: 3) { - Image(nsImage: item.nsIcon) + Image(nsImage: tabFile.nsIcon) .frame(width: 16, height: 16) .foregroundColor( fileIconStyle == .color && activeState != .inactive && isActiveEditor - ? item.iconColor + ? tabFile.iconColor : .secondary ) - Text(item.name) + Text(tabFile.name) .font( isTemporary ? .system(size: 11.0).italic() : .system(size: 11.0) ) .lineLimit(1) + .strikethrough(fileObserver.isDeleted, color: .primary) } .frame(maxHeight: .infinity) // To max-out the parent (tab bar) area. .accessibilityElement(children: .ignore) .accessibilityAddTraits(.isStaticText) - .accessibilityLabel(item.name) + .accessibilityLabel(tabFile.name) .padding(.horizontal, 20) .overlay { ZStack { @@ -152,7 +157,7 @@ struct EditorTabView: View { isDragging: draggingTabId != nil || onDragTabId != nil, closeAction: closeAction, closeButtonGestureActive: $closeButtonGestureActive, - item: item, + item: tabFile, isHoveringClose: $isHoveringClose ) } @@ -227,8 +232,14 @@ struct EditorTabView: View { } ) .zIndex(isActive ? 2 : (isDragging ? 3 : (isPressing ? 1 : 0))) - .id(item.id) - .tabBarContextMenu(item: item, isTemporary: isTemporary) + .id(tabFile.id) + .tabBarContextMenu(item: tabFile, isTemporary: isTemporary) .accessibilityElement(children: .contain) + .onAppear { + workspace.workspaceFileManager?.addObserver(fileObserver) + } + .onDisappear { + workspace.workspaceFileManager?.removeObserver(fileObserver) + } } } diff --git a/CodeEdit/Features/Editor/TabBar/Tabs/Tab/Models/EditorTabFileObserver.swift b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/Models/EditorTabFileObserver.swift new file mode 100644 index 000000000..c9e78d788 --- /dev/null +++ b/CodeEdit/Features/Editor/TabBar/Tabs/Tab/Models/EditorTabFileObserver.swift @@ -0,0 +1,30 @@ +// +// EditorTabFileObserver.swift +// CodeEdit +// +// Created by Filipp Kuznetsov on 25.02.2025. +// + +import Foundation +import SwiftUI + +/// Observer ViewModel for tracking file deletion +@MainActor +final class EditorTabFileObserver: ObservableObject, + CEWorkspaceFileManagerObserver { + @Published private(set) var isDeleted = false + + private let tabFile: CEWorkspaceFile + + init(file: CEWorkspaceFile) { + self.tabFile = file + } + + nonisolated func fileManagerUpdated(updatedItems: Set) { + Task { @MainActor in + if let parent = tabFile.parent, updatedItems.contains(parent) { + isDeleted = tabFile.doesExist == false + } + } + } +} diff --git a/CodeEdit/Features/Editor/TabBar/Tabs/Views/EditorTabs.swift b/CodeEdit/Features/Editor/TabBar/Tabs/Views/EditorTabs.swift index a10dc7839..1bcc3639c 100644 --- a/CodeEdit/Features/Editor/TabBar/Tabs/Views/EditorTabs.swift +++ b/CodeEdit/Features/Editor/TabBar/Tabs/Views/EditorTabs.swift @@ -261,7 +261,7 @@ struct EditorTabs: View { ForEach(Array(openedTabs.enumerated()), id: \.element) { index, id in if let item = editor.tabs.first(where: { $0.file.id == id }) { EditorTabView( - item: item.file, + file: item.file, index: index, draggingTabId: draggingTabId, onDragTabId: onDragTabId, From 13d98b7a653b704cad75cc464066a70b79411f1e Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:00:50 -0500 Subject: [PATCH 10/24] Update Project Settings - Generate Asset Symbols (#2009) Updates the project settings to include generated asset symbols for cleaner asset use project-wide. This allows us to use type-safe, auto-generated symbols for referencing assets rather than string based APIs. This also allows for some cleaning around the use of these symbols, removing nil-coalescing operators and other optional unwrapping boilerplate that was previously required for safe use. For more info on generated asset symbols, see [Xcode 15 release notes here](https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#New-Features). ### Related Issues * N/A ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code ### Screenshots N/A --- CodeEdit.xcodeproj/project.pbxproj | 7 +- .../Models/CEWorkspaceFileIcon.swift | 8 +- .../JumpBar/Views/EditorJumpBarMenu.swift | 4 +- .../OutlineView/FileSystemTableViewCell.swift | 4 +- .../ProjectNavigatorToolbarBottom.swift | 4 +- .../Models/RepoOutlineGroupItem.swift | 10 ++- ...SourceControlNavigatorRepositoryItem.swift | 82 +++++++++---------- ...gatorRepositoryView+outlineGroupData.swift | 14 ++-- .../AccountSelectionView.swift | 2 +- .../AccountsSettingsAccountLink.swift | 2 +- .../AccountsSettingsProviderRow.swift | 4 +- .../AccountsSettingsSigninView.swift | 2 +- .../Models/SourceControlAccount.swift | 20 ++--- 13 files changed, 81 insertions(+), 82 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 494a5c1d5..8a7f8b685 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -380,7 +380,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1330; - LastUpgradeCheck = 1540; + LastUpgradeCheck = 1620; TargetAttributes = { 2BE487EB28245162003F3F64 = { CreatedOnToolsVersion = 13.3.1; @@ -577,6 +577,7 @@ baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -771,6 +772,7 @@ baseConfigurationReferenceRelativePath = Beta.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1033,6 +1035,7 @@ baseConfigurationReferenceRelativePath = Alpha.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CE_APPICON_NAME = AppIconPre; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1229,6 +1232,7 @@ baseConfigurationReferenceRelativePath = Debug.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1300,6 +1304,7 @@ baseConfigurationReferenceRelativePath = Release.xcconfig; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileIcon.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileIcon.swift index 11869086c..e26f15af7 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileIcon.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileIcon.swift @@ -180,13 +180,13 @@ enum FileIcon { case .css: return .teal case .js, .mjs, .py, .entitlements, .LICENSE: - return Color("Amber") + return Color.amber case .json, .resolved, .rb, .strings, .yml: - return Color("Scarlet") + return Color.scarlet case .jsx, .tsx: return .cyan case .plist, .xcconfig, .sh: - return Color("Steel") + return Color.steel case .c, .cetheme: return .purple case .vue: @@ -204,7 +204,7 @@ enum FileIcon { case .rs: return .orange default: - return Color("Steel") + return Color.steel } } } diff --git a/CodeEdit/Features/Editor/JumpBar/Views/EditorJumpBarMenu.swift b/CodeEdit/Features/Editor/JumpBar/Views/EditorJumpBarMenu.swift index 228c974b5..84c97766b 100644 --- a/CodeEdit/Features/Editor/JumpBar/Views/EditorJumpBarMenu.swift +++ b/CodeEdit/Features/Editor/JumpBar/Views/EditorJumpBarMenu.swift @@ -76,10 +76,10 @@ final class JumpBarMenuItem: NSMenuItem { if fileItem.isFolder { let subMenu = NSMenu() submenu = subMenu - color = NSColor(named: "FolderBlue") ?? NSColor(.secondary) + color = NSColor.folderBlue } if generalSettings.fileIconStyle == .monochrome { - color = NSColor(named: "CoolGray") ?? NSColor(.gray) + color = NSColor.coolGray } let image = fileItem.nsIcon.withSymbolConfiguration(.init(paletteColors: [color])) self.image = image diff --git a/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift b/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift index fcbed691d..7aa5ea3cf 100644 --- a/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift +++ b/CodeEdit/Features/NavigatorArea/OutlineView/FileSystemTableViewCell.swift @@ -138,10 +138,10 @@ class FileSystemTableViewCell: StandardTableViewCell { if !item.isFolder { return NSColor(item.iconColor) } else { - return NSColor(named: "FolderBlue") ?? NSColor(.cyan) + return NSColor.folderBlue } } else { - return NSColor(named: "CoolGray") ?? NSColor(.gray) + return NSColor.coolGray } } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift index 0784dde07..e2977bcac 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift @@ -168,10 +168,10 @@ struct FilterDropDownIconButton: View { Menu { menu() } label: {} .background { if isOn == true { - Image("line.3.horizontal.decrease.chevron.filled") + Image(ImageResource.line3HorizontalDecreaseChevronFilled) .foregroundStyle(.tint) } else { - Image("line.3.horizontal.decrease.chevron") + Image(ImageResource.line3HorizontalDecreaseChevron) } } .menuStyle(.borderlessButton) diff --git a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Models/RepoOutlineGroupItem.swift b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Models/RepoOutlineGroupItem.swift index b78c0fea5..a0e454909 100644 --- a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Models/RepoOutlineGroupItem.swift +++ b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Models/RepoOutlineGroupItem.swift @@ -8,12 +8,16 @@ import SwiftUI struct RepoOutlineGroupItem: Hashable, Identifiable { + enum ImageType: Hashable { + case system(name: String) + case symbol(name: String) + } + var id: String var label: String var description: String? - var systemImage: String? - var symbolImage: String? - var imageColor: Color? + var image: ImageType + var imageColor: Color var children: [RepoOutlineGroupItem]? var branch: GitBranch? var stashEntry: GitStashEntry? diff --git a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryItem.swift b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryItem.swift index 4dabc4746..003b28539 100644 --- a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryItem.swift +++ b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryItem.swift @@ -17,53 +17,49 @@ struct SourceControlNavigatorRepositoryItem: View { var controlActiveState var body: some View { - if item.systemImage != nil || item.symbolImage != nil { - Label(title: { - Text(item.label) + Label(title: { + Text(item.label) + .lineLimit(1) + .truncationMode(.middle) + if let description = item.description { + Text(description) .lineLimit(1) - .truncationMode(.middle) - if let description = item.description { - Text(description) - .lineLimit(1) - .foregroundStyle(.secondary) - .font(.system(size: 11)) - .layoutPriority(-1) - } - Spacer() - HStack(spacing: 5) { - if let behind = item.branch?.behind, behind > 0 { - HStack(spacing: 0) { - Image(systemName: "arrow.down") - .imageScale(.small) - Text("\(behind)") - .font(.system(size: 11)) - } + .foregroundStyle(.secondary) + .font(.system(size: 11)) + .layoutPriority(-1) + } + Spacer() + HStack(spacing: 5) { + if let behind = item.branch?.behind, behind > 0 { + HStack(spacing: 0) { + Image(systemName: "arrow.down") + .imageScale(.small) + Text("\(behind)") + .font(.system(size: 11)) } - if let ahead = item.branch?.ahead, ahead > 0 { - HStack(spacing: 0) { - Image(systemName: "arrow.up") - .imageScale(.small) - Text("\(ahead)") - .font(.system(size: 11)) - } + } + if let ahead = item.branch?.ahead, ahead > 0 { + HStack(spacing: 0) { + Image(systemName: "arrow.up") + .imageScale(.small) + Text("\(ahead)") + .font(.system(size: 11)) } } - }, icon: { - if item.symbolImage != nil { - Image(symbol: item.symbolImage ?? "") - .opacity(controlActiveState == .inactive ? 0.5 : 1) - .foregroundStyle(fileIconStyle == .color ? item.imageColor ?? .accentColor : Color("CoolGray")) - } else { - Image(systemName: item.systemImage ?? "") - .opacity(controlActiveState == .inactive ? 0.5 : 1) - .foregroundStyle(fileIconStyle == .color ? item.imageColor ?? .accentColor : Color("CoolGray")) + } + }, icon: { + Group { + switch item.image { + case .system(let name): + Image(systemName: name) + case .symbol(let name): + Image(symbol: name) } - }) - .padding(.leading, 1) - .padding(.vertical, -1) - } else { - Text(item.label) - .padding(.leading, 2) - } + } + .opacity(controlActiveState == .inactive ? 0.5 : 1) + .foregroundStyle(fileIconStyle == .color ? item.imageColor : Color.coolGray) + }) + .padding(.leading, 1) + .padding(.vertical, -1) } } diff --git a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryView+outlineGroupData.swift b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryView+outlineGroupData.swift index c7457fd06..cea00e0b9 100644 --- a/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryView+outlineGroupData.swift +++ b/CodeEdit/Features/NavigatorArea/SourceControlNavigator/Repository/Views/SourceControlNavigatorRepositoryView+outlineGroupData.swift @@ -13,14 +13,14 @@ extension SourceControlNavigatorRepositoryView { .init( id: "BranchesGroup", label: "Branches", - systemImage: "externaldrive.fill", + image: .system(name: "externaldrive.fill"), imageColor: Color(nsColor: .secondaryLabelColor), children: sourceControlManager.orderedLocalBranches.map { branch in .init( id: "Branch\(branch.name)", label: branch.name, description: branch == sourceControlManager.currentBranch ? "(current)" : nil, - symbolImage: "branch", + image: .symbol(name: "branch"), imageColor: .blue, branch: branch ) @@ -29,7 +29,7 @@ extension SourceControlNavigatorRepositoryView { .init( id: "StashedChangesGroup", label: "Stashed Changes", - systemImage: "tray.2.fill", + image: .system(name: "tray.2.fill"), imageColor: Color(nsColor: .secondaryLabelColor), children: sourceControlManager.stashEntries.map { stashEntry in .init( @@ -43,7 +43,7 @@ extension SourceControlNavigatorRepositoryView { .hour(.defaultDigits(amPM: .abbreviated)) .minute(.twoDigits) ), - systemImage: "tray", + image: .system(name: "tray"), imageColor: .orange, stashEntry: stashEntry ) @@ -52,19 +52,19 @@ extension SourceControlNavigatorRepositoryView { .init( id: "RemotesGroup", label: "Remotes", - systemImage: "network", + image: .system(name: "network"), imageColor: Color(nsColor: .secondaryLabelColor), children: sourceControlManager.remotes.map { remote in .init( id: "Remote\(remote.hashValue)", label: remote.name, - symbolImage: "vault", + image: .symbol(name: "vault"), imageColor: .teal, children: remote.branches.map { branch in .init( id: "Remote\(remote.name)-Branch\(branch.name)", label: branch.name, - symbolImage: "branch", + image: .symbol(name: "branch"), imageColor: .blue, branch: branch ) diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountSelectionView.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountSelectionView.swift index 5d0db5d5b..0437b716d 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountSelectionView.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountSelectionView.swift @@ -23,7 +23,7 @@ struct AccountSelectionView: View { ForEach(gitProviders, id: \.self) { provider in AccountsSettingsProviderRow( name: provider.name, - iconName: provider.iconName, + iconResource: provider.iconResource, action: { selectedProvider = provider dismiss() diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift index 0461a3fd0..d655a8d16 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsAccountLink.swift @@ -22,7 +22,7 @@ struct AccountsSettingsAccountLink: View { .font(.footnote) .foregroundColor(.secondary) } icon: { - FeatureIcon(image: Image(account.provider.iconName), size: 26) + FeatureIcon(image: Image(account.provider.iconResource), size: 26) .padding(.vertical, 2) .padding(.leading, 2) } diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift index 7d570464d..cc9c687dc 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsProviderRow.swift @@ -9,7 +9,7 @@ import SwiftUI struct AccountsSettingsProviderRow: View { var name: String - var iconName: String + var iconResource: ImageResource var action: () -> Void @State private var hovering = false @@ -17,7 +17,7 @@ struct AccountsSettingsProviderRow: View { var body: some View { HStack { - FeatureIcon(image: Image(iconName), size: 28) + FeatureIcon(image: Image(iconResource), size: 28) Text(name) Spacer() if hovering { diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift index 7672d50b6..1b648057c 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/AccountsSettingsSigninView.swift @@ -64,7 +64,7 @@ struct AccountsSettingsSigninView: View { }, header: { VStack(alignment: .center, spacing: 10) { - FeatureIcon(image: Image(provider.iconName), size: 52) + FeatureIcon(image: Image(provider.iconResource), size: 52) .padding(.top, 5) Text("Sign in to \(provider.name)") .multilineTextAlignment(.center) diff --git a/CodeEdit/Features/Settings/Pages/AccountsSettings/Models/SourceControlAccount.swift b/CodeEdit/Features/Settings/Pages/AccountsSettings/Models/SourceControlAccount.swift index fdc2b4fd6..f7b67898a 100644 --- a/CodeEdit/Features/Settings/Pages/AccountsSettings/Models/SourceControlAccount.swift +++ b/CodeEdit/Features/Settings/Pages/AccountsSettings/Models/SourceControlAccount.swift @@ -101,20 +101,14 @@ struct SourceControlAccount: Codable, Identifiable, Hashable { } } - var iconName: String { + var iconResource: ImageResource { switch self { - case .bitbucketCloud: - return "BitBucketIcon" - case .bitbucketServer: - return "BitBucketIcon" - case .github: - return "GitHubIcon" - case .githubEnterprise: - return "GitHubIcon" - case .gitlab: - return "GitLabIcon" - case .gitlabSelfHosted: - return "GitLabIcon" + case .bitbucketCloud, .bitbucketServer: + return .bitBucketIcon + case .github, .githubEnterprise: + return .gitHubIcon + case .gitlab, .gitlabSelfHosted: + return .gitLabIcon } } From 255c88e32a1821f8617fd2d9423adeedb8388089 Mon Sep 17 00:00:00 2001 From: Abe Date: Wed, 2 Apr 2025 06:02:22 -0700 Subject: [PATCH 11/24] Added copy path and copy relative path options in project navigator menu (#2013) --- .../Views/EditorTabBarContextMenu.swift | 29 +++++++-------- .../OutlineView/ProjectNavigatorMenu.swift | 6 ++++ .../ProjectNavigatorMenuActions.swift | 36 +++++++++++++++++++ 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarContextMenu.swift b/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarContextMenu.swift index 78d96637a..fbebd7c4b 100644 --- a/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarContextMenu.swift +++ b/CodeEdit/Features/Editor/TabBar/Views/EditorTabBarContextMenu.swift @@ -5,8 +5,8 @@ // Created by Khan Winter on 6/4/22. // -import Foundation import SwiftUI +import Foundation extension View { func tabBarContextMenu(item: CEWorkspaceFile, isTemporary: Bool) -> some View { @@ -149,24 +149,21 @@ struct EditorTabBarContextMenu: ViewModifier { guard let rootPath = workspace.workspaceFileManager?.folderUrl else { return } - // Calculate the relative path - var rootComponents = rootPath.standardizedFileURL.pathComponents - var destinationComponents = item.url.standardizedFileURL.pathComponents - - // Remove any same path components - while !rootComponents.isEmpty && !destinationComponents.isEmpty - && rootComponents.first == destinationComponents.first { - rootComponents.remove(at: 0) - destinationComponents.remove(at: 0) + let destinationComponents = item.url.standardizedFileURL.pathComponents + let baseComponents = rootPath.standardizedFileURL.pathComponents + + // Find common prefix length + var prefixCount = 0 + while prefixCount < min(destinationComponents.count, baseComponents.count) + && destinationComponents[prefixCount] == baseComponents[prefixCount] { + prefixCount += 1 } - - // Make a "../" for each remaining component in the root URL - var relativePath: String = String(repeating: "../", count: rootComponents.count) - // Add the remaining components for the destination url. - relativePath += destinationComponents.joined(separator: "/") + // Build the relative path + let upPath = String(repeating: "../", count: baseComponents.count - prefixCount) + let downPath = destinationComponents[prefixCount...].joined(separator: "/") // Copy it to the clipboard NSPasteboard.general.clearContents() - NSPasteboard.general.setString(relativePath, forType: .string) + NSPasteboard.general.setString(upPath + downPath, forType: .string) } } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenu.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenu.swift index eb7c7764c..553e61406 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenu.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenu.swift @@ -55,6 +55,9 @@ final class ProjectNavigatorMenu: NSMenu { let openExternalEditor = menuItem("Open with External Editor", action: #selector(openWithExternalEditor)) let openAs = menuItem("Open As", action: nil) + let copyPath = menuItem("Copy Path", action: #selector(copyPath)) + let copyRelativePath = menuItem("Copy Relative Path", action: #selector(copyRelativePath)) + let showFileInspector = menuItem("Show File Inspector", action: nil) let newFile = menuItem("New File...", action: #selector(newFile)) @@ -91,6 +94,9 @@ final class ProjectNavigatorMenu: NSMenu { openExternalEditor, openAs, NSMenuItem.separator(), + copyPath, + copyRelativePath, + NSMenuItem.separator(), showFileInspector, NSMenuItem.separator(), newFile, diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift index f3eac9cef..e80890aa7 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorMenuActions.swift @@ -222,6 +222,42 @@ extension ProjectNavigatorMenu { } } + /// Copies the absolute path of the selected files + @objc + func copyPath() { + let paths = selectedItems().map { + $0.url.standardizedFileURL.path + }.sorted().joined(separator: "\n") + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(paths, forType: .string) + } + + /// Copies the relative path of the selected files + @objc + func copyRelativePath() { + guard let rootPath = workspace?.workspaceFileManager?.folderUrl else { + return + } + let paths = selectedItems().map { + let destinationComponents = $0.url.standardizedFileURL.pathComponents + let baseComponents = rootPath.standardizedFileURL.pathComponents + + // Find common prefix length + var prefixCount = 0 + while prefixCount < min(destinationComponents.count, baseComponents.count) + && destinationComponents[prefixCount] == baseComponents[prefixCount] { + prefixCount += 1 + } + // Build the relative path + let upPath = String(repeating: "../", count: baseComponents.count - prefixCount) + let downPath = destinationComponents[prefixCount...].joined(separator: "/") + return upPath + downPath + }.sorted().joined(separator: "\n") + + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(paths, forType: .string) + } + private func reloadData() { sender.outlineView.reloadData() sender.filteredContentChildren.removeAll() From 050c3e37429dea3a6969696d17d251ecdba468e3 Mon Sep 17 00:00:00 2001 From: Abe Date: Sat, 5 Apr 2025 09:08:03 -0700 Subject: [PATCH 12/24] Added editor overscroll setting (#2010) --- CodeEdit.xcodeproj/project.pbxproj | 26 ++++++---------- .../xcshareddata/swiftpm/Package.resolved | 2 +- .../Features/Editor/Views/CodeFileView.swift | 3 ++ .../Models/TextEditingSettings.swift | 31 +++++++++++++++++-- .../TextEditingSettingsView.swift | 26 ++++++++++++++++ 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 8a7f8b685..dc0c9157b 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -28,7 +28,6 @@ 6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */ = {isa = PBXBuildFile; productRef = 6C81916A29B41DD300B75C92 /* DequeModule */; }; 6C85BB402C2105ED00EB5DEF /* CodeEditKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C85BB3F2C2105ED00EB5DEF /* CodeEditKit */; }; 6C85BB442C210EFD00EB5DEF /* SwiftUIIntrospect in Frameworks */ = {isa = PBXBuildFile; productRef = 6C85BB432C210EFD00EB5DEF /* SwiftUIIntrospect */; }; - 6C9DB9E42D55656300ACD86E /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6C9DB9E32D55656300ACD86E /* CodeEditSourceEditor */; }; 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69229BCC71C00A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69429BCD78600A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; @@ -185,7 +184,6 @@ 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */, 6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */, 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */, - 6C9DB9E42D55656300ACD86E /* CodeEditSourceEditor in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -319,7 +317,6 @@ 6CB94D022CA1205100E8651C /* AsyncAlgorithms */, 6CC00A8A2CBEF150004E8134 /* CodeEditSourceEditor */, 6C73A6D22D4F1E550012D95C /* CodeEditSourceEditor */, - 6C9DB9E32D55656300ACD86E /* CodeEditSourceEditor */, ); productName = CodeEdit; productReference = B658FB2C27DA9E0F00EA4DBD /* CodeEdit.app */; @@ -422,7 +419,7 @@ 303E88462C276FD600EEA8D9 /* XCRemoteSwiftPackageReference "LanguageServerProtocol" */, 6C4E37FA2C73E00700AEE7B5 /* XCRemoteSwiftPackageReference "SwiftTerm" */, 6CB94D012CA1205100E8651C /* XCRemoteSwiftPackageReference "swift-async-algorithms" */, - 6C9DB9E22D55656300ACD86E /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */, + 30597BCA2D9AA5BE004BC2CC /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */, ); preferredProjectObjectVersion = 55; productRefGroup = B658FB2D27DA9E0F00EA4DBD /* Products */; @@ -1652,6 +1649,14 @@ minimumVersion = 0.13.2; }; }; + 30597BCA2D9AA5BE004BC2CC /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/CodeEditApp/CodeEditSourceEditor.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.10.0; + }; + }; 30CB648F2C16CA8100CC8A9E /* XCRemoteSwiftPackageReference "LanguageServerProtocol" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ChimeHQ/LanguageServerProtocol"; @@ -1740,14 +1745,6 @@ minimumVersion = 1.2.0; }; }; - 6C9DB9E22D55656300ACD86E /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/CodeEditApp/CodeEditSourceEditor"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.10.0; - }; - }; 6CB94D012CA1205100E8651C /* XCRemoteSwiftPackageReference "swift-async-algorithms" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-async-algorithms.git"; @@ -1841,11 +1838,6 @@ package = 6C85BB422C210EFD00EB5DEF /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; productName = SwiftUIIntrospect; }; - 6C9DB9E32D55656300ACD86E /* CodeEditSourceEditor */ = { - isa = XCSwiftPackageProductDependency; - package = 6C9DB9E22D55656300ACD86E /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */; - productName = CodeEditSourceEditor; - }; 6CB4463F2B6DFF3A00539ED0 /* CodeEditSourceEditor */ = { isa = XCSwiftPackageProductDependency; productName = CodeEditSourceEditor; diff --git a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 958dc198d..4b3a8ce4c 100644 --- a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "ac57a6899925c3e4ac6d43aed791c845c6fc24a4441b6a10297a207d951b7836", + "originHash" : "3d134b350244fc51aaff618575f0cb6d754dbbef6fb05b12964d922d42ce960e", "pins" : [ { "identity" : "anycodable", diff --git a/CodeEdit/Features/Editor/Views/CodeFileView.swift b/CodeEdit/Features/Editor/Views/CodeFileView.swift index ba1fbe660..e4e96959b 100644 --- a/CodeEdit/Features/Editor/Views/CodeFileView.swift +++ b/CodeEdit/Features/Editor/Views/CodeFileView.swift @@ -30,6 +30,8 @@ struct CodeFileView: View { var lineHeightMultiple @AppSettings(\.textEditing.wrapLinesToEditorWidth) var wrapLinesToEditorWidth + @AppSettings(\.textEditing.overscroll) + var overscroll @AppSettings(\.textEditing.font) var settingsFont @AppSettings(\.theme.useThemeBackground) @@ -127,6 +129,7 @@ struct CodeFileView: View { indentOption: (codeFile.indentOption ?? indentOption).textViewOption(), lineHeight: lineHeightMultiple, wrapLines: codeFile.wrapLines ?? wrapLinesToEditorWidth, + editorOverscroll: overscroll.overscrollPercentage, cursorPositions: $cursorPositions, useThemeBackground: useThemeBackground, contentInsets: edgeInsets.nsEdgeInsets, diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift index 2dd23cdfc..70a71d67c 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift @@ -14,10 +14,11 @@ extension SettingsData { struct TextEditingSettings: Codable, Hashable, SearchableSettingsPage { var searchKeys: [String] { - [ + var keys = [ "Prefer Indent Using", "Tab Width", "Wrap lines to editor width", + "Editor Overscroll", "Font", "Font Size", "Font Weight", @@ -27,7 +28,10 @@ extension SettingsData { "Enable type-over completion", "Bracket Pair Highlight" ] - .map { NSLocalizedString($0, comment: "") } + if #available(macOS 14.0, *) { + keys.append("System Cursor") + } + return keys.map { NSLocalizedString($0, comment: "") } } /// An integer indicating how many spaces a `tab` will appear as visually. @@ -49,6 +53,9 @@ extension SettingsData { /// A flag indicating whether to wrap lines to editor width var wrapLinesToEditorWidth: Bool = true + /// The percentage of overscroll to apply to the text view + var overscroll: OverscrollOption = .medium + /// A multiplier for setting the line height. Defaults to `1.2` var lineHeightMultiple: Double = 1.2 @@ -88,6 +95,10 @@ extension SettingsData { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true + self.overscroll = try container.decodeIfPresent( + OverscrollOption.self, + forKey: .overscroll + ) ?? .medium self.lineHeightMultiple = try container.decodeIfPresent( Double.self, forKey: .lineHeightMultiple @@ -167,6 +178,22 @@ extension SettingsData { case underline } } + + enum OverscrollOption: String, Codable { + case none + case small + case medium + case large + + var overscrollPercentage: CGFloat { + switch self { + case .none: return 0 + case .small: return 0.25 + case .medium: return 0.5 + case .large: return 0.75 + } + } + } } struct EditorFont: Codable, Hashable { diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift index d6f641a8a..04522e60b 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift @@ -19,6 +19,7 @@ struct TextEditingSettingsView: View { defaultTabWidth wrapLinesToEditorWidth useSystemCursor + overscroll } Section { fontSelector @@ -80,6 +81,31 @@ private extension TextEditingSettingsView { } } + @ViewBuilder private var overscroll: some View { + Group { + Picker( + "Editor Overscroll", + selection: $textEditing.overscroll + ) { + Text("None") + .tag(SettingsData.TextEditingSettings.OverscrollOption.none) + Divider() + Text("Small") + .tag( + SettingsData.TextEditingSettings.OverscrollOption.small + ) + Text("Medium") + .tag( + SettingsData.TextEditingSettings.OverscrollOption.medium + ) + Text("Large") + .tag( + SettingsData.TextEditingSettings.OverscrollOption.large + ) + } + } + } + @ViewBuilder private var lineHeight: some View { Stepper( "Line Height", From f919bbb1eeaa0e8dcad24fd415758ae545fa3bd7 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:11:29 -0500 Subject: [PATCH 13/24] [chore:] Update CodeEditSourceEditor, add Find In Editor, Misc Bug Fixes (#2020) ### Description Updates CodeEditSourceEditor. Includes: - Find in Editor feature. - Improved undo grouping. - Improved word detection when selecting words. - Improved overscroll behavior. - Added mouse drag selection modes. ### Related Issues * https://github.com/CodeEditApp/CodeEditTextView/issues/1 * https://github.com/CodeEditApp/CodeEditSourceEditor/pull/295 ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code --- CodeEdit.xcodeproj/project.pbxproj | 18 ++++----- .../xcshareddata/swiftpm/Package.resolved | 10 ++--- .../Features/Editor/Views/CodeFileView.swift | 40 ++++++------------- .../Editor/Views/EditorAreaView.swift | 4 +- .../Models/TextEditingSettings.swift | 13 +++--- .../TextEditingSettingsView.swift | 20 +++++----- 6 files changed, 46 insertions(+), 59 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index dc0c9157b..2755e13bd 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -419,7 +419,7 @@ 303E88462C276FD600EEA8D9 /* XCRemoteSwiftPackageReference "LanguageServerProtocol" */, 6C4E37FA2C73E00700AEE7B5 /* XCRemoteSwiftPackageReference "SwiftTerm" */, 6CB94D012CA1205100E8651C /* XCRemoteSwiftPackageReference "swift-async-algorithms" */, - 30597BCA2D9AA5BE004BC2CC /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */, + 6CFE18222DA59C9F00A7B796 /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */, ); preferredProjectObjectVersion = 55; productRefGroup = B658FB2D27DA9E0F00EA4DBD /* Products */; @@ -1649,14 +1649,6 @@ minimumVersion = 0.13.2; }; }; - 30597BCA2D9AA5BE004BC2CC /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/CodeEditApp/CodeEditSourceEditor.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.10.0; - }; - }; 30CB648F2C16CA8100CC8A9E /* XCRemoteSwiftPackageReference "LanguageServerProtocol" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ChimeHQ/LanguageServerProtocol"; @@ -1753,6 +1745,14 @@ version = 1.0.1; }; }; + 6CFE18222DA59C9F00A7B796 /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/CodeEditApp/CodeEditSourceEditor"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.11.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ diff --git a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4b3a8ce4c..305b01206 100644 --- a/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "3d134b350244fc51aaff618575f0cb6d754dbbef6fb05b12964d922d42ce960e", + "originHash" : "ac57a6899925c3e4ac6d43aed791c845c6fc24a4441b6a10297a207d951b7836", "pins" : [ { "identity" : "anycodable", @@ -33,8 +33,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/CodeEditApp/CodeEditSourceEditor", "state" : { - "revision" : "6b2c945501f0a5c15d8aa6d159fb2550c391bdd0", - "version" : "0.10.0" + "revision" : "f444927ab70015f4b76f119f6fc5d0e358fcd77a", + "version" : "0.11.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/CodeEditApp/CodeEditTextView.git", "state" : { - "revision" : "1792167c751b6668b4743600d2cf73d2829dd18a", - "version" : "0.7.9" + "revision" : "47faec9fb571c9c695897e69f0a4f08512ae682e", + "version" : "0.8.2" } }, { diff --git a/CodeEdit/Features/Editor/Views/CodeFileView.swift b/CodeEdit/Features/Editor/Views/CodeFileView.swift index e4e96959b..f45f4d107 100644 --- a/CodeEdit/Features/Editor/Views/CodeFileView.swift +++ b/CodeEdit/Features/Editor/Views/CodeFileView.swift @@ -40,8 +40,8 @@ struct CodeFileView: View { var matchAppearance @AppSettings(\.textEditing.letterSpacing) var letterSpacing - @AppSettings(\.textEditing.bracketHighlight) - var bracketHighlight + @AppSettings(\.textEditing.bracketEmphasis) + var bracketEmphasis @AppSettings(\.textEditing.useSystemCursor) var useSystemCursor @@ -50,6 +50,8 @@ struct CodeFileView: View { @ObservedObject private var themeModel: ThemeModel = .shared + @State private var treeSitter = TreeSitterClient() + private var cancellables = Set() private let isEditable: Bool @@ -99,23 +101,6 @@ struct CodeFileView: View { @State private var font: NSFont = Settings[\.textEditing].font.current - @State private var bracketPairHighlight: BracketPairHighlight? = { - let theme = ThemeModel.shared.selectedTheme ?? ThemeModel.shared.themes.first! - let color = Settings[\.textEditing].bracketHighlight.useCustomColor - ? Settings[\.textEditing].bracketHighlight.color.nsColor - : theme.editor.text.nsColor.withAlphaComponent(0.8) - switch Settings[\.textEditing].bracketHighlight.highlightType { - case .disabled: - return nil - case .flash: - return .flash - case .bordered: - return .bordered(color: color) - case .underline: - return .underline(color: color) - } - }() - @Environment(\.edgeInsets) private var edgeInsets @@ -132,10 +117,12 @@ struct CodeFileView: View { editorOverscroll: overscroll.overscrollPercentage, cursorPositions: $cursorPositions, useThemeBackground: useThemeBackground, + highlightProviders: [treeSitter], contentInsets: edgeInsets.nsEdgeInsets, + additionalTextInsets: NSEdgeInsets(top: 2, left: 0, bottom: 0, right: 0), isEditable: isEditable, letterSpacing: letterSpacing, - bracketPairHighlight: bracketPairHighlight, + bracketPairEmphasis: getBracketPairEmphasis(), useSystemCursor: useSystemCursor, undoManager: undoManager, coordinators: textViewCoordinators @@ -154,19 +141,18 @@ struct CodeFileView: View { .onChange(of: settingsFont) { newFontSetting in font = newFontSetting.current } - .onChange(of: bracketHighlight) { _ in - bracketPairHighlight = getBracketPairHighlight() - } } - private func getBracketPairHighlight() -> BracketPairHighlight? { - let color = if Settings[\.textEditing].bracketHighlight.useCustomColor { - Settings[\.textEditing].bracketHighlight.color.nsColor + /// Determines the style of bracket emphasis based on the `bracketEmphasis` setting and the current theme. + /// - Returns: The emphasis style to use for bracket pair emphasis. + private func getBracketPairEmphasis() -> BracketPairEmphasis? { + let color = if Settings[\.textEditing].bracketEmphasis.useCustomColor { + Settings[\.textEditing].bracketEmphasis.color.nsColor } else { currentTheme.editor.text.nsColor.withAlphaComponent(0.8) } - switch Settings[\.textEditing].bracketHighlight.highlightType { + switch Settings[\.textEditing].bracketEmphasis.highlightType { case .disabled: return nil case .flash: diff --git a/CodeEdit/Features/Editor/Views/EditorAreaView.swift b/CodeEdit/Features/Editor/Views/EditorAreaView.swift index 4868edc21..5e3dd8557 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaView.swift @@ -46,8 +46,8 @@ struct EditorAreaView: View { } var editorInsetAmount: Double { - let tabBarHeight = shouldShowTabBar ? (EditorTabBarView.height + 1) : 0 - let jumpBarHeight = showEditorJumpBar ? (EditorJumpBarView.height + 1) : 0 + let tabBarHeight = shouldShowTabBar ? (EditorTabBarView.height) : 0 + let jumpBarHeight = showEditorJumpBar ? (EditorJumpBarView.height) : 0 return tabBarHeight + jumpBarHeight } diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift index 70a71d67c..26e760f1e 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift @@ -26,6 +26,7 @@ extension SettingsData { "Letter Spacing", "Autocomplete braces", "Enable type-over completion", + "Bracket Pair Emphasis", "Bracket Pair Highlight" ] if #available(macOS 14.0, *) { @@ -64,7 +65,7 @@ extension SettingsData { var letterSpacing: Double = 1.0 /// The behavior of bracket pair highlights. - var bracketHighlight: BracketPairHighlight = BracketPairHighlight() + var bracketEmphasis: BracketPairEmphasis = BracketPairEmphasis() /// Use the system cursor for the source editor. var useSystemCursor: Bool = true @@ -107,10 +108,10 @@ extension SettingsData { Double.self, forKey: .letterSpacing ) ?? 1 - self.bracketHighlight = try container.decodeIfPresent( - BracketPairHighlight.self, - forKey: .bracketHighlight - ) ?? BracketPairHighlight() + self.bracketEmphasis = try container.decodeIfPresent( + BracketPairEmphasis.self, + forKey: .bracketEmphasis + ) ?? BracketPairEmphasis() if #available(macOS 14, *) { self.useSystemCursor = try container.decodeIfPresent(Bool.self, forKey: .useSystemCursor) ?? true } else { @@ -164,7 +165,7 @@ extension SettingsData { } } - struct BracketPairHighlight: Codable, Hashable { + struct BracketPairEmphasis: Codable, Hashable { /// The type of highlight to use var highlightType: HighlightType = .flash var useCustomColor: Bool = false diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift index 04522e60b..03b78a8c0 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift @@ -176,26 +176,26 @@ private extension TextEditingSettingsView { Group { Picker( "Bracket Pair Highlight", - selection: $textEditing.bracketHighlight.highlightType + selection: $textEditing.bracketEmphasis.highlightType ) { - Text("Disabled").tag(SettingsData.TextEditingSettings.BracketPairHighlight.HighlightType.disabled) + Text("Disabled").tag(SettingsData.TextEditingSettings.BracketPairEmphasis.HighlightType.disabled) Divider() - Text("Bordered").tag(SettingsData.TextEditingSettings.BracketPairHighlight.HighlightType.bordered) - Text("Flash").tag(SettingsData.TextEditingSettings.BracketPairHighlight.HighlightType.flash) - Text("Underline").tag(SettingsData.TextEditingSettings.BracketPairHighlight.HighlightType.underline) + Text("Bordered").tag(SettingsData.TextEditingSettings.BracketPairEmphasis.HighlightType.bordered) + Text("Flash").tag(SettingsData.TextEditingSettings.BracketPairEmphasis.HighlightType.flash) + Text("Underline").tag(SettingsData.TextEditingSettings.BracketPairEmphasis.HighlightType.underline) } - if [.bordered, .underline].contains(textEditing.bracketHighlight.highlightType) { - Toggle("Use Custom Color", isOn: $textEditing.bracketHighlight.useCustomColor) + if [.bordered, .underline].contains(textEditing.bracketEmphasis.highlightType) { + Toggle("Use Custom Color", isOn: $textEditing.bracketEmphasis.useCustomColor) SettingsColorPicker( "Bracket Pair Highlight Color", - color: $textEditing.bracketHighlight.color.swiftColor + color: $textEditing.bracketEmphasis.color.swiftColor ) .foregroundColor( - textEditing.bracketHighlight.useCustomColor + textEditing.bracketEmphasis.useCustomColor ? Color(.labelColor) : Color(.secondaryLabelColor) ) - .disabled(!textEditing.bracketHighlight.useCustomColor) + .disabled(!textEditing.bracketEmphasis.useCustomColor) } } } From 8fe8539789064ed137699bf7ef6052a2037f7f2c Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:13:35 -0500 Subject: [PATCH 14/24] [chore:] Bump Version Number (#2021) Bumps the version number to `0.3.4` --- CodeEdit/Info.plist | 2 +- OpenWithCodeEdit/Info.plist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeEdit/Info.plist b/CodeEdit/Info.plist index f6933b689..b4f251e04 100644 --- a/CodeEdit/Info.plist +++ b/CodeEdit/Info.plist @@ -1262,7 +1262,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 0.3.3 + 0.3.4 CFBundleURLTypes diff --git a/OpenWithCodeEdit/Info.plist b/OpenWithCodeEdit/Info.plist index 602726e0a..069637b0e 100644 --- a/OpenWithCodeEdit/Info.plist +++ b/OpenWithCodeEdit/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 0.3.3 + 0.3.4 CFBundleVersion 44 LSUIElement From 5b73629851422b98e6a4d4240bcd45dd5b706fa3 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:27:39 -0500 Subject: [PATCH 15/24] Update pre-release.yml - xcpretty --- .github/workflows/pre-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index f4a851b31..40617ae75 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -48,7 +48,7 @@ jobs: - name: Build CodeEdit env: APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - run: xcodebuild -scheme CodeEdit -configuration Pre -derivedDataPath "$RUNNER_TEMP/DerivedData" -archivePath "$RUNNER_TEMP/CodeEdit.xcarchive" -skipPackagePluginValidation DEVELOPMENT_TEAM=$APPLE_TEAM_ID archive + run: xcodebuild -scheme CodeEdit -configuration Pre -derivedDataPath "$RUNNER_TEMP/DerivedData" -archivePath "$RUNNER_TEMP/CodeEdit.xcarchive" -skipPackagePluginValidation DEVELOPMENT_TEAM=$APPLE_TEAM_ID archive | xcpretty ############################ # Sign From b6a096bc78c8d1ede9c5893a48bed92caf338122 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:51:01 -0500 Subject: [PATCH 16/24] Bump Build Number to 45 (#2022) bump build number to 45 Co-authored-by: GitHub Action --- CodeEdit.xcodeproj/project.pbxproj | 50 +++++++++++++++--------------- CodeEdit/Info.plist | 2 +- OpenWithCodeEdit/Info.plist | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 2755e13bd..2a95476a0 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -606,7 +606,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -646,7 +646,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -682,7 +682,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -710,7 +710,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -739,7 +739,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -801,7 +801,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -841,7 +841,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -877,7 +877,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -905,7 +905,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -934,7 +934,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -968,7 +968,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1002,7 +1002,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1065,7 +1065,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -1106,7 +1106,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -1142,7 +1142,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1170,7 +1170,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1199,7 +1199,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1261,7 +1261,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1333,7 +1333,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -1372,7 +1372,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -1412,7 +1412,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -1448,7 +1448,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1475,7 +1475,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1503,7 +1503,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1532,7 +1532,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 44; + CURRENT_PROJECT_VERSION = 45; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; diff --git a/CodeEdit/Info.plist b/CodeEdit/Info.plist index b4f251e04..962625428 100644 --- a/CodeEdit/Info.plist +++ b/CodeEdit/Info.plist @@ -1275,7 +1275,7 @@ CFBundleVersion - 44 + 45 LSApplicationCategoryType public.app-category.developer-tools NSHumanReadableCopyright diff --git a/OpenWithCodeEdit/Info.plist b/OpenWithCodeEdit/Info.plist index 069637b0e..e592dfdf9 100644 --- a/OpenWithCodeEdit/Info.plist +++ b/OpenWithCodeEdit/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 0.3.4 CFBundleVersion - 44 + 45 LSUIElement NSExtension From 7f9538cf90567c64fca46567ad9b9912786b3f75 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:43:50 -0500 Subject: [PATCH 17/24] Add workflow_dispatch to Release Notes CI --- .github/workflows/CI-release-notes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CI-release-notes.yml b/.github/workflows/CI-release-notes.yml index 7791a7e7a..6630abe0b 100644 --- a/.github/workflows/CI-release-notes.yml +++ b/.github/workflows/CI-release-notes.yml @@ -1,6 +1,7 @@ name: Deploy Website on Release Note Changes on: + workflow_dispatch: release: types: [created, edited, deleted] From e45d7f293e1fb4f62bd92e734fd888ed0d025801 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:01:55 -0500 Subject: [PATCH 18/24] docs: add pro100filipp as a contributor for code (#2023) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8950a8b6b..f39c76143 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -785,6 +785,15 @@ "contributions": [ "bug" ] + }, + { + "login": "pro100filipp", + "name": "Filipp Kuznetsov", + "avatar_url": "https://avatars.githubusercontent.com/u/12880697?v=4", + "profile": "https://github.com/pro100filipp", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index f836f2fdc..4e75fe61f 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,9 @@ For issues we want to focus on that are most relevant at any given time, please Savely
Savely

💻 Kihron
Kihron

🐛 + + Filipp Kuznetsov
Filipp Kuznetsov

💻 + From 2981547cbd864b9290743723e222667b4dc5779c Mon Sep 17 00:00:00 2001 From: Leonardo <83844690+LeonardoLarranaga@users.noreply.github.com> Date: Sat, 12 Apr 2025 06:25:12 -0700 Subject: [PATCH 19/24] Source Control Filter (#2024) ### Description Adding the ability to filter the project navigator by items that have a source control status. ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code ### Screenshots https://github.com/user-attachments/assets/2a5cb5a9-d4f0-42ff-9f61-2a7b3260ee5a --- .../WorkspaceDocument/WorkspaceDocument.swift | 2 ++ .../ProjectNavigatorOutlineView.swift | 4 +++ ...ewController+NSOutlineViewDataSource.swift | 7 +++-- .../ProjectNavigatorViewController.swift | 28 +++++++++++++------ .../ProjectNavigatorToolbarBottom.swift | 5 ++-- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index 1b96e4fca..a47fdbba8 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -16,6 +16,8 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { @Published var sortFoldersOnTop: Bool = true /// A string used to filter the displayed files and folders in the project navigator area based on user input. @Published var navigatorFilter: String = "" + /// Whether the workspace only shows files with changes. + @Published var sourceControlFilter = false private var workspaceState: [String: Any] { get { diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift index 21cf99dd0..529280d09 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift @@ -67,6 +67,10 @@ struct ProjectNavigatorOutlineView: NSViewControllerRepresentable { .throttle(for: 0.1, scheduler: RunLoop.main, latest: true) .sink { [weak self] _ in self?.controller?.handleFilterChange() } .store(in: &cancellables) + workspace.$sourceControlFilter + .throttle(for: 0.1, scheduler: RunLoop.main, latest: true) + .sink { [weak self] _ in self?.controller?.handleFilterChange() } + .store(in: &cancellables) } var cancellables: Set = [] diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift index 9cd4f4e3d..727899663 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift @@ -15,8 +15,11 @@ extension ProjectNavigatorViewController: NSOutlineViewDataSource { } if let children = workspace?.workspaceFileManager?.childrenOfFile(item) { - if let filter = workspace?.navigatorFilter, !filter.isEmpty { - let filteredChildren = children.filter { fileSearchMatches(filter, for: $0) } + if let filter = workspace?.navigatorFilter, let sourceControlFilter = workspace?.sourceControlFilter, + !filter.isEmpty || sourceControlFilter { + let filteredChildren = children.filter { + fileSearchMatches(filter, for: $0, sourceControlFilter: sourceControlFilter) + } filteredContentChildren[item] = filteredChildren return filteredChildren } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift index f76f07efc..ea9e2ee25 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController.swift @@ -64,6 +64,10 @@ final class ProjectNavigatorViewController: NSViewController { /// to open the file a second time. var shouldSendSelectionUpdate: Bool = true + var filterIsEmpty: Bool { + workspace?.navigatorFilter.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == true + } + /// Setup the ``scrollView`` and ``outlineView`` override func loadView() { self.scrollView = NSScrollView() @@ -193,13 +197,13 @@ final class ProjectNavigatorViewController: NSViewController { guard let workspace else { return } /// If the filter is empty, show all items and restore the expanded state. - if workspace.navigatorFilter.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { - restoreExpandedState() - outlineView.autosaveExpandedItems = true - } else { + if workspace.sourceControlFilter || !filterIsEmpty { outlineView.autosaveExpandedItems = false /// Expand all items for search. outlineView.expandItem(outlineView.item(atRow: 0), expandChildren: true) + } else { + restoreExpandedState() + outlineView.autosaveExpandedItems = true } if let root = content.first(where: { $0.isRoot }), let children = filteredContentChildren[root] { @@ -213,16 +217,24 @@ final class ProjectNavigatorViewController: NSViewController { } /// Checks if the given filter matches the name of the item or any of its children. - func fileSearchMatches(_ filter: String, for item: CEWorkspaceFile) -> Bool { - guard !filter.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return true } + func fileSearchMatches(_ filter: String, for item: CEWorkspaceFile, sourceControlFilter: Bool) -> Bool { + guard !filterIsEmpty || sourceControlFilter else { + return true + } - if item.name.localizedLowercase.contains(filter.localizedLowercase) { + if sourceControlFilter { + if item.gitStatus != nil && item.gitStatus != GitStatus.none && + (filterIsEmpty || item.name.localizedCaseInsensitiveContains(filter)) { + saveAllContentChildren(for: item) + return true + } + } else if item.name.localizedCaseInsensitiveContains(filter) { saveAllContentChildren(for: item) return true } if let children = workspace?.workspaceFileManager?.childrenOfFile(item) { - return children.contains { fileSearchMatches(filter, for: $0) } + return children.contains { fileSearchMatches(filter, for: $0, sourceControlFilter: sourceControlFilter) } } return false diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift index e2977bcac..c4a7758eb 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift @@ -18,7 +18,6 @@ struct ProjectNavigatorToolbarBottom: View { @EnvironmentObject var editorManager: EditorManager @State var recentsFilter: Bool = false - @State var sourceControlFilter: Bool = false var body: some View { HStack(spacing: 5) { @@ -48,7 +47,7 @@ struct ProjectNavigatorToolbarBottom: View { Image(systemName: "clock") } .help("Show only recent files") - Toggle(isOn: $sourceControlFilter) { + Toggle(isOn: $workspace.sourceControlFilter) { Image(systemName: "plusminus.circle") } .help("Show only files with source-control status") @@ -57,7 +56,7 @@ struct ProjectNavigatorToolbarBottom: View { .padding(.trailing, 2.5) }, clearable: true, - hasValue: !workspace.navigatorFilter.isEmpty || recentsFilter || sourceControlFilter + hasValue: !workspace.navigatorFilter.isEmpty || recentsFilter || workspace.sourceControlFilter ) } .padding(.horizontal, 5) From 3d64ff1584b11f58d5400f7e41c372162ab52369 Mon Sep 17 00:00:00 2001 From: Leonardo <83844690+LeonardoLarranaga@users.noreply.github.com> Date: Wed, 16 Apr 2025 05:29:02 -0700 Subject: [PATCH 20/24] Disable 'Export All Custom Themes' if custom themes is empty (#2027) ### Description A quick PR... If the user doesn't have any custom themes, disable the "Export All Custom Themes...", as it still opens a save panel and lets the user choose a directory even though nothing's going to be saved. ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [ ] I documented my code ### Screenshots With no custom themes: Screenshot 2025-04-14 at 17 54 45 With custom themes: Screenshot 2025-04-14 at 17 55 11 --- .../Settings/Pages/ThemeSettings/ThemeSettingsView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/CodeEdit/Features/Settings/Pages/ThemeSettings/ThemeSettingsView.swift b/CodeEdit/Features/Settings/Pages/ThemeSettings/ThemeSettingsView.swift index 813479cdc..7ff0ceca7 100644 --- a/CodeEdit/Features/Settings/Pages/ThemeSettings/ThemeSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/ThemeSettings/ThemeSettingsView.swift @@ -53,6 +53,7 @@ struct ThemeSettingsView: View { } label: { Text("Export All Custom Themes...") } + .disabled(themeModel.themes.filter { !$0.isBundled }.isEmpty) } }) .padding(.horizontal, 5) From f9cd13b16737a4ec204a5984892b59f04d30c6c7 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Sat, 19 Apr 2025 14:52:41 -0500 Subject: [PATCH 21/24] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4e75fe61f..f5b9651ae 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ + + + From f880c33757d3677f30912f10bd53d0fdfb479aa5 Mon Sep 17 00:00:00 2001 From: Leonardo <83844690+LeonardoLarranaga@users.noreply.github.com> Date: Sun, 20 Apr 2025 16:05:26 -0700 Subject: [PATCH 22/24] Sort alphabetically - Folders on top (#2028) * Sort alphabetically - Folders on top * Changed `Button` to `Toggle` --- .../ProjectNavigatorOutlineView.swift | 10 +++++++--- ...iewController+NSOutlineViewDataSource.swift | 18 ++++++++++++++---- .../ProjectNavigatorToolbarBottom.swift | 13 +++++++++---- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift index 529280d09..74d1f5320 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorOutlineView.swift @@ -65,11 +65,15 @@ struct ProjectNavigatorOutlineView: NSViewControllerRepresentable { .store(in: &cancellables) workspace.$navigatorFilter .throttle(for: 0.1, scheduler: RunLoop.main, latest: true) - .sink { [weak self] _ in self?.controller?.handleFilterChange() } + .sink { [weak self] _ in + self?.controller?.handleFilterChange() + } .store(in: &cancellables) - workspace.$sourceControlFilter + Publishers.Merge(workspace.$sourceControlFilter, workspace.$sortFoldersOnTop) .throttle(for: 0.1, scheduler: RunLoop.main, latest: true) - .sink { [weak self] _ in self?.controller?.handleFilterChange() } + .sink { [weak self] _ in + self?.controller?.handleFilterChange() + } .store(in: &cancellables) } diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift index 727899663..2cc45c4b1 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/OutlineView/ProjectNavigatorViewController+NSOutlineViewDataSource.swift @@ -12,19 +12,29 @@ extension ProjectNavigatorViewController: NSOutlineViewDataSource { private func getOutlineViewItems(for item: CEWorkspaceFile) -> [CEWorkspaceFile] { if let cachedChildren = filteredContentChildren[item] { return cachedChildren + .sorted { lhs, rhs in + workspace?.sortFoldersOnTop == true ? lhs.isFolder && !rhs.isFolder : lhs.name < rhs.name + } } - if let children = workspace?.workspaceFileManager?.childrenOfFile(item) { - if let filter = workspace?.navigatorFilter, let sourceControlFilter = workspace?.sourceControlFilter, - !filter.isEmpty || sourceControlFilter { + if let workspace, let children = workspace.workspaceFileManager?.childrenOfFile(item) { + if !workspace.navigatorFilter.isEmpty || workspace.sourceControlFilter { let filteredChildren = children.filter { - fileSearchMatches(filter, for: $0, sourceControlFilter: sourceControlFilter) + fileSearchMatches( + workspace.navigatorFilter, + for: $0, + sourceControlFilter: workspace.sourceControlFilter + ) } + filteredContentChildren[item] = filteredChildren return filteredChildren } return children + .sorted { lhs, rhs in + workspace.sortFoldersOnTop ? lhs.isFolder && !rhs.isFolder : lhs.name < rhs.name + } } return [] diff --git a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift index c4a7758eb..bb1e44fb8 100644 --- a/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift +++ b/CodeEdit/Features/NavigatorArea/ProjectNavigator/ProjectNavigatorToolbarBottom.swift @@ -27,10 +27,15 @@ struct ProjectNavigatorToolbarBottom: View { text: $workspace.navigatorFilter, leadingAccessories: { FilterDropDownIconButton(menu: { - Button { - workspace.sortFoldersOnTop.toggle() - } label: { - Text(workspace.sortFoldersOnTop ? "Alphabetically" : "Folders on top") + ForEach([(true, "Folders on top"), (false, "Alphabetically")], id: \.0) { value, title in + Toggle(title, isOn: Binding(get: { + workspace.sortFoldersOnTop == value + }, set: { _ in + // Avoid calling the handleFilterChange method + if workspace.sortFoldersOnTop != value { + workspace.sortFoldersOnTop = value + } + })) } }, isOn: !workspace.navigatorFilter.isEmpty) .padding(.leading, 4) From ae86e5315441deaf4c43cf140b2b95dbea025878 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:20:37 -0500 Subject: [PATCH 23/24] Upload dSYMs When Archiving --- .github/workflows/pre-release.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 40617ae75..2bfce92e9 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -109,6 +109,20 @@ jobs: echo "APP_VERSION=$APP_VERSION" >> $GITHUB_ENV echo "APP_BUILD=$APP_BUILD" >> $GITHUB_ENV + ############################ + # Upload dSYMs Artifact + ############################ + - name: Upload dSYMs Artifact + uses: actions/upload-artifact@v4 + with: + name: "CodeEdit-${{ env.APP_BUILD }}-dSYMs" + path: "${{ RUNNER.TEMP }}/CodeEdit.xcarchive/dSYMs" + if-no-files-found: error + # overwrite files for the same build number + overwrite: true + # these can be big, use maximum compression + compression-level: 9 + ############################ # Sparkle Appcast ############################ From 9989d2ef64a5ddbad80638c87585c277e88a8be8 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Tue, 22 Apr 2025 09:55:43 -0500 Subject: [PATCH 24/24] Fix Tasks Not Saving (#2034) ### Description Fixes a bug where tasks would not save after creating them due to an accidental change when removing a deprecated URL method. Also removes a few unnecessary view models in settings, and correctly handles errors thrown when saving workspace settings in UI (with a simple alert). ### Related Issues * N/A Reported on [discord](https://discord.com/channels/951544472238444645/952640521812193411/1362011473324540097) ### Checklist - [x] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [x] The issues this PR addresses are related to each other - [x] My changes generate no new warnings - [x] My code builds and runs on my machine - [x] My changes are all related to the related issue above - [x] I documented my code ### Screenshots --- .../Models/CEWorkspaceSettings.swift | 16 ++++++++++--- .../Views/CETaskFormView.swift | 6 ----- .../Views/CEWorkspaceSettingsView.swift | 3 --- .../Views/EditCETaskView.swift | 24 ++++++++++++------- .../CEWorkspaceSettingsTests.swift | 20 ++++++++++++++++ 5 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 CodeEditTests/Features/WorkspaceSettings/CEWorkspaceSettingsTests.swift diff --git a/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift b/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift index 8ff0b0249..21d5f661a 100644 --- a/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift +++ b/CodeEdit/Features/CEWorkspaceSettings/Models/CEWorkspaceSettings.swift @@ -17,8 +17,8 @@ final class CEWorkspaceSettings: ObservableObject { private(set) var folderURL: URL - private var settingsURL: URL { - folderURL.appending(path: "settings").appending(path: "json") + var settingsURL: URL { + folderURL.appending(path: "settings").appendingPathExtension("json") } init(workspaceURL: URL) { @@ -54,7 +54,17 @@ final class CEWorkspaceSettings: ObservableObject { /// Save``CEWorkspaceSettingsManager`` model to `.codeedit/settings.json` func savePreferences() throws { // If the user doesn't have any settings to save, don't save them. - guard !settings.isEmpty() else { return } + guard !settings.isEmpty() else { + // Settings is empty, remove the file & directory if it's empty. + if fileManager.fileExists(atPath: settingsURL.path()) { + try fileManager.removeItem(at: settingsURL) + + if try fileManager.contentsOfDirectory(atPath: folderURL.path()).isEmpty { + try fileManager.removeItem(at: folderURL) + } + } + return + } if !fileManager.fileExists(atPath: folderURL.path()) { try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true) diff --git a/CodeEdit/Features/CEWorkspaceSettings/Views/CETaskFormView.swift b/CodeEdit/Features/CEWorkspaceSettings/Views/CETaskFormView.swift index f3f47a3eb..6e7f84057 100644 --- a/CodeEdit/Features/CEWorkspaceSettings/Views/CETaskFormView.swift +++ b/CodeEdit/Features/CEWorkspaceSettings/Views/CETaskFormView.swift @@ -12,7 +12,6 @@ struct CETaskFormView: View { @ObservedObject var task: CETask @State private var selectedEnvID: UUID? - @StateObject var settingsViewModel = SettingsViewModel() var body: some View { Form { Section { @@ -85,7 +84,6 @@ struct CETaskFormView: View { } } .formStyle(.grouped) - .environmentObject(settingsViewModel) } func removeSelectedEnv() { @@ -100,7 +98,3 @@ struct CETaskFormView: View { }) } } - -// #Preview { -// CETaskFormView() -// } diff --git a/CodeEdit/Features/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift b/CodeEdit/Features/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift index 682d63b25..451ed2a38 100644 --- a/CodeEdit/Features/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift +++ b/CodeEdit/Features/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift @@ -13,8 +13,6 @@ struct CEWorkspaceSettingsView: View { @EnvironmentObject var workspaceSettingsManager: CEWorkspaceSettings @EnvironmentObject var workspace: WorkspaceDocument - @StateObject var settingsViewModel = SettingsViewModel() - @State var selectedTaskID: UUID? @State var showAddTaskSheet: Bool = false @@ -68,7 +66,6 @@ struct CEWorkspaceSettingsView: View { } .padding() } - .environmentObject(settingsViewModel) .sheet(isPresented: $showAddTaskSheet) { if let selectedTaskIndex = workspaceSettingsManager.settings.tasks.firstIndex(where: { $0.id == selectedTaskID diff --git a/CodeEdit/Features/CEWorkspaceSettings/Views/EditCETaskView.swift b/CodeEdit/Features/CEWorkspaceSettings/Views/EditCETaskView.swift index 3efbec03f..8d12b39f5 100644 --- a/CodeEdit/Features/CEWorkspaceSettings/Views/EditCETaskView.swift +++ b/CodeEdit/Features/CEWorkspaceSettings/Views/EditCETaskView.swift @@ -23,12 +23,16 @@ struct EditCETaskView: View { Divider() HStack { Button(role: .destructive) { - workspaceSettingsManager.settings.tasks.removeAll(where: { - $0.id == task.id - }) - try? workspaceSettingsManager.savePreferences() - taskManager.deleteTask(taskID: task.id) - self.dismiss() + do { + workspaceSettingsManager.settings.tasks.removeAll(where: { + $0.id == task.id + }) + try workspaceSettingsManager.savePreferences() + taskManager.deleteTask(taskID: task.id) + self.dismiss() + } catch { + NSAlert(error: error).runModal() + } } label: { Text("Delete") .foregroundStyle(.red) @@ -38,8 +42,12 @@ struct EditCETaskView: View { Spacer() Button { - try? workspaceSettingsManager.savePreferences() - self.dismiss() + do { + try workspaceSettingsManager.savePreferences() + self.dismiss() + } catch { + NSAlert(error: error).runModal() + } } label: { Text("Done") .frame(minWidth: 56) diff --git a/CodeEditTests/Features/WorkspaceSettings/CEWorkspaceSettingsTests.swift b/CodeEditTests/Features/WorkspaceSettings/CEWorkspaceSettingsTests.swift new file mode 100644 index 000000000..814172490 --- /dev/null +++ b/CodeEditTests/Features/WorkspaceSettings/CEWorkspaceSettingsTests.swift @@ -0,0 +1,20 @@ +// +// CEWorkspaceSettingsTests.swift +// CodeEditTests +// +// Created by Khan Winter on 4/21/25. +// + +import Foundation +import Testing +@testable import CodeEdit + +struct CEWorkspaceSettingsTests { + let settings: CEWorkspaceSettings = CEWorkspaceSettings(workspaceURL: URL(filePath: "/")) + + @Test + func settingsURLNoSpace() async throws { + #expect(settings.folderURL.lastPathComponent == ".codeedit") + #expect(settings.settingsURL.lastPathComponent == "settings.json") + } +}