diff --git a/src/ContentView.swift b/src/ContentView.swift index 5a56606..76e5533 100644 --- a/src/ContentView.swift +++ b/src/ContentView.swift @@ -3,10 +3,10 @@ import SwiftUI struct ContentView: View { @ObservedObject var state: AppState @State private var sidebarVisible: Bool = false - @AppStorage("themeMode") private var themeMode: String = "auto" + @State private var themeVersion: Int = 0 var body: some View { - let _ = themeMode + let _ = themeVersion HSplitView { if sidebarVisible { SidebarView(state: state) @@ -20,6 +20,9 @@ struct ContentView: View { .onReceive(NotificationCenter.default.publisher(for: .toggleSidebar)) { _ in withAnimation { sidebarVisible.toggle() } } + .onReceive(NotificationCenter.default.publisher(for: .settingsChanged)) { _ in + themeVersion += 1 + } } } diff --git a/src/EditorView.swift b/src/EditorView.swift index 582db4d..84e9024 100644 --- a/src/EditorView.swift +++ b/src/EditorView.swift @@ -1864,7 +1864,7 @@ class LineNumberTextView: NSTextView { let text = string as NSString guard text.length > 0 else { return } - let lineMode = UserDefaults.standard.string(forKey: "lineIndicatorMode") ?? "on" + let lineMode = ConfigManager.shared.lineIndicatorMode var containerVisible = visibleRect containerVisible.origin.x -= origin.x diff --git a/src/SettingsView.swift b/src/SettingsView.swift index ac9fdf0..a90f1ba 100644 --- a/src/SettingsView.swift +++ b/src/SettingsView.swift @@ -30,8 +30,9 @@ enum LineIndicatorMode: String, CaseIterable { } struct SettingsView: View { - @AppStorage("themeMode") private var themeMode: String = "auto" - @AppStorage("lineIndicatorMode") private var lineIndicatorMode: String = "on" + @State private var themeMode: String = ConfigManager.shared.themeMode + @State private var lineIndicatorMode: String = ConfigManager.shared.lineIndicatorMode + @State private var autoSaveDir: String = ConfigManager.shared.autoSaveDirectory var body: some View { let palette = Theme.current @@ -53,26 +54,47 @@ struct SettingsView: View { } .pickerStyle(.segmented) } + + Section("Auto-Save") { + HStack { + TextField("Directory", text: $autoSaveDir) + .textFieldStyle(.roundedBorder) + Button("Choose...") { + let panel = NSOpenPanel() + panel.canChooseFiles = false + panel.canChooseDirectories = true + panel.allowsMultipleSelection = false + if panel.runModal() == .OK, let url = panel.url { + autoSaveDir = url.path + } + } + } + } } .formStyle(.grouped) - .frame(width: 320, height: 180) + .frame(width: 400, height: 260) .background(Color(ns: palette.base)) .onChange(of: themeMode) { + ConfigManager.shared.themeMode = themeMode DispatchQueue.main.async { applyThemeAppearance() NotificationCenter.default.post(name: .settingsChanged, object: nil) } } .onChange(of: lineIndicatorMode) { + ConfigManager.shared.lineIndicatorMode = lineIndicatorMode DispatchQueue.main.async { NotificationCenter.default.post(name: .settingsChanged, object: nil) } } + .onChange(of: autoSaveDir) { + ConfigManager.shared.autoSaveDirectory = autoSaveDir + } } } func applyThemeAppearance() { - let mode = UserDefaults.standard.string(forKey: "themeMode") ?? "auto" + let mode = ConfigManager.shared.themeMode switch mode { case "dark": NSApp.appearance = NSAppearance(named: .darkAqua) @@ -98,10 +120,10 @@ class SettingsWindowController { let settingsView = SettingsView() let hostingView = NSHostingView(rootView: settingsView) - hostingView.frame = NSRect(x: 0, y: 0, width: 320, height: 200) + hostingView.frame = NSRect(x: 0, y: 0, width: 400, height: 280) let w = NSWindow( - contentRect: NSRect(x: 0, y: 0, width: 320, height: 200), + contentRect: NSRect(x: 0, y: 0, width: 400, height: 280), styleMask: [.titled, .closable], backing: .buffered, defer: false diff --git a/src/Theme.swift b/src/Theme.swift index 171afe5..de82cbb 100644 --- a/src/Theme.swift +++ b/src/Theme.swift @@ -90,7 +90,7 @@ struct Theme { ) static var current: CatppuccinPalette { - let mode = UserDefaults.standard.string(forKey: "themeMode") ?? "auto" + let mode = ConfigManager.shared.themeMode switch mode { case "dark": return mocha case "light": return latte