// // SettingsManager.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/9/26. // import Cocoa @objc public enum appearanceMode: Int { case lightMode case darkMode case autoMode } @objc public enum keyChainPasswordType : Int { case ask = 0 case always case never } @objc public enum pageLayoutType : Int { case singlePage = 0 case singlePageContinue case twoPage case twoPageContinue case bookMode case bookModeContinue } @objc public enum leftSidePanelType : Int { case defaultOpen = 0 case sameAsLastOpen case hideLeftSide case prioritizeOutline } @objc public enum defaultOpenType: Int { case thumbnail = 0 case outline case bookmark case annotation } @objc public enum zoomInfoType : Int { case adaptationWidth = 0 case adapPage case actualSize case percent_10 case percent_25 case percent_50 case percent_75 case percent_100 case percent_150 case percent_200 case percent_400 case percent_800 } @objc public enum panelOpenInteractionType : Int { case automatic = 0 case hidePropertyPanel } @objc public enum settingsLanguage: Int { case FollowSystem = 0 case English case Chinese_TW case Dutch case French case German case Italian case Japanese case Polish case Russian case Spanish case Chinese_CN case Protuguese case Arabic } //外观修改时调用 let APPAppearanceChangedNotificationName = NSNotification.Name("APPAppearanceChangedNotificationName") //语言修改时调用 let APPLanguageChangedNotificationName = NSNotification.Name("APPLanguageChangedNotificationName") //高亮Form表单域修改时调用 let kPDFViewHighlightFormFiledUpdateNotiName = NSNotification.Name("kPDFViewHighlightFormFiledUpdateNotiName") //高亮Link链接修改时调用 let kPDFViewHighlightLinkUpdateNotiName = NSNotification.Name("kPDFViewHighlightLinkUpdateNotiName") //General let settingsAppearanceKey = "settingsAppearanceKey" let settingsAuthorKey = "settingsAuthorKey" let settingsDefaultPDFViewerKey = "settingsDefaultPDFViewerKey" var settingsReopenFileKey = "settingsReopenFileKey" var settingsAutoSaveFileKey = "settingsAutoSaveFileKey" var settingsAutoSaveMinutesKey = "settingsAutoSaveMinutesKey" var settingsFileListCountKey = "settingsFileListCountKey" var settingsLanguageTypeKey = "settingsLanguageTypeKey" var settingsKeychainTypeKey = "settingsKeychainTypeKey" //PageDisplay var settingsPageLayoutTypeKey = "settingsPageLayoutTypeKey" var settingsZoomTypeKey = "settingsZoomTypeKey" var settingsLeftSidePanelKey = "settingsLeftSidePanelKey" var settingsDefaultOpenTypeKey = "settingsDefaultOpenTypeKey" var settingsPanelOpenTypeKey = "settingsPanelOpenTypeKey" var settingsShowQuickActionBarKey = "settingsShowQuickActionBarKey" var autoScrollTimeIntervalKey = "autoScrollTimeIntervalKey" var autoScrollJumpSpaceKey = "autoScrollJumpSpaceKey" class SettingsManager: NSObject { static let sharedInstance = SettingsManager.init() override init() { super.init() self.config() } func config() { self.loadData() // if appearance == .autoMode { // // } else if appearance == .lightMode { // NSApplication.shared.appearance = NSAppearance(named: .aqua) // } else if appearance == .darkMode { // NSApplication.shared.appearance = NSAppearance(named: .darkAqua) // } } private func loadData() { //General self.appearance = appearanceMode(rawValue: UserDefaults.standard.integer(forKey: settingsAppearanceKey)) ?? .autoMode self.author = UserDefaults.standard.string(forKey: settingsAuthorKey) ?? NSFullUserName() self.defaultPDFViewer = UserDefaults.standard.bool(forKey: settingsDefaultPDFViewerKey) self.reopenFileWhenAppStart = UserDefaults.standard.bool(forKey: settingsReopenFileKey) self.autoSaveFile = UserDefaults.standard.bool(forKey: settingsAutoSaveFileKey) self.autoSaveMinutes = UserDefaults.standard.string(forKey: settingsAutoSaveMinutesKey) ?? "" if let value = UserDefaults.standard.value(forKey: settingsFileListCountKey), let data = value as? Int { self.fileListCount = data } else { self.fileListCount = 10 } self.language = settingsLanguage(rawValue: UserDefaults.standard.integer(forKey: settingsLanguageTypeKey)) ?? .FollowSystem self.keychainType = keyChainPasswordType(rawValue: UserDefaults.standard.integer(forKey: settingsKeychainTypeKey)) ?? .ask //PageDisplay if let value = UserDefaults.standard.value(forKey: settingsPageLayoutTypeKey), let data = value as? Int { self.layoutType = pageLayoutType(rawValue: data) ?? .singlePageContinue } else { self.layoutType = .singlePageContinue } self.zoomType = zoomInfoType(rawValue: UserDefaults.standard.integer(forKey: settingsZoomTypeKey)) ?? .adaptationWidth self.leftPanelType = leftSidePanelType(rawValue: UserDefaults.standard.integer(forKey: settingsLeftSidePanelKey)) ?? .defaultOpen self.defaultOpen = defaultOpenType(rawValue: UserDefaults.standard.integer(forKey: settingsDefaultOpenTypeKey)) ?? .thumbnail self.autoExpandPropertyPanel = UserDefaults.standard.bool(forKey: settingsPanelOpenTypeKey) if let _ = UserDefaults.standard.value(forKey: settingsShowQuickActionBarKey) { self.showQuickActionBar = UserDefaults.standard.bool(forKey: settingsShowQuickActionBarKey) } else { self.showQuickActionBar = true } let autoScrollTimeInterval = UserDefaults.standard.float(forKey: autoScrollTimeIntervalKey) if autoScrollTimeInterval > 5 { self.autoScrollTimeInterval = autoScrollTimeInterval.cgFloat } else { self.autoScrollTimeInterval = 5 } let autoScrollJumpSpace = UserDefaults.standard.float(forKey: autoScrollJumpSpaceKey) if autoScrollJumpSpace > 10 { self.autoScrollJumpSpace = autoScrollJumpSpace.cgFloat } else { self.autoScrollJumpSpace = 20 } } func saveData() { //General UserDefaults.standard.setValue(appearance.rawValue, forKey: settingsAppearanceKey) UserDefaults.standard.setValue(author, forKey: settingsAuthorKey) UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey) UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey) UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey) UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey) UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey) UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey) UserDefaults.standard.setValue(keychainType.rawValue, forKey: settingsKeychainTypeKey) //PageDisplay UserDefaults.standard.setValue(layoutType.rawValue, forKey: settingsPageLayoutTypeKey) UserDefaults.standard.setValue(zoomType.rawValue, forKey: settingsZoomTypeKey) UserDefaults.standard.setValue(leftPanelType.rawValue, forKey: settingsLeftSidePanelKey) UserDefaults.standard.setValue(autoExpandPropertyPanel, forKey: settingsPanelOpenTypeKey) UserDefaults.standard.setValue(defaultOpen.rawValue, forKey: settingsDefaultOpenTypeKey) UserDefaults.standard.setValue(showQuickActionBar, forKey: settingsShowQuickActionBarKey) UserDefaults.standard.setValue(autoScrollTimeInterval, forKey: autoScrollTimeIntervalKey) UserDefaults.standard.setValue(autoScrollJumpSpace, forKey: autoScrollJumpSpaceKey) } //MARK: - Setter var appearance: appearanceMode = .autoMode { didSet { } } var author: String = "" { didSet { UserDefaults.standard.setValue(author, forKey: settingsAuthorKey) } } var defaultPDFViewer: Bool = true { didSet { let result = KMTools.setDefaultPDFReader(defaultPDFViewer) if (result) { UserDefaults.standard.setValue(defaultPDFViewer, forKey: settingsDefaultPDFViewerKey) } } } var reopenFileWhenAppStart: Bool = false { didSet { UserDefaults.standard.setValue(reopenFileWhenAppStart, forKey: settingsReopenFileKey) } } var autoSaveFile: Bool = false { didSet { UserDefaults.standard.setValue(autoSaveFile, forKey: settingsAutoSaveFileKey) } } var autoSaveMinutes: String = "" { didSet { UserDefaults.standard.setValue(autoSaveMinutes, forKey: settingsAutoSaveMinutesKey) } } var fileListCount: Int = 10 { didSet { UserDefaults.standard.setValue(fileListCount, forKey: settingsFileListCountKey) } } var language: settingsLanguage = .FollowSystem { didSet { UserDefaults.standard.setValue(language.rawValue, forKey: settingsLanguageTypeKey) } } var keychainType: keyChainPasswordType = .ask { didSet { } } var layoutType: pageLayoutType = .singlePage { didSet { } } var zoomType: zoomInfoType = .adaptationWidth { didSet { } } var leftPanelType: leftSidePanelType = .defaultOpen { didSet { } } var defaultOpen: defaultOpenType = .thumbnail { didSet { } } var autoExpandPropertyPanel: Bool = true { didSet { } } var showQuickActionBar: Bool = true { didSet { } } var autoScrollTimeInterval: CGFloat = 5 var autoScrollJumpSpace: CGFloat = 20 //MARK: - Reset func resetDefaultData() { self.resetGeneralData() self.resetPageDisplayData() self.saveData() } func resetGeneralData() { self.appearance = .autoMode self.author = NSFullUserName() self.defaultPDFViewer = true self.reopenFileWhenAppStart = false self.autoSaveFile = false self.autoSaveMinutes = "15" self.fileListCount = 10 self.keychainType = .ask } func resetPageDisplayData() { self.layoutType = .singlePage self.zoomType = .adaptationWidth self.leftPanelType = .defaultOpen self.defaultOpen = .thumbnail self.autoExpandPropertyPanel = true self.showQuickActionBar = true } func closeFileIsPrompt() -> Bool { return true } } //MARK: - Method public func KMLocalizedString(_ key: String, comment: String? = nil) -> String { var bundlePath: String? = nil if SettingsManager.sharedInstance.language != .FollowSystem { if SettingsManager.sharedInstance.language == .English { bundlePath = Bundle.main.path(forResource: "en", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Chinese_TW { bundlePath = Bundle.main.path(forResource: "zh-Hans", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Dutch { bundlePath = Bundle.main.path(forResource: "nl", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .French { bundlePath = Bundle.main.path(forResource: "fr", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .German { bundlePath = Bundle.main.path(forResource: "de", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Italian { bundlePath = Bundle.main.path(forResource: "it", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Japanese { bundlePath = Bundle.main.path(forResource: "ja", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Polish { bundlePath = Bundle.main.path(forResource: "pl", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Russian { bundlePath = Bundle.main.path(forResource: "ru", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Spanish { bundlePath = Bundle.main.path(forResource: "es", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Chinese_CN { bundlePath = Bundle.main.path(forResource: "zh-Hans", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Protuguese { bundlePath = Bundle.main.path(forResource: "pt", ofType: "lproj") } else if SettingsManager.sharedInstance.language == .Arabic { bundlePath = Bundle.main.path(forResource: "ar", ofType: "lproj") } } if let bPath = bundlePath, let bundle = Bundle.init(path: bPath) { return NSLocalizedString(key, tableName: "Localizable", bundle: bundle, comment: comment ?? "") } else { return NSLocalizedString(key, comment: "") } }