diff --git a/Ten31Transcripts/UI/EditorWindow.swift b/Ten31Transcripts/UI/EditorWindow.swift index 922c7d9..43849df 100644 --- a/Ten31Transcripts/UI/EditorWindow.swift +++ b/Ten31Transcripts/UI/EditorWindow.swift @@ -31,6 +31,35 @@ final class EditorWindow { } } +/// Hosts the app Settings in a standalone resizable window. Far roomier than the +/// old in-popover NavigationLink, which cramped the form into the 320pt menu-bar +/// panel and hid most controls below a non-obvious scroll. +@MainActor +final class SettingsWindow { + static let shared = SettingsWindow() + private var window: NSWindow? + + func show(settings: AppSettings) { + if let window { + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + return + } + let w = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 520, height: 660), + styleMask: [.titled, .closable, .resizable, .miniaturizable], + backing: .buffered, defer: false) + w.title = "Settings" + w.isReleasedWhenClosed = false + w.center() + w.contentViewController = NSHostingController( + rootView: SettingsView().environmentObject(settings)) + window = w + NSApp.activate(ignoringOtherApps: true) + w.makeKeyAndOrderFront(nil) + } +} + /// Hosts the recap-templates manager in its own resizable window. @MainActor final class TemplatesWindow { diff --git a/Ten31Transcripts/UI/MenuBarView.swift b/Ten31Transcripts/UI/MenuBarView.swift index f17d613..fa25c47 100644 --- a/Ten31Transcripts/UI/MenuBarView.swift +++ b/Ten31Transcripts/UI/MenuBarView.swift @@ -10,21 +10,19 @@ struct MenuBarView: View { @EnvironmentObject private var session: SessionController var body: some View { - NavigationStack { - VStack(alignment: .leading, spacing: 12) { - header - Divider() - recordingSection - Divider() - permissionsSection - Divider() - backendSection - Divider() - footer - } - .padding(14) - .frame(width: 320) + VStack(alignment: .leading, spacing: 12) { + header + Divider() + recordingSection + Divider() + permissionsSection + Divider() + backendSection + Divider() + footer } + .padding(14) + .frame(width: 320) .onAppear { permissions.refresh() } .task { await refreshHealth() } } @@ -227,9 +225,7 @@ struct MenuBarView: View { private var footer: some View { HStack { - NavigationLink("Settings…") { - SettingsView() - } + Button("Settings…") { SettingsWindow.shared.show(settings: settings) } Spacer() Button("Quit") { NSApplication.shared.terminate(nil) } } diff --git a/Ten31Transcripts/UI/SettingsView.swift b/Ten31Transcripts/UI/SettingsView.swift index febebe8..6d17b48 100644 --- a/Ten31Transcripts/UI/SettingsView.swift +++ b/Ten31Transcripts/UI/SettingsView.swift @@ -72,7 +72,8 @@ struct SettingsView: View { } } .formStyle(.grouped) - .frame(width: 320) + .frame(minWidth: 460, idealWidth: 520, maxWidth: .infinity, + minHeight: 520, idealHeight: 660, maxHeight: .infinity) .navigationTitle("Settings") }