From d9e8c6ceabe91a44f62d31f0e13c610d4eec52c8 Mon Sep 17 00:00:00 2001 From: Grant Gilliam Date: Mon, 8 Jun 2026 13:57:24 -0500 Subject: [PATCH] Open Settings in its own roomy window, not the cramped popover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Settings was a NavigationLink pushed inside the 320pt menu-bar popover, so the grouped form was cramped and most controls sat below a non-obvious scroll (and showed a confusing "< Settings" back arrow). Add SettingsWindow (same standalone NSWindow pattern as the Editor/Templates windows) and open it from the menu-bar "Settings…" button. Drop the now-unused NavigationStack and the 320pt cap so the form uses real window width with normal macOS spacing; window is resizable. --- Ten31Transcripts/UI/EditorWindow.swift | 29 +++++++++++++++++++++++++ Ten31Transcripts/UI/MenuBarView.swift | 30 +++++++++++--------------- Ten31Transcripts/UI/SettingsView.swift | 3 ++- 3 files changed, 44 insertions(+), 18 deletions(-) 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") }