SettingsManager.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. //
  2. // SettingsManager.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/9/26.
  6. //
  7. import Cocoa
  8. @objc public enum appearanceMode: Int {
  9. case lightMode
  10. case darkMode
  11. case autoMode
  12. }
  13. @objc public enum keyChainPasswordType : Int {
  14. case ask = 0
  15. case always
  16. case never
  17. }
  18. @objc public enum pageLayoutType : Int {
  19. case singlePage = 0
  20. case singlePageContinue
  21. case twoPage
  22. case twoPageContinue
  23. case bookMode
  24. case bookModeContinue
  25. }
  26. @objc public enum leftSidePanelType : Int {
  27. case defaultOpen = 0
  28. case sameAsLastOpen
  29. case hideLeftSide
  30. case prioritizeOutline
  31. }
  32. @objc public enum defaultOpenType: Int {
  33. case thumbnail = 0
  34. case outline
  35. case bookmark
  36. case annotation
  37. }
  38. @objc public enum zoomInfoType : Int {
  39. case adaptationWidth = 0
  40. case adapPage
  41. case actualSize
  42. case percent_10
  43. case percent_25
  44. case percent_50
  45. case percent_75
  46. case percent_100
  47. case percent_150
  48. case percent_200
  49. case percent_400
  50. case percent_800
  51. }
  52. @objc public enum panelOpenInteractionType : Int {
  53. case automatic = 0
  54. case hidePropertyPanel
  55. }
  56. @objc public enum settingsLanguage: Int {
  57. case FollowSystem = 0
  58. case English
  59. case Chinese_CN
  60. case Chinese_TW
  61. case Dutch
  62. case French
  63. case Spanish
  64. case German
  65. case Russian
  66. case Italian
  67. case Japanese
  68. case Polish
  69. case Protuguese
  70. case Arabic
  71. }
  72. //外观修改时调用
  73. let APPAppearanceChangedNotificationName = NSNotification.Name("APPAppearanceChangedNotificationName")
  74. //语言修改时调用
  75. let APPLanguageChangedNotificationName = NSNotification.Name("APPLanguageChangedNotificationName")
  76. //高亮Form表单域修改时调用
  77. let kPDFViewHighlightFormFiledUpdateNotiName = NSNotification.Name("kPDFViewHighlightFormFiledUpdateNotiName")
  78. //高亮Link链接修改时调用
  79. let kPDFViewHighlightLinkUpdateNotiName = NSNotification.Name("kPDFViewHighlightLinkUpdateNotiName")
  80. //General
  81. let settingsAppearanceKey = "settingsAppearanceKey"
  82. let settingsAuthorKey = "settingsAuthorKey"
  83. let settingsDefaultPDFViewerKey = "settingsDefaultPDFViewerKey"
  84. var settingsReopenFileKey = "settingsReopenFileKey"
  85. var settingsAutoSaveFileKey = "settingsAutoSaveFileKey"
  86. var settingsAutoSaveMinutesKey = "settingsAutoSaveMinutesKey"
  87. var settingsFileListCountKey = "settingsFileListCountKey"
  88. var settingsLanguageTypeKey = "settingsLanguageTypeKey"
  89. var settingsKeychainTypeKey = "settingsKeychainTypeKey"
  90. //PageDisplay
  91. var settingsPageLayoutTypeKey = "settingsPageLayoutTypeKey"
  92. var settingsZoomTypeKey = "settingsZoomTypeKey"
  93. var settingsLeftSidePanelKey = "settingsLeftSidePanelKey"
  94. var settingsDefaultOpenTypeKey = "settingsDefaultOpenTypeKey"
  95. var settingsPanelOpenTypeKey = "settingsPanelOpenTypeKey"
  96. var settingsShowQuickActionBarKey = "settingsShowQuickActionBarKey"
  97. var autoScrollTimeIntervalKey = "autoScrollTimeIntervalKey"
  98. var autoScrollJumpSpaceKey = "autoScrollJumpSpaceKey"
  99. @objc class SettingsManager: NSObject {
  100. @objc static let sharedInstance = SettingsManager.init()
  101. override init() {
  102. super.init()
  103. self.config()
  104. }
  105. func config() {
  106. self.loadData()
  107. // if appearance == .autoMode {
  108. //
  109. // } else if appearance == .lightMode {
  110. // NSApplication.shared.appearance = NSAppearance(named: .aqua)
  111. // } else if appearance == .darkMode {
  112. // NSApplication.shared.appearance = NSAppearance(named: .darkAqua)
  113. // }
  114. }
  115. private func loadData() {
  116. //General
  117. self.appearance = appearanceMode(rawValue: UserDefaults.standard.integer(forKey: settingsAppearanceKey)) ?? .autoMode
  118. self.author = UserDefaults.standard.string(forKey: settingsAuthorKey) ?? NSFullUserName()
  119. self.defaultPDFViewer = UserDefaults.standard.bool(forKey: settingsDefaultPDFViewerKey)
  120. self.reopenFileWhenAppStart = UserDefaults.standard.bool(forKey: settingsReopenFileKey)
  121. self.autoSaveFile = UserDefaults.standard.bool(forKey: settingsAutoSaveFileKey)
  122. self.autoSaveMinutes = UserDefaults.standard.string(forKey: settingsAutoSaveMinutesKey) ?? ""
  123. if let value = UserDefaults.standard.value(forKey: settingsFileListCountKey), let data = value as? Int {
  124. self.fileListCount = data
  125. } else {
  126. self.fileListCount = 10
  127. }
  128. self.language = settingsLanguage(rawValue: UserDefaults.standard.integer(forKey: settingsLanguageTypeKey)) ?? .FollowSystem
  129. self.keychainType = keyChainPasswordType(rawValue: UserDefaults.standard.integer(forKey: settingsKeychainTypeKey)) ?? .ask
  130. //PageDisplay
  131. if let value = UserDefaults.standard.value(forKey: settingsPageLayoutTypeKey), let data = value as? Int {
  132. self.layoutType = pageLayoutType(rawValue: data) ?? .singlePageContinue
  133. } else {
  134. self.layoutType = .singlePageContinue
  135. }
  136. self.zoomType = zoomInfoType(rawValue: UserDefaults.standard.integer(forKey: settingsZoomTypeKey)) ?? .adaptationWidth
  137. self.leftPanelType = leftSidePanelType(rawValue: UserDefaults.standard.integer(forKey: settingsLeftSidePanelKey)) ?? .defaultOpen
  138. self.defaultOpen = defaultOpenType(rawValue: UserDefaults.standard.integer(forKey: settingsDefaultOpenTypeKey)) ?? .thumbnail
  139. self.autoExpandPropertyPanel = UserDefaults.standard.bool(forKey: settingsPanelOpenTypeKey)
  140. if let _ = UserDefaults.standard.value(forKey: settingsShowQuickActionBarKey) {
  141. self.showQuickActionBar = UserDefaults.standard.bool(forKey: settingsShowQuickActionBarKey)
  142. } else {
  143. self.showQuickActionBar = true
  144. }
  145. let autoScrollTimeInterval = UserDefaults.standard.float(forKey: autoScrollTimeIntervalKey)
  146. if autoScrollTimeInterval > 5 {
  147. self.autoScrollTimeInterval = autoScrollTimeInterval.cgFloat
  148. } else {
  149. self.autoScrollTimeInterval = 5
  150. }
  151. let autoScrollJumpSpace = UserDefaults.standard.float(forKey: autoScrollJumpSpaceKey)
  152. if autoScrollJumpSpace > 10 {
  153. self.autoScrollJumpSpace = autoScrollJumpSpace.cgFloat
  154. } else {
  155. self.autoScrollJumpSpace = 20
  156. }
  157. }
  158. func saveData() {
  159. //General
  160. UserDefaults.standard.setValue(appearance.rawValue, forKey: settingsAppearanceKey)
  161. UserDefaults.standard.setValue(author, forKey: settingsAuthorKey)
  162. UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey)
  163. UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey)
  164. UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey)
  165. UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey)
  166. UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey)
  167. UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey)
  168. UserDefaults.standard.setValue(keychainType.rawValue, forKey: settingsKeychainTypeKey)
  169. //PageDisplay
  170. UserDefaults.standard.setValue(layoutType.rawValue, forKey: settingsPageLayoutTypeKey)
  171. UserDefaults.standard.setValue(zoomType.rawValue, forKey: settingsZoomTypeKey)
  172. UserDefaults.standard.setValue(leftPanelType.rawValue, forKey: settingsLeftSidePanelKey)
  173. UserDefaults.standard.setValue(autoExpandPropertyPanel, forKey: settingsPanelOpenTypeKey)
  174. UserDefaults.standard.setValue(defaultOpen.rawValue, forKey: settingsDefaultOpenTypeKey)
  175. UserDefaults.standard.setValue(showQuickActionBar, forKey: settingsShowQuickActionBarKey)
  176. UserDefaults.standard.setValue(autoScrollTimeInterval, forKey: autoScrollTimeIntervalKey)
  177. UserDefaults.standard.setValue(autoScrollJumpSpace, forKey: autoScrollJumpSpaceKey)
  178. }
  179. //MARK: - Setter
  180. @objc var appearance: appearanceMode = .autoMode {
  181. didSet {
  182. }
  183. }
  184. @objc var author: String = "" {
  185. didSet {
  186. UserDefaults.standard.setValue(author, forKey: settingsAuthorKey)
  187. }
  188. }
  189. var defaultPDFViewer: Bool = true {
  190. didSet {
  191. let result = KMTools.setDefaultPDFReader(defaultPDFViewer)
  192. if (result) {
  193. UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey)
  194. }
  195. }
  196. }
  197. var reopenFileWhenAppStart: Bool = false {
  198. didSet {
  199. UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey)
  200. }
  201. }
  202. var autoSaveFile: Bool = false {
  203. didSet {
  204. UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey)
  205. }
  206. }
  207. var autoSaveMinutes: String = "" {
  208. didSet {
  209. UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey)
  210. }
  211. }
  212. var fileListCount: Int = 10 {
  213. didSet {
  214. UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey)
  215. }
  216. }
  217. var language: settingsLanguage = .FollowSystem {
  218. didSet {
  219. UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey)
  220. }
  221. }
  222. var keychainType: keyChainPasswordType = .ask {
  223. didSet {
  224. }
  225. }
  226. var layoutType: pageLayoutType = .singlePage {
  227. didSet {
  228. }
  229. }
  230. var zoomType: zoomInfoType = .adaptationWidth {
  231. didSet {
  232. }
  233. }
  234. var leftPanelType: leftSidePanelType = .defaultOpen {
  235. didSet {
  236. }
  237. }
  238. var defaultOpen: defaultOpenType = .thumbnail {
  239. didSet {
  240. }
  241. }
  242. var autoExpandPropertyPanel: Bool = true {
  243. didSet {
  244. }
  245. }
  246. var showQuickActionBar: Bool = true {
  247. didSet {
  248. }
  249. }
  250. var resetDefaultWaringKeys: [String] {
  251. return ["HomeFilesDeleteConfirmKey", "kApplyRedactAlert", "kExitRedactAlert", "kRedact", "kDigitalSignature", "kKMBatchProcessingView"]
  252. }
  253. var autoScrollTimeInterval: CGFloat = 5
  254. var autoScrollJumpSpace: CGFloat = 20
  255. //MARK: - Reset
  256. func resetDefaultData() {
  257. self.resetGeneralData()
  258. self.resetPageDisplayData()
  259. self.saveData()
  260. }
  261. func resetGeneralData() {
  262. self.appearance = .autoMode
  263. self.author = NSFullUserName()
  264. self.defaultPDFViewer = true
  265. self.reopenFileWhenAppStart = false
  266. self.autoSaveFile = false
  267. self.autoSaveMinutes = "15"
  268. self.fileListCount = 10
  269. self.keychainType = .ask
  270. }
  271. func resetPageDisplayData() {
  272. self.layoutType = .singlePageContinue
  273. self.zoomType = .adaptationWidth
  274. self.leftPanelType = .defaultOpen
  275. self.defaultOpen = .thumbnail
  276. self.autoExpandPropertyPanel = false
  277. self.showQuickActionBar = true
  278. self.autoScrollTimeInterval = 5
  279. self.autoScrollJumpSpace = 20
  280. }
  281. func closeFileIsPrompt() -> Bool {
  282. return true
  283. }
  284. func resetDefaultWaringKeyEnable() -> Bool {
  285. for string in self.resetDefaultWaringKeys {
  286. if let _ = UserDefaults.standard.value(forKey: string) {
  287. return true
  288. }
  289. }
  290. return false
  291. }
  292. }
  293. //MARK: - Method
  294. public func KMLocalizedString(_ key: String, comment: String? = nil) -> String {
  295. var bundlePath: String? = nil
  296. if SettingsManager.sharedInstance.language != .FollowSystem {
  297. if SettingsManager.sharedInstance.language == .English {
  298. bundlePath = Bundle.main.path(forResource: "en", ofType: "lproj")
  299. } else if SettingsManager.sharedInstance.language == .Chinese_TW {
  300. bundlePath = Bundle.main.path(forResource: "zh-Hant", ofType: "lproj")
  301. } else if SettingsManager.sharedInstance.language == .Dutch {
  302. bundlePath = Bundle.main.path(forResource: "nl", ofType: "lproj")
  303. } else if SettingsManager.sharedInstance.language == .French {
  304. bundlePath = Bundle.main.path(forResource: "fr", ofType: "lproj")
  305. } else if SettingsManager.sharedInstance.language == .German {
  306. bundlePath = Bundle.main.path(forResource: "de", ofType: "lproj")
  307. } else if SettingsManager.sharedInstance.language == .Italian {
  308. bundlePath = Bundle.main.path(forResource: "it", ofType: "lproj")
  309. } else if SettingsManager.sharedInstance.language == .Japanese {
  310. bundlePath = Bundle.main.path(forResource: "ja", ofType: "lproj")
  311. } else if SettingsManager.sharedInstance.language == .Polish {
  312. bundlePath = Bundle.main.path(forResource: "pl", ofType: "lproj")
  313. } else if SettingsManager.sharedInstance.language == .Russian {
  314. bundlePath = Bundle.main.path(forResource: "ru", ofType: "lproj")
  315. } else if SettingsManager.sharedInstance.language == .Spanish {
  316. bundlePath = Bundle.main.path(forResource: "es", ofType: "lproj")
  317. } else if SettingsManager.sharedInstance.language == .Chinese_CN {
  318. bundlePath = Bundle.main.path(forResource: "zh-Hans", ofType: "lproj")
  319. } else if SettingsManager.sharedInstance.language == .Protuguese {
  320. bundlePath = Bundle.main.path(forResource: "pt", ofType: "lproj")
  321. } else if SettingsManager.sharedInstance.language == .Arabic {
  322. bundlePath = Bundle.main.path(forResource: "ar", ofType: "lproj")
  323. }
  324. }
  325. if let bPath = bundlePath, let bundle = Bundle.init(path: bPath) {
  326. return NSLocalizedString(key, tableName: "Localizable", bundle: bundle, comment: comment ?? "")
  327. } else {
  328. return NSLocalizedString(key, comment: "")
  329. }
  330. }