feat: merge previous preferences onto new defaults (closes #73)

This commit is contained in:
Louis Pontoise committed 2019-11-11 15:02:19 +09:00
1 parent 39677fe542
commit 7ec3a50f22
1 file changed
+12 -18
+12 -18
View File
@@ -9,7 +9,6 @@ enum ShowOnScreenPreference {
class Preferences {
static var defaults: [String: String] = [
"version": "3", // bump this anytime the dictionary is changed
"maxScreenUsage": "80",
"maxThumbnailsPerRow": "4",
"iconSize": "32",
@@ -61,11 +60,19 @@ class Preferences {
static func loadFromDiskAndUpdateValues() {
do {
try handleNoFileOrOldFile(userFile)
try saveDefaultsToDisk()
let preferencesExist = FileManager.default.fileExists(atPath: userFile.path)
if !preferencesExist {
try FileManager.default.copyItem(at: defaultsFile, to: userFile)
}
rawValues = try loadFromDisk(userFile)
try rawValues
.filter { $0.key != "version" }
.forEach { try updateAndValidateFromString($0.key, $0.value) }
if preferencesExist {
rawValues = defaults.merging(rawValues) { (_, new) in new }
}
try rawValues.forEach { try updateAndValidateFromString($0.key, $0.value) }
if preferencesExist {
try saveRawToDisk()
}
} catch {
debugPrint("Error loading preferences", error)
if (FileManager.default.fileExists(atPath: userFile.path)) {
@@ -122,19 +129,6 @@ class Preferences {
return try JSONDecoder().decode([String: String].self, from: Data(contentsOf: url))
}
private static func handleNoFileOrOldFile(_ userFile: URL) throws {
try saveDefaultsToDisk()
if !FileManager.default.fileExists(atPath: userFile.path) {
try FileManager.default.copyItem(at: defaultsFile, to: userFile)
} else {
if try preferencesVersion(defaultsFile) > preferencesVersion(userFile) {
// TODO: handle upgrades in a smarter way (e.g. merge files)
try FileManager.default.removeItem(at: userFile)
try FileManager.default.copyItem(at: defaultsFile, to: userFile)
}
}
}
private static func saveDefaultsToDisk() throws {
try saveToDisk(defaults, defaultsFile)
}