Acord/src/ConfigManager.swift

66 lines
2.1 KiB
Swift

import Foundation
class ConfigManager {
static let shared = ConfigManager()
private let configDir: URL
private let configFile: URL
private let defaultNotesDir: URL
private var config: [String: String]
private init() {
let home = FileManager.default.homeDirectoryForCurrentUser
configDir = home.appendingPathComponent(".acord")
configFile = configDir.appendingPathComponent("config.json")
defaultNotesDir = configDir.appendingPathComponent("notes")
config = [:]
ensureDirectories()
load()
}
private func ensureDirectories() {
let fm = FileManager.default
try? fm.createDirectory(at: configDir, withIntermediateDirectories: true)
try? fm.createDirectory(at: defaultNotesDir, withIntermediateDirectories: true)
}
private func load() {
guard let data = try? Data(contentsOf: configFile),
let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String]
else { return }
config = dict
}
private func save() {
guard let data = try? JSONSerialization.data(
withJSONObject: config, options: [.prettyPrinted, .sortedKeys]
) else { return }
try? data.write(to: configFile, options: .atomic)
}
var autoSaveDirectory: String {
get { config["autoSaveDirectory"] ?? defaultNotesDir.path }
set { config["autoSaveDirectory"] = newValue; save() }
}
var themeMode: String {
get { config["themeMode"] ?? "auto" }
set { config["themeMode"] = newValue; save() }
}
var lineIndicatorMode: String {
get { config["lineIndicatorMode"] ?? "on" }
set { config["lineIndicatorMode"] = newValue; save() }
}
var gutterRainbow: Bool {
get { (config["gutterRainbow"] ?? "true") != "false" }
set { config["gutterRainbow"] = newValue ? "true" : "false"; save() }
}
var zoomLevel: CGFloat {
get { CGFloat(Double(config["zoomLevel"] ?? "0") ?? 0) }
set { config["zoomLevel"] = String(Double(newValue)); save() }
}
}