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 {
@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
}
}
}

View File

@ -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

View File

@ -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

View File

@ -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