mac: clear status highlight via menu delegate
This commit is contained in:
@@ -14,6 +14,7 @@ struct ClawdisApp: App {
|
|||||||
@StateObject private var activityStore = WorkActivityStore.shared
|
@StateObject private var activityStore = WorkActivityStore.shared
|
||||||
@State private var statusItem: NSStatusItem?
|
@State private var statusItem: NSStatusItem?
|
||||||
@State private var isMenuPresented = false
|
@State private var isMenuPresented = false
|
||||||
|
private let menuDelegate = StatusMenuDelegate()
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
_state = StateObject(wrappedValue: AppStateStore.shared)
|
_state = StateObject(wrappedValue: AppStateStore.shared)
|
||||||
@@ -36,6 +37,7 @@ struct ClawdisApp: App {
|
|||||||
self.statusItem = item
|
self.statusItem = item
|
||||||
self.applyStatusItemAppearance(paused: self.state.isPaused)
|
self.applyStatusItemAppearance(paused: self.state.isPaused)
|
||||||
self.installStatusItemMouseHandler(for: item)
|
self.installStatusItemMouseHandler(for: item)
|
||||||
|
self.attachMenuDelegate(to: item)
|
||||||
}
|
}
|
||||||
.onChange(of: self.state.isPaused) { _, paused in
|
.onChange(of: self.state.isPaused) { _, paused in
|
||||||
self.applyStatusItemAppearance(paused: paused)
|
self.applyStatusItemAppearance(paused: paused)
|
||||||
@@ -63,6 +65,8 @@ struct ClawdisApp: App {
|
|||||||
self.statusItem?.button?.highlight(visible)
|
self.statusItem?.button?.highlight(visible)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.menuDelegate.button = button
|
||||||
|
|
||||||
let handler = StatusItemMouseHandlerView()
|
let handler = StatusItemMouseHandlerView()
|
||||||
handler.translatesAutoresizingMaskIntoConstraints = false
|
handler.translatesAutoresizingMaskIntoConstraints = false
|
||||||
handler.onLeftClick = { [self] in self.toggleWebChatPanel() }
|
handler.onLeftClick = { [self] in self.toggleWebChatPanel() }
|
||||||
@@ -77,6 +81,13 @@ struct ClawdisApp: App {
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
private func attachMenuDelegate(to item: NSStatusItem) {
|
||||||
|
guard let menu = item.menu else { return }
|
||||||
|
self.menuDelegate.button = item.button
|
||||||
|
menu.delegate = self.menuDelegate
|
||||||
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
private func toggleWebChatPanel() {
|
private func toggleWebChatPanel() {
|
||||||
guard AppStateStore.webChatEnabled else {
|
guard AppStateStore.webChatEnabled else {
|
||||||
@@ -130,6 +141,18 @@ private final class StatusItemMouseHandlerView: NSView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final class StatusMenuDelegate: NSObject, NSMenuDelegate {
|
||||||
|
weak var button: NSStatusBarButton?
|
||||||
|
|
||||||
|
func menuWillOpen(_ menu: NSMenu) {
|
||||||
|
self.button?.highlight(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func menuDidClose(_ menu: NSMenu) {
|
||||||
|
self.button?.highlight(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final class AppDelegate: NSObject, NSApplicationDelegate, NSXPCListenerDelegate {
|
final class AppDelegate: NSObject, NSApplicationDelegate, NSXPCListenerDelegate {
|
||||||
private var listener: NSXPCListener?
|
private var listener: NSXPCListener?
|
||||||
private var state: AppState?
|
private var state: AppState?
|
||||||
|
|||||||
Reference in New Issue
Block a user