feat: add SettingsView with API key, shortcut, mode, and latency

This commit is contained in:
Carsten Abele 2026-04-07 19:43:14 +02:00
parent b26995b15b
commit dbe3294201

View file

@ -0,0 +1,68 @@
import SwiftUI
struct SettingsView: View {
@ObservedObject var settings = AppSettings.shared
@State private var isRecordingShortcut = false
var body: some View {
Form {
Section("API") {
SecureField("Mistral API Key", text: $settings.apiKey)
}
Section("Output") {
Picker("Mode", selection: $settings.outputMode) {
ForEach(OutputMode.allCases, id: \.self) { mode in
Text(mode.rawValue).tag(mode)
}
}
.pickerStyle(.segmented)
if settings.outputMode == .cursorInjection && !CursorInjector.isAccessibilityGranted {
HStack {
Image(systemName: "exclamationmark.triangle.fill")
.foregroundStyle(.yellow)
Text("Accessibility permission required")
.font(.caption)
Button("Grant") {
CursorInjector.promptAccessibilityPermission()
}
.font(.caption)
}
}
}
Section("Shortcut") {
HStack {
Text("Toggle Recording:")
Spacer()
Button(isRecordingShortcut ? "Press keys..." : settings.shortcutDisplayString) {
isRecordingShortcut = true
}
}
}
Section("Latency") {
VStack(alignment: .leading) {
Text("Streaming delay: \(settings.streamingDelayMs)ms")
.font(.caption)
Slider(
value: Binding(
get: { Double(settings.streamingDelayMs) },
set: { settings.streamingDelayMs = Int($0) }
),
in: 240...2400,
step: 120
)
HStack {
Text("Fast").font(.caption2).foregroundStyle(.secondary)
Spacer()
Text("Accurate").font(.caption2).foregroundStyle(.secondary)
}
}
}
}
.formStyle(.grouped)
.frame(width: 360, height: 340)
}
}