From 2f63de4d26d8929c295735a8eef89ee800ccd0d0 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 11 Feb 2025 09:53:07 -0600 Subject: [PATCH 01/32] Added global notifications system --- CodeEdit.xcodeproj/project.pbxproj | 36 +++++++++++++ CodeEdit/AppDelegate.swift | 52 ++++++++++++++----- .../Documents/Views/WindowContentView.swift | 1 + .../FileInspector/FileInspectorView.swift | 26 ++++++++++ .../Views/FileInspector.swift | 13 +++++ .../Views/NotificationListView.swift | 41 +++++++++++++++ .../Views/NotificationOverlayView.swift | 36 +++++++++++++ CodeEdit/WorkspaceView.swift | 3 ++ 8 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 CodeEdit/Features/Documents/Views/WindowContentView.swift create mode 100644 CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift create mode 100644 CodeEdit/Features/Notifications/Views/NotificationListView.swift create mode 100644 CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 494a5c1d5..1045676b4 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -527,6 +527,42 @@ 6CAAF69429BCD78600A1F48A /* (null) in Sources */, 58F2EB03292FB2B0004A9BDE /* Documentation.docc 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 */, + B68DE5E72D5A7D62009A43EF /* NotificationBannerEnvironment.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 */, 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */, ); diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 7945d1e71..906a1831a 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -25,10 +25,23 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { checkForFilesToOpen() NSApp.closeWindow(.welcome, .about) - + + // Add test notification + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + NotificationManager.shared.post( + icon: "bell.badge", + title: "Welcome to CodeEdit", + description: "This is a test notification to demonstrate the notification system.", + actionButtonTitle: "Learn More", + action: { + print("Action button clicked!") + } + ) + } + DispatchQueue.main.async { var needToHandleOpen = true - + // If no windows were reopened by NSQuitAlwaysKeepsWindows, do default behavior. // Non-WindowGroup SwiftUI Windows are still in NSApp.windows when they are closed, // So we need to think about those. @@ -60,30 +73,30 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { } func applicationWillTerminate(_ aNotification: Notification) { - + } - + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { true } - + func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { guard flag else { handleOpen() return false } - + /// Check if all windows are either miniaturized or not visible. /// If so, attempt to find the first miniaturized window and deminiaturize it. guard sender.windows.allSatisfy({ $0.isMiniaturized || !$0.isVisible }) else { return false } sender.windows.first(where: { $0.isMiniaturized })?.deminiaturize(sender) return false } - + func applicationShouldOpenUntitledFile(_ sender: NSApplication) -> Bool { false } - + func handleOpen() { let behavior = Settings.shared.preferences.general.reopenBehavior switch behavior { @@ -97,7 +110,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { CodeEditDocumentController.shared.newDocument(self) } } - + /// Handle urls with the form `codeedit://file/{filepath}:{line}:{column}` func application(_ application: NSApplication, open urls: [URL]) { for url in urls { @@ -105,7 +118,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { let filePath = URL(fileURLWithPath: String(file[0])) let line = file.count > 1 ? Int(file[1]) ?? 0 : 0 let column = file.count > 2 ? Int(file[2]) ?? 1 : 1 - + CodeEditDocumentController.shared .openDocument(withContentsOf: filePath, display: true) { document, _, error in if let error { @@ -117,10 +130,23 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { cursorPositions: [CursorPosition(line: line, column: column > 0 ? column : 1)] ) } + // Add notification when workspace is opened via URL + if let workspaceDoc = document as? WorkspaceDocument { + NotificationManager.shared.post( + icon: "folder.badge.plus", + title: "Workspace Opened", + description: "Successfully opened workspace: \(workspaceDoc.fileURL?.lastPathComponent ?? "")", + actionButtonTitle: "View Files", + action: { + // Ensure the workspace window is frontmost + workspaceDoc.windowControllers.first?.window?.makeKeyAndOrderFront(nil) + } + ) + } } } } - + /// Defers the application terminate message until we've finished cleanup. /// /// All paths _must_ call `NSApplication.shared.reply(toApplicationShouldTerminate: true)` as soon as possible. @@ -138,9 +164,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { let projects: [String] = CodeEditDocumentController.shared.documents .compactMap { ($0 as? WorkspaceDocument)?.fileURL?.path } - + UserDefaults.standard.set(projects, forKey: AppDelegate.recoverWorkspacesKey) - + let areAllDocumentsClean = CodeEditDocumentController.shared.documents.allSatisfy { !$0.isDocumentEdited } guard areAllDocumentsClean else { CodeEditDocumentController.shared.closeAllDocuments( diff --git a/CodeEdit/Features/Documents/Views/WindowContentView.swift b/CodeEdit/Features/Documents/Views/WindowContentView.swift new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/CodeEdit/Features/Documents/Views/WindowContentView.swift @@ -0,0 +1 @@ + diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index d4e6c1032..0f7115202 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,6 +59,14 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } + Section { + Button("Add Test Notification") { + addTestNotification() + } + Button("Add Test Notification After Delay") { + addTestNotificationAfterDelay() + } + } } } else { NoSelectionInspectorView() @@ -81,6 +89,24 @@ struct FileInspectorView: View { } } + func addTestNotification () { + NotificationManager.shared.post( + icon: "bell", + title: "New Notification Created", + description: "Successfully created new notification", + actionButtonTitle: "Action", + action: { + print("Action taken") + } + ) + } + + func addTestNotificationAfterDelay () { + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + addTestNotification() + } + } + @ViewBuilder private var fileNameField: some View { if let file { TextField("Name", text: $fileName) diff --git a/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift b/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift new file mode 100644 index 000000000..7682d3914 --- /dev/null +++ b/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift @@ -0,0 +1,13 @@ +struct FileInspector: View { + var body: some View { + List { + Section("Testing") { + Button("Test Notification (3s)") { + NotificationManager.shared.testNotification() + } + .buttonStyle(.borderless) + } + } + .listStyle(.inset) + } +} \ No newline at end of file diff --git a/CodeEdit/Features/Notifications/Views/NotificationListView.swift b/CodeEdit/Features/Notifications/Views/NotificationListView.swift new file mode 100644 index 000000000..d141b0082 --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/NotificationListView.swift @@ -0,0 +1,41 @@ +import SwiftUI + +struct NotificationListView: View { + @ObservedObject private var notificationManager = NotificationManager.shared + @Namespace private var animation + + var body: some View { + ScrollView { + VStack(spacing: 10) { + if notificationManager.notifications.isEmpty { + Text("No notifications") + .foregroundColor(.secondary) + .padding() + } else { + ForEach(notificationManager.notifications) { notification in + NotificationBannerView( + notification: notification, + namespace: animation, + onDismiss: { + withAnimation(.easeInOut(duration: 0.2)) { + notificationManager.dismissNotification(notification) + } + }, + onAction: { + withAnimation(.easeInOut(duration: 0.2)) { + notification.action() + notificationManager.dismissNotification(notification) + } + } + ) + .environment(\.isOverlay, false) + .environment(\.isSingleListItem, notificationManager.notifications.count == 1) + .transition(.opacity.combined(with: .move(edge: .trailing))) + } + } + } + .padding(notificationManager.notifications.count == 1 ? 0 : 10) + .animation(.easeInOut(duration: 0.2), value: notificationManager.notifications) + } + } +} diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift new file mode 100644 index 000000000..c6a821797 --- /dev/null +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct NotificationOverlayView: View { + @ObservedObject private var notificationManager = NotificationManager.shared + @Namespace private var animation + @Environment(\.controlActiveState) private var controlActiveState + + var body: some View { + VStack(spacing: 10) { + ForEach(Array([notificationManager.activeNotification].compactMap { $0 }), id: \.id) { notification in + if controlActiveState == .active || controlActiveState == .key { + NotificationBannerView( + notification: notification, + namespace: animation, + onDismiss: { + notificationManager.dismissNotification(notification) + }, + onAction: { + notification.action() + notificationManager.dismissNotification(notification) + } + ) + .environment(\.isOverlay, true) + .transition( + .asymmetric( + insertion: .opacity.combined(with: .move(edge: .bottom)), + removal: .opacity.combined(with: .move(edge: .top)) + ) + ) + } + } + } + .padding(8) + .animation(.easeInOut(duration: 0.2), value: notificationManager.activeNotification?.id) + } +} diff --git a/CodeEdit/WorkspaceView.swift b/CodeEdit/WorkspaceView.swift index 69b957bcd..de6a0fc98 100644 --- a/CodeEdit/WorkspaceView.swift +++ b/CodeEdit/WorkspaceView.swift @@ -53,6 +53,9 @@ struct WorkspaceView: View { focus: $focusedEditor ) .frame(maxWidth: .infinity, maxHeight: .infinity) + .overlay(alignment: .topTrailing) { + NotificationOverlayView() + } .onChange(of: geo.size.height) { newHeight in editorsHeight = newHeight } From 898a87cd8ebadfbcabe6d341d3daf15ecbb2a0b7 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 11 Feb 2025 12:46:33 -0600 Subject: [PATCH 02/32] Refactored FeatureIcon and notifications to support custom images --- CodeEdit/AppDelegate.swift | 26 +++++++++---------- .../FileInspector/FileInspectorView.swift | 5 ++-- .../Notifications/Models/CENotification.swift | 23 +++++++++++++++- .../Views/NotificationListView.swift | 7 +++++ .../Views/NotificationOverlayView.swift | 7 +++++ 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 906a1831a..81eb1987e 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -25,11 +25,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { checkForFilesToOpen() NSApp.closeWindow(.welcome, .about) - + // Add test notification DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { NotificationManager.shared.post( - icon: "bell.badge", + iconSymbol: "bell.badge", title: "Welcome to CodeEdit", description: "This is a test notification to demonstrate the notification system.", actionButtonTitle: "Learn More", @@ -38,10 +38,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { } ) } - + DispatchQueue.main.async { var needToHandleOpen = true - + // If no windows were reopened by NSQuitAlwaysKeepsWindows, do default behavior. // Non-WindowGroup SwiftUI Windows are still in NSApp.windows when they are closed, // So we need to think about those. @@ -73,13 +73,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { } func applicationWillTerminate(_ aNotification: Notification) { - + } - + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { true } - + func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { guard flag else { handleOpen() @@ -92,11 +92,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { sender.windows.first(where: { $0.isMiniaturized })?.deminiaturize(sender) return false } - + func applicationShouldOpenUntitledFile(_ sender: NSApplication) -> Bool { false } - + func handleOpen() { let behavior = Settings.shared.preferences.general.reopenBehavior switch behavior { @@ -110,7 +110,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { CodeEditDocumentController.shared.newDocument(self) } } - + /// Handle urls with the form `codeedit://file/{filepath}:{line}:{column}` func application(_ application: NSApplication, open urls: [URL]) { for url in urls { @@ -118,7 +118,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { let filePath = URL(fileURLWithPath: String(file[0])) let line = file.count > 1 ? Int(file[1]) ?? 0 : 0 let column = file.count > 2 ? Int(file[2]) ?? 1 : 1 - + CodeEditDocumentController.shared .openDocument(withContentsOf: filePath, display: true) { document, _, error in if let error { @@ -133,7 +133,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { // Add notification when workspace is opened via URL if let workspaceDoc = document as? WorkspaceDocument { NotificationManager.shared.post( - icon: "folder.badge.plus", + iconSymbol: "folder.badge.plus", title: "Workspace Opened", description: "Successfully opened workspace: \(workspaceDoc.fileURL?.lastPathComponent ?? "")", actionButtonTitle: "View Files", @@ -146,7 +146,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { } } } - + /// Defers the application terminate message until we've finished cleanup. /// /// All paths _must_ call `NSApplication.shared.reply(toApplicationShouldTerminate: true)` as soon as possible. diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 0f7115202..3f2574106 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -91,7 +91,8 @@ struct FileInspectorView: View { func addTestNotification () { NotificationManager.shared.post( - icon: "bell", + iconSymbol: "bell", + iconColor: .red, title: "New Notification Created", description: "Successfully created new notification", actionButtonTitle: "Action", @@ -100,7 +101,7 @@ struct FileInspectorView: View { } ) } - + func addTestNotificationAfterDelay () { DispatchQueue.main.asyncAfter(deadline: .now() + 3) { addTestNotification() diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift index f71d39a49..d0f5c6354 100644 --- a/CodeEdit/Features/Notifications/Models/CENotification.swift +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -106,7 +106,28 @@ struct CENotification: Identifiable, Equatable { isRead: Bool ) { self.id = id - self.icon = icon + self.icon = .symbol(name: iconSymbol, color: iconColor) + self.title = title + self.description = description + self.actionButtonTitle = actionButtonTitle + self.action = action + self.isSticky = isSticky + self.isRead = isRead + self.timestamp = Date() + } + + init( + id: UUID = UUID(), + iconImage: Image, + title: String, + description: String, + actionButtonTitle: String, + action: @escaping () -> Void, + isSticky: Bool = false, + isRead: Bool = false + ) { + self.id = id + self.icon = .image(iconImage) self.title = title self.description = description self.actionButtonTitle = actionButtonTitle diff --git a/CodeEdit/Features/Notifications/Views/NotificationListView.swift b/CodeEdit/Features/Notifications/Views/NotificationListView.swift index d141b0082..d579c9bb3 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationListView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationListView.swift @@ -1,3 +1,10 @@ +// +// NotificationListView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + import SwiftUI struct NotificationListView: View { diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index c6a821797..77c5f3ed3 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -1,3 +1,10 @@ +// +// NotificationOverlayView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/10/24. +// + import SwiftUI struct NotificationOverlayView: View { From 418e540f8e75215afb337d81771080126e47bc8e Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 11 Feb 2025 16:02:46 -0600 Subject: [PATCH 03/32] Fixed SwiftLint errors --- CodeEdit/AppDelegate.swift | 12 +++++---- .../FileInspector/FileInspectorView.swift | 2 +- .../Notifications/Models/CENotification.swift | 25 ++++++++++++++++++- .../Views/NotificationOverlayView.swift | 5 +++- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 81eb1987e..115e2e8bc 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -29,10 +29,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { // Add test notification DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { NotificationManager.shared.post( - iconSymbol: "bell.badge", + iconText: "👋", + iconTextColor: .white, + iconColor: .indigo, title: "Welcome to CodeEdit", description: "This is a test notification to demonstrate the notification system.", - actionButtonTitle: "Learn More", + actionButtonTitle: "Learn More...", action: { print("Action button clicked!") } @@ -85,7 +87,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { handleOpen() return false } - + /// Check if all windows are either miniaturized or not visible. /// If so, attempt to find the first miniaturized window and deminiaturize it. guard sender.windows.allSatisfy({ $0.isMiniaturized || !$0.isVisible }) else { return false } @@ -164,9 +166,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { let projects: [String] = CodeEditDocumentController.shared.documents .compactMap { ($0 as? WorkspaceDocument)?.fileURL?.path } - + UserDefaults.standard.set(projects, forKey: AppDelegate.recoverWorkspacesKey) - + let areAllDocumentsClean = CodeEditDocumentController.shared.documents.allSatisfy { !$0.isDocumentEdited } guard areAllDocumentsClean else { CodeEditDocumentController.shared.closeAllDocuments( diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 3f2574106..493b392ff 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -91,7 +91,7 @@ struct FileInspectorView: View { func addTestNotification () { NotificationManager.shared.post( - iconSymbol: "bell", + iconSymbol: "bell.badge.fill", iconColor: .red, title: "New Notification Created", description: "Successfully created new notification", diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift index d0f5c6354..ef7ee4fce 100644 --- a/CodeEdit/Features/Notifications/Models/CENotification.swift +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -115,7 +115,30 @@ struct CENotification: Identifiable, Equatable { self.isRead = isRead self.timestamp = Date() } - + + 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.id = id + self.icon = .text(iconText, backgroundColor: iconColor, textColor: iconTextColor) + self.title = title + self.description = description + self.actionButtonTitle = actionButtonTitle + self.action = action + self.isSticky = isSticky + self.isRead = isRead + self.timestamp = Date() + } + init( id: UUID = UUID(), iconImage: Image, diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index 77c5f3ed3..ce69e2e5b 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -8,9 +8,12 @@ import SwiftUI struct NotificationOverlayView: View { + @Environment(\.controlActiveState) + private var controlActiveState + @ObservedObject private var notificationManager = NotificationManager.shared + @Namespace private var animation - @Environment(\.controlActiveState) private var controlActiveState var body: some View { VStack(spacing: 10) { From 14fc34f93a0eb7144dfc58c5918d65a056497a7f Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 11 Feb 2025 22:14:55 -0600 Subject: [PATCH 04/32] Fixed SwiftLint errors --- CodeEdit/AppDelegate.swift | 15 +-------------- .../Documents/Views/WindowContentView.swift | 1 - .../InspectorSidebar/Views/FileInspector.swift | 2 +- 3 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 CodeEdit/Features/Documents/Views/WindowContentView.swift diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 115e2e8bc..720783c37 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -27,7 +27,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { NSApp.closeWindow(.welcome, .about) // Add test notification - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { NotificationManager.shared.post( iconText: "👋", iconTextColor: .white, @@ -132,19 +132,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { cursorPositions: [CursorPosition(line: line, column: column > 0 ? column : 1)] ) } - // Add notification when workspace is opened via URL - if let workspaceDoc = document as? WorkspaceDocument { - NotificationManager.shared.post( - iconSymbol: "folder.badge.plus", - title: "Workspace Opened", - description: "Successfully opened workspace: \(workspaceDoc.fileURL?.lastPathComponent ?? "")", - actionButtonTitle: "View Files", - action: { - // Ensure the workspace window is frontmost - workspaceDoc.windowControllers.first?.window?.makeKeyAndOrderFront(nil) - } - ) - } } } } diff --git a/CodeEdit/Features/Documents/Views/WindowContentView.swift b/CodeEdit/Features/Documents/Views/WindowContentView.swift deleted file mode 100644 index 8d1c8b69c..000000000 --- a/CodeEdit/Features/Documents/Views/WindowContentView.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift b/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift index 7682d3914..270c0a648 100644 --- a/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift +++ b/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift @@ -10,4 +10,4 @@ struct FileInspector: View { } .listStyle(.inset) } -} \ No newline at end of file +} From 2e73c75ee09c1946a6a8917558f3bb2c6bf2c5ea Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 11 Feb 2025 22:28:12 -0600 Subject: [PATCH 05/32] Deleted unused file --- .../InspectorSidebar/Views/FileInspector.swift | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift diff --git a/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift b/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift deleted file mode 100644 index 270c0a648..000000000 --- a/CodeEdit/Features/InspectorSidebar/Views/FileInspector.swift +++ /dev/null @@ -1,13 +0,0 @@ -struct FileInspector: View { - var body: some View { - List { - Section("Testing") { - Button("Test Notification (3s)") { - NotificationManager.shared.testNotification() - } - .buttonStyle(.borderless) - } - } - .listStyle(.inset) - } -} From a0e7357ce65439f217d7727c929f13fd38f65bad Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 12 Feb 2025 13:13:30 -0600 Subject: [PATCH 06/32] Added sticky notifications. Allowed multiple notifications to overlay UI. Improved aesthetics of notification banner --- .../FileInspector/FileInspectorView.swift | 30 ++---------- .../Notifications/NotificationManager.swift | 3 ++ .../Views/NotificationBannerView.swift | 3 ++ .../Views/NotificationListView.swift | 49 +++++++++++++++---- .../Views/NotificationOverlayView.swift | 4 +- 5 files changed, 51 insertions(+), 38 deletions(-) diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 493b392ff..3cac365a6 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,14 +59,6 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } - Section { - Button("Add Test Notification") { - addTestNotification() - } - Button("Add Test Notification After Delay") { - addTestNotificationAfterDelay() - } - } } } else { NoSelectionInspectorView() @@ -89,26 +81,9 @@ struct FileInspectorView: View { } } - func addTestNotification () { - NotificationManager.shared.post( - iconSymbol: "bell.badge.fill", - iconColor: .red, - title: "New Notification Created", - description: "Successfully created new notification", - actionButtonTitle: "Action", - action: { - print("Action taken") - } - ) - } - - func addTestNotificationAfterDelay () { - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { - addTestNotification() - } - } - @ViewBuilder private var fileNameField: some View { + @State var isValid: Bool = true + if let file { TextField("Name", text: $fileName) .background( @@ -136,6 +111,7 @@ struct FileInspectorView: View { } } } else { + isValid = false fileName = file.labelFileName() } } diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index e27051418..ecced3bbb 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -22,6 +22,9 @@ final class NotificationManager: NSObject, ObservableObject { @Published private(set) var notifications: [CENotification] = [] private var isAppActive: Bool = true + private var hiddenStickyNotifications: [CENotification] = [] + private var hiddenNonStickyNotifications: [CENotification] = [] + private var dismissedNotificationIds: Set = [] // Track dismissed notifications /// Number of unread notifications var unreadCount: Int { diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index 11a90696a..442e924b6 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -14,6 +14,9 @@ struct NotificationBannerView: View { @EnvironmentObject private var workspace: WorkspaceDocument @ObservedObject private var notificationManager = NotificationManager.shared + @Environment(\.colorScheme) + private var colorScheme + let notification: CENotification let onDismiss: () -> Void let onAction: () -> Void diff --git a/CodeEdit/Features/Notifications/Views/NotificationListView.swift b/CodeEdit/Features/Notifications/Views/NotificationListView.swift index d579c9bb3..8e9f0753a 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationListView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationListView.swift @@ -8,9 +8,22 @@ import SwiftUI struct NotificationListView: View { + @Environment(\.dismiss) + private var dismiss + @ObservedObject private var notificationManager = NotificationManager.shared + @Namespace private var animation + private var sortedNotifications: [CENotification] { + notificationManager.notifications.sorted { first, second in + if first.isSticky == second.isSticky { + return first.timestamp > second.timestamp + } + return first.isSticky && !second.isSticky + } + } + var body: some View { ScrollView { VStack(spacing: 10) { @@ -19,30 +32,48 @@ struct NotificationListView: View { .foregroundColor(.secondary) .padding() } else { - ForEach(notificationManager.notifications) { notification in + ForEach(sortedNotifications) { notification in NotificationBannerView( notification: notification, namespace: animation, onDismiss: { - withAnimation(.easeInOut(duration: 0.2)) { - notificationManager.dismissNotification(notification) + if !notification.isSticky && notificationManager.notifications.count == 1 { + dismiss() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + withAnimation(.easeInOut(duration: 0.2)) { + notificationManager.dismissNotification(notification) + } + } + } else { + withAnimation(.easeInOut(duration: 0.2)) { + notificationManager.dismissNotification(notification) + } } }, onAction: { - withAnimation(.easeInOut(duration: 0.2)) { - notification.action() - notificationManager.dismissNotification(notification) + if !notification.isSticky && notificationManager.notifications.count == 1 { + dismiss() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + notification.action() + withAnimation(.easeInOut(duration: 0.2)) { + notificationManager.dismissNotification(notification) + } + } + } else { + withAnimation(.easeInOut(duration: 0.2)) { + notification.action() + notificationManager.dismissNotification(notification) + } } } ) .environment(\.isOverlay, false) .environment(\.isSingleListItem, notificationManager.notifications.count == 1) - .transition(.opacity.combined(with: .move(edge: .trailing))) + .transition(.opacity) } } } - .padding(notificationManager.notifications.count == 1 ? 0 : 10) - .animation(.easeInOut(duration: 0.2), value: notificationManager.notifications) + .padding(10) } } } diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index ce69e2e5b..8c998652e 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -17,7 +17,7 @@ struct NotificationOverlayView: View { var body: some View { VStack(spacing: 10) { - ForEach(Array([notificationManager.activeNotification].compactMap { $0 }), id: \.id) { notification in + ForEach(notificationManager.activeNotifications, id: \.id) { notification in if controlActiveState == .active || controlActiveState == .key { NotificationBannerView( notification: notification, @@ -41,6 +41,6 @@ struct NotificationOverlayView: View { } } .padding(8) - .animation(.easeInOut(duration: 0.2), value: notificationManager.activeNotification?.id) + .animation(.easeInOut(duration: 0.2), value: notificationManager.activeNotifications) } } From 5ba7a662aa0ee74588ab8d12811ec387f9d3f2d9 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 13 Feb 2025 15:10:07 -0600 Subject: [PATCH 07/32] Streamlined UI getting rid of the notifications popover in favor of the notification overlay UI previously just used for temporary notifications. --- CodeEdit.xcodeproj/project.pbxproj | 1 - .../FileInspector/FileInspectorView.swift | 27 +++++++ .../Notifications/NotificationManager.swift | 31 +++++++- .../Views/NotificationBannerView.swift | 2 + .../Views/NotificationListView.swift | 79 ------------------- .../Views/NotificationOverlayView.swift | 65 ++++++++++++--- 6 files changed, 109 insertions(+), 96 deletions(-) delete mode 100644 CodeEdit/Features/Notifications/Views/NotificationListView.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 1045676b4..7c05730d7 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -549,7 +549,6 @@ 6C578D8729CD345900DC73B2 /* ExtensionSceneView.swift in Sources */, 617DB3D02C25AFAE00B58BFE /* TaskNotificationHandler.swift in Sources */, 77EF6C052C57DE4B00984B69 /* URL+ResouceValues.swift in Sources */, - B68DE5E72D5A7D62009A43EF /* NotificationBannerEnvironment.swift in Sources */, B640A9A129E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift in Sources */, 587B9E7929301D8F00AC7927 /* GitHubIssueRouter.swift in Sources */, B67700F92D2A2662004FD61F /* WorkspacePanelView.swift in Sources */, diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 3cac365a6..ca5411354 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,6 +59,33 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } + Section("Test Notifications") { + Button("Add Test Notification") { + NotificationManager.shared.post( + iconSymbol: "bell.badge.fill", + iconColor: .red, + title: "Test Notification", + description: "This is a test notification", + actionButtonTitle: "Action", + action: { + print("Test notification action triggered") + } + ) + } + Button("Add Sticky Notification") { + NotificationManager.shared.post( + iconSymbol: "pin.fill", + iconColor: .orange, + title: "Sticky Notification", + description: "This notification will stay until dismissed", + actionButtonTitle: "Acknowledge", + action: { + print("Sticky notification acknowledged") + }, + isSticky: true + ) + } + } } } else { NoSelectionInspectorView() diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index ecced3bbb..1b02baea1 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -22,9 +22,34 @@ final class NotificationManager: NSObject, ObservableObject { @Published private(set) var notifications: [CENotification] = [] private var isAppActive: Bool = true - private var hiddenStickyNotifications: [CENotification] = [] - private var hiddenNonStickyNotifications: [CENotification] = [] - private var dismissedNotificationIds: Set = [] // Track dismissed notifications + + /// Whether notifications were manually shown via toolbar + @Published private(set) var isManuallyShown: Bool = false + + /// Set of hidden notification IDs + private var hiddenNotificationIds: Set = [] + + /// Whether any non-sticky notifications are currently hidden + private var hasHiddenNotifications: Bool { + activeNotifications.contains { notification in + !notification.isSticky && !isNotificationVisible(notification) + } + } + + /// Whether a notification should be visible in the overlay + 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 isManuallyShown { + return true // Show all notifications when manually shown + } + // Otherwise, show if not hidden and has active timer + return !hiddenNotificationIds.contains(notification.id) && timers[notification.id] != nil + } /// Number of unread notifications var unreadCount: Int { diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index 442e924b6..8f739611e 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -17,6 +17,8 @@ struct NotificationBannerView: View { @Environment(\.colorScheme) private var colorScheme + @ObservedObject private var notificationManager = NotificationManager.shared + let notification: CENotification let onDismiss: () -> Void let onAction: () -> Void diff --git a/CodeEdit/Features/Notifications/Views/NotificationListView.swift b/CodeEdit/Features/Notifications/Views/NotificationListView.swift deleted file mode 100644 index 8e9f0753a..000000000 --- a/CodeEdit/Features/Notifications/Views/NotificationListView.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// NotificationListView.swift -// CodeEdit -// -// Created by Austin Condiff on 2/10/24. -// - -import SwiftUI - -struct NotificationListView: View { - @Environment(\.dismiss) - private var dismiss - - @ObservedObject private var notificationManager = NotificationManager.shared - - @Namespace private var animation - - private var sortedNotifications: [CENotification] { - notificationManager.notifications.sorted { first, second in - if first.isSticky == second.isSticky { - return first.timestamp > second.timestamp - } - return first.isSticky && !second.isSticky - } - } - - var body: some View { - ScrollView { - VStack(spacing: 10) { - if notificationManager.notifications.isEmpty { - Text("No notifications") - .foregroundColor(.secondary) - .padding() - } else { - ForEach(sortedNotifications) { notification in - NotificationBannerView( - notification: notification, - namespace: animation, - onDismiss: { - if !notification.isSticky && notificationManager.notifications.count == 1 { - dismiss() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - withAnimation(.easeInOut(duration: 0.2)) { - notificationManager.dismissNotification(notification) - } - } - } else { - withAnimation(.easeInOut(duration: 0.2)) { - notificationManager.dismissNotification(notification) - } - } - }, - onAction: { - if !notification.isSticky && notificationManager.notifications.count == 1 { - dismiss() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - notification.action() - withAnimation(.easeInOut(duration: 0.2)) { - notificationManager.dismissNotification(notification) - } - } - } else { - withAnimation(.easeInOut(duration: 0.2)) { - notification.action() - notificationManager.dismissNotification(notification) - } - } - } - ) - .environment(\.isOverlay, false) - .environment(\.isSingleListItem, notificationManager.notifications.count == 1) - .transition(.opacity) - } - } - } - .padding(10) - } - } -} diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index 8c998652e..3ac064dab 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -13,34 +13,73 @@ struct NotificationOverlayView: View { @ObservedObject private var notificationManager = NotificationManager.shared - @Namespace private var animation + // ID for the top anchor + private let topID = "top" - var body: some View { - VStack(spacing: 10) { + // Fixed width for notifications + private let notificationWidth: CGFloat = 320 // 300 + 10 padding on each side + + var notifications: some View { + VStack(spacing: 8) { ForEach(notificationManager.activeNotifications, id: \.id) { notification in if controlActiveState == .active || controlActiveState == .key { NotificationBannerView( notification: notification, - namespace: animation, onDismiss: { notificationManager.dismissNotification(notification) }, onAction: { notification.action() notificationManager.dismissNotification(notification) + // Only hide if manually shown + if notificationManager.isManuallyShown { + notificationManager.toggleNotificationsVisibility() + } } ) - .environment(\.isOverlay, true) - .transition( - .asymmetric( - insertion: .opacity.combined(with: .move(edge: .bottom)), - removal: .opacity.combined(with: .move(edge: .top)) - ) - ) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + } + } + } + .padding(10) + } + + var body: some View { + ViewThatFits(in: .vertical) { + notifications + .border(.red) + GeometryReader { geometry in + HStack { + Spacer() // Push content to trailing edge + ScrollViewReader { proxy in + ScrollView(.vertical, showsIndicators: false) { + VStack(spacing: 0) { + // Invisible anchor view at the top to scroll back to when closed + Color.clear.frame(height: 0).id(topID) + notifications + } + .padding(.bottom, 30) // Account for the status bar + } + .frame(width: notificationWidth) + .frame(maxHeight: geometry.size.height) + .scrollDisabled(!notificationManager.isManuallyShown) + .onChange(of: notificationManager.isManuallyShown) { isShown in + if !isShown { + // 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) + } + } + } + } + } } + .animation(.easeInOut(duration: 0.3), value: notificationManager.activeNotifications) } } - .padding(8) - .animation(.easeInOut(duration: 0.2), value: notificationManager.activeNotifications) } } From e7216ca625fe4538a95e12f848e8bf079702f497 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Fri, 14 Feb 2025 17:40:09 -0600 Subject: [PATCH 08/32] Added a close button click state, allows clicking under scroll view. --- .../FileInspector/FileInspectorView.swift | 27 ---- .../Views/NotificationBannerView.swift | 25 ++++ .../Views/NotificationOverlayView.swift | 125 +++++++++++------- CodeEdit/WorkspaceView.swift | 3 - 4 files changed, 104 insertions(+), 76 deletions(-) diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index ca5411354..3cac365a6 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,33 +59,6 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } - Section("Test Notifications") { - Button("Add Test Notification") { - NotificationManager.shared.post( - iconSymbol: "bell.badge.fill", - iconColor: .red, - title: "Test Notification", - description: "This is a test notification", - actionButtonTitle: "Action", - action: { - print("Test notification action triggered") - } - ) - } - Button("Add Sticky Notification") { - NotificationManager.shared.post( - iconSymbol: "pin.fill", - iconColor: .orange, - title: "Sticky Notification", - description: "This notification will stay until dismissed", - actionButtonTitle: "Acknowledge", - action: { - print("Sticky notification acknowledged") - }, - isSticky: true - ) - } - } } } else { NoSelectionInspectorView() diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index 8f739611e..ca8a1883f 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -7,6 +7,31 @@ import SwiftUI +struct CloseButtonStyle: 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 + ) + } +} + struct NotificationBannerView: View { @Environment(\.colorScheme) private var colorScheme diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index 3ac064dab..49e8331e8 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -19,67 +19,100 @@ struct NotificationOverlayView: View { // 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 + } + } + var notifications: some View { VStack(spacing: 8) { - ForEach(notificationManager.activeNotifications, id: \.id) { notification in - if controlActiveState == .active || controlActiveState == .key { - NotificationBannerView( - notification: notification, - onDismiss: { - notificationManager.dismissNotification(notification) - }, - onAction: { - notification.action() - notificationManager.dismissNotification(notification) - // Only hide if manually shown - if notificationManager.isManuallyShown { - notificationManager.toggleNotificationsVisibility() - } + ForEach( + notificationManager.activeNotifications.filter { + notificationManager.isNotificationVisible($0) + }, + id: \.id + ) { notification in + NotificationBannerView( + notification: notification, + onDismiss: { + notificationManager.dismissNotification(notification) + }, + onAction: { + notification.action() + notificationManager.dismissNotification(notification) + // Only hide if manually shown + if notificationManager.isManuallyShown { + notificationManager.toggleNotificationsVisibility() } - ) - .transition(.asymmetric( - insertion: .move(edge: .trailing), - removal: .opacity - )) - } + } + ) } } .padding(10) } - var body: some View { - ViewThatFits(in: .vertical) { - notifications - .border(.red) - GeometryReader { geometry in - HStack { - Spacer() // Push content to trailing edge - ScrollViewReader { proxy in - ScrollView(.vertical, showsIndicators: false) { - VStack(spacing: 0) { - // Invisible anchor view at the top to scroll back to when closed - Color.clear.frame(height: 0).id(topID) - notifications - } - .padding(.bottom, 30) // Account for the status bar + var notificationsWithScrollView: some View { + GeometryReader { geometry in + HStack { + Spacer() // Push content to trailing edge + ScrollViewReader { proxy in + ScrollView(.vertical, showsIndicators: false) { + VStack(alignment: .trailing, spacing: 0) { + // Invisible anchor view at the top to scroll back to when closed + Color.clear.frame(height: 0).id(topID) + notifications } - .frame(width: notificationWidth) - .frame(maxHeight: geometry.size.height) - .scrollDisabled(!notificationManager.isManuallyShown) - .onChange(of: notificationManager.isManuallyShown) { isShown in - if !isShown { - // 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) - } + .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) + .onChange(of: geometry.size.height) { newValue in + updateOverflow(contentHeight: contentHeight, containerHeight: newValue) + } + .onChange(of: notificationManager.isManuallyShown) { isShown in + if !isShown { + // 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( + notificationManager.activeNotifications + .contains { notificationManager.isNotificationVisible($0) } + ) } - .animation(.easeInOut(duration: 0.3), value: notificationManager.activeNotifications) } } } + + var body: some View { + Group { + if #available(macOS 14.0, *) { + notificationsWithScrollView + .scrollClipDisabled(true) + } else { + notificationsWithScrollView + } + } + .opacity(controlActiveState == .active || controlActiveState == .key ? 1 : 0) + .offset(x: controlActiveState == .active || controlActiveState == .key ? 0 : 350) + .animation(.easeInOut(duration: 0.2), value: controlActiveState) + } } diff --git a/CodeEdit/WorkspaceView.swift b/CodeEdit/WorkspaceView.swift index de6a0fc98..69b957bcd 100644 --- a/CodeEdit/WorkspaceView.swift +++ b/CodeEdit/WorkspaceView.swift @@ -53,9 +53,6 @@ struct WorkspaceView: View { focus: $focusedEditor ) .frame(maxWidth: .infinity, maxHeight: .infinity) - .overlay(alignment: .topTrailing) { - NotificationOverlayView() - } .onChange(of: geo.size.height) { newHeight in editorsHeight = newHeight } From 4bc9151c740e720c62cef04a5ade1bfb8426efcb Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Sat, 15 Feb 2025 01:30:59 -0600 Subject: [PATCH 09/32] Remove test notification --- CodeEdit/AppDelegate.swift | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 720783c37..7945d1e71 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -26,21 +26,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { NSApp.closeWindow(.welcome, .about) - // Add test notification - DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { - NotificationManager.shared.post( - iconText: "👋", - iconTextColor: .white, - iconColor: .indigo, - title: "Welcome to CodeEdit", - description: "This is a test notification to demonstrate the notification system.", - actionButtonTitle: "Learn More...", - action: { - print("Action button clicked!") - } - ) - } - DispatchQueue.main.async { var needToHandleOpen = true From d6362771184a4226228b01b8edf7464e4bc69f3b Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 18 Feb 2025 13:03:41 -0600 Subject: [PATCH 10/32] Improve notification handling and workspace panel behavior - Add system notification action button that, when clicked, focuses CodeEdit, runs the action, and dismisses the corresponding CodeEdit notification. - Dismissing a CodeEdit notification now also dismisses its corresponding system notification, and vice versa. - The notification panel in a workspace now closes when clicking outside of it, behaving like other menus. - Refactored notification state management: Moved display-related state from `NotificationService` to a dedicated view model to ensure notification panels remain independent across workspaces. --- CodeEdit/AppDelegate.swift | 15 + .../WorkspaceDocument/WorkspaceDocument.swift | 1 + .../FileInspector/FileInspectorView.swift | 121 ++++++++ .../Notifications/NotificationManager.swift | 5 + .../NotificationOverlayViewModel.swift | 265 ++++++++++++++++++ .../Views/NotificationOverlayView.swift | 94 +++++-- 6 files changed, 480 insertions(+), 21 deletions(-) create mode 100644 CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 7945d1e71..720783c37 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -26,6 +26,21 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { NSApp.closeWindow(.welcome, .about) + // Add test notification + DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { + NotificationManager.shared.post( + iconText: "👋", + iconTextColor: .white, + iconColor: .indigo, + title: "Welcome to CodeEdit", + description: "This is a test notification to demonstrate the notification system.", + actionButtonTitle: "Learn More...", + action: { + print("Action button clicked!") + } + ) + } + DispatchQueue.main.async { var needToHandleOpen = true diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index 1b96e4fca..b937f3d66 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -61,6 +61,7 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { deinit { cancellables.forEach { $0.cancel() } NotificationCenter.default.removeObserver(self) + notificationOverlaySubscription?.cancel() } func getFromWorkspaceState(_ key: WorkspaceStateKey) -> Any? { diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 3cac365a6..d2204b8d8 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,6 +59,71 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } + Section("Test Notifications") { + Button("Add Notification") { + let (iconSymbol, iconColor) = randomSymbolAndColor() + NotificationManager.shared.post( + iconSymbol: iconSymbol, + iconColor: iconColor, + title: "Test Notification", + description: "This is a test notification.", + actionButtonTitle: "Action", + action: { + print("Test notification action triggered") + } + ) + } + Button("Add Sticky Notification") { + NotificationManager.shared.post( + iconSymbol: "pin.fill", + iconColor: .orange, + title: "Sticky Notification", + description: "This notification will stay until dismissed.", + actionButtonTitle: "Acknowledge", + action: { + print("Sticky notification acknowledged") + }, + isSticky: true + ) + } + Button("Add Image Notification") { + NotificationManager.shared.post( + iconImage: randomImage(), + title: "Test Notification with Image", + description: "This is a test notification with a custom image.", + actionButtonTitle: "Action", + action: { + print("Test notification action triggered") + } + ) + } + Button("Add Text Notification") { + NotificationManager.shared.post( + iconText: randomLetter(), + iconTextColor: .white, + iconColor: randomColor(), + title: "Text Notification", + description: "This is a test notification with text.", + actionButtonTitle: "Acknowledge", + action: { + print("Test notification action triggered") + } + ) + } + Button("Add Emoji Notification") { + NotificationManager.shared.post( + iconText: randomEmoji(), + iconTextColor: .white, + iconColor: randomColor(), + title: "Emoji Notification", + description: "This is a test notification with an emoji.", + actionButtonTitle: "Acknowledge", + action: { + print("Test notification action triggered") + } + ) + } + } } } else { NoSelectionInspectorView() @@ -81,6 +146,62 @@ struct FileInspectorView: View { } } + func randomColor() -> Color { + let colors: [Color] = [ + .red, .orange, .yellow, .green, .mint, .cyan, + .teal, .blue, .indigo, .purple, .pink, .gray + ] + return colors.randomElement() ?? .black + } + + func randomSymbolAndColor() -> (String, Color) { + let symbols: [(String, Color)] = [ + ("bell.fill", .red), + ("bell.badge.fill", .red), + ("exclamationmark.triangle.fill", .orange), + ("info.circle.fill", .blue), + ("checkmark.seal.fill", .green), + ("xmark.octagon.fill", .red), + ("bubble.left.fill", .teal), + ("envelope.fill", .blue), + ("phone.fill", .green), + ("megaphone.fill", .pink), + ("clock.fill", .gray), + ("calendar", .red), + ("flag.fill", .green), + ("bookmark.fill", .orange), + ("bolt.fill", .indigo), + ("shield.lefthalf.fill", .red), + ("gift.fill", .purple), + ("heart.fill", .pink), + ("star.fill", .orange), + ("curlybraces", .cyan), + ] + return symbols.randomElement() ?? ("bell.fill", .red) + } + + func randomEmoji() -> String { + let emoji: [String] = [ + "🔔", "🚨", "⚠️", "👋", "😍", "😎", "😘", "😜", "😝", "😀", "😁", + "😂", "🤣", "😃", "😄", "😅", "😆", "😇", "😉", "😊", "😋", "😌" + ] + return emoji.randomElement() ?? "🔔" + } + + func randomImage() -> Image { + let images: [Image] = [ + Image("GitHubIcon"), + Image("BitBucketIcon"), + Image("GitLabIcon") + ] + return images.randomElement() ?? Image("GitHubIcon") + } + + func randomLetter() -> String { + let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { String($0) } + return letters.randomElement() ?? "A" + } + @ViewBuilder private var fileNameField: some View { @State var isValid: Bool = true diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index 1b02baea1..ccdcf255c 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -56,6 +56,11 @@ final class NotificationManager: NSObject, ObservableObject { notifications.filter { !$0.isRead }.count } + /// Whether there are currently notifications being displayed in the overlay + var hasActiveNotification: Bool { + !notifications.isEmpty + } + /// Posts a new notification /// - Parameters: /// - iconSymbol: SF Symbol or CodeEditSymbol name for the notification icon diff --git a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift new file mode 100644 index 000000000..0cb516198 --- /dev/null +++ b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift @@ -0,0 +1,265 @@ +// +// NotificationOverlayViewModel.swift +// CodeEdit +// +// Created by Austin Condiff on 2/14/24. +// + +import SwiftUI + +final class NotificationOverlayViewModel: ObservableObject { + /// Currently displayed notifications in the overlay + @Published private(set) var activeNotifications: [CENotification] = [] + + /// Whether notifications were manually shown via toolbar + @Published private(set) var isManuallyShown: 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 + + /// Whether any non-sticky notifications are currently hidden + private var hasHiddenNotifications: Bool { + activeNotifications.contains { notification in + !notification.isSticky && !isNotificationVisible(notification) + } + } + + @Published var scrolledToTop: Bool = true + + /// Whether a notification should be visible in the overlay + 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 isManuallyShown { + return true // Show all notifications when manually shown + } + return !hiddenNotificationIds.contains(notification.id) + } + + /// Handles focus changes for the notification overlay + func handleFocusChange(isFocused: Bool) { + if !isFocused { + // Only hide if manually shown and focus is completely lost + if isManuallyShown { + toggleNotificationsVisibility() + } + } + } + + /// Toggles visibility of notifications in the overlay + func toggleNotificationsVisibility() { + if isManuallyShown { + if !scrolledToTop { + // Just set isManuallyShown to false to trigger the offset animation + withAnimation(.easeInOut(duration: 0.3)) { + isManuallyShown = 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)) { + isManuallyShown = true + hiddenNotificationIds.removeAll() + objectWillChange.send() + } + } + } + + private func hideNotifications() { + withAnimation(.easeInOut(duration: 0.3)) { + self.isManuallyShown = 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 && !isManuallyShown 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 !isManuallyShown && !notification.isSticky { + startHideTimer(for: notification) + } + } + } + + /// Dismisses a specific notification + func dismissNotification(_ notification: CENotification) { + // 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 }) { + 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.isManuallyShown { + self.isManuallyShown = 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 && isManuallyShown { + isManuallyShown = false + } + } + } +} diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index 49e8331e8..a520ebdbf 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -8,10 +8,12 @@ import SwiftUI struct NotificationOverlayView: 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" @@ -21,6 +23,7 @@ struct NotificationOverlayView: View { @State private var hasOverflow: Bool = false @State private var contentHeight: CGFloat = 0.0 + @State private var scrollOffset: CGFloat = 0 private func updateOverflow(contentHeight: CGFloat, containerHeight: CGFloat) { if !hasOverflow && contentHeight > containerHeight { @@ -31,41 +34,56 @@ struct NotificationOverlayView: View { } var notifications: some View { - VStack(spacing: 8) { - ForEach( - notificationManager.activeNotifications.filter { - notificationManager.isNotificationVisible($0) - }, - id: \.id - ) { notification in + let visibleNotifications = workspace.notificationOverlay.activeNotifications.filter { + workspace.notificationOverlay.isNotificationVisible($0) + } + + return VStack(spacing: 8) { + ForEach(visibleNotifications, id: \.id) { notification in NotificationBannerView( notification: notification, onDismiss: { - notificationManager.dismissNotification(notification) + workspace.notificationOverlay.dismissNotification(notification) }, onAction: { notification.action() - notificationManager.dismissNotification(notification) - // Only hide if manually shown - if notificationManager.isManuallyShown { - notificationManager.toggleNotificationsVisibility() + workspace.notificationOverlay.dismissNotification(notification) + if workspace.notificationOverlay.isManuallyShown { + workspace.notificationOverlay.toggleNotificationsVisibility() } } ) } } .padding(10) + .animation(.easeInOut(duration: 0.3), value: visibleNotifications) } var notificationsWithScrollView: some View { GeometryReader { geometry in HStack { - Spacer() // Push content to trailing edge + Spacer() ScrollViewReader { proxy in ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .trailing, spacing: 0) { - // Invisible anchor view at the top to scroll back to when closed - Color.clear.frame(height: 0).id(topID) + 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.notificationOverlay.scrolledToTop { + workspace.notificationOverlay.scrolledToTop = true + } else if $0 > 0.0 && workspace.notificationOverlay.scrolledToTop { + workspace.notificationOverlay.scrolledToTop = false + } + } notifications } .background( @@ -80,12 +98,16 @@ struct NotificationOverlayView: View { .frame(maxWidth: notificationWidth, alignment: .trailing) .frame(height: min(geometry.size.height, contentHeight)) .scrollDisabled(!hasOverflow) + .coordinateSpace(name: "scroll") + .onChange(of: isFocused) { newValue in + workspace.notificationOverlay.handleFocusChange(isFocused: newValue) + } .onChange(of: geometry.size.height) { newValue in updateOverflow(contentHeight: contentHeight, containerHeight: newValue) } - .onChange(of: notificationManager.isManuallyShown) { isShown in - if !isShown { - // Delay scroll animation until after notifications are hidden + .onChange(of: workspace.notificationOverlay.isManuallyShown) { isShown in + if !isShown && !workspace.notificationOverlay.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) @@ -94,8 +116,8 @@ struct NotificationOverlayView: View { } } .allowsHitTesting( - notificationManager.activeNotifications - .contains { notificationManager.isNotificationVisible($0) } + workspace.notificationOverlay.activeNotifications + .contains { workspace.notificationOverlay.isNotificationVisible($0) } ) } } @@ -107,12 +129,42 @@ struct NotificationOverlayView: View { if #available(macOS 14.0, *) { notificationsWithScrollView .scrollClipDisabled(true) + .focusable() + .focusEffectDisabled() + .focused($isFocused) + .onChange(of: workspace.notificationOverlay.isManuallyShown) { isShown in + if isShown { + isFocused = true + } + } + .onChange(of: controlActiveState) { newState in + if newState != .active && newState != .key && workspace.notificationOverlay.isManuallyShown { + // Delay hiding notifications to match animation timing + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + workspace.notificationOverlay.toggleNotificationsVisibility() + } + } + } } else { notificationsWithScrollView } } .opacity(controlActiveState == .active || controlActiveState == .key ? 1 : 0) - .offset(x: controlActiveState == .active || controlActiveState == .key ? 0 : 350) + .offset( + x: (controlActiveState == .active || controlActiveState == .key) && + (workspace.notificationOverlay.isManuallyShown || workspace.notificationOverlay.scrolledToTop) + ? 0 + : 350 + ) + .animation(.easeInOut(duration: 0.3), value: workspace.notificationOverlay.isManuallyShown) + .animation(.easeInOut(duration: 0.3), value: workspace.notificationOverlay.scrolledToTop) .animation(.easeInOut(duration: 0.2), value: controlActiveState) } } + +struct ScrollOffsetPreferenceKey: PreferenceKey { + static var defaultValue: CGFloat = 0 + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value = nextValue() + } +} From 9df84a15e98d7fcaeb117fdb331e28982f5f14fa Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 18 Feb 2025 13:58:37 -0600 Subject: [PATCH 11/32] Fixed SwiftLint and PR issues --- .../ViewModels/NotificationOverlayViewModel.swift | 7 ------- .../Views/NotificationOverlayView.swift | 14 +++----------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift index 0cb516198..efcb349ea 100644 --- a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift +++ b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift @@ -28,13 +28,6 @@ final class NotificationOverlayViewModel: ObservableObject { private var notificationManager = NotificationManager.shared - /// Whether any non-sticky notifications are currently hidden - private var hasHiddenNotifications: Bool { - activeNotifications.contains { notification in - !notification.isSticky && !isNotificationVisible(notification) - } - } - @Published var scrolledToTop: Bool = true /// Whether a notification should be visible in the overlay diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index a520ebdbf..7275a63e5 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -23,7 +23,6 @@ struct NotificationOverlayView: View { @State private var hasOverflow: Bool = false @State private var contentHeight: CGFloat = 0.0 - @State private var scrollOffset: CGFloat = 0 private func updateOverflow(contentHeight: CGFloat, containerHeight: CGFloat) { if !hasOverflow && contentHeight > containerHeight { @@ -33,12 +32,12 @@ struct NotificationOverlayView: View { } } - var notifications: some View { + @ViewBuilder var notifications: some View { let visibleNotifications = workspace.notificationOverlay.activeNotifications.filter { workspace.notificationOverlay.isNotificationVisible($0) } - return VStack(spacing: 8) { + VStack(spacing: 8) { ForEach(visibleNotifications, id: \.id) { notification in NotificationBannerView( notification: notification, @@ -59,7 +58,7 @@ struct NotificationOverlayView: View { .animation(.easeInOut(duration: 0.3), value: visibleNotifications) } - var notificationsWithScrollView: some View { + @ViewBuilder var notificationsWithScrollView: some View { GeometryReader { geometry in HStack { Spacer() @@ -161,10 +160,3 @@ struct NotificationOverlayView: View { .animation(.easeInOut(duration: 0.2), value: controlActiveState) } } - -struct ScrollOffsetPreferenceKey: PreferenceKey { - static var defaultValue: CGFloat = 0 - static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { - value = nextValue() - } -} From 951e899a34e3ca657a9e1773eedfc6866061fe69 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 19 Feb 2025 10:28:02 -0600 Subject: [PATCH 12/32] Fixed animation glitch when taking action on a notification while notification panel is presented. Removed notification tests and made the notification test in the dev inspector more configurable. --- CodeEdit/AppDelegate.swift | 15 --- .../FileInspector/FileInspectorView.swift | 121 ------------------ .../NotificationOverlayViewModel.swift | 9 +- .../Views/NotificationOverlayView.swift | 4 +- 4 files changed, 11 insertions(+), 138 deletions(-) diff --git a/CodeEdit/AppDelegate.swift b/CodeEdit/AppDelegate.swift index 720783c37..7945d1e71 100644 --- a/CodeEdit/AppDelegate.swift +++ b/CodeEdit/AppDelegate.swift @@ -26,21 +26,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject { NSApp.closeWindow(.welcome, .about) - // Add test notification - DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { - NotificationManager.shared.post( - iconText: "👋", - iconTextColor: .white, - iconColor: .indigo, - title: "Welcome to CodeEdit", - description: "This is a test notification to demonstrate the notification system.", - actionButtonTitle: "Learn More...", - action: { - print("Action button clicked!") - } - ) - } - DispatchQueue.main.async { var needToHandleOpen = true diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index d2204b8d8..3cac365a6 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -59,71 +59,6 @@ struct FileInspectorView: View { widthOptions wrapLinesToggle } - Section("Test Notifications") { - Button("Add Notification") { - let (iconSymbol, iconColor) = randomSymbolAndColor() - NotificationManager.shared.post( - iconSymbol: iconSymbol, - iconColor: iconColor, - title: "Test Notification", - description: "This is a test notification.", - actionButtonTitle: "Action", - action: { - print("Test notification action triggered") - } - ) - } - Button("Add Sticky Notification") { - NotificationManager.shared.post( - iconSymbol: "pin.fill", - iconColor: .orange, - title: "Sticky Notification", - description: "This notification will stay until dismissed.", - actionButtonTitle: "Acknowledge", - action: { - print("Sticky notification acknowledged") - }, - isSticky: true - ) - } - Button("Add Image Notification") { - NotificationManager.shared.post( - iconImage: randomImage(), - title: "Test Notification with Image", - description: "This is a test notification with a custom image.", - actionButtonTitle: "Action", - action: { - print("Test notification action triggered") - } - ) - } - Button("Add Text Notification") { - NotificationManager.shared.post( - iconText: randomLetter(), - iconTextColor: .white, - iconColor: randomColor(), - title: "Text Notification", - description: "This is a test notification with text.", - actionButtonTitle: "Acknowledge", - action: { - print("Test notification action triggered") - } - ) - } - Button("Add Emoji Notification") { - NotificationManager.shared.post( - iconText: randomEmoji(), - iconTextColor: .white, - iconColor: randomColor(), - title: "Emoji Notification", - description: "This is a test notification with an emoji.", - actionButtonTitle: "Acknowledge", - action: { - print("Test notification action triggered") - } - ) - } - } } } else { NoSelectionInspectorView() @@ -146,62 +81,6 @@ struct FileInspectorView: View { } } - func randomColor() -> Color { - let colors: [Color] = [ - .red, .orange, .yellow, .green, .mint, .cyan, - .teal, .blue, .indigo, .purple, .pink, .gray - ] - return colors.randomElement() ?? .black - } - - func randomSymbolAndColor() -> (String, Color) { - let symbols: [(String, Color)] = [ - ("bell.fill", .red), - ("bell.badge.fill", .red), - ("exclamationmark.triangle.fill", .orange), - ("info.circle.fill", .blue), - ("checkmark.seal.fill", .green), - ("xmark.octagon.fill", .red), - ("bubble.left.fill", .teal), - ("envelope.fill", .blue), - ("phone.fill", .green), - ("megaphone.fill", .pink), - ("clock.fill", .gray), - ("calendar", .red), - ("flag.fill", .green), - ("bookmark.fill", .orange), - ("bolt.fill", .indigo), - ("shield.lefthalf.fill", .red), - ("gift.fill", .purple), - ("heart.fill", .pink), - ("star.fill", .orange), - ("curlybraces", .cyan), - ] - return symbols.randomElement() ?? ("bell.fill", .red) - } - - func randomEmoji() -> String { - let emoji: [String] = [ - "🔔", "🚨", "⚠️", "👋", "😍", "😎", "😘", "😜", "😝", "😀", "😁", - "😂", "🤣", "😃", "😄", "😅", "😆", "😇", "😉", "😊", "😋", "😌" - ] - return emoji.randomElement() ?? "🔔" - } - - func randomImage() -> Image { - let images: [Image] = [ - Image("GitHubIcon"), - Image("BitBucketIcon"), - Image("GitLabIcon") - ] - return images.randomElement() ?? Image("GitHubIcon") - } - - func randomLetter() -> String { - let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { String($0) } - return letters.randomElement() ?? "A" - } - @ViewBuilder private var fileNameField: some View { @State var isValid: Bool = true diff --git a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift index efcb349ea..47e5b1565 100644 --- a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift +++ b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift @@ -181,7 +181,7 @@ final class NotificationOverlayViewModel: ObservableObject { } /// Dismisses a specific notification - func dismissNotification(_ notification: CENotification) { + func dismissNotification(_ notification: CENotification, disableAnimation: Bool = false) { // Clean up timers timers[notification.id]?.invalidate() timers[notification.id] = nil @@ -189,6 +189,13 @@ final class NotificationOverlayViewModel: ObservableObject { // 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 diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift index 7275a63e5..f1a3e105a 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift @@ -46,9 +46,11 @@ struct NotificationOverlayView: View { }, onAction: { notification.action() - workspace.notificationOverlay.dismissNotification(notification) if workspace.notificationOverlay.isManuallyShown { workspace.notificationOverlay.toggleNotificationsVisibility() + workspace.notificationOverlay.dismissNotification(notification, disableAnimation: true) + } else { + workspace.notificationOverlay.dismissNotification(notification) } } ) From 4518e4cd6ba6fbfae80ca4bfc51c208626c7c6a0 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 19 Feb 2025 10:48:11 -0600 Subject: [PATCH 13/32] Changed variable name isManuallyShown to isPresented, and notificationOverlay to notificationPanel. Fixed SwiftLint errors. --- .../WorkspaceDocument/WorkspaceDocument.swift | 2 +- .../Notifications/NotificationManager.swift | 5 - .../NotificationOverlayViewModel.swift | 265 ------------------ .../Views/NotificationOverlayView.swift | 164 ----------- 4 files changed, 1 insertion(+), 435 deletions(-) delete mode 100644 CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift delete mode 100644 CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index b937f3d66..229cd8fc5 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -61,7 +61,7 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { deinit { cancellables.forEach { $0.cancel() } NotificationCenter.default.removeObserver(self) - notificationOverlaySubscription?.cancel() + notificationPanelSubscription?.cancel() } func getFromWorkspaceState(_ key: WorkspaceStateKey) -> Any? { diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index ccdcf255c..1b02baea1 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -56,11 +56,6 @@ final class NotificationManager: NSObject, ObservableObject { notifications.filter { !$0.isRead }.count } - /// Whether there are currently notifications being displayed in the overlay - var hasActiveNotification: Bool { - !notifications.isEmpty - } - /// Posts a new notification /// - Parameters: /// - iconSymbol: SF Symbol or CodeEditSymbol name for the notification icon diff --git a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift b/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift deleted file mode 100644 index 47e5b1565..000000000 --- a/CodeEdit/Features/Notifications/ViewModels/NotificationOverlayViewModel.swift +++ /dev/null @@ -1,265 +0,0 @@ -// -// NotificationOverlayViewModel.swift -// CodeEdit -// -// Created by Austin Condiff on 2/14/24. -// - -import SwiftUI - -final class NotificationOverlayViewModel: ObservableObject { - /// Currently displayed notifications in the overlay - @Published private(set) var activeNotifications: [CENotification] = [] - - /// Whether notifications were manually shown via toolbar - @Published private(set) var isManuallyShown: 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 overlay - 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 isManuallyShown { - return true // Show all notifications when manually shown - } - return !hiddenNotificationIds.contains(notification.id) - } - - /// Handles focus changes for the notification overlay - func handleFocusChange(isFocused: Bool) { - if !isFocused { - // Only hide if manually shown and focus is completely lost - if isManuallyShown { - toggleNotificationsVisibility() - } - } - } - - /// Toggles visibility of notifications in the overlay - func toggleNotificationsVisibility() { - if isManuallyShown { - if !scrolledToTop { - // Just set isManuallyShown to false to trigger the offset animation - withAnimation(.easeInOut(duration: 0.3)) { - isManuallyShown = 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)) { - isManuallyShown = true - hiddenNotificationIds.removeAll() - objectWillChange.send() - } - } - } - - private func hideNotifications() { - withAnimation(.easeInOut(duration: 0.3)) { - self.isManuallyShown = 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 && !isManuallyShown 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 !isManuallyShown && !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.isManuallyShown { - self.isManuallyShown = 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 && isManuallyShown { - isManuallyShown = false - } - } - } -} diff --git a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift b/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift deleted file mode 100644 index f1a3e105a..000000000 --- a/CodeEdit/Features/Notifications/Views/NotificationOverlayView.swift +++ /dev/null @@ -1,164 +0,0 @@ -// -// NotificationOverlayView.swift -// CodeEdit -// -// Created by Austin Condiff on 2/10/24. -// - -import SwiftUI - -struct NotificationOverlayView: 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.notificationOverlay.activeNotifications.filter { - workspace.notificationOverlay.isNotificationVisible($0) - } - - VStack(spacing: 8) { - ForEach(visibleNotifications, id: \.id) { notification in - NotificationBannerView( - notification: notification, - onDismiss: { - workspace.notificationOverlay.dismissNotification(notification) - }, - onAction: { - notification.action() - if workspace.notificationOverlay.isManuallyShown { - workspace.notificationOverlay.toggleNotificationsVisibility() - workspace.notificationOverlay.dismissNotification(notification, disableAnimation: true) - } else { - workspace.notificationOverlay.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.notificationOverlay.scrolledToTop { - workspace.notificationOverlay.scrolledToTop = true - } else if $0 > 0.0 && workspace.notificationOverlay.scrolledToTop { - workspace.notificationOverlay.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.notificationOverlay.handleFocusChange(isFocused: newValue) - } - .onChange(of: geometry.size.height) { newValue in - updateOverflow(contentHeight: contentHeight, containerHeight: newValue) - } - .onChange(of: workspace.notificationOverlay.isManuallyShown) { isShown in - if !isShown && !workspace.notificationOverlay.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.notificationOverlay.activeNotifications - .contains { workspace.notificationOverlay.isNotificationVisible($0) } - ) - } - } - } - } - - var body: some View { - Group { - if #available(macOS 14.0, *) { - notificationsWithScrollView - .scrollClipDisabled(true) - .focusable() - .focusEffectDisabled() - .focused($isFocused) - .onChange(of: workspace.notificationOverlay.isManuallyShown) { isShown in - if isShown { - isFocused = true - } - } - .onChange(of: controlActiveState) { newState in - if newState != .active && newState != .key && workspace.notificationOverlay.isManuallyShown { - // Delay hiding notifications to match animation timing - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - workspace.notificationOverlay.toggleNotificationsVisibility() - } - } - } - } else { - notificationsWithScrollView - } - } - .opacity(controlActiveState == .active || controlActiveState == .key ? 1 : 0) - .offset( - x: (controlActiveState == .active || controlActiveState == .key) && - (workspace.notificationOverlay.isManuallyShown || workspace.notificationOverlay.scrolledToTop) - ? 0 - : 350 - ) - .animation(.easeInOut(duration: 0.3), value: workspace.notificationOverlay.isManuallyShown) - .animation(.easeInOut(duration: 0.3), value: workspace.notificationOverlay.scrolledToTop) - .animation(.easeInOut(duration: 0.2), value: controlActiveState) - } -} From 46adb4c2929f57095b2f88878d3bc17c6f21ac6f Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 19 Feb 2025 13:28:14 -0600 Subject: [PATCH 14/32] Refactored CENotification to use delegated inits. --- .../Notifications/Models/CENotification.swift | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift index ef7ee4fce..6512d7863 100644 --- a/CodeEdit/Features/Notifications/Models/CENotification.swift +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -128,15 +128,16 @@ struct CENotification: Identifiable, Equatable { isSticky: Bool = false, isRead: Bool = false ) { - self.id = id - self.icon = .text(iconText, backgroundColor: iconColor, textColor: iconTextColor) - self.title = title - self.description = description - self.actionButtonTitle = actionButtonTitle - self.action = action - self.isSticky = isSticky - self.isRead = isRead - self.timestamp = Date() + self.init( + id: id, + icon: .text(iconText, backgroundColor: iconColor, textColor: iconTextColor), + title: title, + description: description, + actionButtonTitle: actionButtonTitle, + action: action, + isSticky: isSticky, + isRead: isRead + ) } init( @@ -148,9 +149,31 @@ struct CENotification: Identifiable, Equatable { 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 = .image(iconImage) + self.icon = icon self.title = title self.description = description self.actionButtonTitle = actionButtonTitle From 8abb2b59c9e01713f27d910f6065c15530ca63e1 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 19 Feb 2025 21:51:37 -0600 Subject: [PATCH 15/32] Moved CloseButtonStyle into CodeEditUI and renamed it OverlayButtonStyle --- .../FileInspector/FileInspectorView.swift | 3 --- .../Views/NotificationBannerView.swift | 25 ------------------- 2 files changed, 28 deletions(-) diff --git a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift index 3cac365a6..d4e6c1032 100644 --- a/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/FileInspector/FileInspectorView.swift @@ -82,8 +82,6 @@ struct FileInspectorView: View { } @ViewBuilder private var fileNameField: some View { - @State var isValid: Bool = true - if let file { TextField("Name", text: $fileName) .background( @@ -111,7 +109,6 @@ struct FileInspectorView: View { } } } else { - isValid = false fileName = file.labelFileName() } } diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index ca8a1883f..8f739611e 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -7,31 +7,6 @@ import SwiftUI -struct CloseButtonStyle: 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 - ) - } -} - struct NotificationBannerView: View { @Environment(\.colorScheme) private var colorScheme From 6bdde36342896671d156a8ad8b7059f79918d28a Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 19 Feb 2025 21:59:29 -0600 Subject: [PATCH 16/32] Using cancelables so workspace cleanup is more concise --- .../Features/Documents/WorkspaceDocument/WorkspaceDocument.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index 229cd8fc5..1b96e4fca 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -61,7 +61,6 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { deinit { cancellables.forEach { $0.cancel() } NotificationCenter.default.removeObserver(self) - notificationPanelSubscription?.cancel() } func getFromWorkspaceState(_ key: WorkspaceStateKey) -> Any? { From 42f802ece9c924fff1dbbf36fea5689e47c19456 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 15:30:11 -0600 Subject: [PATCH 17/32] Refactored Activities (previously TaskNotifications) to have a clear distinction in name and have a consistent API when compared with Notifications. --- CodeEdit.xcodeproj/project.pbxproj | 3160 ++++++++++++++++- .../Features/Activities/ActivityManager.swift | 107 + .../Models/CEActivity.swift} | 6 +- .../DropdownMenuItemStyleModifier.swift | 0 .../Views}/ActiveTaskView.swift | 0 .../Views/ActivitiesView.swift} | 34 +- .../Views}/ActivityViewer.swift | 8 +- .../Views}/CECircularProgressView.swift | 0 .../Views}/OptionMenuItemView.swift | 0 .../Views}/SchemeDropDownView.swift | 0 .../Views}/TaskDropDownView.swift | 0 .../Views}/TaskNotificationsDetailView.swift | 25 +- .../Tasks => Activities/Views}/TaskView.swift | 0 .../Views}/TasksPopoverMenuItem.swift | 0 .../Views}/WorkspaceMenuItemView.swift | 0 .../ActivityViewer/Models/CEActivity.swift | 7 + .../TaskNotificationHandler.swift | 207 -- .../CodeEditSplitViewController.swift | 15 +- .../CodeEditWindowController+Toolbar.swift | 4 +- .../WorkspaceDocument+Index.swift | 53 +- .../WorkspaceDocument/WorkspaceDocument.swift | 14 +- .../Features/Tasks/Models/CEActiveTask.swift | 74 +- .../Models/CETask.swift | 0 CodeEdit/Features/Tasks/TaskManager.swift | 10 +- .../TaskNotificationHandlerTests.swift | 136 +- 25 files changed, 3429 insertions(+), 431 deletions(-) create mode 100644 CodeEdit/Features/Activities/ActivityManager.swift rename CodeEdit/Features/{ActivityViewer/Models/TaskNotificationModel.swift => Activities/Models/CEActivity.swift} (57%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/ViewModifiers}/DropdownMenuItemStyleModifier.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/ActiveTaskView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Notifications/TaskNotificationView.swift => Activities/Views/ActivitiesView.swift} (61%) rename CodeEdit/Features/{ActivityViewer => Activities/Views}/ActivityViewer.swift (86%) rename CodeEdit/Features/{ActivityViewer/Notifications => Activities/Views}/CECircularProgressView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/OptionMenuItemView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/SchemeDropDownView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/TaskDropDownView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Notifications => Activities/Views}/TaskNotificationsDetailView.swift (53%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/TaskView.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/TasksPopoverMenuItem.swift (100%) rename CodeEdit/Features/{ActivityViewer/Tasks => Activities/Views}/WorkspaceMenuItemView.swift (100%) create mode 100644 CodeEdit/Features/ActivityViewer/Models/CEActivity.swift delete mode 100644 CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift rename CodeEdit/Features/{CEWorkspaceSettings => Tasks}/Models/CETask.swift (100%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 7c05730d7..6ffa54323 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -16,6 +16,87 @@ 583E529C29361BAB001AB554 /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 583E529B29361BAB001AB554 /* SnapshotTesting */; }; 58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EACE292FB2B0004A9BDE /* Documentation.docc */; }; 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 /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3CF2C25AFAE00B58BFE /* ActivityManager.swift */; }; + 617DB3D62C25B02D00B58BFE /* ActivitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D52C25B02D00B58BFE /* ActivitiesView.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 */; }; 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C0824A02C5C0C9700A0751E /* SwiftTerm */; }; 6C147C4529A329350089B630 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = 6C147C4429A329350089B630 /* OrderedCollections */; }; @@ -39,6 +120,171 @@ 6CC17B4F2C432AE000834E2C /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC17B4E2C432AE000834E2C /* CodeEditSourceEditor */; }; 6CD3CA552C8B508200D83DCD /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CD3CA542C8B508200D83DCD /* CodeEditSourceEditor */; }; 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 */; }; + B616EA942D67C4DA00DF9029 /* CEActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA932D67C4DA00DF9029 /* CEActivity.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 */; }; /* End PBXBuildFile section */ @@ -107,9 +353,253 @@ 2BE487EC28245162003F3F64 /* OpenWithCodeEdit.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenWithCodeEdit.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 589F3E342936185400E1A4DA /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 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 /* ActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManager.swift; sourceTree = ""; }; + 617DB3D52C25B02D00B58BFE /* ActivitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivitiesView.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 = ""; }; 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 = ""; }; + B616EA932D67C4DA00DF9029 /* CEActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEActivity.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; }; 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; }; @@ -207,21 +697,1946 @@ /* 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 /* Activities */, + 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 */, + 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 /* Activities */ = { + isa = PBXGroup; + children = ( + 617DB3D12C25AFD300B58BFE /* Models */, + B616EA902D67C40800DF9029 /* Views */, + 618725A22C29EFE200987354 /* ViewModifiers */, + 617DB3CF2C25AFAE00B58BFE /* ActivityManager.swift */, + ); + path = Activities; + sourceTree = ""; + }; + 617DB3D12C25AFD300B58BFE /* Models */ = { + isa = PBXGroup; + children = ( + B616EA932D67C4DA00DF9029 /* CEActivity.swift */, + ); + path = Models; + sourceTree = ""; + }; + 617DB3DD2C25E11500B58BFE /* ActivityViewer */ = { + isa = PBXGroup; + children = ( + 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */, + ); + path = ActivityViewer; + sourceTree = ""; + }; + 618725A22C29EFE200987354 /* ViewModifiers */ = { + isa = PBXGroup; + children = ( + 618725A52C29F02500987354 /* DropdownMenuItemStyleModifier.swift */, + ); + path = ViewModifiers; + 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 */, + ); + 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 */, ); - name = Frameworks; + path = Views; sourceTree = ""; }; - 6C01F25D2C4820B600AA951B /* Recovered References */ = { + B616EA8A2D651B0A00DF9029 /* Styles */ = { isa = PBXGroup; children = ( - 6C67413D2C44A28C00AABDF5 /* ProjectNavigatorViewController+DataSource.swift */, - 6C67413F2C44A2A200AABDF5 /* ProjectNavigatorViewController+Delegate.swift */, + B67DB0F82AFDF638002DC647 /* IconButtonStyle.swift */, + B67DB0FB2AFDF71F002DC647 /* IconToggleStyle.swift */, + B616EA862D651ADA00DF9029 /* OverlayButtonStyle.swift */, + 611028C72C8DC7F100DFD845 /* MenuWithButtonStyle.swift */, ); - name = "Recovered References"; + path = Styles; + sourceTree = ""; + }; + B616EA8C2D65238900DF9029 /* InternalDevelopmentInspector */ = { + isa = PBXGroup; + children = ( + B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */, + B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */, + ); + path = InternalDevelopmentInspector; + sourceTree = ""; + }; + B616EA902D67C40800DF9029 /* Views */ = { + isa = PBXGroup; + children = ( + B69D3EE22C5F536B005CF43A /* ActiveTaskView.swift */, + 618725A72C29F05500987354 /* OptionMenuItemView.swift */, + 618725A02C29EFCC00987354 /* SchemeDropDownView.swift */, + 618725AA2C29F2C000987354 /* TaskDropDownView.swift */, + B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */, + B69D3EE02C5F5357005CF43A /* TaskView.swift */, + 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */, + 617DB3D52C25B02D00B58BFE /* ActivitiesView.swift */, + 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */, + 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */, + 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */, + ); + path = Views; + 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 */, + ); + path = Pages; + sourceTree = ""; + }; + B61DA9E129D929F900BF4A43 /* GeneralSettings */ = { + isa = PBXGroup; + children = ( + B6CF632529E541520085880A /* Models */, + B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */, + B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */, + ); + path = GeneralSettings; + sourceTree = ""; + }; + B62AEDB12A1FD7F0009A9F52 /* Views */ = { + isa = PBXGroup; + children = ( + B62AEDD32A27B29F009A9F52 /* PaneToolbar.swift */, + 58822513292C280D00E83CDE /* UtilityAreaView.swift */, + B62AEDC82A2704F3009A9F52 /* UtilityAreaTabView.swift */, + B62AEDDA2A27C1B3009A9F52 /* OSLogType+Color.swift */, + B62AEDD02A27B264009A9F52 /* View+paneToolbar.swift */, + ); + path = Views; + sourceTree = ""; + }; + B63F6A752C5618BF003B4342 /* Formatters */ = { + isa = PBXGroup; + children = ( + B63F6A7A2C561BCB003B4342 /* RegexFormatter.swift */, + B63F6A782C5618EF003B4342 /* TrimWhitespaceFormatter.swift */, + ); + path = Formatters; + sourceTree = ""; + }; + B640A9A329E218E300715F20 /* Models */ = { + 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 */, + ); + path = Models; sourceTree = ""; }; B658FB2327DA9E0F00EA4DBD = { @@ -256,6 +2671,464 @@ 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 = ( + 77A01E422BBC3A2800F0EA38 /* CETask.swift */, + 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 */ @@ -525,7 +3398,280 @@ buildActionMask = 2147483647; files = ( 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 /* ActivitiesView.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 */, + B616EA942D67C4DA00DF9029 /* CEActivity.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 */, + 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 */, @@ -547,7 +3693,7 @@ 6C9AE66F2D148DD200FAE8D2 /* URL+FindWorkspace.swift in Sources */, 58D01C94293167DC00C5B6B4 /* Color+HEX.swift in Sources */, 6C578D8729CD345900DC73B2 /* ExtensionSceneView.swift in Sources */, - 617DB3D02C25AFAE00B58BFE /* TaskNotificationHandler.swift in Sources */, + 617DB3D02C25AFAE00B58BFE /* ActivityManager.swift in Sources */, 77EF6C052C57DE4B00984B69 /* URL+ResouceValues.swift in Sources */, B640A9A129E2188F00715F20 /* View+NavigationBarBackButtonVisible.swift in Sources */, 587B9E7929301D8F00AC7927 /* GitHubIssueRouter.swift in Sources */, diff --git a/CodeEdit/Features/Activities/ActivityManager.swift b/CodeEdit/Features/Activities/ActivityManager.swift new file mode 100644 index 000000000..d832f31f4 --- /dev/null +++ b/CodeEdit/Features/Activities/ActivityManager.swift @@ -0,0 +1,107 @@ +// +// ActivityManager.swift +// CodeEdit +// +// Created by Tommy Ludwig on 21.06.24. +// + +import Foundation +import Combine +import SwiftUI + +/// Manages activities for a workspace +final class ActivityManager: ObservableObject { + /// Currently displayed activities + @Published private(set) var activities: [CEActivity] = [] + + /// Posts a new activity + /// - Parameters: + /// - priority: Whether to insert at start of list + /// - title: Activity title + /// - message: Optional detail message + /// - percentage: Optional progress percentage (0-1) + /// - isLoading: Whether activity shows loading indicator + /// - Returns: The created activity + @discardableResult + func post( + priority: Bool = false, + title: String, + message: String? = nil, + percentage: Double? = nil, + isLoading: Bool = false + ) -> CEActivity { + let activity = CEActivity( + id: UUID().uuidString, + title: title, + message: message, + percentage: percentage, + isLoading: isLoading + ) + + withAnimation(.easeInOut(duration: 0.3)) { + if priority { + activities.insert(activity, at: 0) + } else { + activities.append(activity) + } + } + + return activity + } + + /// Updates an existing activity + /// - Parameters: + /// - id: ID of activity to update + /// - title: New title (optional) + /// - message: New message (optional) + /// - percentage: New progress percentage (optional) + /// - isLoading: New loading state (optional) + func update( + id: String, + title: String? = nil, + message: String? = nil, + percentage: Double? = nil, + isLoading: Bool? = nil + ) { + if let index = activities.firstIndex(where: { $0.id == id }) { + var activity = activities[index] + + if let title = title { + activity.title = title + } + if let message = message { + activity.message = message + } + if let percentage = percentage { + activity.percentage = percentage + } + if let isLoading = isLoading { + activity.isLoading = isLoading + } + + activities[index] = activity + } + } + + /// Deletes an activity + /// - Parameter id: ID of activity to delete + func delete(id: String) { + withAnimation(.easeInOut(duration: 0.3)) { + activities.removeAll { $0.id == id } + } + } + + /// Deletes an activity after a delay + /// - Parameters: + /// - id: ID of activity to delete + /// - delay: Time to wait before deleting + func delete(id: String, delay: TimeInterval) { + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in + self?.delete(id: id) + } + } +} + +extension Notification.Name { + static let activity = Notification.Name("activity") +} diff --git a/CodeEdit/Features/ActivityViewer/Models/TaskNotificationModel.swift b/CodeEdit/Features/Activities/Models/CEActivity.swift similarity index 57% rename from CodeEdit/Features/ActivityViewer/Models/TaskNotificationModel.swift rename to CodeEdit/Features/Activities/Models/CEActivity.swift index a92b618bd..a09e74f56 100644 --- a/CodeEdit/Features/ActivityViewer/Models/TaskNotificationModel.swift +++ b/CodeEdit/Features/Activities/Models/CEActivity.swift @@ -1,5 +1,5 @@ // -// TaskNotificationModel.swift +// CEActivity.swift // CodeEdit // // Created by Tommy Ludwig on 21.06.24. @@ -7,8 +7,8 @@ import Foundation -/// Represents a notifications or tasks, that are displayed in the activity viewer -struct TaskNotificationModel: Equatable { +/// Represents an activity, that is displayed in the activity viewer +struct CEActivity: Equatable { var id: String var title: String var message: String? diff --git a/CodeEdit/Features/ActivityViewer/Tasks/DropdownMenuItemStyleModifier.swift b/CodeEdit/Features/Activities/ViewModifiers/DropdownMenuItemStyleModifier.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/DropdownMenuItemStyleModifier.swift rename to CodeEdit/Features/Activities/ViewModifiers/DropdownMenuItemStyleModifier.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/ActiveTaskView.swift b/CodeEdit/Features/Activities/Views/ActiveTaskView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/ActiveTaskView.swift rename to CodeEdit/Features/Activities/Views/ActiveTaskView.swift diff --git a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationView.swift b/CodeEdit/Features/Activities/Views/ActivitiesView.swift similarity index 61% rename from CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationView.swift rename to CodeEdit/Features/Activities/Views/ActivitiesView.swift index 1b9c1d0a3..99577fb76 100644 --- a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationView.swift +++ b/CodeEdit/Features/Activities/Views/ActivitiesView.swift @@ -1,5 +1,5 @@ // -// TaskNotificationView.swift +// ActivityView.swift // CodeEdit // // Created by Tommy Ludwig on 21.06.24. @@ -7,36 +7,36 @@ import SwiftUI -struct TaskNotificationView: View { +struct ActivityView: View { @Environment(\.controlActiveState) private var activeState - @ObservedObject var taskNotificationHandler: TaskNotificationHandler + @ObservedObject var activityManager: ActivityManager @State private var isPresented: Bool = false - @State var notification: TaskNotificationModel? + @State var activity: CEActivity? var body: some View { ZStack { - if let notification { + if let activity { HStack { - Text(notification.title) + Text(activity.title) .font(.subheadline) .transition( .asymmetric(insertion: .move(edge: .top), removal: .move(edge: .bottom)) .combined(with: .opacity) ) - .id("NotificationTitle" + notification.title) + .id("ActivityTitle" + activity.title) - if notification.isLoading { + if activity.isLoading { CECircularProgressView( - progress: notification.percentage, - currentTaskCount: taskNotificationHandler.notifications.count + progress: activity.percentage, + currentTaskCount: activityManager.activities.count ) .padding(.horizontal, -1) .frame(height: 16) } else { - if taskNotificationHandler.notifications.count > 1 { - Text("\(taskNotificationHandler.notifications.count)") + if activityManager.activities.count > 1 { + Text("\(activityManager.activities.count)") .font(.caption) .padding(5) .background( @@ -54,17 +54,17 @@ struct TaskNotificationView: View { .padding(-3) .padding(.trailing, 3) .popover(isPresented: $isPresented, arrowEdge: .bottom) { - TaskNotificationsDetailView(taskNotificationHandler: taskNotificationHandler) + ActivitysDetailView(activityManager: activityManager) } .onTapGesture { self.isPresented.toggle() } } } - .animation(.easeInOut, value: notification) - .onChange(of: taskNotificationHandler.notifications) { newValue in + .animation(.easeInOut, value: activity) + .onChange(of: activityManager.activities) { newValue in withAnimation { - notification = newValue.first + activity = newValue.first } } } @@ -72,5 +72,5 @@ struct TaskNotificationView: View { } #Preview { - TaskNotificationView(taskNotificationHandler: TaskNotificationHandler()) + ActivityView(activityManager: ActivityManager()) } diff --git a/CodeEdit/Features/ActivityViewer/ActivityViewer.swift b/CodeEdit/Features/Activities/Views/ActivityViewer.swift similarity index 86% rename from CodeEdit/Features/ActivityViewer/ActivityViewer.swift rename to CodeEdit/Features/Activities/Views/ActivityViewer.swift index 5b3e41069..fd02b245e 100644 --- a/CodeEdit/Features/ActivityViewer/ActivityViewer.swift +++ b/CodeEdit/Features/Activities/Views/ActivityViewer.swift @@ -14,7 +14,7 @@ struct ActivityViewer: View { var workspaceFileManager: CEWorkspaceFileManager? - @ObservedObject var taskNotificationHandler: TaskNotificationHandler + @ObservedObject var activityManager: ActivityManager @ObservedObject var workspaceSettingsManager: CEWorkspaceSettings // TODO: try to get this from the envrionment @@ -23,12 +23,12 @@ struct ActivityViewer: View { init( workspaceFileManager: CEWorkspaceFileManager?, workspaceSettingsManager: CEWorkspaceSettings, - taskNotificationHandler: TaskNotificationHandler, + activityManager: ActivityManager, taskManager: TaskManager ) { self.workspaceFileManager = workspaceFileManager self.workspaceSettingsManager = workspaceSettingsManager - self.taskNotificationHandler = taskNotificationHandler + self.activityManager = activityManager self.taskManager = taskManager } var body: some View { @@ -42,7 +42,7 @@ struct ActivityViewer: View { Spacer(minLength: 0) - TaskNotificationView(taskNotificationHandler: taskNotificationHandler) + ActivityView(activityManager: activityManager) .fixedSize() } .fixedSize(horizontal: false, vertical: false) diff --git a/CodeEdit/Features/ActivityViewer/Notifications/CECircularProgressView.swift b/CodeEdit/Features/Activities/Views/CECircularProgressView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Notifications/CECircularProgressView.swift rename to CodeEdit/Features/Activities/Views/CECircularProgressView.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/OptionMenuItemView.swift b/CodeEdit/Features/Activities/Views/OptionMenuItemView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/OptionMenuItemView.swift rename to CodeEdit/Features/Activities/Views/OptionMenuItemView.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/SchemeDropDownView.swift b/CodeEdit/Features/Activities/Views/SchemeDropDownView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/SchemeDropDownView.swift rename to CodeEdit/Features/Activities/Views/SchemeDropDownView.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/TaskDropDownView.swift b/CodeEdit/Features/Activities/Views/TaskDropDownView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/TaskDropDownView.swift rename to CodeEdit/Features/Activities/Views/TaskDropDownView.swift diff --git a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationsDetailView.swift b/CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift similarity index 53% rename from CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationsDetailView.swift rename to CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift index 4742fa817..33513e69d 100644 --- a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationsDetailView.swift +++ b/CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift @@ -1,5 +1,5 @@ // -// TaskNotificationsDetailView.swift +// ActivitysDetailView.swift // CodeEdit // // Created by Tommy Ludwig on 21.06.24. @@ -7,22 +7,23 @@ import SwiftUI -struct TaskNotificationsDetailView: View { - @ObservedObject var taskNotificationHandler: TaskNotificationHandler - @State private var selectedTaskNotificationIndex: Int = 0 +struct ActivitysDetailView: View { + @ObservedObject var activityManager: ActivityManager + @State private var selectedActivityIndex: Int = 0 + var body: some View { ScrollView { VStack(alignment: .leading, spacing: 15) { - ForEach(taskNotificationHandler.notifications, id: \.id) { notification in + ForEach(activityManager.activities, id: \.id) { activity in HStack(alignment: .center, spacing: 8) { - CECircularProgressView(progress: notification.percentage) + CECircularProgressView(progress: activity.percentage) .frame(width: 16, height: 16) VStack(alignment: .leading) { - Text(notification.title) + Text(activity.title) .fixedSize(horizontal: false, vertical: true) .transition(.identity) - if let message = notification.message, !message.isEmpty { + if let message = activity.message, !message.isEmpty { Text(message) .font(.subheadline) .foregroundStyle(.secondary) @@ -35,14 +36,14 @@ struct TaskNotificationsDetailView: View { } .padding(15) .frame(minWidth: 320) - .onChange(of: taskNotificationHandler.notifications) { newValue in - if selectedTaskNotificationIndex >= newValue.count { - selectedTaskNotificationIndex = 0 + .onChange(of: activityManager.activities) { newValue in + if selectedActivityIndex >= newValue.count { + selectedActivityIndex = 0 } } } } #Preview { - TaskNotificationsDetailView(taskNotificationHandler: TaskNotificationHandler()) + ActivitysDetailView(activityManager: ActivityManager()) } diff --git a/CodeEdit/Features/ActivityViewer/Tasks/TaskView.swift b/CodeEdit/Features/Activities/Views/TaskView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/TaskView.swift rename to CodeEdit/Features/Activities/Views/TaskView.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/TasksPopoverMenuItem.swift b/CodeEdit/Features/Activities/Views/TasksPopoverMenuItem.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/TasksPopoverMenuItem.swift rename to CodeEdit/Features/Activities/Views/TasksPopoverMenuItem.swift diff --git a/CodeEdit/Features/ActivityViewer/Tasks/WorkspaceMenuItemView.swift b/CodeEdit/Features/Activities/Views/WorkspaceMenuItemView.swift similarity index 100% rename from CodeEdit/Features/ActivityViewer/Tasks/WorkspaceMenuItemView.swift rename to CodeEdit/Features/Activities/Views/WorkspaceMenuItemView.swift diff --git a/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift b/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift new file mode 100644 index 000000000..59b2ee2ec --- /dev/null +++ b/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift @@ -0,0 +1,7 @@ +struct CEActivity: Equatable { + var id: String + var title: String + var message: String? + var percentage: Double? + var isLoading: Bool = false +} diff --git a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift b/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift deleted file mode 100644 index ae0fdc645..000000000 --- a/CodeEdit/Features/ActivityViewer/Notifications/TaskNotificationHandler.swift +++ /dev/null @@ -1,207 +0,0 @@ -// -// TaskNotificationHandler.swift -// CodeEdit -// -// Created by Tommy Ludwig on 21.06.24. -// - -import Foundation -import Combine - -/// Manages task-related notifications. -/// -/// This class listens for notifications named `.taskNotification` and performs actions -/// such as creating, updating, or deleting tasks based on the notification's content. -/// -/// When a task is created, it is added to the end of the array. The activity viewer displays -/// only the first item in the array. To immediately display a notification, use the -/// `"action": "createWithPriority"` option to insert the task at the beginning of the array. -/// *Note: This option should be reserved for important notifications only.* -/// -/// It is recommended to use `UUID().uuidString` to generate a unique identifier for each task. -/// This identifier can then be used to update or delete the task. Alternatively, you can use any -/// unique identifier, such as a token sent from a language server. -/// -/// Remember to manage your task notifications appropriately. You should either delete task -/// notifications manually or schedule their deletion in advance using the `deleteWithDelay` method. -/// -/// ## Available Methods -/// - `create`: -/// Creates a new Task Notification. -/// Required fields: `id` (String), `action` (String), `title` (String). -/// Optional fields: `message` (String), `percentage` (Double), `isLoading` (Bool). -/// - `createWithPriority`: -/// Creates a new Task Notification and inserts it at the start of the array. -/// This ensures it appears in the activity viewer even if there are other task notifications before it. -/// **Note:** This should only be used for important notifications! -/// Required fields: `id` (String), `action` (String), `title` (String). -/// Optional fields: `message` (String), `percentage` (Double), `isLoading` (Bool). -/// - `update`: -/// Updates an existing task notification. It's important to pass the same `id` to update the correct task. -/// Required fields: `id` (String), `action` (String). -/// Optional fields: `title` (String), `message` (String), `percentage` (Double), `isLoading` (Bool). -/// - `delete`: -/// Deletes an existing task notification. -/// Required fields: `id` (String), `action` (String). -/// - `deleteWithDelay`: -/// Deletes an existing task notification after a certain `TimeInterval`. -/// Required fields: `id` (String), `action` (String), `delay` (Double). -/// **Important:** When specifying the delay, ensure it's a double. -/// For example, '2' would be invalid because it would count as an integer, use '2.0' instead. -/// -/// ## Example Usage: -/// ```swift -/// let uuidString = UUID().uuidString -/// -/// func createTask() { -/// let userInfo: [String: Any] = [ -/// "id": "uniqueTaskID", -/// "action": "create", -/// "title": "Task Title" -/// ] -/// NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) -/// } -/// -/// func createTaskWithPriority() { -/// let userInfo: [String: Any] = [ -/// "id": "uniqueTaskID", -/// "action": "createWithPriority", -/// "title": "Priority Task Title" -/// ] -/// NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) -/// } -/// -/// func updateTask() { -/// var userInfo: [String: Any] = [ -/// "id": "uniqueTaskID", -/// "action": "update", -/// "title": "Updated Task Title", -/// "message": "Updated Task Message", -/// "percentage": 0.5, -/// "isLoading": true -/// ] -/// NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) -/// } -/// -/// func deleteTask() { -/// let userInfo: [String: Any] = [ -/// "id": "uniqueTaskID", -/// "action": "delete" -/// ] -/// NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) -/// } -/// -/// func deleteTaskWithDelay() { -/// let userInfo: [String: Any] = [ -/// "id": "uniqueTaskID", -/// "action": "deleteWithDelay", -/// "delay": 4.0 // 4 would be invalid, because it would count as an int -/// ] -/// NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) -/// } -/// ``` -/// -/// - Important: Please refer to ``CodeEdit/TaskNotificationModel`` and ensure you pass the correct values. -final class TaskNotificationHandler: ObservableObject { - @Published private(set) var notifications: [TaskNotificationModel] = [] - var cancellables: Set = [] - - /// Initialises a new `TaskNotificationHandler` and starts observing for task notifications. - init() { - NotificationCenter.default - .publisher(for: .taskNotification) - .receive(on: DispatchQueue.main) - .sink { notification in - self.handleNotification(notification) - } - .store(in: &cancellables) - } - - deinit { - NotificationCenter.default.removeObserver(self, name: .taskNotification, object: nil) - } - - /// Handles notifications about task events. - /// - /// - Parameter notification: The notification containing task information. - private func handleNotification(_ notification: Notification) { - guard let userInfo = notification.userInfo, - let taskID = userInfo["id"] as? String, - let action = userInfo["action"] as? String else { return } - - switch action { - case "create", "createWithPriority": - createTask(task: userInfo) - case "update": - updateTask(task: userInfo) - case "delete": - deleteTask(taskID: taskID) - case "deleteWithDelay": - if let delay = userInfo["delay"] as? Double { - deleteTaskAfterDelay(taskID: taskID, delay: delay) - } - default: - break - } - } - - /// Creates a new task or inserts it at the beginning of the tasks array based on the action. - /// - /// - Parameter task: A dictionary containing task information. - private func createTask(task: [AnyHashable: Any]) { - guard let title = task["title"] as? String, - let id = task["id"] as? String, - let action = task["action"] as? String else { - return - } - - let task = TaskNotificationModel( - id: id, - title: title, - message: task["message"] as? String, - percentage: task["percentage"] as? Double, - isLoading: task["isLoading"] as? Bool ?? false - ) - - if action == "create" { - notifications.append(task) - } else { - notifications.insert(task, at: 0) - } - } - - /// Updates an existing task with new information. - /// - /// - Parameter task: A dictionary containing task information. - private func updateTask(task: [AnyHashable: Any]) { - guard let taskID = task["id"] as? String else { return } - if let index = self.notifications.firstIndex(where: { $0.id == taskID }) { - if let title = task["title"] as? String { - self.notifications[index].title = title - } - if let message = task["message"] as? String { - self.notifications[index].message = message - } - if let percentage = task["percentage"] as? Double { - self.notifications[index].percentage = percentage - } - if let isLoading = task["isLoading"] as? Bool { - self.notifications[index].isLoading = isLoading - } - } - } - - private func deleteTask(taskID: String) { - self.notifications.removeAll { $0.id == taskID } - } - - private func deleteTaskAfterDelay(taskID: String, delay: Double) { - DispatchQueue.main.asyncAfter(deadline: .now() + delay) { - self.notifications.removeAll { $0.id == taskID } - } - } -} - -extension Notification.Name { - static let taskNotification = Notification.Name("taskNotification") -} diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift index 7551c0bed..b21e57247 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift @@ -69,14 +69,13 @@ final class CodeEditSplitViewController: NSSplitViewController { addSplitViewItem(navigator) let workspaceView = SettingsInjector { - WindowObserver(window: WindowBox(value: windowRef)) { - WorkspaceView() - .environmentObject(workspace) - .environmentObject(editorManager) - .environmentObject(statusBarViewModel) - .environmentObject(utilityAreaModel) - .environmentObject(taskManager) - } + WorkspaceView() + .environmentObject(workspace) + .environmentObject(editorManager) + .environmentObject(statusBarViewModel) + .environmentObject(utilityAreaModel) + .environmentObject(taskManager) + .environmentObject(workspace.activityManager) } let mainContent = NSSplitViewItem(viewController: NSHostingController(rootView: workspaceView)) diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift index e7d5f0282..644b3799c 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController+Toolbar.swift @@ -152,7 +152,7 @@ extension CodeEditWindowController { let toolbarItem = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier.activityViewer) toolbarItem.visibilityPriority = .user guard let workspaceSettingsManager = workspace?.workspaceSettingsManager, - let taskNotificationHandler = workspace?.taskNotificationHandler, + let activityManager = workspace?.activityManager, let taskManager = workspace?.taskManager else { return nil } @@ -160,7 +160,7 @@ extension CodeEditWindowController { rootView: ActivityViewer( workspaceFileManager: workspace?.workspaceFileManager, workspaceSettingsManager: workspaceSettingsManager, - taskNotificationHandler: taskNotificationHandler, + activityManager: activityManager, taskManager: taskManager ) ) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift index e84edceaf..d957115fe 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift @@ -15,15 +15,13 @@ extension WorkspaceDocument.SearchState { guard let url = workspace.fileURL else { return } indexStatus = .indexing(progress: 0.0) - let uuidString = UUID().uuidString - let createInfo: [String: Any] = [ - "id": uuidString, - "action": "create", - "title": "Indexing | Processing files", - "message": "Creating an index to enable fast and accurate searches within your codebase.", - "isLoading": true - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: createInfo) + + // Create activity using new API + let activity = workspace.activityManager.post( + title: "Indexing | Processing files", + message: "Creating an index to enable fast and accurate searches within your codebase.", + isLoading: true + ) Task.detached { let filePaths = self.getFileURLs(at: url) @@ -41,12 +39,11 @@ extension WorkspaceDocument.SearchState { await MainActor.run { self.indexStatus = .indexing(progress: progress) } - let updateInfo: [String: Any] = [ - "id": uuidString, - "action": "update", - "percentage": progress - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: updateInfo) + // Update activity using new API + self.workspace.activityManager.update( + id: activity.id, + percentage: progress + ) } } asyncController.index.flush() @@ -54,20 +51,18 @@ extension WorkspaceDocument.SearchState { await MainActor.run { self.indexStatus = .done } - let updateInfo: [String: Any] = [ - "id": uuidString, - "action": "update", - "title": "Finished indexing", - "isLoading": false - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: updateInfo) - - let deleteInfo = [ - "id": uuidString, - "action": "deleteWithDelay", - "delay": 4.0 - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: deleteInfo) + + // Update and delete activity using new API + self.workspace.activityManager.update( + id: activity.id, + title: "Finished indexing", + isLoading: false + ) + + self.workspace.activityManager.delete( + id: activity.id, + delay: 4.0 + ) } } diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift index 1b96e4fca..896af7149 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift @@ -41,14 +41,23 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { var taskManager: TaskManager? var workspaceSettingsManager: CEWorkspaceSettings? - var taskNotificationHandler: TaskNotificationHandler = TaskNotificationHandler() + @Published var activityManager: ActivityManager = ActivityManager() @Published var notificationPanel = NotificationPanelViewModel() + private var cancellables = Set() override init() { super.init() + // Observe changes to activity manager + activityManager.objectWillChange + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.objectWillChange.send() + } + .store(in: &cancellables) + // Observe changes to notification panel notificationPanel.objectWillChange .receive(on: DispatchQueue.main) @@ -156,7 +165,8 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { if let workspaceSettingsManager { self.taskManager = TaskManager( workspaceSettings: workspaceSettingsManager.settings, - workspaceURL: url + workspaceURL: url, + workspace: self ) } diff --git a/CodeEdit/Features/Tasks/Models/CEActiveTask.swift b/CodeEdit/Features/Tasks/Models/CEActiveTask.swift index 3b6d94cdb..45d296cfc 100644 --- a/CodeEdit/Features/Tasks/Models/CEActiveTask.swift +++ b/CodeEdit/Features/Tasks/Models/CEActiveTask.swift @@ -19,13 +19,20 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { /// The name of the associated task. @ObservedObject var task: CETask + /// Reference to the workspace that owns this task + weak var workspace: WorkspaceDocument? + + /// The activity associated with this task + private var activity: CEActivity? + var process: Process? var outputPipe: Pipe? private var cancellables = Set() - init(task: CETask) { + init(task: CETask, workspace: WorkspaceDocument?) { self.task = task + self.workspace = workspace self.process = Process() self.outputPipe = Pipe() @@ -47,7 +54,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { guard let process, let outputPipe else { return } await updateTaskStatus(to: .running) - createStatusTaskNotification() + createStatusActivity() process.terminationHandler = { [weak self] capturedProcess in if let self { @@ -84,7 +91,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { if terminationStatus == 0 { await updateOutput("\nFinished running \(task.name).\n\n") await updateTaskStatus(to: .finished) - updateTaskNotification( + updateActivity( title: "Finished Running \(task.name)", message: "", isLoading: false @@ -92,7 +99,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { } else if terminationStatus == 15 { await updateOutput("\n\(task.name) cancelled.\n\n") await updateTaskStatus(to: .notRunning) - updateTaskNotification( + updateActivity( title: "\(task.name) cancelled", message: "", isLoading: false @@ -100,7 +107,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { } else { await updateOutput("\nFailed to run \(task.name).\n\n") await updateTaskStatus(to: .failed) - updateTaskNotification( + updateActivity( title: "Failed Running \(task.name)", message: "", isLoading: false @@ -108,7 +115,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { } outputPipe?.fileHandleForReading.readabilityHandler = nil - deleteStatusTaskNotification() + deleteStatusActivity() } func renew() { @@ -144,44 +151,33 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable { output = "" } - private func createStatusTaskNotification() { - let userInfo: [String: Any] = [ - "id": self.task.id.uuidString, - "action": "createWithPriority", - "title": "Running \(self.task.name)", - "message": "Running your task: \(self.task.name).", - "isLoading": true - ] - - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) + private func createStatusActivity() { + activity = workspace?.activityManager.post( + priority: true, + title: "Running \(self.task.name)", + message: "Running your task: \(self.task.name).", + isLoading: true + ) } - private func deleteStatusTaskNotification() { - let deleteInfo: [String: Any] = [ - "id": "\(task.id.uuidString)", - "action": "deleteWithDelay", - "delay": 3.0 - ] - - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: deleteInfo) + private func deleteStatusActivity() { + if let activityId = activity?.id { + workspace?.activityManager.delete( + id: activityId, + delay: 3.0 + ) + } } - private func updateTaskNotification(title: String? = nil, message: String? = nil, isLoading: Bool? = nil) { - var userInfo: [String: Any] = [ - "id": task.id.uuidString, - "action": "update" - ] - if let title { - userInfo["title"] = title - } - if let message { - userInfo["message"] = message - } - if let isLoading { - userInfo["isLoading"] = isLoading + private func updateActivity(title: String? = nil, message: String? = nil, isLoading: Bool? = nil) { + if let activityId = activity?.id { + workspace?.activityManager.update( + id: activityId, + title: title, + message: message, + isLoading: isLoading + ) } - - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) } private func updateTaskStatus(to taskStatus: CETaskStatus) async { diff --git a/CodeEdit/Features/CEWorkspaceSettings/Models/CETask.swift b/CodeEdit/Features/Tasks/Models/CETask.swift similarity index 100% rename from CodeEdit/Features/CEWorkspaceSettings/Models/CETask.swift rename to CodeEdit/Features/Tasks/Models/CETask.swift diff --git a/CodeEdit/Features/Tasks/TaskManager.swift b/CodeEdit/Features/Tasks/TaskManager.swift index aeb96e2de..ec78262e8 100644 --- a/CodeEdit/Features/Tasks/TaskManager.swift +++ b/CodeEdit/Features/Tasks/TaskManager.swift @@ -18,10 +18,16 @@ class TaskManager: ObservableObject { private var workspaceURL: URL? private var settingsListener: AnyCancellable? + private weak var workspace: WorkspaceDocument? - init(workspaceSettings: CEWorkspaceSettingsData, workspaceURL: URL? = nil) { + init( + workspaceSettings: CEWorkspaceSettingsData, + workspaceURL: URL? = nil, + workspace: WorkspaceDocument? = nil + ) { self.workspaceURL = workspaceURL self.workspaceSettings = workspaceSettings + self.workspace = workspace settingsListener = workspaceSettings.$tasks .receive(on: DispatchQueue.main) @@ -79,7 +85,7 @@ class TaskManager: ObservableObject { } activeTask.run(workspaceURL: workspaceURL) } else { - let runningTask = CEActiveTask(task: task) + let runningTask = CEActiveTask(task: task, workspace: workspace) runningTask.run(workspaceURL: workspaceURL) await MainActor.run { activeTasks[task.id] = runningTask diff --git a/CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift b/CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift index 0d02c69f9..6e5177cb9 100644 --- a/CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift +++ b/CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift @@ -1,5 +1,5 @@ // -// TaskNotificationHandlerTests.swift +// ActivityManagerTests.swift // CodeEditTests // // Created by Tommy Ludwig on 21.06.24. @@ -8,128 +8,66 @@ import XCTest @testable import CodeEdit -final class TaskNotificationHandlerTests: XCTestCase { - var taskNotificationHandler: TaskNotificationHandler! +final class ActivityManagerTests: XCTestCase { + var activityManager: ActivityManager! override func setUp() { super.setUp() - taskNotificationHandler = TaskNotificationHandler() + activityManager = ActivityManager() } override func tearDown() { - taskNotificationHandler = nil + activityManager = nil super.tearDown() } func testCreateTask() { - let uuid = UUID().uuidString - let userInfo: [String: Any] = [ - "id": uuid, - "action": "create", - "title": "Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: userInfo) - - let testExpectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - XCTAssertEqual(self.taskNotificationHandler.notifications.first?.id, uuid) - testExpectation.fulfill() - } - wait(for: [testExpectation], timeout: 1) + let activity = activityManager.post(title: "Task Title") + XCTAssertEqual(activityManager.activities.first?.id, activity.id) + XCTAssertEqual(activityManager.activities.first?.title, "Task Title") } func testCreateTaskWithPriority() { - let task1: [String: Any] = [ - "id": UUID().uuidString, - "action": "create", - "title": "Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: task1) - - let task2: [String: Any] = [ - "id": UUID().uuidString, - "action": "createWithPriority", - "title": "Priority Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: task2) - - let testExpectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { - XCTAssertEqual(self.taskNotificationHandler.notifications.first?.title, "Priority Task Title") - testExpectation.fulfill() - } - wait(for: [testExpectation], timeout: 1) + let activity1 = activityManager.post(title: "Task Title") + let activity2 = activityManager.post( + priority: true, + title: "Priority Task Title" + ) + + XCTAssertEqual(activityManager.activities.first?.id, activity2.id) + XCTAssertEqual(activityManager.activities.first?.title, "Priority Task Title") + XCTAssertEqual(activityManager.activities.last?.id, activity1.id) } func testUpdateTask() { - let uuid = UUID().uuidString - let taskInfo: [String: Any] = [ - "id": uuid, - "action": "create", - "title": "Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: taskInfo) - - let taskUpdateInfo: [String: Any] = [ - "id": uuid, - "action": "update", - "title": "Updated Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: taskUpdateInfo) - - let testExpectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - XCTAssertEqual(self.taskNotificationHandler.notifications.first?.title, "Updated Task Title") - testExpectation.fulfill() - } - wait(for: [testExpectation], timeout: 1) + let activity = activityManager.post(title: "Task Title") + + activityManager.update( + id: activity.id, + title: "Updated Task Title" + ) + + XCTAssertEqual(activityManager.activities.first?.title, "Updated Task Title") } func testDeleteTask() { - let uuid = UUID().uuidString - let createUserInfo: [String: Any] = [ - "id": uuid, - "action": "create", - "title": "Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: createUserInfo) - let deleteUserInfo: [String: Any] = [ - "id": uuid, - "action": "delete" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: deleteUserInfo) - - let testExpectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - XCTAssertTrue(self.taskNotificationHandler.notifications.isEmpty) - testExpectation.fulfill() - } - wait(for: [testExpectation], timeout: 1) + let activity = activityManager.post(title: "Task Title") + activityManager.delete(id: activity.id) + + XCTAssertTrue(activityManager.activities.isEmpty) } func testDeleteTaskWithDelay() { - let uuid = UUID().uuidString - let createUserInfo: [String: Any] = [ - "id": uuid, - "action": "create", - "title": "Task Title" - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: createUserInfo) - let deleteUserInfo: [String: Any] = [ - "id": uuid, - "action": "deleteWithDelay", - "delay": 0.2 - ] - NotificationCenter.default.post(name: .taskNotification, object: nil, userInfo: deleteUserInfo) + let activity = activityManager.post(title: "Task Title") + activityManager.delete(id: activity.id, delay: 0.2) - let testExpectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - XCTAssertFalse(self.taskNotificationHandler.notifications.isEmpty) - } + XCTAssertFalse(activityManager.activities.isEmpty) + + let expectation = XCTestExpectation() DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - XCTAssertTrue(self.taskNotificationHandler.notifications.isEmpty) - testExpectation.fulfill() + XCTAssertTrue(self.activityManager.activities.isEmpty) + expectation.fulfill() } - wait(for: [testExpectation], timeout: 1) + wait(for: [expectation], timeout: 1) } } From 596847c3b41ebb447548684878925da654ab4a3d Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 16:17:18 -0600 Subject: [PATCH 18/32] Renamed a few files for consistency --- CodeEdit.xcodeproj/project.pbxproj | 235 +++++++++++++++++- ...lView.swift => ActivitiesDetailView.swift} | 6 +- ...ctivitiesView.swift => ActivityView.swift} | 2 +- .../ActivityManagerTests.swift} | 0 4 files changed, 226 insertions(+), 17 deletions(-) rename CodeEdit/Features/Activities/Views/{TaskNotificationsDetailView.swift => ActivitiesDetailView.swift} (91%) rename CodeEdit/Features/Activities/Views/{ActivitiesView.swift => ActivityView.swift} (97%) rename CodeEditTests/Features/{ActivityViewer/TaskNotificationHandlerTests.swift => Activities/ActivityManagerTests.swift} (100%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 6ffa54323..d80af3d81 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -53,11 +53,11 @@ 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 /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3CF2C25AFAE00B58BFE /* ActivityManager.swift */; }; - 617DB3D62C25B02D00B58BFE /* ActivitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D52C25B02D00B58BFE /* ActivitiesView.swift */; }; + 617DB3D62C25B02D00B58BFE /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D52C25B02D00B58BFE /* ActivityView.swift */; }; 617DB3D82C25B04D00B58BFE /* CECircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */; }; - 617DB3DA2C25B07F00B58BFE /* TaskNotificationsDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */; }; + 617DB3DA2C25B07F00B58BFE /* ActivitiesDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */; }; 617DB3DC2C25B14A00B58BFE /* ActivityViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */; }; - 617DB3DF2C25E13800B58BFE /* TaskNotificationHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */; }; + 617DB3DF2C25E13800B58BFE /* ActivityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.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 */; }; @@ -397,11 +397,11 @@ 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 /* ActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManager.swift; sourceTree = ""; }; - 617DB3D52C25B02D00B58BFE /* ActivitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivitiesView.swift; sourceTree = ""; }; + 617DB3D52C25B02D00B58BFE /* ActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityView.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 = ""; }; + 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivitiesDetailView.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 = ""; }; + 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManagerTests.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 = ""; }; @@ -1379,7 +1379,7 @@ isa = PBXGroup; children = ( 283BDCC22972F211002AFF81 /* Acknowledgements */, - 617DB3DD2C25E11500B58BFE /* ActivityViewer */, + 617DB3DD2C25E11500B58BFE /* Activities */, 583E527429361B39001AB554 /* CodeEditUI */, 587B612C2934199800D5CD8F /* CodeFile */, 4EE96EC82960562000FFBEA8 /* Documents */, @@ -2019,12 +2019,12 @@ path = Models; sourceTree = ""; }; - 617DB3DD2C25E11500B58BFE /* ActivityViewer */ = { + 617DB3DD2C25E11500B58BFE /* Activities */ = { isa = PBXGroup; children = ( - 617DB3DE2C25E13800B58BFE /* TaskNotificationHandlerTests.swift */, + 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.swift */, ); - path = ActivityViewer; + path = Activities; sourceTree = ""; }; 618725A22C29EFE200987354 /* ViewModifiers */ = { @@ -2566,8 +2566,8 @@ B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */, B69D3EE02C5F5357005CF43A /* TaskView.swift */, 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */, - 617DB3D52C25B02D00B58BFE /* ActivitiesView.swift */, - 617DB3D92C25B07F00B58BFE /* TaskNotificationsDetailView.swift */, + 617DB3D52C25B02D00B58BFE /* ActivityView.swift */, + 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */, 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */, 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */, ); @@ -3409,7 +3409,7 @@ 04BA7C142AE2AA7300584E1C /* GitCloneViewModel.swift in Sources */, B61A606129F188AB009B43F9 /* ExternalLink.swift in Sources */, 587B9E9729301D8F00AC7927 /* BitBucketAccount+Token.swift in Sources */, - 617DB3D62C25B02D00B58BFE /* ActivitiesView.swift in Sources */, + 617DB3D62C25B02D00B58BFE /* ActivityView.swift in Sources */, 587B9E7729301D8F00AC7927 /* String+PercentEncoding.swift in Sources */, 587B9E5B29301D8F00AC7927 /* GitCheckoutBranchView.swift in Sources */, 2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */, @@ -3710,6 +3710,190 @@ 04BA7C0B2AE2A2D100584E1C /* GitBranch.swift in Sources */, 6CAAF69229BCC71C00A1F48A /* (null) 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 /* ActivitiesDetailView.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; }; @@ -3717,6 +3901,31 @@ 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 /* ActivityManagerTests.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; }; diff --git a/CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift b/CodeEdit/Features/Activities/Views/ActivitiesDetailView.swift similarity index 91% rename from CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift rename to CodeEdit/Features/Activities/Views/ActivitiesDetailView.swift index 33513e69d..da6c1fc1d 100644 --- a/CodeEdit/Features/Activities/Views/TaskNotificationsDetailView.swift +++ b/CodeEdit/Features/Activities/Views/ActivitiesDetailView.swift @@ -1,5 +1,5 @@ // -// ActivitysDetailView.swift +// ActivitiesDetailView.swift // CodeEdit // // Created by Tommy Ludwig on 21.06.24. @@ -7,7 +7,7 @@ import SwiftUI -struct ActivitysDetailView: View { +struct ActivitiesDetailView: View { @ObservedObject var activityManager: ActivityManager @State private var selectedActivityIndex: Int = 0 @@ -45,5 +45,5 @@ struct ActivitysDetailView: View { } #Preview { - ActivitysDetailView(activityManager: ActivityManager()) + ActivitiesDetailView(activityManager: ActivityManager()) } diff --git a/CodeEdit/Features/Activities/Views/ActivitiesView.swift b/CodeEdit/Features/Activities/Views/ActivityView.swift similarity index 97% rename from CodeEdit/Features/Activities/Views/ActivitiesView.swift rename to CodeEdit/Features/Activities/Views/ActivityView.swift index 99577fb76..3ae937488 100644 --- a/CodeEdit/Features/Activities/Views/ActivitiesView.swift +++ b/CodeEdit/Features/Activities/Views/ActivityView.swift @@ -54,7 +54,7 @@ struct ActivityView: View { .padding(-3) .padding(.trailing, 3) .popover(isPresented: $isPresented, arrowEdge: .bottom) { - ActivitysDetailView(activityManager: activityManager) + ActivitiesDetailView(activityManager: activityManager) } .onTapGesture { self.isPresented.toggle() diff --git a/CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift b/CodeEditTests/Features/Activities/ActivityManagerTests.swift similarity index 100% rename from CodeEditTests/Features/ActivityViewer/TaskNotificationHandlerTests.swift rename to CodeEditTests/Features/Activities/ActivityManagerTests.swift From 87ebaa77da963761dfc49ce168d09d1c96f34bf2 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 16:31:42 -0600 Subject: [PATCH 19/32] Added Activities section to the Internal Developer Inspector for testing purposes. --- CodeEdit.xcodeproj/project.pbxproj | 4 + .../CodeEditSplitViewController.swift | 1 + .../InternalDevelopmentActivitiesView.swift | 75 +++++++++++++++++++ .../InternalDevelopmentInspectorView.swift | 5 +- ...InternalDevelopmentNotificationsView.swift | 2 +- 5 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index d80af3d81..5527a5c2e 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -167,6 +167,7 @@ B616EA8D2D65238900DF9029 /* InternalDevelopmentInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */; }; B616EA8F2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */; }; B616EA942D67C4DA00DF9029 /* CEActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA932D67C4DA00DF9029 /* CEActivity.swift */; }; + B616EA962D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.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 */; }; @@ -580,6 +581,7 @@ B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentInspectorView.swift; sourceTree = ""; }; B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentNotificationsView.swift; sourceTree = ""; }; B616EA932D67C4DA00DF9029 /* CEActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEActivity.swift; sourceTree = ""; }; + B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentActivitiesView.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 = ""; }; @@ -2552,6 +2554,7 @@ children = ( B616EA8B2D65238900DF9029 /* InternalDevelopmentInspectorView.swift */, B616EA8E2D662E9800DF9029 /* InternalDevelopmentNotificationsView.swift */, + B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift */, ); path = InternalDevelopmentInspector; sourceTree = ""; @@ -3659,6 +3662,7 @@ B66A4E5329C91831004573B4 /* CodeEditCommands.swift in Sources */, 58822529292C280D00E83CDE /* StatusBarLineEndSelector.swift in Sources */, 5C4BB1E128212B1E00A92FB2 /* World.swift in Sources */, + B616EA962D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift in Sources */, 581550D029FBD30400684881 /* FileSystemTableViewCell.swift in Sources */, B607183F2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift in Sources */, B62AEDD42A27B29F009A9F52 /* PaneToolbar.swift in Sources */, diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift index b21e57247..681ddeb0e 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift @@ -88,6 +88,7 @@ final class CodeEditSplitViewController: NSSplitViewController { InspectorAreaView(viewModel: InspectorAreaViewModel()) .environmentObject(workspace) .environmentObject(editorManager) + .environmentObject(workspace.activityManager) }) addSplitViewItem(inspector) diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift new file mode 100644 index 000000000..70b9dac9c --- /dev/null +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift @@ -0,0 +1,75 @@ +// +// InternalDevelopmentActivitiesView.swift +// CodeEdit +// +// Created by Austin Condiff on 2/20/25. +// + +import SwiftUI + +struct InternalDevelopmentActivitiesView: View { + @EnvironmentObject var activityManager: ActivityManager + + @State private var activityTitle: String = "Test Activity" + @State private var activityMessage: String = "This is a test activity." + @State private var activityProgress: Double = 0.0 + @State private var isLoading: Bool = false + @State private var isPriority: Bool = false + @State private var autoDelete: Bool = false + @State private var deleteDelay: Double = 3.0 + + var body: some View { + Section("Activities") { + Toggle("Priority", isOn: $isPriority) + Toggle("Loading", isOn: $isLoading) + + TextField("Title", text: $activityTitle) + TextField("Message", text: $activityMessage, axis: .vertical) + .lineLimit(1...5) + + if !isLoading { + HStack { + Text("Progress") + Slider(value: $activityProgress, in: 0...1) + Text("\(Int(activityProgress * 100))%") + .monospacedDigit() + .frame(width: 40, alignment: .trailing) + } + } + + Toggle("Auto Delete", isOn: $autoDelete) + + if autoDelete { + HStack { + Text("Delete After") + Slider(value: $deleteDelay, in: 1...10) + Text("\(Int(deleteDelay))s") + .monospacedDigit() + .frame(width: 30, alignment: .trailing) + } + } + + Button("Add Activity") { + let activity = activityManager.post( + priority: isPriority, + title: activityTitle, + message: activityMessage, + percentage: isLoading ? nil : activityProgress, + isLoading: isLoading + ) + + if autoDelete { + activityManager.delete(id: activity.id, delay: deleteDelay) + } + } + + if !activityManager.activities.isEmpty { + Button("Clear All Activities") { + for activity in activityManager.activities { + activityManager.delete(id: activity.id) + } + } + } + } + } +} diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift index 0906bbcbf..cd1b3c84b 100644 --- a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift @@ -2,14 +2,17 @@ // InternalDevelopmentInspectorView.swift // CodeEdit // -// Created by Austin Condiff on 2/19/24. +// Created by Austin Condiff on 2/19/25. // import SwiftUI struct InternalDevelopmentInspectorView: View { + @EnvironmentObject var activityManager: ActivityManager + var body: some View { Form { + InternalDevelopmentActivitiesView() InternalDevelopmentNotificationsView() } } diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift index 533488099..1ea73a278 100644 --- a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentNotificationsView.swift @@ -2,7 +2,7 @@ // InternalDevelopmentNotificationsView.swift // CodeEdit // -// Created by Austin Condiff on 2/19/24. +// Created by Austin Condiff on 2/19/25. // import SwiftUI From 4b262f86779f2624c99186dfc122e5483c5cda22 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 22:18:15 -0600 Subject: [PATCH 20/32] Fixed SwiftLint errors and made a few adjustments --- CodeEdit.xcodeproj/project.pbxproj | 2 +- .../Features/Activities/ActivityManager.swift | 10 ++++--- .../ActivityViewer/Models/CEActivity.swift | 9 +++++- .../CodeEditSplitViewController.swift | 2 +- .../WorkspaceDocument+Index.swift | 28 +++++++++---------- .../WorkspaceDocument+SearchState.swift | 4 ++- .../InternalDevelopmentInspectorView.swift | 2 +- .../Activities/ActivityManagerTests.swift | 6 ++-- 8 files changed, 37 insertions(+), 26 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 5527a5c2e..ebf0baff6 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -3256,7 +3256,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1330; - LastUpgradeCheck = 1540; + LastUpgradeCheck = 1620; TargetAttributes = { 2BE487EB28245162003F3F64 = { CreatedOnToolsVersion = 13.3.1; diff --git a/CodeEdit/Features/Activities/ActivityManager.swift b/CodeEdit/Features/Activities/ActivityManager.swift index d832f31f4..44db8232d 100644 --- a/CodeEdit/Features/Activities/ActivityManager.swift +++ b/CodeEdit/Features/Activities/ActivityManager.swift @@ -10,6 +10,7 @@ import Combine import SwiftUI /// Manages activities for a workspace +@MainActor final class ActivityManager: ObservableObject { /// Currently displayed activities @Published private(set) var activities: [CEActivity] = [] @@ -59,13 +60,13 @@ final class ActivityManager: ObservableObject { func update( id: String, title: String? = nil, - message: String? = nil, + message: String? = nil, percentage: Double? = nil, isLoading: Bool? = nil ) { if let index = activities.firstIndex(where: { $0.id == id }) { var activity = activities[index] - + if let title = title { activity.title = title } @@ -96,8 +97,9 @@ final class ActivityManager: ObservableObject { /// - id: ID of activity to delete /// - delay: Time to wait before deleting func delete(id: String, delay: TimeInterval) { - DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in - self?.delete(id: id) + Task { @MainActor in + try? await Task.sleep(for: .seconds(delay)) + delete(id: id) } } } diff --git a/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift b/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift index 59b2ee2ec..79aac26b9 100644 --- a/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift +++ b/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift @@ -1,7 +1,14 @@ +// +// CEActivity.swift +// CodeEdit +// +// Created by Austin Condiff on 2/20/25. +// + struct CEActivity: Equatable { var id: String var title: String var message: String? var percentage: Double? var isLoading: Bool = false -} +} diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift index 681ddeb0e..77ee7e3f2 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift @@ -41,7 +41,7 @@ final class CodeEditSplitViewController: NSSplitViewController { override func viewDidLoad() { super.viewDidLoad() - guard let windowRef else { + guard windowRef != nil else { // swiftlint:disable:next line_length assertionFailure("No WindowRef found, not initialized properly or the window was dereferenced and the controller was not.") return diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift index d957115fe..e1f1d8eb8 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift @@ -10,18 +10,20 @@ import Foundation extension WorkspaceDocument.SearchState { /// Adds the contents of the current workspace URL to the search index. /// That means that the contents of the workspace will be indexed and searchable. - func addProjectToIndex() { + func addProjectToIndex() async { guard let indexer = indexer else { return } guard let url = workspace.fileURL else { return } indexStatus = .indexing(progress: 0.0) - + // Create activity using new API - let activity = workspace.activityManager.post( - title: "Indexing | Processing files", - message: "Creating an index to enable fast and accurate searches within your codebase.", - isLoading: true - ) + let activity = await MainActor.run { + workspace.activityManager.post( + title: "Indexing | Processing files", + message: "Creating an index to enable fast and accurate searches within your codebase.", + isLoading: true + ) + } Task.detached { let filePaths = self.getFileURLs(at: url) @@ -39,8 +41,7 @@ extension WorkspaceDocument.SearchState { await MainActor.run { self.indexStatus = .indexing(progress: progress) } - // Update activity using new API - self.workspace.activityManager.update( + await self.workspace.activityManager.update( id: activity.id, percentage: progress ) @@ -51,15 +52,14 @@ extension WorkspaceDocument.SearchState { await MainActor.run { self.indexStatus = .done } - - // Update and delete activity using new API - self.workspace.activityManager.update( + + await self.workspace.activityManager.update( id: activity.id, title: "Finished indexing", isLoading: false ) - - self.workspace.activityManager.delete( + + await self.workspace.activityManager.delete( id: activity.id, delay: 4.0 ) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+SearchState.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+SearchState.swift index 261a4d224..046bc73dc 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+SearchState.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+SearchState.swift @@ -47,7 +47,9 @@ extension WorkspaceDocument { init(_ workspace: WorkspaceDocument) { self.workspace = workspace self.indexer = SearchIndexer.Memory.create() - addProjectToIndex() + Task { + await addProjectToIndex() + } } /// Represents the compare options to be used for find and replace. diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift index cd1b3c84b..9d061cc1e 100644 --- a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentInspectorView.swift @@ -9,7 +9,7 @@ import SwiftUI struct InternalDevelopmentInspectorView: View { @EnvironmentObject var activityManager: ActivityManager - + var body: some View { Form { InternalDevelopmentActivitiesView() diff --git a/CodeEditTests/Features/Activities/ActivityManagerTests.swift b/CodeEditTests/Features/Activities/ActivityManagerTests.swift index 6e5177cb9..705303319 100644 --- a/CodeEditTests/Features/Activities/ActivityManagerTests.swift +++ b/CodeEditTests/Features/Activities/ActivityManagerTests.swift @@ -41,7 +41,7 @@ final class ActivityManagerTests: XCTestCase { func testUpdateTask() { let activity = activityManager.post(title: "Task Title") - + activityManager.update( id: activity.id, title: "Updated Task Title" @@ -53,7 +53,7 @@ final class ActivityManagerTests: XCTestCase { func testDeleteTask() { let activity = activityManager.post(title: "Task Title") activityManager.delete(id: activity.id) - + XCTAssertTrue(activityManager.activities.isEmpty) } @@ -62,7 +62,7 @@ final class ActivityManagerTests: XCTestCase { activityManager.delete(id: activity.id, delay: 0.2) XCTAssertFalse(activityManager.activities.isEmpty) - + let expectation = XCTestExpectation() DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { XCTAssertTrue(self.activityManager.activities.isEmpty) From 97d7f07aaefc3eb2aa58e3f40c68ff031b0c4037 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 22:43:58 -0600 Subject: [PATCH 21/32] Added update and delete functions to notification manager. --- .../Notifications/Models/CENotification.swift | 10 ++-- .../NotificationManager+Delegate.swift | 2 +- .../NotificationManager+System.swift | 6 +- .../Notifications/NotificationManager.swift | 58 +++++++++++++++++++ .../Views/NotificationBannerView.swift | 1 - .../Views/NotificationPanelView.swift | 1 - 6 files changed, 67 insertions(+), 11 deletions(-) diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift index 6512d7863..e73ef4a99 100644 --- a/CodeEdit/Features/Notifications/Models/CENotification.swift +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -11,11 +11,11 @@ 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 title: String + var description: String + var actionButtonTitle: String + var action: () -> Void + var isSticky: Bool var isRead: Bool let timestamp: Date var isBeingDismissed: Bool = false diff --git a/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift b/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift index 967023db1..18febee98 100644 --- a/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift +++ b/CodeEdit/Features/Notifications/NotificationManager+Delegate.swift @@ -43,7 +43,7 @@ extension NotificationManager: UNUserNotificationCenterDelegate { completionHandler([.banner, .sound]) } - func setupNotificationDelegate() { + public func setupNotificationDelegate() { UNUserNotificationCenter.current().delegate = self // Create action button diff --git a/CodeEdit/Features/Notifications/NotificationManager+System.swift b/CodeEdit/Features/Notifications/NotificationManager+System.swift index 24522d7c4..ab2c4773a 100644 --- a/CodeEdit/Features/Notifications/NotificationManager+System.swift +++ b/CodeEdit/Features/Notifications/NotificationManager+System.swift @@ -10,7 +10,7 @@ import UserNotifications extension NotificationManager { /// Shows a system notification when app is in background - func showSystemNotification(_ notification: CENotification) { + public func showSystemNotification(_ notification: CENotification) { let content = UNMutableNotificationContent() content.title = notification.title content.body = notification.description @@ -29,14 +29,14 @@ extension NotificationManager { } /// Removes a system notification - func removeSystemNotification(_ notification: CENotification) { + public func removeSystemNotification(_ notification: CENotification) { UNUserNotificationCenter.current().removeDeliveredNotifications( withIdentifiers: [notification.id.uuidString] ) } /// Handles response from system notification - func handleSystemNotificationResponse(id: String) { + public func handleSystemNotificationResponse(id: String) { if let uuid = UUID(uuidString: id), let notification = notifications.first(where: { $0.id == uuid }) { notification.action() diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index 1b02baea1..52aba99b5 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -172,6 +172,64 @@ final class NotificationManager: NSObject, ObservableObject { } } + /// Updates an existing notification + /// - Parameters: + /// - id: UUID of notification to update + /// - title: New title (optional) + /// - description: New description (optional) + /// - actionButtonTitle: New action button title (optional) + /// - action: New action closure (optional) + /// - isSticky: New sticky state (optional) + func update( + id: UUID, + title: String? = nil, + description: String? = nil, + actionButtonTitle: String? = nil, + action: (() -> Void)? = nil, + isSticky: Bool? = nil + ) { + if let index = notifications.firstIndex(where: { $0.id == id }) { + var notification = notifications[index] + + if let title = title { + notification.title = title + } + if let description = description { + notification.description = description + } + if let actionButtonTitle = actionButtonTitle { + notification.actionButtonTitle = actionButtonTitle + } + if let action = action { + notification.action = action + } + if let isSticky = isSticky { + notification.isSticky = isSticky + } + + notifications[index] = notification + } + } + + /// Deletes a notification + /// - Parameter id: UUID of notification to delete + func delete(id: UUID) { + if let notification = notifications.first(where: { $0.id == id }) { + dismissNotification(notification) + } + } + + /// Deletes a notification after a delay + /// - Parameters: + /// - id: UUID of notification to delete + /// - delay: Time to wait before deleting + func delete(id: UUID, delay: TimeInterval) { + Task { @MainActor in + try? await Task.sleep(for: .seconds(delay)) + delete(id: id) + } + } + override init() { super.init() setupNotificationDelegate() diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index 8f739611e..7ded63d6e 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -12,7 +12,6 @@ struct NotificationBannerView: View { private var colorScheme @EnvironmentObject private var workspace: WorkspaceDocument - @ObservedObject private var notificationManager = NotificationManager.shared @Environment(\.colorScheme) private var colorScheme diff --git a/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift b/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift index c2c764eeb..fd8de522a 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationPanelView.swift @@ -12,7 +12,6 @@ struct NotificationPanelView: View { @Environment(\.controlActiveState) private var controlActiveState - @ObservedObject private var notificationManager = NotificationManager.shared @FocusState private var isFocused: Bool // ID for the top anchor From 694d8687a4315f88dce9ed1b1d185c746cf148a9 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 20 Feb 2025 23:14:24 -0600 Subject: [PATCH 22/32] Fixed some tests --- .../Activities/ActivityManagerTests.swift | 94 +++++++++++-------- ...ment+SearchState+FindAndReplaceTests.swift | 4 +- .../Features/Tasks/CEActiveTaskTests.swift | 9 +- 3 files changed, 68 insertions(+), 39 deletions(-) diff --git a/CodeEditTests/Features/Activities/ActivityManagerTests.swift b/CodeEditTests/Features/Activities/ActivityManagerTests.swift index 705303319..2a32678c5 100644 --- a/CodeEditTests/Features/Activities/ActivityManagerTests.swift +++ b/CodeEditTests/Features/Activities/ActivityManagerTests.swift @@ -11,63 +11,83 @@ import XCTest final class ActivityManagerTests: XCTestCase { var activityManager: ActivityManager! - override func setUp() { - super.setUp() - activityManager = ActivityManager() + override func setUp() async throws { + try await super.setUp() + // Initialize on main actor since ActivityManager is main actor-isolated + await MainActor.run { + activityManager = ActivityManager() + } } - override func tearDown() { - activityManager = nil - super.tearDown() + override func tearDown() async throws { + await MainActor.run { + activityManager = nil + } + try await super.tearDown() } - func testCreateTask() { - let activity = activityManager.post(title: "Task Title") - XCTAssertEqual(activityManager.activities.first?.id, activity.id) - XCTAssertEqual(activityManager.activities.first?.title, "Task Title") + func testCreateTask() async { + await MainActor.run { + let activity = activityManager.post(title: "Task Title") + XCTAssertEqual(activityManager.activities.first?.id, activity.id) + XCTAssertEqual(activityManager.activities.first?.title, "Task Title") + } } - func testCreateTaskWithPriority() { - let activity1 = activityManager.post(title: "Task Title") - let activity2 = activityManager.post( - priority: true, - title: "Priority Task Title" - ) + func testCreateTaskWithPriority() async { + await MainActor.run { + let activity1 = activityManager.post(title: "Task Title") + let activity2 = activityManager.post( + priority: true, + title: "Priority Task Title" + ) - XCTAssertEqual(activityManager.activities.first?.id, activity2.id) - XCTAssertEqual(activityManager.activities.first?.title, "Priority Task Title") - XCTAssertEqual(activityManager.activities.last?.id, activity1.id) + XCTAssertEqual(activityManager.activities.first?.id, activity2.id) + XCTAssertEqual(activityManager.activities.first?.title, "Priority Task Title") + XCTAssertEqual(activityManager.activities.last?.id, activity1.id) + } } - func testUpdateTask() { - let activity = activityManager.post(title: "Task Title") + func testUpdateTask() async { + await MainActor.run { + let activity = activityManager.post(title: "Task Title") - activityManager.update( - id: activity.id, - title: "Updated Task Title" - ) + activityManager.update( + id: activity.id, + title: "Updated Task Title" + ) - XCTAssertEqual(activityManager.activities.first?.title, "Updated Task Title") + XCTAssertEqual(activityManager.activities.first?.title, "Updated Task Title") + } } - func testDeleteTask() { - let activity = activityManager.post(title: "Task Title") - activityManager.delete(id: activity.id) + func testDeleteTask() async { + await MainActor.run { + let activity = activityManager.post(title: "Task Title") + activityManager.delete(id: activity.id) - XCTAssertTrue(activityManager.activities.isEmpty) + XCTAssertTrue(activityManager.activities.isEmpty) + } } - func testDeleteTaskWithDelay() { - let activity = activityManager.post(title: "Task Title") - activityManager.delete(id: activity.id, delay: 0.2) + func testDeleteTaskWithDelay() async throws { + let expectation = XCTestExpectation() - XCTAssertFalse(activityManager.activities.isEmpty) + await MainActor.run { + let activity = activityManager.post(title: "Task Title") + activityManager.delete(id: activity.id, delay: 0.2) - let expectation = XCTestExpectation() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + XCTAssertFalse(activityManager.activities.isEmpty) + } + + // Wait for deletion + try await Task.sleep(nanoseconds: 300_000_000) // 0.3 seconds + + await MainActor.run { XCTAssertTrue(self.activityManager.activities.isEmpty) expectation.fulfill() } - wait(for: [expectation], timeout: 1) + + await fulfillment(of: [expectation], timeout: 1) } } diff --git a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift index 72fd990db..b03099365 100644 --- a/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift +++ b/CodeEditTests/Features/Documents/WorkspaceDocument+SearchState+FindAndReplaceTests.swift @@ -99,7 +99,9 @@ final class FindAndReplaceTests: XCTestCase { // IMPORTANT: // This is only a temporary solution, in the feature a file watcher would track the file update // and trigger a index update. - searchState.addProjectToIndex() + Task { + await searchState.addProjectToIndex() + } let startTime = Date() while searchState.indexStatus != .done { try? await Task.sleep(nanoseconds: 100_000_000) diff --git a/CodeEditTests/Features/Tasks/CEActiveTaskTests.swift b/CodeEditTests/Features/Tasks/CEActiveTaskTests.swift index 4ecc58fac..e13446af1 100644 --- a/CodeEditTests/Features/Tasks/CEActiveTaskTests.swift +++ b/CodeEditTests/Features/Tasks/CEActiveTaskTests.swift @@ -11,21 +11,28 @@ import XCTest final class CEActiveTaskTests: XCTestCase { var task: CETask! var activeTask: CEActiveTask! + var mockWorkspace: WorkspaceDocument! override func setUpWithError() throws { try super.setUpWithError() + mockWorkspace = try WorkspaceDocument( + contentsOf: URL(fileURLWithPath: NSTemporaryDirectory()), + ofType: "public.folder" + ) + task = CETask( name: "Test Task", command: "echo $STATE", environmentVariables: [CETask.EnvironmentVariable(key: "STATE", value: "Testing")] ) - activeTask = CEActiveTask(task: task) + activeTask = CEActiveTask(task: task, workspace: mockWorkspace) } override func tearDownWithError() throws { task = nil activeTask = nil + mockWorkspace = nil try super.tearDownWithError() } From e602eabfd02c33562bd74cbbef913cfecf0c1e2e Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Fri, 21 Feb 2025 22:55:09 -0600 Subject: [PATCH 23/32] Put back window observer --- .../CodeEditSplitViewController.swift | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift index 77ee7e3f2..0e4839200 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift @@ -69,13 +69,15 @@ final class CodeEditSplitViewController: NSSplitViewController { addSplitViewItem(navigator) let workspaceView = SettingsInjector { - WorkspaceView() - .environmentObject(workspace) - .environmentObject(editorManager) - .environmentObject(statusBarViewModel) - .environmentObject(utilityAreaModel) - .environmentObject(taskManager) - .environmentObject(workspace.activityManager) + WindowObserver(window: WindowBox(value: windowRef)) { + WorkspaceView() + .environmentObject(workspace) + .environmentObject(editorManager) + .environmentObject(statusBarViewModel) + .environmentObject(utilityAreaModel) + .environmentObject(taskManager) + .environmentObject(workspace.activityManager) + } } let mainContent = NSSplitViewItem(viewController: NSHostingController(rootView: workspaceView)) From 09e52d7af215520e82e7e889f2fa28e3f478cb04 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 26 Feb 2025 15:11:27 -0600 Subject: [PATCH 24/32] Clip the inspector so when scrolled, contents can't be seen under toolbar and tabs --- CodeEdit/Features/CodeEditUI/Views/WorkspacePanelView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/CodeEdit/Features/CodeEditUI/Views/WorkspacePanelView.swift b/CodeEdit/Features/CodeEditUI/Views/WorkspacePanelView.swift index 4637d2785..f37cd2662 100644 --- a/CodeEdit/Features/CodeEditUI/Views/WorkspacePanelView.swift +++ b/CodeEdit/Features/CodeEditUI/Views/WorkspacePanelView.swift @@ -40,6 +40,7 @@ struct WorkspacePanelView: CEContentUnavailableView("No Selection") } } + .clipped() .safeAreaInset(edge: .leading, spacing: 0) { if sidebarPosition == .side { HStack(spacing: 0) { From 43ca864a1b94b7869e6eaf73ba75f5a470bb5b12 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 27 Feb 2025 10:57:56 -0600 Subject: [PATCH 25/32] Performance improvements --- .../Features/Activities/ActivityManager.swift | 53 +++++++++++++------ .../WorkspaceDocument+Index.swift | 51 +++++++++++------- .../InternalDevelopmentActivitiesView.swift | 53 +++++++++++++++++++ 3 files changed, 122 insertions(+), 35 deletions(-) diff --git a/CodeEdit/Features/Activities/ActivityManager.swift b/CodeEdit/Features/Activities/ActivityManager.swift index 44db8232d..089999656 100644 --- a/CodeEdit/Features/Activities/ActivityManager.swift +++ b/CodeEdit/Features/Activities/ActivityManager.swift @@ -15,6 +15,9 @@ final class ActivityManager: ObservableObject { /// Currently displayed activities @Published private(set) var activities: [CEActivity] = [] + /// Debounce work item for batching updates + private var updateWorkItems: [String: DispatchWorkItem] = [:] + /// Posts a new activity /// - Parameters: /// - priority: Whether to insert at start of list @@ -50,7 +53,7 @@ final class ActivityManager: ObservableObject { return activity } - /// Updates an existing activity + /// Updates an existing activity with debouncing /// - Parameters: /// - id: ID of activity to update /// - title: New title (optional) @@ -64,29 +67,49 @@ final class ActivityManager: ObservableObject { percentage: Double? = nil, isLoading: Bool? = nil ) { - if let index = activities.firstIndex(where: { $0.id == id }) { - var activity = activities[index] + // Cancel any pending update for this specific activity + updateWorkItems[id]?.cancel() - if let title = title { - activity.title = title - } - if let message = message { - activity.message = message - } - if let percentage = percentage { - activity.percentage = percentage - } - if let isLoading = isLoading { - activity.isLoading = isLoading + // Create new work item + let workItem = DispatchWorkItem { [weak self] in + guard let self else { return } + + if let index = self.activities.firstIndex(where: { $0.id == id }) { + var activity = self.activities[index] + + if let title = title { + activity.title = title + } + if let message = message { + activity.message = message + } + if let percentage = percentage { + activity.percentage = percentage + } + if let isLoading = isLoading { + activity.isLoading = isLoading + } + + withAnimation(.easeInOut(duration: 0.15)) { + self.activities[index] = activity + } } - activities[index] = activity + self.updateWorkItems.removeValue(forKey: id) } + + // Store work item and schedule after delay + updateWorkItems[id] = workItem + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05, execute: workItem) } /// Deletes an activity /// - Parameter id: ID of activity to delete func delete(id: String) { + // Clear any pending updates for this activity + updateWorkItems[id]?.cancel() + updateWorkItems.removeValue(forKey: id) + withAnimation(.easeInOut(duration: 0.3)) { activities.removeAll { $0.id == id } } diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift index e1f1d8eb8..5a5a4620c 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift @@ -27,42 +27,53 @@ extension WorkspaceDocument.SearchState { Task.detached { let filePaths = self.getFileURLs(at: url) - let asyncController = SearchIndexer.AsyncManager(index: indexer) var lastProgress: Double = 0 + // Batch our progress updates + var pendingProgress: Double? + + func updateProgress(_ progress: Double) async { + await MainActor.run { + self.indexStatus = .indexing(progress: progress) + self.workspace.activityManager.update( + id: activity.id, + percentage: progress + ) + } + } + for await (file, index) in AsyncFileIterator(fileURLs: filePaths) { _ = await asyncController.addText(files: [file], flushWhenComplete: false) let progress = Double(index) / Double(filePaths.count) - // Send only if difference is > 0.5%, to keep updates from sending too frequently - if progress - lastProgress > 0.005 || index == filePaths.count - 1 { + // Send only if difference is > 1% + if progress - lastProgress > 0.01 { lastProgress = progress - await MainActor.run { - self.indexStatus = .indexing(progress: progress) + pendingProgress = progress + + // Only update UI every 100ms + if index == filePaths.count - 1 || pendingProgress != nil { + await updateProgress(progress) + pendingProgress = nil } - await self.workspace.activityManager.update( - id: activity.id, - percentage: progress - ) } } + asyncController.index.flush() await MainActor.run { self.indexStatus = .done + self.workspace.activityManager.update( + id: activity.id, + title: "Finished indexing", + isLoading: false + ) + self.workspace.activityManager.delete( + id: activity.id, + delay: 4.0 + ) } - - await self.workspace.activityManager.update( - id: activity.id, - title: "Finished indexing", - isLoading: false - ) - - await self.workspace.activityManager.delete( - id: activity.id, - delay: 4.0 - ) } } diff --git a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift index 70b9dac9c..ed5241c53 100644 --- a/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift +++ b/CodeEdit/Features/InspectorArea/InternalDevelopmentInspector/InternalDevelopmentActivitiesView.swift @@ -18,6 +18,10 @@ struct InternalDevelopmentActivitiesView: View { @State private var autoDelete: Bool = false @State private var deleteDelay: Double = 3.0 + // New state for progress timer + @State private var isProgressTimerRunning: Bool = false + @State private var progressActivity: CEActivity? + var body: some View { Section("Activities") { Toggle("Priority", isOn: $isPriority) @@ -70,6 +74,55 @@ struct InternalDevelopmentActivitiesView: View { } } } + + Section("Progress Timer Test") { + Button(isProgressTimerRunning ? "Stop Progress Timer" : "Start Progress Timer") { + if isProgressTimerRunning { + isProgressTimerRunning = false + if let activity = progressActivity { + activityManager.delete(id: activity.id) + } + progressActivity = nil + } else { + isProgressTimerRunning = true + progressActivity = activityManager.post( + priority: isPriority, + title: "Progress Timer", + message: "Updating every 50ms", + percentage: 0.0 + ) + + // Start timer to update progress + Task { @MainActor in + var progress = 0.0 + while isProgressTimerRunning && progress < 1.0 { + // Update in 5% increments + progress = min(1.0, progress + 0.05) + if let activity = progressActivity { + activityManager.update( + id: activity.id, + percentage: progress + ) + } + // Wait longer between updates + try? await Task.sleep(for: .milliseconds(100)) + } + + // Cleanup when done + if let activity = progressActivity { + activityManager.update( + id: activity.id, + title: "Progress Timer Complete", + percentage: 1.0 + ) + activityManager.delete(id: activity.id, delay: 2.0) + } + isProgressTimerRunning = false + progressActivity = nil + } + } + } + } } } } From ca6a3fcb8b76aa19ea27846f264f475d87939db7 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 4 Mar 2025 13:38:00 -0600 Subject: [PATCH 26/32] Made fixes suggested in PR. --- .../WorkspaceDocument+Index.swift | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift index 5a5a4620c..228232196 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift @@ -24,6 +24,10 @@ extension WorkspaceDocument.SearchState { isLoading: true ) } + + let (progressStream, continuation) = AsyncStream.makeStream() + // Dispatch this now, we want to continue after starting to monitor + Task { await self.monitorProgressStream(progressStream, activityId: activity.id) } Task.detached { let filePaths = self.getFileURLs(at: url) @@ -33,16 +37,6 @@ extension WorkspaceDocument.SearchState { // Batch our progress updates var pendingProgress: Double? - func updateProgress(_ progress: Double) async { - await MainActor.run { - self.indexStatus = .indexing(progress: progress) - self.workspace.activityManager.update( - id: activity.id, - percentage: progress - ) - } - } - for await (file, index) in AsyncFileIterator(fileURLs: filePaths) { _ = await asyncController.addText(files: [file], flushWhenComplete: false) let progress = Double(index) / Double(filePaths.count) @@ -54,7 +48,7 @@ extension WorkspaceDocument.SearchState { // Only update UI every 100ms if index == filePaths.count - 1 || pendingProgress != nil { - await updateProgress(progress) + continuation.yield(progress) pendingProgress = nil } } @@ -77,6 +71,25 @@ extension WorkspaceDocument.SearchState { } } + /// Monitors a progress stream from ``addProjectToIndex()`` and updates ``indexStatus`` and the workspace's activity + /// manager accordingly. + /// + /// Without this, updates can come too fast for `Combine` to handle and can cause crashes. + /// + /// - Parameters: + /// - stream: The stream to monitor for progress updates, in %. + /// - activityId: The activity ID that's being monitored + @MainActor + private func monitorProgressStream(_ stream: AsyncStream, activityId: String) async { + for await progressUpdate in stream.debounce(for: .milliseconds(10)) { + self.indexStatus = .indexing(progress: progressUpdate) + self.workspace.activityManager.update( + id: activityId, + percentage: progressUpdate + ) + } + } + /// Retrieves an array of file URLs within the specified directory URL. /// /// - Parameter url: The URL of the directory to search for files. From c4f7479a592866c61320ad55d1a24a6403afe822 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 4 Mar 2025 14:43:46 -0600 Subject: [PATCH 27/32] Rebased from latest main --- .../Notifications/Models/CENotification.swift | 77 ++--------------- .../Notifications/NotificationManager.swift | 86 ------------------- .../Views/NotificationBannerView.swift | 5 -- 3 files changed, 5 insertions(+), 163 deletions(-) diff --git a/CodeEdit/Features/Notifications/Models/CENotification.swift b/CodeEdit/Features/Notifications/Models/CENotification.swift index e73ef4a99..f71d39a49 100644 --- a/CodeEdit/Features/Notifications/Models/CENotification.swift +++ b/CodeEdit/Features/Notifications/Models/CENotification.swift @@ -11,11 +11,11 @@ import SwiftUI struct CENotification: Identifiable, Equatable { let id: UUID let icon: IconType - var title: String - var description: String - var actionButtonTitle: String - var action: () -> Void - var isSticky: Bool + 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 @@ -95,73 +95,6 @@ struct CENotification: Identifiable, Equatable { ) } - private init( - id: UUID, - icon: IconType, - title: String, - description: String, - actionButtonTitle: String, - action: @escaping () -> Void, - isSticky: Bool, - isRead: Bool - ) { - self.id = id - self.icon = .symbol(name: iconSymbol, color: iconColor) - self.title = title - self.description = description - self.actionButtonTitle = actionButtonTitle - self.action = action - self.isSticky = isSticky - self.isRead = isRead - self.timestamp = Date() - } - - 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, diff --git a/CodeEdit/Features/Notifications/NotificationManager.swift b/CodeEdit/Features/Notifications/NotificationManager.swift index 52aba99b5..e27051418 100644 --- a/CodeEdit/Features/Notifications/NotificationManager.swift +++ b/CodeEdit/Features/Notifications/NotificationManager.swift @@ -23,34 +23,6 @@ final class NotificationManager: NSObject, ObservableObject { private var isAppActive: Bool = true - /// Whether notifications were manually shown via toolbar - @Published private(set) var isManuallyShown: Bool = false - - /// Set of hidden notification IDs - private var hiddenNotificationIds: Set = [] - - /// Whether any non-sticky notifications are currently hidden - private var hasHiddenNotifications: Bool { - activeNotifications.contains { notification in - !notification.isSticky && !isNotificationVisible(notification) - } - } - - /// Whether a notification should be visible in the overlay - 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 isManuallyShown { - return true // Show all notifications when manually shown - } - // Otherwise, show if not hidden and has active timer - return !hiddenNotificationIds.contains(notification.id) && timers[notification.id] != nil - } - /// Number of unread notifications var unreadCount: Int { notifications.filter { !$0.isRead }.count @@ -172,64 +144,6 @@ final class NotificationManager: NSObject, ObservableObject { } } - /// Updates an existing notification - /// - Parameters: - /// - id: UUID of notification to update - /// - title: New title (optional) - /// - description: New description (optional) - /// - actionButtonTitle: New action button title (optional) - /// - action: New action closure (optional) - /// - isSticky: New sticky state (optional) - func update( - id: UUID, - title: String? = nil, - description: String? = nil, - actionButtonTitle: String? = nil, - action: (() -> Void)? = nil, - isSticky: Bool? = nil - ) { - if let index = notifications.firstIndex(where: { $0.id == id }) { - var notification = notifications[index] - - if let title = title { - notification.title = title - } - if let description = description { - notification.description = description - } - if let actionButtonTitle = actionButtonTitle { - notification.actionButtonTitle = actionButtonTitle - } - if let action = action { - notification.action = action - } - if let isSticky = isSticky { - notification.isSticky = isSticky - } - - notifications[index] = notification - } - } - - /// Deletes a notification - /// - Parameter id: UUID of notification to delete - func delete(id: UUID) { - if let notification = notifications.first(where: { $0.id == id }) { - dismissNotification(notification) - } - } - - /// Deletes a notification after a delay - /// - Parameters: - /// - id: UUID of notification to delete - /// - delay: Time to wait before deleting - func delete(id: UUID, delay: TimeInterval) { - Task { @MainActor in - try? await Task.sleep(for: .seconds(delay)) - delete(id: id) - } - } - override init() { super.init() setupNotificationDelegate() diff --git a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift index 7ded63d6e..c74e763d4 100644 --- a/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift +++ b/CodeEdit/Features/Notifications/Views/NotificationBannerView.swift @@ -13,11 +13,6 @@ struct NotificationBannerView: View { @EnvironmentObject private var workspace: WorkspaceDocument - @Environment(\.colorScheme) - private var colorScheme - - @ObservedObject private var notificationManager = NotificationManager.shared - let notification: CENotification let onDismiss: () -> Void let onAction: () -> Void From 6f2e6111638b9fd8b1bb008c39acb68079b9485c Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Tue, 4 Mar 2025 14:55:07 -0600 Subject: [PATCH 28/32] Removed files inadvertedly added durring rebase --- .../ActivityViewer/Models/CEActivity.swift | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 CodeEdit/Features/ActivityViewer/Models/CEActivity.swift diff --git a/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift b/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift deleted file mode 100644 index 79aac26b9..000000000 --- a/CodeEdit/Features/ActivityViewer/Models/CEActivity.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// CEActivity.swift -// CodeEdit -// -// Created by Austin Condiff on 2/20/25. -// - -struct CEActivity: Equatable { - var id: String - var title: String - var message: String? - var percentage: Double? - var isLoading: Bool = false -} From 17b940f1c33d8032b0d9b500c9c3fbcf0d44a5f1 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 5 Mar 2025 15:44:34 -0600 Subject: [PATCH 29/32] Rebased from main --- CodeEdit.xcodeproj/project.pbxproj | 3570 ++-------------------------- 1 file changed, 167 insertions(+), 3403 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index ebf0baff6..75e43e23e 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -16,87 +16,6 @@ 583E529C29361BAB001AB554 /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 583E529B29361BAB001AB554 /* SnapshotTesting */; }; 58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */ = {isa = PBXBuildFile; fileRef = 58F2EACE292FB2B0004A9BDE /* Documentation.docc */; }; 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 /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3CF2C25AFAE00B58BFE /* ActivityManager.swift */; }; - 617DB3D62C25B02D00B58BFE /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D52C25B02D00B58BFE /* ActivityView.swift */; }; - 617DB3D82C25B04D00B58BFE /* CECircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */; }; - 617DB3DA2C25B07F00B58BFE /* ActivitiesDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */; }; - 617DB3DC2C25B14A00B58BFE /* ActivityViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */; }; - 617DB3DF2C25E13800B58BFE /* ActivityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.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 */; }; 6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C0824A02C5C0C9700A0751E /* SwiftTerm */; }; 6C147C4529A329350089B630 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = 6C147C4429A329350089B630 /* OrderedCollections */; }; @@ -120,172 +39,87 @@ 6CC17B4F2C432AE000834E2C /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC17B4E2C432AE000834E2C /* CodeEditSourceEditor */; }; 6CD3CA552C8B508200D83DCD /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CD3CA542C8B508200D83DCD /* CodeEditSourceEditor */; }; 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 */; }; - B616EA942D67C4DA00DF9029 /* CEActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA932D67C4DA00DF9029 /* CEActivity.swift */; }; - B616EA962D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.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 */; }; + B65B10EF2B07C454002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B65B10F22B07D34F002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B65B10F52B081A0C002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B65B10F82B081A34002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B65B10FE2B08B07D002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B65B11042B09DB1C002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66460592D600E9500EC1411 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B664605A2D600E9500EC1411 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B664C3B32B96634F00816B4E /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E4529C8E86D004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E4C29C9179B004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E4F29C917B8004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E5129C917D5004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E5329C91831004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B66A4E5629C918A0004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67700F92D2A2662004FD61F /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DB0F62AFC2A7A002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DB0F92AFDF638002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DB0FC2AFDF71F002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB882CD51C55007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB8A2CD5D8F7007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB8C2CD5D9CB007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB902CD5EA77007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB922CD5EAAB007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B67DBB942CD5FC08007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B68108042C60287F008B27C1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B685DE7929CC9CCD002860C8 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B68DE5E52D5A7988009A43EF /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6966A282C2F683300259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6966A2A2C2F687A00259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6966A2E2C3056AD00259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6966A302C33282200259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6966A322C3348D300259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B696A7E62CFE20C40048CFE1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B697937A29FF5668002027EC /* (null) in Sources */ = {isa = PBXBuildFile; }; + B69970322D63E5C700BB132D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B69BFDC72B0686910050D9A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B69D3EE12C5F5357005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B69D3EE32C5F536B005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B69D3EE52C5F54B3005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6A43C5D29FC4AF00027E0E0 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6AB09A12AAABAAE0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6AB09A32AAABFEC0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6AB09A52AAAC00F0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6AB09B32AB919CF0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6B2D79F2CE8794E00379967 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6B2D7A12CE8797B00379967 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C4F2A12B3CA37500B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C4F2A32B3CA74800B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C4F2A62B3CABD200B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C4F2A92B3CB00100B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C6A42A297716A500A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C6A42E29771A8D00A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6C6A43029771F7100A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6CFD80D2C1B9A8000E63F1A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6CFD8112C20A8EE00E63F1A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6D7EA592971078500301FAC /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6D7EA5C297107DD00301FAC /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6DCDAC62CCDE2B90099FBF9 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E38E022CD3E63A00F4E65A /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C7029DD157F0088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C7429DD40010088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C7929DE02800088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C8B29DE7AE80088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C8F29DE9CD80088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E41C9429DEAE260088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6E55C3B2A95368E003ECC7D /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA1FE529DA33DB001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA1FE729DA341D001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA1FF829DB78DB001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA1FFB29DB78F6001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA1FFD29DB792C001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA200029DB7966001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EA200229DB7F81001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6EE989027E8879A00CDD8AB /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6F0517029D9E36800D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6F0517729D9E3AD00D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6F0517929D9E3C900D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6F0517B29D9E46400D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6F0517D29D9E4B100D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; + B6FA3F882BF41C940023DE9C /* (null) in Sources */ = {isa = PBXBuildFile; }; B6FF04782B6C08AC002C2C78 /* DefaultThemes in Resources */ = {isa = PBXBuildFile; fileRef = B6FF04772B6C08AC002C2C78 /* DefaultThemes */; }; /* End PBXBuildFile section */ @@ -354,254 +188,7 @@ 2BE487EC28245162003F3F64 /* OpenWithCodeEdit.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenWithCodeEdit.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 589F3E342936185400E1A4DA /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 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 /* ActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManager.swift; sourceTree = ""; }; - 617DB3D52C25B02D00B58BFE /* ActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; - 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CECircularProgressView.swift; sourceTree = ""; }; - 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivitiesDetailView.swift; sourceTree = ""; }; - 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityViewer.swift; sourceTree = ""; }; - 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManagerTests.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 = ""; }; 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 = ""; }; - B616EA932D67C4DA00DF9029 /* CEActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEActivity.swift; sourceTree = ""; }; - B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalDevelopmentActivitiesView.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; }; 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; }; @@ -699,1947 +286,19 @@ /* 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 /* Activities */, - 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 /* Activities */, - 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 /* Activities */ = { - isa = PBXGroup; - children = ( - 617DB3D12C25AFD300B58BFE /* Models */, - B616EA902D67C40800DF9029 /* Views */, - 618725A22C29EFE200987354 /* ViewModifiers */, - 617DB3CF2C25AFAE00B58BFE /* ActivityManager.swift */, - ); - path = Activities; - sourceTree = ""; - }; - 617DB3D12C25AFD300B58BFE /* Models */ = { - isa = PBXGroup; - children = ( - B616EA932D67C4DA00DF9029 /* CEActivity.swift */, - ); - path = Models; - sourceTree = ""; - }; - 617DB3DD2C25E11500B58BFE /* Activities */ = { - isa = PBXGroup; - children = ( - 617DB3DE2C25E13800B58BFE /* ActivityManagerTests.swift */, - ); - path = Activities; - sourceTree = ""; - }; - 618725A22C29EFE200987354 /* ViewModifiers */ = { - isa = PBXGroup; - children = ( - 618725A52C29F02500987354 /* DropdownMenuItemStyleModifier.swift */, - ); - path = ViewModifiers; - 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 */, - ); - 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 */, - B616EA952D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift */, - ); - path = InternalDevelopmentInspector; - sourceTree = ""; - }; - B616EA902D67C40800DF9029 /* Views */ = { - isa = PBXGroup; - children = ( - B69D3EE22C5F536B005CF43A /* ActiveTaskView.swift */, - 618725A72C29F05500987354 /* OptionMenuItemView.swift */, - 618725A02C29EFCC00987354 /* SchemeDropDownView.swift */, - 618725AA2C29F2C000987354 /* TaskDropDownView.swift */, - B69D3EE42C5F54B3005CF43A /* TasksPopoverMenuItem.swift */, - B69D3EE02C5F5357005CF43A /* TaskView.swift */, - 618725A32C29F00400987354 /* WorkspaceMenuItemView.swift */, - 617DB3D52C25B02D00B58BFE /* ActivityView.swift */, - 617DB3D92C25B07F00B58BFE /* ActivitiesDetailView.swift */, - 617DB3D72C25B04D00B58BFE /* CECircularProgressView.swift */, - 617DB3DB2C25B14A00B58BFE /* ActivityViewer.swift */, - ); - path = Views; - 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 */, - ); - path = Pages; - sourceTree = ""; - }; - B61DA9E129D929F900BF4A43 /* GeneralSettings */ = { - isa = PBXGroup; - children = ( - B6CF632529E541520085880A /* Models */, - B61DA9DE29D929E100BF4A43 /* GeneralSettingsView.swift */, - B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */, - ); - path = GeneralSettings; - sourceTree = ""; - }; - B62AEDB12A1FD7F0009A9F52 /* Views */ = { - isa = PBXGroup; - children = ( - B62AEDD32A27B29F009A9F52 /* PaneToolbar.swift */, - 58822513292C280D00E83CDE /* UtilityAreaView.swift */, - B62AEDC82A2704F3009A9F52 /* UtilityAreaTabView.swift */, - B62AEDDA2A27C1B3009A9F52 /* OSLogType+Color.swift */, - B62AEDD02A27B264009A9F52 /* View+paneToolbar.swift */, - ); - path = Views; - sourceTree = ""; - }; - B63F6A752C5618BF003B4342 /* Formatters */ = { + 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 */, ); - path = Models; + name = "Recovered References"; sourceTree = ""; }; B658FB2327DA9E0F00EA4DBD = { @@ -2674,464 +333,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 = ( - 77A01E422BBC3A2800F0EA38 /* CETask.swift */, - 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 */ @@ -3401,503 +602,91 @@ buildActionMask = 2147483647; files = ( 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 /* ActivityView.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 */, + B67DB0F62AFC2A7A002DC647 /* (null) in Sources */, + B696A7E62CFE20C40048CFE1 /* (null) in Sources */, + B67DB0F92AFDF638002DC647 /* (null) in Sources */, + B6EA1FE529DA33DB001BF195 /* (null) in Sources */, + B6EA200029DB7966001BF195 /* (null) in Sources */, + B66A4E5129C917D5004573B4 /* (null) in Sources */, + B6C4F2A62B3CABD200B2B140 /* (null) in Sources */, + B65B10FE2B08B07D002852CF /* (null) 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 */, - B616EA942D67C4DA00DF9029 /* CEActivity.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 */, - B616EA962D67E20A00DF9029 /* InternalDevelopmentActivitiesView.swift in Sources */, - 581550D029FBD30400684881 /* FileSystemTableViewCell.swift in Sources */, - B607183F2B17DB07009CDAB4 /* SourceControlNavigatorRepositoryView+contextMenu.swift in Sources */, - B62AEDD42A27B29F009A9F52 /* PaneToolbar.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 */, + B664C3B32B96634F00816B4E /* (null) in Sources */, + B67DBB882CD51C55007F4F18 /* (null) in Sources */, + B6DCDAC62CCDE2B90099FBF9 /* (null) in Sources */, + B6B2D7A12CE8797B00379967 /* (null) in Sources */, + B69970322D63E5C700BB132D /* (null) in Sources */, + B68DE5E52D5A7988009A43EF /* (null) in Sources */, + B6CFD8112C20A8EE00E63F1A /* (null) in Sources */, + B66A4E4C29C9179B004573B4 /* (null) in Sources */, + B6C4F2A12B3CA37500B2B140 /* (null) in Sources */, + B6C6A43029771F7100A3D28F /* (null) in Sources */, + B6F0517D29D9E4B100D72287 /* (null) in Sources */, + B6966A282C2F683300259C2D /* (null) in Sources */, + B67DBB902CD5EA77007F4F18 /* (null) in Sources */, + B6D7EA5C297107DD00301FAC /* (null) in Sources */, + B6EA1FE729DA341D001BF195 /* (null) in Sources */, + B67DBB942CD5FC08007F4F18 /* (null) in Sources */, + B66A4E4F29C917B8004573B4 /* (null) in Sources */, + B6E41C8B29DE7AE80088F9F4 /* (null) in Sources */, + B6E41C8F29DE9CD80088F9F4 /* (null) in Sources */, + B6CFD80D2C1B9A8000E63F1A /* (null) in Sources */, + B6F0517B29D9E46400D72287 /* (null) in Sources */, + B68108042C60287F008B27C1 /* (null) in Sources */, + B67DBB922CD5EAAB007F4F18 /* (null) in Sources */, + B67DBB8A2CD5D8F7007F4F18 /* (null) in Sources */, + B67DB0FC2AFDF71F002DC647 /* (null) in Sources */, + B67DBB8C2CD5D9CB007F4F18 /* (null) in Sources */, + B6E55C3B2A95368E003ECC7D /* (null) in Sources */, + B69D3EE12C5F5357005CF43A /* (null) in Sources */, + B6E41C7029DD157F0088F9F4 /* (null) in Sources */, + B66A4E4529C8E86D004573B4 /* (null) in Sources */, + B6966A2A2C2F687A00259C2D /* (null) in Sources */, + B66A4E5629C918A0004573B4 /* (null) in Sources */, + B66A4E5329C91831004573B4 /* (null) in Sources */, + B6F0517029D9E36800D72287 /* (null) in Sources */, + B69D3EE32C5F536B005CF43A /* (null) 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 /* ActivityManager.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 */, + B6C6A42A297716A500A3D28F /* (null) in Sources */, + B6F0517729D9E3AD00D72287 /* (null) in Sources */, + B67700F92D2A2662004FD61F /* (null) in Sources */, + B6E38E022CD3E63A00F4E65A /* (null) in Sources */, + B6AB09A52AAAC00F0003A3A6 /* (null) in Sources */, 6CAAF69229BCC71C00A1F48A /* (null) 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 /* ActivitiesDetailView.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 */, + B697937A29FF5668002027EC /* (null) in Sources */, + B685DE7929CC9CCD002860C8 /* (null) in Sources */, + B6E41C9429DEAE260088F9F4 /* (null) in Sources */, + B65B11042B09DB1C002852CF /* (null) in Sources */, + B6E41C7929DE02800088F9F4 /* (null) in Sources */, + B6B2D79F2CE8794E00379967 /* (null) in Sources */, + B6C4F2A92B3CB00100B2B140 /* (null) in Sources */, + B6EA1FFB29DB78F6001BF195 /* (null) in Sources */, + B65B10F22B07D34F002852CF /* (null) in Sources */, + B6A43C5D29FC4AF00027E0E0 /* (null) in Sources */, + B6EA200229DB7F81001BF195 /* (null) in Sources */, + B66460592D600E9500EC1411 /* (null) in Sources */, + B664605A2D600E9500EC1411 /* (null) in Sources */, + B65B10F82B081A34002852CF /* (null) in Sources */, + B6EA1FFD29DB792C001BF195 /* (null) in Sources */, + B6EA1FF829DB78DB001BF195 /* (null) in Sources */, + B6D7EA592971078500301FAC /* (null) in Sources */, + B6AB09A32AAABFEC0003A3A6 /* (null) in Sources */, + B69BFDC72B0686910050D9A6 /* (null) in Sources */, + B6EE989027E8879A00CDD8AB /* (null) in Sources */, + B6966A302C33282200259C2D /* (null) in Sources */, + B6F0517929D9E3C900D72287 /* (null) in Sources */, + B6966A2E2C3056AD00259C2D /* (null) in Sources */, + B65B10F52B081A0C002852CF /* (null) in Sources */, + B6FA3F882BF41C940023DE9C /* (null) in Sources */, + B6E41C7429DD40010088F9F4 /* (null) in Sources */, + B6C6A42E29771A8D00A3D28F /* (null) in Sources */, + B6C4F2A32B3CA74800B2B140 /* (null) in Sources */, + B6966A322C3348D300259C2D /* (null) in Sources */, + B69D3EE52C5F54B3005CF43A /* (null) in Sources */, + B6AB09A12AAABAAE0003A3A6 /* (null) in Sources */, + B6AB09B32AB919CF0003A3A6 /* (null) in Sources */, + B65B10EF2B07C454002852CF /* (null) in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3905,31 +694,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 /* ActivityManagerTests.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; }; From 46c94d19badd9fd182b239b691528c5abd3a0af8 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 5 Mar 2025 15:46:36 -0600 Subject: [PATCH 30/32] SwiftLint fix --- .../Documents/WorkspaceDocument/WorkspaceDocument+Index.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift index 228232196..99febae44 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+Index.swift @@ -24,7 +24,7 @@ extension WorkspaceDocument.SearchState { isLoading: true ) } - + let (progressStream, continuation) = AsyncStream.makeStream() // Dispatch this now, we want to continue after starting to monitor Task { await self.monitorProgressStream(progressStream, activityId: activity.id) } From 299ad40332af4dc53052723b300e94e543d671d6 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 5 Mar 2025 17:23:06 -0600 Subject: [PATCH 31/32] Cleanup --- CodeEdit.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 75e43e23e..a05df2f41 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -294,13 +294,6 @@ name = Frameworks; sourceTree = ""; }; - 6C01F25D2C4820B600AA951B /* Recovered References */ = { - isa = PBXGroup; - children = ( - ); - name = "Recovered References"; - sourceTree = ""; - }; B658FB2327DA9E0F00EA4DBD = { isa = PBXGroup; children = ( @@ -316,7 +309,6 @@ 283BDCBC2972EEBD002AFF81 /* Package.resolved */, B658FB2D27DA9E0F00EA4DBD /* Products */, 5C403B8D27E20F8000788241 /* Frameworks */, - 6C01F25D2C4820B600AA951B /* Recovered References */, ); indentWidth = 4; sourceTree = ""; From ce4f72c1548bd43504449c4135d4018e9d26f53d Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Wed, 5 Mar 2025 17:29:22 -0600 Subject: [PATCH 32/32] Cleanup --- CodeEdit.xcodeproj/project.pbxproj | 170 ----------------------------- 1 file changed, 170 deletions(-) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index a05df2f41..c518f7d4b 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -29,97 +29,12 @@ 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; }; 6CB446402B6DFF3A00539ED0 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB4463F2B6DFF3A00539ED0 /* CodeEditSourceEditor */; }; - 6CB9144B29BEC7F100BC47F2 /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB94D022CA1205100E8651C /* AsyncAlgorithms */; }; 6CC00A8B2CBEF150004E8134 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC00A8A2CBEF150004E8134 /* CodeEditSourceEditor */; }; 6CC17B4F2C432AE000834E2C /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CC17B4E2C432AE000834E2C /* CodeEditSourceEditor */; }; 6CD3CA552C8B508200D83DCD /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CD3CA542C8B508200D83DCD /* CodeEditSourceEditor */; }; 6CE21E872C650D2C0031B056 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6CE21E862C650D2C0031B056 /* SwiftTerm */; }; - B65B10EF2B07C454002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B65B10F22B07D34F002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B65B10F52B081A0C002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B65B10F82B081A34002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B65B10FE2B08B07D002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B65B11042B09DB1C002852CF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66460592D600E9500EC1411 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B664605A2D600E9500EC1411 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B664C3B32B96634F00816B4E /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E4529C8E86D004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E4C29C9179B004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E4F29C917B8004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E5129C917D5004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E5329C91831004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B66A4E5629C918A0004573B4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67700F92D2A2662004FD61F /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DB0F62AFC2A7A002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DB0F92AFDF638002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DB0FC2AFDF71F002DC647 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB882CD51C55007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB8A2CD5D8F7007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB8C2CD5D9CB007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB902CD5EA77007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB922CD5EAAB007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B67DBB942CD5FC08007F4F18 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B68108042C60287F008B27C1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B685DE7929CC9CCD002860C8 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B68DE5E52D5A7988009A43EF /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6966A282C2F683300259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6966A2A2C2F687A00259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6966A2E2C3056AD00259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6966A302C33282200259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6966A322C3348D300259C2D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B696A7E62CFE20C40048CFE1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B697937A29FF5668002027EC /* (null) in Sources */ = {isa = PBXBuildFile; }; - B69970322D63E5C700BB132D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B69BFDC72B0686910050D9A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B69D3EE12C5F5357005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B69D3EE32C5F536B005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B69D3EE52C5F54B3005CF43A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6A43C5D29FC4AF00027E0E0 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6AB09A12AAABAAE0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6AB09A32AAABFEC0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6AB09A52AAAC00F0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6AB09B32AB919CF0003A3A6 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6B2D79F2CE8794E00379967 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6B2D7A12CE8797B00379967 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C4F2A12B3CA37500B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C4F2A32B3CA74800B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C4F2A62B3CABD200B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C4F2A92B3CB00100B2B140 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C6A42A297716A500A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C6A42E29771A8D00A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6C6A43029771F7100A3D28F /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6CFD80D2C1B9A8000E63F1A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6CFD8112C20A8EE00E63F1A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6D7EA592971078500301FAC /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6D7EA5C297107DD00301FAC /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6DCDAC62CCDE2B90099FBF9 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E38E022CD3E63A00F4E65A /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C7029DD157F0088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C7429DD40010088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C7929DE02800088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C8B29DE7AE80088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C8F29DE9CD80088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E41C9429DEAE260088F9F4 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6E55C3B2A95368E003ECC7D /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA1FE529DA33DB001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA1FE729DA341D001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA1FF829DB78DB001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA1FFB29DB78F6001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA1FFD29DB792C001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA200029DB7966001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EA200229DB7F81001BF195 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6EE989027E8879A00CDD8AB /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6F0517029D9E36800D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6F0517729D9E3AD00D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6F0517929D9E3C900D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6F0517B29D9E46400D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6F0517D29D9E4B100D72287 /* (null) in Sources */ = {isa = PBXBuildFile; }; - B6FA3F882BF41C940023DE9C /* (null) in Sources */ = {isa = PBXBuildFile; }; B6FF04782B6C08AC002C2C78 /* DefaultThemes in Resources */ = {isa = PBXBuildFile; fileRef = B6FF04772B6C08AC002C2C78 /* DefaultThemes */; }; /* End PBXBuildFile section */ @@ -593,92 +508,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6CAAF69429BCD78600A1F48A /* (null) in Sources */, - B67DB0F62AFC2A7A002DC647 /* (null) in Sources */, - B696A7E62CFE20C40048CFE1 /* (null) in Sources */, - B67DB0F92AFDF638002DC647 /* (null) in Sources */, - B6EA1FE529DA33DB001BF195 /* (null) in Sources */, - B6EA200029DB7966001BF195 /* (null) in Sources */, - B66A4E5129C917D5004573B4 /* (null) in Sources */, - B6C4F2A62B3CABD200B2B140 /* (null) in Sources */, - B65B10FE2B08B07D002852CF /* (null) in Sources */, 58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */, - B664C3B32B96634F00816B4E /* (null) in Sources */, - B67DBB882CD51C55007F4F18 /* (null) in Sources */, - B6DCDAC62CCDE2B90099FBF9 /* (null) in Sources */, - B6B2D7A12CE8797B00379967 /* (null) in Sources */, - B69970322D63E5C700BB132D /* (null) in Sources */, - B68DE5E52D5A7988009A43EF /* (null) in Sources */, - B6CFD8112C20A8EE00E63F1A /* (null) in Sources */, - B66A4E4C29C9179B004573B4 /* (null) in Sources */, - B6C4F2A12B3CA37500B2B140 /* (null) in Sources */, - B6C6A43029771F7100A3D28F /* (null) in Sources */, - B6F0517D29D9E4B100D72287 /* (null) in Sources */, - B6966A282C2F683300259C2D /* (null) in Sources */, - B67DBB902CD5EA77007F4F18 /* (null) in Sources */, - B6D7EA5C297107DD00301FAC /* (null) in Sources */, - B6EA1FE729DA341D001BF195 /* (null) in Sources */, - B67DBB942CD5FC08007F4F18 /* (null) in Sources */, - B66A4E4F29C917B8004573B4 /* (null) in Sources */, - B6E41C8B29DE7AE80088F9F4 /* (null) in Sources */, - B6E41C8F29DE9CD80088F9F4 /* (null) in Sources */, - B6CFD80D2C1B9A8000E63F1A /* (null) in Sources */, - B6F0517B29D9E46400D72287 /* (null) in Sources */, - B68108042C60287F008B27C1 /* (null) in Sources */, - B67DBB922CD5EAAB007F4F18 /* (null) in Sources */, - B67DBB8A2CD5D8F7007F4F18 /* (null) in Sources */, - B67DB0FC2AFDF71F002DC647 /* (null) in Sources */, - B67DBB8C2CD5D9CB007F4F18 /* (null) in Sources */, - B6E55C3B2A95368E003ECC7D /* (null) in Sources */, - B69D3EE12C5F5357005CF43A /* (null) in Sources */, - B6E41C7029DD157F0088F9F4 /* (null) in Sources */, - B66A4E4529C8E86D004573B4 /* (null) in Sources */, - B6966A2A2C2F687A00259C2D /* (null) in Sources */, - B66A4E5629C918A0004573B4 /* (null) in Sources */, - B66A4E5329C91831004573B4 /* (null) in Sources */, - B6F0517029D9E36800D72287 /* (null) in Sources */, - B69D3EE32C5F536B005CF43A /* (null) in Sources */, - 6CB9144B29BEC7F100BC47F2 /* (null) in Sources */, - B6C6A42A297716A500A3D28F /* (null) in Sources */, - B6F0517729D9E3AD00D72287 /* (null) in Sources */, - B67700F92D2A2662004FD61F /* (null) in Sources */, - B6E38E022CD3E63A00F4E65A /* (null) in Sources */, - B6AB09A52AAAC00F0003A3A6 /* (null) in Sources */, - 6CAAF69229BCC71C00A1F48A /* (null) in Sources */, - 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */, - B697937A29FF5668002027EC /* (null) in Sources */, - B685DE7929CC9CCD002860C8 /* (null) in Sources */, - B6E41C9429DEAE260088F9F4 /* (null) in Sources */, - B65B11042B09DB1C002852CF /* (null) in Sources */, - B6E41C7929DE02800088F9F4 /* (null) in Sources */, - B6B2D79F2CE8794E00379967 /* (null) in Sources */, - B6C4F2A92B3CB00100B2B140 /* (null) in Sources */, - B6EA1FFB29DB78F6001BF195 /* (null) in Sources */, - B65B10F22B07D34F002852CF /* (null) in Sources */, - B6A43C5D29FC4AF00027E0E0 /* (null) in Sources */, - B6EA200229DB7F81001BF195 /* (null) in Sources */, - B66460592D600E9500EC1411 /* (null) in Sources */, - B664605A2D600E9500EC1411 /* (null) in Sources */, - B65B10F82B081A34002852CF /* (null) in Sources */, - B6EA1FFD29DB792C001BF195 /* (null) in Sources */, - B6EA1FF829DB78DB001BF195 /* (null) in Sources */, - B6D7EA592971078500301FAC /* (null) in Sources */, - B6AB09A32AAABFEC0003A3A6 /* (null) in Sources */, - B69BFDC72B0686910050D9A6 /* (null) in Sources */, - B6EE989027E8879A00CDD8AB /* (null) in Sources */, - B6966A302C33282200259C2D /* (null) in Sources */, - B6F0517929D9E3C900D72287 /* (null) in Sources */, - B6966A2E2C3056AD00259C2D /* (null) in Sources */, - B65B10F52B081A0C002852CF /* (null) in Sources */, - B6FA3F882BF41C940023DE9C /* (null) in Sources */, - B6E41C7429DD40010088F9F4 /* (null) in Sources */, - B6C6A42E29771A8D00A3D28F /* (null) in Sources */, - B6C4F2A32B3CA74800B2B140 /* (null) in Sources */, - B6966A322C3348D300259C2D /* (null) in Sources */, - B69D3EE52C5F54B3005CF43A /* (null) in Sources */, - B6AB09A12AAABAAE0003A3A6 /* (null) in Sources */, - B6AB09B32AB919CF0003A3A6 /* (null) in Sources */, - B65B10EF2B07C454002852CF /* (null) in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };