Skip to content

Commit 54e0726

Browse files
Only Save Workspace Settings If Necessary (#1702)
Only Save Settings If Necessary
1 parent cfc5dbc commit 54e0726

File tree

5 files changed

+30
-14
lines changed

5 files changed

+30
-14
lines changed

CodeEdit/Features/CEWorkspace/Extensions/CEWorkspaceSettingsData+ProjectSettings.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import SwiftUI
99

1010
extension CEWorkspaceSettingsData {
1111
/// Workspace settings for the project tab.
12-
struct ProjectSettings: Codable, Hashable, SearchableSettingsPage {
12+
struct ProjectSettings: Codable, Hashable, SearchableSettingsPage, WorkspaceSettingsGroup {
1313
var searchKeys: [String] {
1414
[
1515
"Project Name",
@@ -26,5 +26,9 @@ extension CEWorkspaceSettingsData {
2626
let container = try decoder.container(keyedBy: CodingKeys.self)
2727
self.projectName = try container.decodeIfPresent(String.self, forKey: .projectName) ?? ""
2828
}
29+
30+
func isEmpty() -> Bool {
31+
projectName == ""
32+
}
2933
}
3034
}

CodeEdit/Features/CEWorkspace/Extensions/CEWorkspaceSettingsData+TasksSettings.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Collections
1010

1111
extension CEWorkspaceSettingsData {
1212
/// Workspace settings for the tasks tab.
13-
struct TasksSettings: Codable, Hashable, SearchableSettingsPage {
13+
struct TasksSettings: Codable, Hashable, SearchableSettingsPage, WorkspaceSettingsGroup {
1414
var items: [CETask] = []
1515

1616
var searchKeys: [String] {
@@ -31,5 +31,9 @@ extension CEWorkspaceSettingsData {
3131
self.items = try container.decodeIfPresent([CETask].self, forKey: .items) ?? []
3232
self.enabled = try container.decodeIfPresent(Bool.self, forKey: .enabled) ?? true
3333
}
34+
35+
func isEmpty() -> Bool {
36+
items.isEmpty && enabled == true
37+
}
3438
}
3539
}

CodeEdit/Features/CEWorkspace/Models/CEWorkspaceSettings.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ final class CEWorkspaceSettings: ObservableObject {
1313
@ObservedObject private var workspace: WorkspaceDocument
1414
@Published public var preferences: CEWorkspaceSettingsData = .init()
1515

16-
private var savedSettings = false
1716
private var storeTask: AnyCancellable!
1817
private let fileManager = FileManager.default
1918

@@ -37,12 +36,7 @@ final class CEWorkspaceSettings: ObservableObject {
3736

3837
loadSettings()
3938

40-
self.storeTask = self.$preferences.throttle(for: 2, scheduler: RunLoop.main, latest: true).sink {
41-
if !self.savedSettings, let folderURL = self.folderURL {
42-
try? self.fileManager.createDirectory(at: folderURL, withIntermediateDirectories: false)
43-
self.savedSettings = true
44-
}
45-
39+
self.storeTask = self.$preferences.throttle(for: 2.0, scheduler: RunLoop.main, latest: true).sink {
4640
try? self.savePreferences($0)
4741
}
4842
}
@@ -54,16 +48,21 @@ final class CEWorkspaceSettings: ObservableObject {
5448
guard let json = try? Data(contentsOf: settingsURL),
5549
let prefs = try? JSONDecoder().decode(CEWorkspaceSettingsData.self, from: json)
5650
else { return }
57-
58-
self.savedSettings = true
5951
self.preferences = prefs
6052
}
6153
}
6254
}
6355

6456
/// Save``CEWorkspaceSettings`` model to `.codeedit/settings.json`
6557
private func savePreferences(_ data: CEWorkspaceSettingsData) throws {
66-
guard let settingsURL = settingsURL else { return }
58+
// If the user doesn't have any settings to save, don't save them.
59+
guard !data.isEmpty() else { return }
60+
61+
guard let folderURL, let settingsURL else { return }
62+
63+
if !fileManager.fileExists(atPath: folderURL.path()) {
64+
try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true)
65+
}
6766

6867
let data = try JSONEncoder().encode(data)
6968
let json = try JSONSerialization.jsonObject(with: data)

CodeEdit/Features/CEWorkspace/Models/CEWorkspaceSettingsData.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@
88
import SwiftUI
99
import Foundation
1010

11+
protocol WorkspaceSettingsGroup {
12+
/// Determine if the settings are changed from the defaults.
13+
/// Used to check if creating a `.codeedit` folder is necessary on the user's machine.
14+
func isEmpty() -> Bool
15+
}
16+
1117
/// # Workspace Settings
1218
///
1319
/// The model of the workspace settings for `CodeEdit` that control the behavior of some functionality at the workspace
1420
/// level like the workspace name or defining tasks. A `JSON` representation is persisted in the workspace's
1521
/// `./codeedit/settings.json`. file
16-
struct CEWorkspaceSettingsData: Codable, Hashable {
22+
struct CEWorkspaceSettingsData: Codable, Hashable, WorkspaceSettingsGroup {
1723
/// The project global settings
1824
var project: ProjectSettings = .init()
1925

@@ -41,4 +47,8 @@ struct CEWorkspaceSettingsData: Codable, Hashable {
4147

4248
return settings
4349
}
50+
51+
func isEmpty() -> Bool {
52+
project.isEmpty() && tasks.isEmpty()
53+
}
4454
}

CodeEdit/Features/Settings/Models/Settings.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ final class Settings: ObservableObject {
6565
/// Save``Settings`` model to
6666
/// `~/Library/Application Support/CodeEdit/settings.json`
6767
private func savePreferences(_ data: SettingsData) throws {
68-
print("Saving...")
6968
let data = try JSONEncoder().encode(data)
7069
let json = try JSONSerialization.jsonObject(with: data)
7170
let prettyJSON = try JSONSerialization.data(withJSONObject: json, options: [.prettyPrinted])

0 commit comments

Comments
 (0)