// // KMDisplayPreferences.swift // PDF Reader Pro // // Created by tangchao on 2023/11/6. // import Cocoa @objcMembers class KMDisplayPreferences: NSViewController { @IBOutlet weak var thumbSizeLabel: NSTextField! @IBOutlet weak var pagesLabel: NSTextField! @IBOutlet weak var pagesSlider: NSSlider! @IBOutlet weak var snapshotLabel: NSTextField! @IBOutlet weak var snapshotSlider: NSSlider! @IBOutlet weak var discreteSizeCheckbox: NSButton! @IBOutlet var tableFontLabelField: NSTextField! @IBOutlet var tableFontComboBox: NSComboBox! @IBOutlet weak var displayLabel: NSTextField! @IBOutlet var greekingLabelField: NSTextField! @IBOutlet var greekingTextField: NSTextField! @IBOutlet var antiAliasCheckButton: NSButton! @IBOutlet weak var backgroundColorLabel: NSTextField! @IBOutlet weak var normalColorLabel: NSTextField! @IBOutlet weak var normalColorWell: NSColorWell! @IBOutlet weak var fullScreenLabel: NSTextField! @IBOutlet weak var fullScreenColorWell: NSColorWell! @IBOutlet weak var readBarLabel: NSTextField! @IBOutlet weak var readingbarColorLabel: NSTextField! @IBOutlet weak var readBarColorWell: NSColorWell! @IBOutlet weak var invertBarButton: NSButton! var thumbnailSizeLabels: [NSTextField] = [] var thumbnailSizeControls: [NSControl] = [] var colorLabels: [NSTextField] = [] var colorControls: [NSControl] = [] let SKDefaultFontSizes: [CGFloat] = [8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 16.0, 18.0, 20.0, 24.0, 28.0, 32.0, 48.0, 64.0] override var nibName: NSNib.Name? { return "DisplayPreferences" } override func loadView() { super.loadView() self.thumbnailSizeLabels = [self.pagesLabel, self.snapshotLabel] self.thumbnailSizeControls = [self.pagesSlider, self.snapshotSlider, self.discreteSizeCheckbox] _ = KMAutoSizeLabelFields(self.thumbnailSizeLabels, self.thumbnailSizeControls, false) self.discreteSizeCheckbox.sizeToFit() _ = KMAutoSizeLabelFields([self.tableFontLabelField], [self.tableFontComboBox], false) _ = KMAutoSizeLabelFields([self.greekingLabelField], [self.greekingTextField], false) self.antiAliasCheckButton.sizeToFit() self.colorLabels = [self.normalColorLabel, self.readingbarColorLabel] self.colorControls = [self.normalColorWell, self.fullScreenLabel, self.fullScreenColorWell, self.readBarColorWell, self.invertBarButton] _ = KMAutoSizeLabelFields(self.colorLabels, self.colorControls, false) _ = KMAutoSizeLabelFields([self.fullScreenLabel], [self.fullScreenColorWell], false); self.invertBarButton.sizeToFit() var w = 0.0 for view in self.view.subviews { if view.autoresizingMask.contains(.width) == false { var x = NSMaxX(view.frame) if view.isKind(of: NSSlider.self) || view.isKind(of: NSButton.self) { x -= 2.0 } else if view.isKind(of: NSComboBox.self) { x -= 3.0 } w = fmax(w, x) } } var size = self.view.frame.size size.width = w + 20.0 self.view.setFrameSize(size) } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. thumbSizeLabel.stringValue = KMLocalizedString("Thumbnail sizes:") pagesLabel.stringValue = KMLocalizedString("Pages:") snapshotLabel.stringValue = KMLocalizedString("Snapshots:") discreteSizeCheckbox.title = KMLocalizedString("Discrete sizes") tableFontLabelField.stringValue = KMLocalizedString("Outline font size:") displayLabel.stringValue = KMLocalizedString("PDF display:") greekingLabelField.stringValue = KMLocalizedString("Greeking threshold:") antiAliasCheckButton.title = KMLocalizedString("Anti-alias text and line art") backgroundColorLabel.stringValue = KMLocalizedString("Background color:") normalColorLabel.stringValue = KMLocalizedString("Normal:") fullScreenLabel.stringValue = KMLocalizedString("Full Screen:") readBarLabel.stringValue = KMLocalizedString("Reading bar:") readingbarColorLabel.stringValue = KMLocalizedString("Color:") invertBarButton.title = KMLocalizedString("Invert bar") self.pagesSlider.target = self self.pagesSlider.action = #selector(pageSliderAction) self.snapshotSlider.target = self self.snapshotSlider.action = #selector(snapshotSliderAction) self.tableFontComboBox.addItems(withObjectValues: SKDefaultFontSizes) self.tableFontComboBox.selectItem(at: 4) self.tableFontComboBox.delegate = self self.greekingTextField.delegate = self self.antiAliasCheckButton.target = self self.antiAliasCheckButton.action = #selector(antiAliasCheckAction) self.normalColorWell.target = self self.normalColorWell.action = #selector(normalColorAction) self.fullScreenColorWell.target = self self.fullScreenColorWell.action = #selector(fullScreenColorAction) self.readBarColorWell.target = self self.readBarColorWell.action = #selector(readBarColorAction) self.invertBarButton.target = self self.invertBarButton.action = #selector(invertBarAction) self.greekingTextField.formatter = NumberFormatter() // 赋值 self.initData() } override var title: String? { set { super.title = newValue } get { KMLocalizedString("Display") } } func initData() { self.pagesSlider.floatValue = KMPreference.shared.thumbPageSize self.snapshotSlider.floatValue = KMPreference.shared.thumbSnapshotSize self.tableFontComboBox.stringValue = String(format: "%.0f", KMPreference.shared.outlineFontSize) self.greekingTextField.stringValue = String(format: "%.0f", KMPreference.shared.greekThreshold) self.antiAliasCheckButton.state = KMPreference.shared.antiAliasText ? .on : .off self.normalColorWell.color = KMPreference.shared.displayBackgroundNormalColor self.fullScreenColorWell.color = KMPreference.shared.displayBackgroundFullScreenColor self.readBarColorWell.color = KMPreference.shared.readBarColor self.invertBarButton.state = KMPreference.shared.invertBar ? .on : .off } @objc func pageSliderAction(_ sender: NSSlider) { KMPreference.shared.thumbPageSize = self.pagesSlider.floatValue } @objc func snapshotSliderAction(_ sender: NSSlider) { KMPreference.shared.thumbSnapshotSize = self.snapshotSlider.floatValue } @IBAction func changeDiscreteThumbnailSizes(_ sender: AnyObject?) { let slider1 = self.pagesSlider let slider2 = self.snapshotSlider let button = sender as? NSButton if let data = button?.state, data == .on { slider1?.numberOfTickMarks = 8 slider2?.numberOfTickMarks = 8 slider1?.allowsTickMarkValuesOnly = true slider2?.allowsTickMarkValuesOnly = true } else { slider1?.superview?.setNeedsDisplay(slider1?.frame ?? .zero) slider2?.superview?.setNeedsDisplay(slider2?.frame ?? .zero) slider1?.numberOfTickMarks = 0 slider2?.numberOfTickMarks = 0 slider1?.allowsTickMarkValuesOnly = false slider2?.allowsTickMarkValuesOnly = false } slider1?.sizeToFit() slider2?.sizeToFit() } @objc func antiAliasCheckAction(_ sender: NSButton) { KMPreference.shared.antiAliasText = self.antiAliasCheckButton.state == .on } @objc func normalColorAction(_ sender: NSColorWell) { if let color = sender.color.usingColorSpaceName(NSColorSpaceName.calibratedRGB) { KMPreference.shared.displayBackgroundNormalColor = color } } @objc func fullScreenColorAction(_ sender: NSColorWell) { if let color = sender.color.usingColorSpaceName(NSColorSpaceName.calibratedRGB) { KMPreference.shared.displayBackgroundFullScreenColor = color } } @objc func readBarColorAction(_ sender: NSColorWell) { if let color = sender.color.usingColorSpaceName(NSColorSpaceName.calibratedRGB) { KMPreference.shared.readBarColor = color } } @objc func invertBarAction(_ sender: NSButton) { KMPreference.shared.invertBar = sender.state == .on } } extension KMDisplayPreferences: KMPreferencePane { func defaultsDidRevert() { // no things. } func reloadData() { self.initData() } } extension KMDisplayPreferences: NSComboBoxDelegate { func comboBoxSelectionDidChange(_ notification: Notification) { if self.tableFontComboBox.isEqual(to: notification.object) { KMPreference.shared.outlineFontSize = self.tableFontComboBox.floatValue } } } extension KMDisplayPreferences: NSTextFieldDelegate { func controlTextDidChange(_ obj: Notification) { if self.greekingTextField.isEqual(to: obj.object) { KMPreference.shared.greekThreshold = self.greekingTextField.floatValue } } }