AppSettings.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import Cocoa
  2. enum PaperSize: String, CaseIterable {
  3. case a4 = "A4"
  4. case letter = "Letter"
  5. case legal = "Legal"
  6. }
  7. enum PrintQuality: String, CaseIterable {
  8. case draft = "Draft"
  9. case normal = "Normal"
  10. case best = "Best"
  11. }
  12. enum ColorMode: String, CaseIterable {
  13. case color = "Color"
  14. case grayscale = "Grayscale"
  15. }
  16. enum ScanResolution: String, CaseIterable {
  17. case dpi150 = "150 DPI"
  18. case dpi300 = "300 DPI"
  19. case dpi600 = "600 DPI"
  20. }
  21. enum ScanFormat: String, CaseIterable {
  22. case pdf = "PDF"
  23. case jpeg = "JPEG"
  24. case png = "PNG"
  25. }
  26. enum AppSettings {
  27. private static let defaults = UserDefaults.standard
  28. private enum Key {
  29. static let launchAtLogin = "settings.launchAtLogin"
  30. static let defaultPaperSize = "settings.defaultPaperSize"
  31. static let printQuality = "settings.printQuality"
  32. static let colorMode = "settings.colorMode"
  33. static let duplexEnabled = "settings.duplexEnabled"
  34. static let scanResolution = "settings.scanResolution"
  35. static let scanFormat = "settings.scanFormat"
  36. static let showPrintNotifications = "settings.showPrintNotifications"
  37. static let saveRecentFiles = "settings.saveRecentFiles"
  38. static let defaultPrinterName = "settings.defaultPrinterName"
  39. static let appTheme = "settings.appTheme"
  40. static let darkModeEnabled = "settings.darkModeEnabled"
  41. static let appLanguage = "settings.appLanguage"
  42. }
  43. static var launchAtLogin: Bool {
  44. get { defaults.bool(forKey: Key.launchAtLogin) }
  45. set { defaults.set(newValue, forKey: Key.launchAtLogin) }
  46. }
  47. static var defaultPaperSize: PaperSize {
  48. get {
  49. PaperSize(rawValue: defaults.string(forKey: Key.defaultPaperSize) ?? "") ?? .a4
  50. }
  51. set { defaults.set(newValue.rawValue, forKey: Key.defaultPaperSize) }
  52. }
  53. static var printQuality: PrintQuality {
  54. get {
  55. PrintQuality(rawValue: defaults.string(forKey: Key.printQuality) ?? "") ?? .normal
  56. }
  57. set { defaults.set(newValue.rawValue, forKey: Key.printQuality) }
  58. }
  59. static var colorMode: ColorMode {
  60. get {
  61. ColorMode(rawValue: defaults.string(forKey: Key.colorMode) ?? "") ?? .color
  62. }
  63. set { defaults.set(newValue.rawValue, forKey: Key.colorMode) }
  64. }
  65. static var duplexEnabled: Bool {
  66. get { defaults.bool(forKey: Key.duplexEnabled) }
  67. set { defaults.set(newValue, forKey: Key.duplexEnabled) }
  68. }
  69. static var scanResolution: ScanResolution {
  70. get {
  71. ScanResolution(rawValue: defaults.string(forKey: Key.scanResolution) ?? "") ?? .dpi300
  72. }
  73. set { defaults.set(newValue.rawValue, forKey: Key.scanResolution) }
  74. }
  75. static var scanFormat: ScanFormat {
  76. get {
  77. ScanFormat(rawValue: defaults.string(forKey: Key.scanFormat) ?? "") ?? .pdf
  78. }
  79. set { defaults.set(newValue.rawValue, forKey: Key.scanFormat) }
  80. }
  81. static var showPrintNotifications: Bool {
  82. get {
  83. if defaults.object(forKey: Key.showPrintNotifications) == nil { return true }
  84. return defaults.bool(forKey: Key.showPrintNotifications)
  85. }
  86. set { defaults.set(newValue, forKey: Key.showPrintNotifications) }
  87. }
  88. static var saveRecentFiles: Bool {
  89. get {
  90. if defaults.object(forKey: Key.saveRecentFiles) == nil { return true }
  91. return defaults.bool(forKey: Key.saveRecentFiles)
  92. }
  93. set { defaults.set(newValue, forKey: Key.saveRecentFiles) }
  94. }
  95. static var defaultPrinterName: String? {
  96. get { defaults.string(forKey: Key.defaultPrinterName) }
  97. set {
  98. if let newValue {
  99. defaults.set(newValue, forKey: Key.defaultPrinterName)
  100. } else {
  101. defaults.removeObject(forKey: Key.defaultPrinterName)
  102. }
  103. }
  104. }
  105. static var availablePrinters: [String] {
  106. let printInfo = NSPrintInfo.shared
  107. let printerNames = NSPrinter.printerNames
  108. if printerNames.isEmpty {
  109. return [printInfo.printer.name]
  110. }
  111. return printerNames
  112. }
  113. static var effectiveDefaultPrinter: String {
  114. if let saved = defaultPrinterName, availablePrinters.contains(saved) {
  115. return saved
  116. }
  117. return NSPrintInfo.shared.printer.name
  118. }
  119. static var darkModeEnabled: Bool {
  120. get {
  121. if defaults.object(forKey: Key.darkModeEnabled) != nil {
  122. return defaults.bool(forKey: Key.darkModeEnabled)
  123. }
  124. return defaults.integer(forKey: Key.appTheme) == 2
  125. }
  126. set { defaults.set(newValue, forKey: Key.darkModeEnabled) }
  127. }
  128. static func applyAppearance() {
  129. NSApp.appearance = darkModeEnabled ? NSAppearance(named: .darkAqua) : NSAppearance(named: .aqua)
  130. }
  131. static var appLanguage: String {
  132. get { defaults.string(forKey: Key.appLanguage) ?? "English" }
  133. set { defaults.set(newValue, forKey: Key.appLanguage) }
  134. }
  135. }