浏览代码

Replace theme picker with a Dark Mode toggle.

Simplify settings to a single on/off switch and apply the saved appearance when the app launches or the toggle changes.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 5 小时之前
父节点
当前提交
904e3e5edc
共有 3 个文件被更改,包括 40 次插入37 次删除
  1. 1 0
      smart_printer/AppDelegate.swift
  2. 11 18
      smart_printer/AppSettings.swift
  3. 28 19
      smart_printer/SettingsView.swift

+ 1 - 0
smart_printer/AppDelegate.swift

@@ -11,6 +11,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
11 11
     private weak var mainWindowController: MainWindowController?
12 12
 
13 13
     func applicationDidFinishLaunching(_ notification: Notification) {
14
+        AppSettings.applyAppearance()
14 15
         resolveMainWindowController()
15 16
         configureMainWindow()
16 17
         configurePreferencesMenu()

+ 11 - 18
smart_printer/AppSettings.swift

@@ -29,20 +29,6 @@ enum ScanFormat: String, CaseIterable {
29 29
     case png = "PNG"
30 30
 }
31 31
 
32
-enum AppThemePreference: Int, CaseIterable {
33
-    case system
34
-    case light
35
-    case dark
36
-
37
-    var title: String {
38
-        switch self {
39
-        case .system: "System"
40
-        case .light: "Light"
41
-        case .dark: "Dark"
42
-        }
43
-    }
44
-}
45
-
46 32
 enum AppSettings {
47 33
     private static let defaults = UserDefaults.standard
48 34
 
@@ -58,6 +44,7 @@ enum AppSettings {
58 44
         static let saveRecentFiles = "settings.saveRecentFiles"
59 45
         static let defaultPrinterName = "settings.defaultPrinterName"
60 46
         static let appTheme = "settings.appTheme"
47
+        static let darkModeEnabled = "settings.darkModeEnabled"
61 48
         static let appLanguage = "settings.appLanguage"
62 49
     }
63 50
 
@@ -149,12 +136,18 @@ enum AppSettings {
149 136
         return NSPrintInfo.shared.printer.name
150 137
     }
151 138
 
152
-    static var appTheme: AppThemePreference {
139
+    static var darkModeEnabled: Bool {
153 140
         get {
154
-            let raw = defaults.integer(forKey: Key.appTheme)
155
-            return AppThemePreference(rawValue: raw) ?? .light
141
+            if defaults.object(forKey: Key.darkModeEnabled) != nil {
142
+                return defaults.bool(forKey: Key.darkModeEnabled)
143
+            }
144
+            return defaults.integer(forKey: Key.appTheme) == 2
156 145
         }
157
-        set { defaults.set(newValue.rawValue, forKey: Key.appTheme) }
146
+        set { defaults.set(newValue, forKey: Key.darkModeEnabled) }
147
+    }
148
+
149
+    static func applyAppearance() {
150
+        NSApp.appearance = darkModeEnabled ? NSAppearance(named: .darkAqua) : NSAppearance(named: .aqua)
158 151
     }
159 152
 
160 153
     static var appLanguage: String {

+ 28 - 19
smart_printer/SettingsView.swift

@@ -102,7 +102,15 @@ final class SettingsView: NSView {
102 102
                 picker.show(relativeTo: .zero, of: view, preferredEdge: .minY)
103 103
             }
104 104
         })
105
-        card.addRow(SettingsThemeRow())
105
+        card.addRow(SettingsToggleRow(
106
+            symbolName: "moon.fill",
107
+            title: "Dark Mode",
108
+            isOn: AppSettings.darkModeEnabled,
109
+            isLast: true
110
+        ) { enabled in
111
+            AppSettings.darkModeEnabled = enabled
112
+            AppSettings.applyAppearance()
113
+        })
106 114
 
107 115
         return card
108 116
     }
@@ -323,22 +331,19 @@ private final class SettingsPopupRow: SettingsRowBase {
323 331
     required init?(coder: NSCoder) { nil }
324 332
 }
325 333
 
326
-private final class SettingsThemeRow: SettingsRowBase {
327
-    private let segmentTarget: SegmentTarget
334
+private final class SettingsToggleRow: SettingsRowBase {
335
+    private let toggleTarget: ToggleTarget
328 336
 
329
-    init() {
330
-        segmentTarget = SegmentTarget()
331
-        super.init(isLast: true)
332
-
333
-        let segment = NSSegmentedControl(labels: AppThemePreference.allCases.map(\.title), trackingMode: .selectOne, target: segmentTarget, action: #selector(SegmentTarget.changed(_:)))
334
-        segment.selectedSegment = AppSettings.appTheme.rawValue
335
-        segmentTarget.handler = { index in
336
-            if let theme = AppThemePreference(rawValue: index) {
337
-                AppSettings.appTheme = theme
338
-            }
339
-        }
337
+    init(symbolName: String, title: String, isOn: Bool, isLast: Bool = false, onChange: @escaping (Bool) -> Void) {
338
+        toggleTarget = ToggleTarget(handler: onChange)
339
+        super.init(isLast: isLast)
340 340
 
341
-        _ = install(icon: "circle.lefthalf.filled", title: "Theme", trailing: segment)
341
+        let toggle = NSSwitch()
342
+        toggle.state = isOn ? .on : .off
343
+        toggle.target = toggleTarget
344
+        toggle.action = #selector(ToggleTarget.changed(_:))
345
+
346
+        _ = install(icon: symbolName, title: title, trailing: toggle)
342 347
     }
343 348
 
344 349
     @available(*, unavailable)
@@ -380,11 +385,15 @@ private final class PopupTarget: NSObject {
380 385
     }
381 386
 }
382 387
 
383
-private final class SegmentTarget: NSObject {
384
-    var handler: ((Int) -> Void)?
388
+private final class ToggleTarget: NSObject {
389
+    private let handler: (Bool) -> Void
390
+
391
+    init(handler: @escaping (Bool) -> Void) {
392
+        self.handler = handler
393
+    }
385 394
 
386
-    @objc func changed(_ sender: NSSegmentedControl) {
387
-        handler?(sender.selectedSegment)
395
+    @objc func changed(_ sender: NSSwitch) {
396
+        handler(sender.state == .on)
388 397
     }
389 398
 }
390 399