Skip to content

Commit 7368c5e

Browse files
committed
Support open chat from menu bar
1 parent c8d0c50 commit 7368c5e

File tree

3 files changed

+26
-54
lines changed

3 files changed

+26
-54
lines changed

Config.debug.xcconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
SLASH = /
33

44
PRODUCT_NAME = Copilot for Xcode Dev
5+
HOST_APP_NAME = Copilot for Xcode Dev
56
BUNDLE_IDENTIFIER_BASE = dev.com.intii.CopilotForXcode
67
EXTENSION_BUNDLE_NAME = Copilot Dev
78
SPARKLE_FEED_URL = http:$(SLASH)$(SLASH)127.0.0.1:9433/appcast.xml

Core/Sources/Service/GUI/GraphicalUserInterfaceController.swift.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,15 @@ public final class GraphicalUserInterfaceController {
3333
}
3434
}
3535
}
36+
37+
public func openGlobalChat() {
38+
UserDefaults.shared.set(true, for: \.useGlobalChat)
39+
let dataSource = WidgetDataSource.shared
40+
let fakeFileURL = URL(fileURLWithPath: "/")
41+
Task {
42+
await dataSource.createChatIfNeeded(for: fakeFileURL)
43+
let presenter = PresentInWindowSuggestionPresenter()
44+
presenter.presentChatRoom(fileURL: fakeFileURL)
45+
}
46+
}
3647
}

ExtensionService/AppDelegate.swift

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ let serviceIdentifier = bundleIdentifierBase + ".ExtensionService"
1919
@main
2020
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
2121
let scheduledCleaner = ScheduledCleaner()
22-
private let userDefaultsObserver = UserDefaultsObserver(
23-
object: UserDefaults.shared,
24-
forKeyPaths: [UserDefaultPreferenceKeys().realtimeSuggestionToggle.key],
25-
context: nil
26-
)
2722
private var statusBarItem: NSStatusItem!
2823
private var xpcListener: (NSXPCListener, ServiceDelegate)?
2924
private let updateChecker =
@@ -64,19 +59,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
6459
let statusBarMenu = NSMenu(title: "Status Bar Menu")
6560
statusBarItem.menu = statusBarMenu
6661

67-
#if DEBUG
68-
let copilotName = NSMenuItem(
69-
title: "Copilot for Xcode - DEBUG",
70-
action: nil,
71-
keyEquivalent: ""
72-
)
73-
#else
62+
let hostAppName = Bundle.main.object(forInfoDictionaryKey: "HOST_APP_NAME") as? String
63+
?? "Copilot for Xcode"
64+
7465
let copilotName = NSMenuItem(
75-
title: "Copilot for Xcode",
66+
title: hostAppName,
7667
action: nil,
7768
keyEquivalent: ""
7869
)
79-
#endif
8070

8171
let checkForUpdate = NSMenuItem(
8272
title: "Check for Updates",
@@ -85,19 +75,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
8575
)
8676

8777
let openCopilotForXcode = NSMenuItem(
88-
title: "Open Copilot for Xcode",
78+
title: "Open \(hostAppName)",
8979
action: #selector(openCopilotForXcode),
9080
keyEquivalent: ""
9181
)
9282

93-
let toggleRealtimeSuggestions = NSMenuItem(
94-
title: "Real-time Suggestions",
95-
action: #selector(toggleRealtimeSuggestions),
83+
let openGlobalChat = NSMenuItem(
84+
title: "Open Chat",
85+
action: #selector(openGlobalChat),
9686
keyEquivalent: ""
9787
)
98-
toggleRealtimeSuggestions.state = UserDefaults.shared
99-
.value(for: \.realtimeSuggestionToggle) ? .on : .off
100-
toggleRealtimeSuggestions.target = self
10188

10289
let quitItem = NSMenuItem(
10390
title: "Quit",
@@ -107,18 +94,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
10794
quitItem.target = self
10895

10996
statusBarMenu.addItem(copilotName)
110-
statusBarMenu.addItem(checkForUpdate)
111-
statusBarMenu.addItem(.separator())
11297
statusBarMenu.addItem(openCopilotForXcode)
98+
statusBarMenu.addItem(checkForUpdate)
11399
statusBarMenu.addItem(.separator())
114-
statusBarMenu.addItem(toggleRealtimeSuggestions)
100+
statusBarMenu.addItem(openGlobalChat)
115101
statusBarMenu.addItem(.separator())
116102
statusBarMenu.addItem(quitItem)
117-
118-
userDefaultsObserver.onChange = {
119-
toggleRealtimeSuggestions.state = UserDefaults.shared
120-
.value(for: \.realtimeSuggestionToggle) ? .on : .off
121-
}
122103
}
123104

124105
@objc func quit() {
@@ -135,32 +116,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
135116
}
136117
}
137118

138-
@objc func toggleRealtimeSuggestions() {
139-
let isOn = !UserDefaults.shared.value(for: \.realtimeSuggestionToggle)
140-
if isOn {
141-
if !AXIsProcessTrusted() {
142-
let alert = NSAlert()
143-
let image = NSImage(
144-
systemSymbolName: "exclamationmark.triangle.fill",
145-
accessibilityDescription: nil
146-
)
147-
var config = NSImage.SymbolConfiguration(
148-
textStyle: .body,
149-
scale: .large
150-
)
151-
config = config.applying(.init(hierarchicalColor: .systemYellow))
152-
alert.icon = image?.withSymbolConfiguration(config)
153-
alert.messageText = "Accessibility API Permission Required"
154-
alert.informativeText =
155-
"Permission not granted to use Accessibility API. Please turn in on in System Settings.app."
156-
alert.addButton(withTitle: "OK")
157-
alert.addButton(withTitle: "Cancel")
158-
alert.alertStyle = .warning
159-
alert.runModal()
160-
return
161-
}
119+
@objc func openGlobalChat() {
120+
Task { @MainActor in
121+
let serviceGUI = GraphicalUserInterfaceController.shared
122+
serviceGUI.openGlobalChat()
162123
}
163-
UserDefaults.shared.set(isOn, for: \.realtimeSuggestionToggle)
164124
}
165125

166126
func setupQuitOnUpdate() {

0 commit comments

Comments
 (0)