Skip to content

Commit 5b970dd

Browse files
peteonrailsclaude
andcommitted
Improve macOS menubar layout and settings UX
- Menubar: Compact single-line header with Label (icon + "Voxtype · Status") - Settings: Combined Whisper local/remote into single view with animated transitions - Settings: Use ConfigManager for section-aware config updates (fixes corruption) - Settings: Redesigned Models view with unified list and inline progress - Notifications: Engine-specific icons via terminal-notifier contentImage - Added engine icon assets (parakeet.png, whisper.png) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 6080247 commit 5b970dd

File tree

11 files changed

+375
-315
lines changed

11 files changed

+375
-315
lines changed

assets/engines/parakeet.png

44.8 KB
Loading

assets/engines/whisper.png

46.3 KB
Loading

macos/VoxtypeMenubar/Sources/MenuBarView.swift

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,16 @@ struct MenuBarView: View {
55

66
var body: some View {
77
VStack(alignment: .leading, spacing: 0) {
8-
// Header
9-
Text("Voxtype")
10-
.font(.headline)
11-
.padding(.horizontal, 12)
12-
.padding(.top, 8)
13-
.padding(.bottom, 4)
14-
15-
// Status section
16-
HStack {
8+
// Status header - single line with icon, name, and status
9+
Label {
10+
Text("Voxtype · \(statusMonitor.statusText)")
11+
} icon: {
1712
Image(systemName: statusMonitor.iconName)
1813
.foregroundColor(statusColor)
19-
Text(statusMonitor.statusText)
2014
}
15+
.font(.headline)
2116
.padding(.horizontal, 12)
22-
.padding(.bottom, 8)
17+
.padding(.vertical, 8)
2318

2419
Divider()
2520

macos/VoxtypeSetup/Sources/Settings/GeneralSettingsView.swift

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,27 +126,7 @@ struct GeneralSettingsView: View {
126126
}
127127

128128
private func restartDaemon() {
129-
// Kill existing daemon
130-
let killTask = Process()
131-
killTask.launchPath = "/usr/bin/pkill"
132-
killTask.arguments = ["-x", "voxtype"]
133-
killTask.standardOutput = FileHandle.nullDevice
134-
killTask.standardError = FileHandle.nullDevice
135-
try? killTask.run()
136-
killTask.waitUntilExit()
137-
138-
// Clean up state
139-
let rmTask = Process()
140-
rmTask.launchPath = "/bin/rm"
141-
rmTask.arguments = ["-rf", "/tmp/voxtype"]
142-
rmTask.standardOutput = FileHandle.nullDevice
143-
rmTask.standardError = FileHandle.nullDevice
144-
try? rmTask.run()
145-
rmTask.waitUntilExit()
146-
147-
// Start daemon fresh
148-
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
149-
_ = VoxtypeCLI.run(["daemon"], wait: false)
129+
VoxtypeCLI.restartDaemon {
150130
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
151131
self.checkDaemonStatus()
152132
}

macos/VoxtypeSetup/Sources/Settings/HotkeySettingsView.swift

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -178,28 +178,8 @@ struct HotkeySettingsView: View {
178178
}
179179

180180
private func restartDaemon() {
181-
// First, stop any running daemon
182-
let killTask = Process()
183-
killTask.launchPath = "/usr/bin/pkill"
184-
killTask.arguments = ["-x", "voxtype"]
185-
try? killTask.run()
186-
killTask.waitUntilExit()
187-
188-
// Wait a moment for the daemon to stop
189-
Thread.sleep(forTimeInterval: 0.5)
190-
191-
// Try launchctl first (if service is installed)
192-
let launchTask = Process()
193-
launchTask.launchPath = "/bin/launchctl"
194-
launchTask.arguments = ["start", "io.voxtype.daemon"]
195-
try? launchTask.run()
196-
launchTask.waitUntilExit()
197-
198-
// If launchctl didn't work, start daemon directly
199-
if launchTask.terminationStatus != 0 {
200-
VoxtypeCLI.run(["daemon"], wait: false)
181+
VoxtypeCLI.restartDaemon {
182+
self.needsRestart = false
201183
}
202-
203-
needsRestart = false
204184
}
205185
}

0 commit comments

Comments
 (0)