123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- //
- // KMPreferenceManager.swift
- // PDF Reader Pro
- //
- // Created by tangchao on 2023/2/3.
- //
- import Cocoa
- enum KMPreferenceGroup: String {
- case general, display, markup, infomation, other
- }
- private let KMPreferenceInfoKey: String = "KMPreferenceInfoKey"
- typealias KMPreferenceKey = String
- /// general
- /// files
- private let KMOpenLastUnclosedDocumentWhenAppStartKey: KMPreferenceKey = "KMOpenLastUnclosedDocumentWhenAppStartKey"
- private let KMOpenLastUnlockedDocumentWhenAppStartKey: KMPreferenceKey = "KMOpenLastUnlockedDocumentWhenAppStartKey"
- private let KMDocumentMaximunDisplayNumberKey: KMPreferenceKey = "KMDocumentMaximunDisplayNumberKey"
- private let KMAutoSaveKey: KMPreferenceKey = "KMAutoSaveKey"
- private let KMAutoSavePerNumberMinuteKey: KMPreferenceKey = "KMAutoSavePerNumberMinuteKey"
- private let KMCloseFilePromptTypeKey: KMPreferenceKey = "KMCloseFilePromptTypeKey"
- /// open image file
- private let KMOpenImageFileTypeKey: KMPreferenceKey = "KMOpenImageFileTypeKey"
- private let KMSetDefaultPDFReaderKey: KMPreferenceKey = "KMSetDefaultPDFReaderKey"
- /// save password
- private let KMSavePasswordTypeKey: KMPreferenceKey = "KMSavePasswordTypeKey"
- private let KMGeneralAuthorNameKey: KMPreferenceKey = "KMGeneralAuthorNameKey"
-
- /// 偏好设置已改变
- private let KMPreferenceDidChangeNotificationName = "KMPreferenceDidChangeNotificationName"
- private let KMDefaultFontName = "Helvetica-Oblique"
- var TeXEditors: [[String : Any]] = []
- let NAME_KEY = "name"
- var INITIALUSERDEFAULTS_KEY = "InitialUserDefaults"
- var TEXEDITORS_KEY = "TeXEditors"
- var COMMAND_KEY = "command"
- var ARGUMENTS_KEY = "arguments"
- typealias KMPreference = KMPreferenceManager
- @objcMembers class KMPreferenceManager: NSObject {
- static let shared = KMPreferenceManager()
-
- private var generalGroupKeys: Array<KMPreferenceKey> = []
- private var displayGroupKeys: Array<KMPreferenceKey> = []
- private var markupGroupKeys: Array<KMPreferenceKey> = []
-
- public static let didChangeNotification = Notification.Name(KMPreferenceDidChangeNotificationName)
-
- /// general
- /// files
- public static let openLastUnclosedDocumentWhenAppStartKey = KMOpenLastUnclosedDocumentWhenAppStartKey
- public static let openLastUnlockedDocumentWhenAppStartKey = KMOpenLastUnlockedDocumentWhenAppStartKey
- public static let documentMaximunDisplayNumberKey = KMDocumentMaximunDisplayNumberKey
- public static let autoSaveKey = KMAutoSaveKey
- public static let autoSavePerNumberMinuteKey = KMAutoSavePerNumberMinuteKey
- public static let closeFilePromptTypeKey = KMCloseFilePromptTypeKey
- /// open image file
- public static let openImageFileTypeKey = KMOpenImageFileTypeKey
- public static let setDefaultPDFReaderKey = KMSetDefaultPDFReaderKey
- /// save password
- public static let savePasswordTypeKey = KMSavePasswordTypeKey
- public static let generalAuthorNameKey = KMGeneralAuthorNameKey
-
-
- override init() {
- super.init()
-
- }
-
- // MARK: 保存/获取数据
- public func setData(data: Any,forKey key: KMPreferenceKey) -> Bool {
- return self.setData(data: data, forKey: key, in: findGroup(forKey: key))
- }
-
- public func setData(data: Any,forKey key: KMPreferenceKey, in group: KMPreferenceGroup) -> Bool {
-
- return true
- }
-
- public func getData(forKey key: KMPreferenceKey) -> Any {
- var info: [String : Any]?
-
- let groupInfo: [String : Any] = info?[findGroup(forKey: key).rawValue] as? [String : Any] ?? [:]
- return groupInfo[key] as Any
- }
-
- public func resetData(_ group: KMPreferenceGroup) {
-
- }
-
- // MARK: 注册 key
- public func register(_ key: KMPreferenceKey, to group: KMPreferenceGroup) -> Bool {
- if (group == .general) {
- if (self.generalGroupKeys.contains(key)) {
- return false
- }
- self.generalGroupKeys.append(key)
- }
- return true
- }
-
- // MARK: -
- // MARK: 发布通知
-
- private func postNotification(object: [KMPreferenceGroup]?, userInfo: [KMPreferenceKey : Any]?) {
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
- NotificationCenter.default.post(name: KMPreferenceManager.didChangeNotification, object: object, userInfo: userInfo)
- }
- }
-
- // MARK: 获取信息
- private func findGroup(forKey key: KMPreferenceKey) -> KMPreferenceGroup {
- if (self.generalGroupKeys.contains(key)) {
- return .general
- } else if (self.displayGroupKeys.contains(key)) {
- return .display
- } else if (self.markupGroupKeys.contains(key)) {
- return .markup
- }
- return .other
- }
- }
- // MARK: - 默认值
- extension KMPreferenceManager {
- // General
-
- var openDocumentTypeDefaultValue: KMPreferenceOpenDocumentType {
- get {
- return .inSameWindow
- }
- }
- }
-
- // MARK: 扩展 General
- extension KMPreferenceManager {
- var openLastUnclosedDocumentWhenAppStart: Bool {
- get {
- return KMDataManager.ud_bool(forKey: KMReopenLastOpenFilesKey)
- }
- set {
- let pKey = KMPreference.openLastUnclosedDocumentWhenAppStartKey
-
- _ = self.setData(data: newValue, forKey: pKey)
- }
- }
-
- var openLastUnlockedDocumentWhenAppStart: Bool {
- get {
- return self.getData(forKey: KMOpenLastUnlockedDocumentWhenAppStartKey) as? Bool ?? true
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMOpenLastUnlockedDocumentWhenAppStartKey)
- }
- }
-
- var documentMaximunDisplayNumber: Int {
- get {
- return self.getData(forKey: KMDocumentMaximunDisplayNumberKey) as? Int ?? 10
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMDocumentMaximunDisplayNumberKey)
- }
- }
-
- var autoSave: Bool {
- get {
- return self.getData(forKey: KMAutoSaveKey) as? Bool ?? true
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMAutoSaveKey)
- }
- }
-
- var autoSavePerNumberMinute: Int {
- get {
- return self.getData(forKey: KMAutoSavePerNumberMinuteKey) as? Int ?? 5
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMAutoSavePerNumberMinuteKey)
- }
- }
-
- var closeFilePromptType: KMPreferenceCloseFilePromptType {
- get {
- if let type = self.getData(forKey: KMCloseFilePromptTypeKey) as? Int {
- if type == 1 { // 无提示,直接保存
- return .noPromp
- }
- }
-
- return .promp
- }
- set {
- if (newValue == .promp || newValue == .noPromp) {
- let _ = self.setData(data: newValue.rawValue, forKey: KMCloseFilePromptTypeKey)
- }
- }
- }
-
- var openImageFileType: Int {
- get {
- return self.getData(forKey: KMOpenImageFileTypeKey) as? Int ?? 0
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMOpenImageFileTypeKey)
- }
- }
-
- var author: String {
- get {
- return KMDataManager.ud_string(forKey: KMUserNameKey) ?? NSFullUserName()
- }
- set {
- let _ = self.setData(data: newValue, forKey: KMGeneralAuthorNameKey)
- }
- }
-
- var setDefaultPDFReader: Bool {
- get {
- return self.getData(forKey: KMSetDefaultPDFReaderKey) as? Bool ?? true
- }
- set {
- let result = KMTools.setDefaultPDFReader(newValue)
- if (result) {
- let _ = self.setData(data: newValue, forKey: KMSetDefaultPDFReaderKey)
- }
- }
- }
-
- var savePasswordType: KMPreferenceSavePasswordType {
- get {
- let type = KMDataManager.ud_integer(forKey: KMSavePasswordOptionKey)
- if type == -1 {
- return .ask
- } else if type == 1 {
- return .always
- }
- return .never
- }
- set {
- if (newValue == .always || newValue == .never || newValue == .ask) {
- var data: Int = 0
- if newValue == .always {
- data = 1
- } else if newValue == .ask {
- data = -1
- }
-
- let _ = self.setData(data: newValue.rawValue, forKey: KMSavePasswordTypeKey)
- }
- }
- }
-
- var openDocumentType: KMPreferenceOpenDocumentType { // KMOpenDocumentInTab
- get {
- guard let num = KMDataManager.ud_object(forKey: KMOpenDocumentInTabKey) as? NSNumber else {
- return self.openDocumentTypeDefaultValue
- }
- if num.intValue == 1 {
- return .newWindow
- }
- return .inSameWindow
- }
- set {
- if (newValue == .inSameWindow || newValue == .newWindow) {
- }
- }
- }
-
- var openFileType: KMPreferenceOpenFileType {
- get {
- // 数据兼容
- let value = KMDataManager.ud_integer(forKey: KMInitialWindowSizeOptionKey)
- if let type = KMPreferenceOpenFileType(rawValue: value) {
- return type
- }
-
- return .default
- }
- set {
- if (newValue == .default || newValue == .maxim || newValue == .fit) {
- // 数据兼容
- }
- }
- }
-
-
- var keepSnapshotWindowToTop: Bool {
- get {
- return KMDataManager.ud_bool(forKey: KMSnapshotsOnTopKey)
- }
- set {
- // 数据兼容
- }
- }
- }
-
-
- // MARK: UserDefaults
- fileprivate let kKMLastOpenFilepathKey = "lastOpenFilepath"
- fileprivate let kKMLastOpenFilepathKeys = "lastOpenFilepaths"
- fileprivate let kKMViewSettingKey = "viewSetting"
- fileprivate let kKMPageNumberKey = "pageNumber"
- fileprivate let kKMPageScaleKey = "pageScale"
- extension KMPreferenceManager {
- var lastOpenFilepath: String? {
- get {
- return UserDefaults.standard.value(forKey: kKMLastOpenFilepathKey) as? String
- }
- set {
- UserDefaults.standard.set(newValue, forKey: kKMLastOpenFilepathKey)
- UserDefaults.standard.synchronize()
- }
- }
-
- var lastOpenFilepaths: [String]? {
- get {
- return UserDefaults.standard.value(forKey: kKMLastOpenFilepathKeys) as? [String]
- }
- set {
- UserDefaults.standard.set(newValue, forKey: kKMLastOpenFilepathKeys)
- UserDefaults.standard.synchronize()
- }
- }
-
- func setPageNumber(_ number: Int, forKey key: String) {
- UserDefaults.standard.set(number, forKey: "\(key)+\(kKMPageNumberKey)")
- UserDefaults.standard.synchronize()
- }
-
- func getPageNumber(forKey key: String) -> Int? {
- return UserDefaults.standard.value(forKey: "\(key)+\(kKMPageNumberKey)") as? Int
- }
-
- func setPageScale(_ scale: Float, forKey key: String) {
- UserDefaults.standard.set(scale, forKey: "\(key)+\(kKMPageScaleKey)")
- UserDefaults.standard.synchronize()
- }
-
- func getPageScale(forKey key: String) -> Float? {
- return UserDefaults.standard.value(forKey: "\(key)+\(kKMPageScaleKey)") as? Float
- }
- }
-
- // MARK: Qiuck
- extension KMPreferenceManager {
- internal func closeFileIsPrompt() -> Bool {
- return self.closeFilePromptType == .promp
- }
-
- // 单位: 秒
- var autoSaveTimeInterval: TimeInterval {
- get {
- var minute = KMPreferenceManager.shared.autoSavePerNumberMinute
- if (minute < 5) {
- minute = 5
- } else if (minute > 99) {
- minute = 99
- }
-
- let interval: TimeInterval = Double(minute) * 60.0
- return interval
- }
- }
- }
- // MARK: - Grouping
- extension KMPreferenceManager {
- var grouping: Bool {
- get {
- return false
- }
- }
-
- private static var _groupingInfosKey = "KMGroupingInfosKey"
- private var _grouping_infos: [KMPreferenceKey : Any] {
- get {
- return (objc_getAssociatedObject(self, &Self._groupingInfosKey) as? [KMPreferenceKey : Any]) ?? [:]
- }
- set {
- objc_setAssociatedObject(self, &Self._groupingInfosKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- private static var _groupingObjectsKey = "KMGroupingObjectsKey"
- private var _grouping_objects: Set<KMPreferenceGroup> {
- get {
- return (objc_getAssociatedObject(self, &Self._groupingObjectsKey) as? Set) ?? []
- }
- set {
- objc_setAssociatedObject(self, &Self._groupingObjectsKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- private static var _groupingKey = "KMGroupingKey"
- private var _grouping: Bool {
- get {
- return (objc_getAssociatedObject(self, &Self._groupingKey) as? Bool) ?? false
- }
- set {
- objc_setAssociatedObject(self, &Self._groupingKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
- }
- }
-
- func beginGrouping() {
- self._grouping = true
- self._grouping_objects = []
- self._grouping_infos = [:]
- }
-
- func endGrouping() {
- self._grouping = false
-
- if self._grouping_objects.isEmpty == false { // 发送通知
- var objects: [KMPreferenceGroup] = []
- for data in self._grouping_objects {
- objects.append(data)
- }
- self.postNotification(object: objects, userInfo: self._grouping_infos)
- }
-
- self._grouping_objects = []
- self._grouping_infos = [:]
- }
- }
|