Ver código fonte

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 1 mês atrás
pai
commit
904e3e5edc

+ 1 - 0
smart_printer/AppDelegate.swift

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

+ 11 - 18
smart_printer/AppSettings.swift

@@ -29,20 +29,6 @@ enum ScanFormat: String, CaseIterable {
     case png = "PNG"
 }
 
-enum AppThemePreference: Int, CaseIterable {
-    case system
-    case light
-    case dark
-
-    var title: String {
-        switch self {
-        case .system: "System"
-        case .light: "Light"
-        case .dark: "Dark"
-        }
-    }
-}
-
 enum AppSettings {
     private static let defaults = UserDefaults.standard
 
@@ -58,6 +44,7 @@ enum AppSettings {
         static let saveRecentFiles = "settings.saveRecentFiles"
         static let defaultPrinterName = "settings.defaultPrinterName"
         static let appTheme = "settings.appTheme"
+        static let darkModeEnabled = "settings.darkModeEnabled"
         static let appLanguage = "settings.appLanguage"
     }
 
@@ -149,12 +136,18 @@ enum AppSettings {
         return NSPrintInfo.shared.printer.name
     }
 
-    static var appTheme: AppThemePreference {
+    static var darkModeEnabled: Bool {
         get {
-            let raw = defaults.integer(forKey: Key.appTheme)
-            return AppThemePreference(rawValue: raw) ?? .light
+            if defaults.object(forKey: Key.darkModeEnabled) != nil {
+                return defaults.bool(forKey: Key.darkModeEnabled)
+            }
+            return defaults.integer(forKey: Key.appTheme) == 2
         }
-        set { defaults.set(newValue.rawValue, forKey: Key.appTheme) }
+        set { defaults.set(newValue, forKey: Key.darkModeEnabled) }
+    }
+
+    static func applyAppearance() {
+        NSApp.appearance = darkModeEnabled ? NSAppearance(named: .darkAqua) : NSAppearance(named: .aqua)
     }
 
     static var appLanguage: String {

+ 28 - 19
smart_printer/SettingsView.swift

@@ -102,7 +102,15 @@ final class SettingsView: NSView {
                 picker.show(relativeTo: .zero, of: view, preferredEdge: .minY)
             }
         })
-        card.addRow(SettingsThemeRow())
+        card.addRow(SettingsToggleRow(
+            symbolName: "moon.fill",
+            title: "Dark Mode",
+            isOn: AppSettings.darkModeEnabled,
+            isLast: true
+        ) { enabled in
+            AppSettings.darkModeEnabled = enabled
+            AppSettings.applyAppearance()
+        })
 
         return card
     }
@@ -323,22 +331,19 @@ private final class SettingsPopupRow: SettingsRowBase {
     required init?(coder: NSCoder) { nil }
 }
 
-private final class SettingsThemeRow: SettingsRowBase {
-    private let segmentTarget: SegmentTarget
+private final class SettingsToggleRow: SettingsRowBase {
+    private let toggleTarget: ToggleTarget
 
-    init() {
-        segmentTarget = SegmentTarget()
-        super.init(isLast: true)
-
-        let segment = NSSegmentedControl(labels: AppThemePreference.allCases.map(\.title), trackingMode: .selectOne, target: segmentTarget, action: #selector(SegmentTarget.changed(_:)))
-        segment.selectedSegment = AppSettings.appTheme.rawValue
-        segmentTarget.handler = { index in
-            if let theme = AppThemePreference(rawValue: index) {
-                AppSettings.appTheme = theme
-            }
-        }
+    init(symbolName: String, title: String, isOn: Bool, isLast: Bool = false, onChange: @escaping (Bool) -> Void) {
+        toggleTarget = ToggleTarget(handler: onChange)
+        super.init(isLast: isLast)
 
-        _ = install(icon: "circle.lefthalf.filled", title: "Theme", trailing: segment)
+        let toggle = NSSwitch()
+        toggle.state = isOn ? .on : .off
+        toggle.target = toggleTarget
+        toggle.action = #selector(ToggleTarget.changed(_:))
+
+        _ = install(icon: symbolName, title: title, trailing: toggle)
     }
 
     @available(*, unavailable)
@@ -380,11 +385,15 @@ private final class PopupTarget: NSObject {
     }
 }
 
-private final class SegmentTarget: NSObject {
-    var handler: ((Int) -> Void)?
+private final class ToggleTarget: NSObject {
+    private let handler: (Bool) -> Void
+
+    init(handler: @escaping (Bool) -> Void) {
+        self.handler = handler
+    }
 
-    @objc func changed(_ sender: NSSegmentedControl) {
-        handler?(sender.selectedSegment)
+    @objc func changed(_ sender: NSSwitch) {
+        handler(sender.state == .on)
     }
 }