migrate settings persistence to ~/.swiftly/config.json

This commit is contained in:
jess 2026-04-06 00:59:25 -07:00
parent ecd01dfb37
commit c8f883742b
4 changed files with 35 additions and 10 deletions

View File

@ -3,10 +3,10 @@ import SwiftUI
struct ContentView: View { struct ContentView: View {
@ObservedObject var state: AppState @ObservedObject var state: AppState
@State private var sidebarVisible: Bool = false @State private var sidebarVisible: Bool = false
@AppStorage("themeMode") private var themeMode: String = "auto" @State private var themeVersion: Int = 0
var body: some View { var body: some View {
let _ = themeMode let _ = themeVersion
HSplitView { HSplitView {
if sidebarVisible { if sidebarVisible {
SidebarView(state: state) SidebarView(state: state)
@ -20,6 +20,9 @@ struct ContentView: View {
.onReceive(NotificationCenter.default.publisher(for: .toggleSidebar)) { _ in .onReceive(NotificationCenter.default.publisher(for: .toggleSidebar)) { _ in
withAnimation { sidebarVisible.toggle() } withAnimation { sidebarVisible.toggle() }
} }
.onReceive(NotificationCenter.default.publisher(for: .settingsChanged)) { _ in
themeVersion += 1
}
} }
} }

View File

@ -1864,7 +1864,7 @@ class LineNumberTextView: NSTextView {
let text = string as NSString let text = string as NSString
guard text.length > 0 else { return } guard text.length > 0 else { return }
let lineMode = UserDefaults.standard.string(forKey: "lineIndicatorMode") ?? "on" let lineMode = ConfigManager.shared.lineIndicatorMode
var containerVisible = visibleRect var containerVisible = visibleRect
containerVisible.origin.x -= origin.x containerVisible.origin.x -= origin.x

View File

@ -30,8 +30,9 @@ enum LineIndicatorMode: String, CaseIterable {
} }
struct SettingsView: View { struct SettingsView: View {
@AppStorage("themeMode") private var themeMode: String = "auto" @State private var themeMode: String = ConfigManager.shared.themeMode
@AppStorage("lineIndicatorMode") private var lineIndicatorMode: String = "on" @State private var lineIndicatorMode: String = ConfigManager.shared.lineIndicatorMode
@State private var autoSaveDir: String = ConfigManager.shared.autoSaveDirectory
var body: some View { var body: some View {
let palette = Theme.current let palette = Theme.current
@ -53,26 +54,47 @@ struct SettingsView: View {
} }
.pickerStyle(.segmented) .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) .formStyle(.grouped)
.frame(width: 320, height: 180) .frame(width: 400, height: 260)
.background(Color(ns: palette.base)) .background(Color(ns: palette.base))
.onChange(of: themeMode) { .onChange(of: themeMode) {
ConfigManager.shared.themeMode = themeMode
DispatchQueue.main.async { DispatchQueue.main.async {
applyThemeAppearance() applyThemeAppearance()
NotificationCenter.default.post(name: .settingsChanged, object: nil) NotificationCenter.default.post(name: .settingsChanged, object: nil)
} }
} }
.onChange(of: lineIndicatorMode) { .onChange(of: lineIndicatorMode) {
ConfigManager.shared.lineIndicatorMode = lineIndicatorMode
DispatchQueue.main.async { DispatchQueue.main.async {
NotificationCenter.default.post(name: .settingsChanged, object: nil) NotificationCenter.default.post(name: .settingsChanged, object: nil)
} }
} }
.onChange(of: autoSaveDir) {
ConfigManager.shared.autoSaveDirectory = autoSaveDir
}
} }
} }
func applyThemeAppearance() { func applyThemeAppearance() {
let mode = UserDefaults.standard.string(forKey: "themeMode") ?? "auto" let mode = ConfigManager.shared.themeMode
switch mode { switch mode {
case "dark": case "dark":
NSApp.appearance = NSAppearance(named: .darkAqua) NSApp.appearance = NSAppearance(named: .darkAqua)
@ -98,10 +120,10 @@ class SettingsWindowController {
let settingsView = SettingsView() let settingsView = SettingsView()
let hostingView = NSHostingView(rootView: 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( 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], styleMask: [.titled, .closable],
backing: .buffered, backing: .buffered,
defer: false defer: false

View File

@ -90,7 +90,7 @@ struct Theme {
) )
static var current: CatppuccinPalette { static var current: CatppuccinPalette {
let mode = UserDefaults.standard.string(forKey: "themeMode") ?? "auto" let mode = ConfigManager.shared.themeMode
switch mode { switch mode {
case "dark": return mocha case "dark": return mocha
case "light": return latte case "light": return latte