SettingsManager.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  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 = "AutoSaveTimeIntervalKey"
  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. DistributedNotificationCenter.default().addObserver(self, selector: #selector(_themeChanged), name: NSApplication.interfaceThemeChangedNotification, object: nil)
  105. NotificationCenter.default.addObserver(self, selector: #selector(_themeChanged), name: NSNotification.Name("ComponentLibraryParserFinishNoti"), object: nil)
  106. }
  107. func config() {
  108. self.loadData()
  109. // if appearance == .autoMode {
  110. //
  111. // } else if appearance == .lightMode {
  112. // NSApplication.shared.appearance = NSAppearance(named: .aqua)
  113. // } else if appearance == .darkMode {
  114. // NSApplication.shared.appearance = NSAppearance(named: .darkAqua)
  115. // }
  116. }
  117. private func loadData() {
  118. //General
  119. self.appearance = appearanceMode(rawValue: UserDefaults.standard.integer(forKey: settingsAppearanceKey)) ?? .autoMode
  120. self.author = UserDefaults.standard.string(forKey: settingsAuthorKey) ?? NSFullUserName()
  121. self.defaultPDFViewer = UserDefaults.standard.bool(forKey: settingsDefaultPDFViewerKey)
  122. self.reopenFileWhenAppStart = UserDefaults.standard.bool(forKey: settingsReopenFileKey)
  123. self.autoSaveFile = UserDefaults.standard.bool(forKey: settingsAutoSaveFileKey)
  124. self.autoSaveMinutes = UserDefaults.standard.string(forKey: settingsAutoSaveMinutesKey) ?? ""
  125. if let value = UserDefaults.standard.value(forKey: settingsFileListCountKey), let data = value as? Int {
  126. self.fileListCount = data
  127. } else {
  128. self.fileListCount = 10
  129. }
  130. self.language = settingsLanguage(rawValue: UserDefaults.standard.integer(forKey: settingsLanguageTypeKey)) ?? .FollowSystem
  131. self.keychainType = keyChainPasswordType(rawValue: UserDefaults.standard.integer(forKey: settingsKeychainTypeKey)) ?? .ask
  132. //PageDisplay
  133. if let value = UserDefaults.standard.value(forKey: settingsPageLayoutTypeKey), let data = value as? Int {
  134. self.layoutType = pageLayoutType(rawValue: data) ?? .singlePageContinue
  135. } else {
  136. self.layoutType = .singlePageContinue
  137. }
  138. self.zoomType = zoomInfoType(rawValue: UserDefaults.standard.integer(forKey: settingsZoomTypeKey)) ?? .adaptationWidth
  139. self.leftPanelType = leftSidePanelType(rawValue: UserDefaults.standard.integer(forKey: settingsLeftSidePanelKey)) ?? .defaultOpen
  140. self.defaultOpen = defaultOpenType(rawValue: UserDefaults.standard.integer(forKey: settingsDefaultOpenTypeKey)) ?? .thumbnail
  141. self.autoExpandPropertyPanel = UserDefaults.standard.bool(forKey: settingsPanelOpenTypeKey)
  142. if let _ = UserDefaults.standard.value(forKey: settingsShowQuickActionBarKey) {
  143. self.showQuickActionBar = UserDefaults.standard.bool(forKey: settingsShowQuickActionBarKey)
  144. } else {
  145. self.showQuickActionBar = true
  146. }
  147. let autoScrollTimeInterval = UserDefaults.standard.float(forKey: autoScrollTimeIntervalKey)
  148. if autoScrollTimeInterval > 5 {
  149. self.autoScrollTimeInterval = autoScrollTimeInterval.cgFloat
  150. } else {
  151. self.autoScrollTimeInterval = 5
  152. }
  153. let autoScrollJumpSpace = UserDefaults.standard.float(forKey: autoScrollJumpSpaceKey)
  154. if autoScrollJumpSpace > 10 {
  155. self.autoScrollJumpSpace = autoScrollJumpSpace.cgFloat
  156. } else {
  157. self.autoScrollJumpSpace = 20
  158. }
  159. }
  160. func saveData() {
  161. //General
  162. UserDefaults.standard.setValue(appearance.rawValue, forKey: settingsAppearanceKey)
  163. UserDefaults.standard.setValue(author, forKey: settingsAuthorKey)
  164. UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey)
  165. UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey)
  166. UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey)
  167. UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey)
  168. UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey)
  169. UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey)
  170. UserDefaults.standard.setValue(keychainType.rawValue, forKey: settingsKeychainTypeKey)
  171. //PageDisplay
  172. UserDefaults.standard.setValue(layoutType.rawValue, forKey: settingsPageLayoutTypeKey)
  173. UserDefaults.standard.setValue(zoomType.rawValue, forKey: settingsZoomTypeKey)
  174. UserDefaults.standard.setValue(leftPanelType.rawValue, forKey: settingsLeftSidePanelKey)
  175. UserDefaults.standard.setValue(autoExpandPropertyPanel, forKey: settingsPanelOpenTypeKey)
  176. UserDefaults.standard.setValue(defaultOpen.rawValue, forKey: settingsDefaultOpenTypeKey)
  177. UserDefaults.standard.setValue(showQuickActionBar, forKey: settingsShowQuickActionBarKey)
  178. UserDefaults.standard.setValue(autoScrollTimeInterval, forKey: autoScrollTimeIntervalKey)
  179. UserDefaults.standard.setValue(autoScrollJumpSpace, forKey: autoScrollJumpSpaceKey)
  180. }
  181. //MARK: - Setter
  182. @objc var appearance: appearanceMode = .autoMode {
  183. didSet {
  184. }
  185. }
  186. @objc var author: String = "" {
  187. didSet {
  188. UserDefaults.standard.setValue(author, forKey: settingsAuthorKey)
  189. }
  190. }
  191. var defaultPDFViewer: Bool = true {
  192. didSet {
  193. let result = KMTools.setDefaultPDFReader(defaultPDFViewer)
  194. if (result) {
  195. UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey)
  196. }
  197. }
  198. }
  199. var reopenFileWhenAppStart: Bool = false {
  200. didSet {
  201. UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey)
  202. }
  203. }
  204. var autoSaveFile: Bool = false {
  205. didSet {
  206. UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey)
  207. }
  208. }
  209. var autoSaveMinutes: String = "" {
  210. didSet {
  211. UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey)
  212. }
  213. }
  214. var fileListCount: Int = 10 {
  215. didSet {
  216. UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey)
  217. }
  218. }
  219. var language: settingsLanguage = .FollowSystem {
  220. didSet {
  221. UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey)
  222. }
  223. }
  224. var keychainType: keyChainPasswordType = .ask {
  225. didSet {
  226. }
  227. }
  228. var layoutType: pageLayoutType = .singlePage {
  229. didSet {
  230. }
  231. }
  232. var zoomType: zoomInfoType = .adaptationWidth {
  233. didSet {
  234. }
  235. }
  236. var leftPanelType: leftSidePanelType = .defaultOpen {
  237. didSet {
  238. }
  239. }
  240. var defaultOpen: defaultOpenType = .thumbnail {
  241. didSet {
  242. }
  243. }
  244. var autoExpandPropertyPanel: Bool = true {
  245. didSet {
  246. }
  247. }
  248. var showQuickActionBar: Bool = true {
  249. didSet {
  250. }
  251. }
  252. var resetDefaultWaringKeys: [String] {
  253. return ["HomeFilesDeleteConfirmKey", "kApplyRedactAlert", "kExitRedactAlert", "kRedact", "kDigitalSignature", "kKMBatchProcessingView"]
  254. }
  255. var autoScrollTimeInterval: CGFloat = 5
  256. var autoScrollJumpSpace: CGFloat = 20
  257. //MARK: - Reset
  258. func resetDefaultData() {
  259. self.resetGeneralData()
  260. self.resetPageDisplayData()
  261. self.saveData()
  262. }
  263. func resetGeneralData() {
  264. self.appearance = .autoMode
  265. self.author = NSFullUserName()
  266. self.defaultPDFViewer = true
  267. self.reopenFileWhenAppStart = false
  268. self.autoSaveFile = false
  269. self.autoSaveMinutes = "15"
  270. self.fileListCount = 10
  271. self.keychainType = .ask
  272. }
  273. func resetPageDisplayData() {
  274. self.layoutType = .singlePageContinue
  275. self.zoomType = .adaptationWidth
  276. self.leftPanelType = .defaultOpen
  277. self.defaultOpen = .thumbnail
  278. self.autoExpandPropertyPanel = false
  279. self.showQuickActionBar = true
  280. self.autoScrollTimeInterval = 5
  281. self.autoScrollJumpSpace = 20
  282. }
  283. func closeFileIsPrompt() -> Bool {
  284. return true
  285. }
  286. func resetDefaultWaringKeyEnable() -> Bool {
  287. for string in self.resetDefaultWaringKeys {
  288. if let _ = UserDefaults.standard.value(forKey: string) {
  289. return true
  290. }
  291. }
  292. return false
  293. }
  294. @objc private func _themeChanged(_ sender: Notification) {
  295. NotificationCenter.default.post(name: APPAppearanceChangedNotificationName, object: nil)
  296. }
  297. }
  298. //MARK: - Method
  299. public func KMLocalizedString(_ key: String, comment: String? = nil) -> String {
  300. var bundlePath: String? = nil
  301. if SettingsManager.sharedInstance.language != .FollowSystem {
  302. if SettingsManager.sharedInstance.language == .English {
  303. bundlePath = Bundle.main.path(forResource: "en", ofType: "lproj")
  304. } else if SettingsManager.sharedInstance.language == .Chinese_TW {
  305. bundlePath = Bundle.main.path(forResource: "zh-Hant", ofType: "lproj")
  306. } else if SettingsManager.sharedInstance.language == .Dutch {
  307. bundlePath = Bundle.main.path(forResource: "nl", ofType: "lproj")
  308. } else if SettingsManager.sharedInstance.language == .French {
  309. bundlePath = Bundle.main.path(forResource: "fr", ofType: "lproj")
  310. } else if SettingsManager.sharedInstance.language == .German {
  311. bundlePath = Bundle.main.path(forResource: "de", ofType: "lproj")
  312. } else if SettingsManager.sharedInstance.language == .Italian {
  313. bundlePath = Bundle.main.path(forResource: "it", ofType: "lproj")
  314. } else if SettingsManager.sharedInstance.language == .Japanese {
  315. bundlePath = Bundle.main.path(forResource: "ja", ofType: "lproj")
  316. } else if SettingsManager.sharedInstance.language == .Polish {
  317. bundlePath = Bundle.main.path(forResource: "pl", ofType: "lproj")
  318. } else if SettingsManager.sharedInstance.language == .Russian {
  319. bundlePath = Bundle.main.path(forResource: "ru", ofType: "lproj")
  320. } else if SettingsManager.sharedInstance.language == .Spanish {
  321. bundlePath = Bundle.main.path(forResource: "es", ofType: "lproj")
  322. } else if SettingsManager.sharedInstance.language == .Chinese_CN {
  323. bundlePath = Bundle.main.path(forResource: "zh-Hans", ofType: "lproj")
  324. } else if SettingsManager.sharedInstance.language == .Protuguese {
  325. bundlePath = Bundle.main.path(forResource: "pt", ofType: "lproj")
  326. } else if SettingsManager.sharedInstance.language == .Arabic {
  327. bundlePath = Bundle.main.path(forResource: "ar", ofType: "lproj")
  328. }
  329. }
  330. if let bPath = bundlePath, let bundle = Bundle.init(path: bPath) {
  331. return NSLocalizedString(key, tableName: "Localizable", bundle: bundle, comment: comment ?? "")
  332. } else {
  333. return NSLocalizedString(key, comment: "")
  334. }
  335. }