| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- import Cocoa
- import ServiceManagement
- enum PaperSize: String, CaseIterable {
- case a4 = "A4"
- case letter = "Letter"
- case legal = "Legal"
- }
- enum PrintQuality: String, CaseIterable {
- case draft = "Draft"
- case normal = "Normal"
- case best = "Best"
- }
- enum ColorMode: String, CaseIterable {
- case color = "Color"
- case grayscale = "Grayscale"
- }
- enum ScanResolution: String, CaseIterable {
- case dpi150 = "150 DPI"
- case dpi300 = "300 DPI"
- case dpi600 = "600 DPI"
- }
- enum ScanFormat: String, CaseIterable {
- case pdf = "PDF"
- case jpeg = "JPEG"
- case png = "PNG"
- }
- enum AppSettings {
- private static let defaults = UserDefaults.standard
- private enum Key {
- static let launchAtLogin = "settings.launchAtLogin"
- static let defaultPaperSize = "settings.defaultPaperSize"
- static let printQuality = "settings.printQuality"
- static let colorMode = "settings.colorMode"
- static let duplexEnabled = "settings.duplexEnabled"
- static let scanResolution = "settings.scanResolution"
- static let scanFormat = "settings.scanFormat"
- static let showPrintNotifications = "settings.showPrintNotifications"
- 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"
- }
- static var launchAtLogin: Bool {
- get { defaults.bool(forKey: Key.launchAtLogin) }
- set {
- defaults.set(newValue, forKey: Key.launchAtLogin)
- applyLaunchAtLogin(newValue)
- }
- }
- static var defaultPaperSize: PaperSize {
- get {
- PaperSize(rawValue: defaults.string(forKey: Key.defaultPaperSize) ?? "") ?? .a4
- }
- set { defaults.set(newValue.rawValue, forKey: Key.defaultPaperSize) }
- }
- static var printQuality: PrintQuality {
- get {
- PrintQuality(rawValue: defaults.string(forKey: Key.printQuality) ?? "") ?? .normal
- }
- set { defaults.set(newValue.rawValue, forKey: Key.printQuality) }
- }
- static var colorMode: ColorMode {
- get {
- ColorMode(rawValue: defaults.string(forKey: Key.colorMode) ?? "") ?? .color
- }
- set { defaults.set(newValue.rawValue, forKey: Key.colorMode) }
- }
- static var duplexEnabled: Bool {
- get { defaults.bool(forKey: Key.duplexEnabled) }
- set { defaults.set(newValue, forKey: Key.duplexEnabled) }
- }
- static var scanResolution: ScanResolution {
- get {
- ScanResolution(rawValue: defaults.string(forKey: Key.scanResolution) ?? "") ?? .dpi300
- }
- set { defaults.set(newValue.rawValue, forKey: Key.scanResolution) }
- }
- static var scanFormat: ScanFormat {
- get {
- ScanFormat(rawValue: defaults.string(forKey: Key.scanFormat) ?? "") ?? .pdf
- }
- set { defaults.set(newValue.rawValue, forKey: Key.scanFormat) }
- }
- static var showPrintNotifications: Bool {
- get {
- if defaults.object(forKey: Key.showPrintNotifications) == nil { return true }
- return defaults.bool(forKey: Key.showPrintNotifications)
- }
- set { defaults.set(newValue, forKey: Key.showPrintNotifications) }
- }
- static var saveRecentFiles: Bool {
- get {
- if defaults.object(forKey: Key.saveRecentFiles) == nil { return true }
- return defaults.bool(forKey: Key.saveRecentFiles)
- }
- set { defaults.set(newValue, forKey: Key.saveRecentFiles) }
- }
- static var defaultPrinterName: String? {
- get { defaults.string(forKey: Key.defaultPrinterName) }
- set {
- if let newValue {
- defaults.set(newValue, forKey: Key.defaultPrinterName)
- } else {
- defaults.removeObject(forKey: Key.defaultPrinterName)
- }
- }
- }
- static var availablePrinters: [String] {
- let printInfo = NSPrintInfo.shared
- let printerNames = NSPrinter.printerNames
- if printerNames.isEmpty {
- return [printInfo.printer.name]
- }
- return printerNames
- }
- static var effectiveDefaultPrinter: String {
- if let saved = defaultPrinterName, availablePrinters.contains(saved) {
- return saved
- }
- return NSPrintInfo.shared.printer.name
- }
- static var darkModeEnabled: Bool {
- get {
- if defaults.object(forKey: Key.darkModeEnabled) != nil {
- return defaults.bool(forKey: Key.darkModeEnabled)
- }
- return defaults.integer(forKey: Key.appTheme) == 2
- }
- set { defaults.set(newValue, forKey: Key.darkModeEnabled) }
- }
- static func applyAppearance() {
- NSApp.appearance = darkModeEnabled ? NSAppearance(named: .darkAqua) : NSAppearance(named: .aqua)
- NotificationCenter.default.post(name: .appearanceDidChange, object: nil)
- }
- static func syncLaunchAtLoginRegistration() {
- guard #available(macOS 13.0, *) else { return }
- let registered = SMAppService.mainApp.status == .enabled
- if registered != launchAtLogin {
- applyLaunchAtLogin(launchAtLogin)
- }
- }
- private static func applyLaunchAtLogin(_ enabled: Bool) {
- guard #available(macOS 13.0, *) else { return }
- do {
- if enabled {
- try SMAppService.mainApp.register()
- } else {
- try SMAppService.mainApp.unregister()
- }
- } catch {
- NSLog("Launch at login failed: \(error.localizedDescription)")
- }
- }
- static var appLanguage: String {
- get { defaults.string(forKey: Key.appLanguage) ?? "English" }
- set { defaults.set(newValue, forKey: Key.appLanguage) }
- }
- }
- extension Notification.Name {
- static let appearanceDidChange = Notification.Name("appearanceDidChange")
- }
|