feat(mac): show relay run indicator in menu
This commit is contained in:
@@ -631,10 +631,14 @@ struct ClawdisApp: App {
|
|||||||
|
|
||||||
private struct MenuContent: View {
|
private struct MenuContent: View {
|
||||||
@ObservedObject var state: AppState
|
@ObservedObject var state: AppState
|
||||||
|
@ObservedObject private var relayManager = RelayProcessManager.shared
|
||||||
@Environment(\.openSettings) private var openSettings
|
@Environment(\.openSettings) private var openSettings
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Toggle(isOn: self.activeBinding) { Text("Clawdis Active") }
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
|
self.relayStatusRow
|
||||||
|
Toggle(isOn: self.activeBinding) { Text("Clawdis Active") }
|
||||||
|
}
|
||||||
Toggle(isOn: self.$state.swabbleEnabled) { Text("Voice Wake") }
|
Toggle(isOn: self.$state.swabbleEnabled) { Text("Voice Wake") }
|
||||||
.disabled(!voiceWakeSupported)
|
.disabled(!voiceWakeSupported)
|
||||||
.opacity(voiceWakeSupported ? 1 : 0.5)
|
.opacity(voiceWakeSupported ? 1 : 0.5)
|
||||||
@@ -654,6 +658,28 @@ private struct MenuContent: View {
|
|||||||
NotificationCenter.default.post(name: .clawdisSelectSettingsTab, object: tab)
|
NotificationCenter.default.post(name: .clawdisSelectSettingsTab, object: tab)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var relayStatusRow: some View {
|
||||||
|
let status = self.relayManager.status
|
||||||
|
return HStack(spacing: 8) {
|
||||||
|
Circle()
|
||||||
|
.fill(self.statusColor(status))
|
||||||
|
.frame(width: 8, height: 8)
|
||||||
|
Text(status.label)
|
||||||
|
.font(.caption.weight(.semibold))
|
||||||
|
.foregroundStyle(.primary)
|
||||||
|
}
|
||||||
|
.padding(.vertical, 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func statusColor(_ status: RelayProcessManager.Status) -> Color {
|
||||||
|
switch status {
|
||||||
|
case .running: return .green
|
||||||
|
case .starting, .restarting: return .orange
|
||||||
|
case .failed: return .red
|
||||||
|
case .stopped: return .secondary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var activeBinding: Binding<Bool> {
|
private var activeBinding: Binding<Bool> {
|
||||||
Binding(get: { !self.state.isPaused }, set: { self.state.isPaused = !$0 })
|
Binding(get: { !self.state.isPaused }, set: { self.state.isPaused = !$0 })
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user