|
@@ -6,6 +6,7 @@
|
|
|
//
|
|
|
|
|
|
import Cocoa
|
|
|
+import KMComponentLibrary
|
|
|
|
|
|
typealias TTSCloseWindowCallback = (_ isCloseWindow: Bool) -> Void
|
|
|
|
|
@@ -13,28 +14,43 @@ let minSpeed: Float = 0.6
|
|
|
let maxSpeed: Float = 5.0
|
|
|
let standardSpeed: Float = 175.0
|
|
|
|
|
|
-class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowDelegate, NSTextFieldDelegate{
|
|
|
- var pdfView: CPDFView!
|
|
|
- var closeWindowCallback: TTSCloseWindowCallback?
|
|
|
- @IBOutlet var sontinuouButton: NSButton!
|
|
|
- @IBOutlet var speedLabel: NSTextField!
|
|
|
- @IBOutlet var languageLabel: NSTextField!
|
|
|
+class KMTTSWindowController: NSWindowController, NSWindowDelegate{
|
|
|
|
|
|
- @IBOutlet var languageComboBox: NSPopUpButton!
|
|
|
- @IBOutlet var speedTextField: NSTextField!
|
|
|
- @IBOutlet var speedSlider: NSSlider!
|
|
|
-
|
|
|
- @IBOutlet var speedStepper: NSStepper!
|
|
|
- @IBOutlet var nextButton: KMToolbarItem!
|
|
|
- @IBOutlet var forwardButton: KMToolbarItem!
|
|
|
+ @IBOutlet var titleLabel: NSTextField!
|
|
|
+ @IBOutlet var previousButton: ComponentButton!
|
|
|
+ @IBOutlet var playButton: ComponentButton!
|
|
|
+ @IBOutlet var nextButton: ComponentButton!
|
|
|
+ @IBOutlet var divider: ComponentDivider!
|
|
|
+ @IBOutlet var languageLabel: NSTextField!
|
|
|
+ @IBOutlet var languageSelect: ComponentSelect!
|
|
|
+ @IBOutlet var speedLabel: NSTextField!
|
|
|
+ @IBOutlet var speedSlider: ComponentSlider!
|
|
|
+ @IBOutlet var speedInput: ComponentInputNumber!
|
|
|
+ @IBOutlet var continueCheckbox: ComponentCheckBox!
|
|
|
|
|
|
- @IBOutlet var playButton: KMToolbarItem!
|
|
|
|
|
|
- @IBOutlet var speedBox: NSBox!
|
|
|
|
|
|
|
|
|
- @IBOutlet var sppendCountLabel: NSTextField!
|
|
|
+ // @IBOutlet var sontinuouButton: NSButton!
|
|
|
+ // @IBOutlet var speedLabel: NSTextField!
|
|
|
+ // @IBOutlet var languageLabel: NSTextField!
|
|
|
+ //
|
|
|
+ // @IBOutlet var languageComboBox: NSPopUpButton!
|
|
|
+ // @IBOutlet var speedTextField: NSTextField!
|
|
|
+ // @IBOutlet var speedSlider: NSSlider!
|
|
|
+ //
|
|
|
+ // @IBOutlet var speedStepper: NSStepper!
|
|
|
+ // @IBOutlet var nextButton: KMToolbarItem!
|
|
|
+ // @IBOutlet var forwardButton: KMToolbarItem!
|
|
|
+ //
|
|
|
+ // @IBOutlet var playButton: KMToolbarItem!
|
|
|
+ //
|
|
|
+ // @IBOutlet var speedBox: NSBox!
|
|
|
+ //
|
|
|
+ // @IBOutlet var sppendCountLabel: NSTextField!
|
|
|
|
|
|
+ var pdfView: CPDFView!
|
|
|
+ var closeWindowCallback: TTSCloseWindowCallback?
|
|
|
|
|
|
var pdfSelection: CPDFSelection?
|
|
|
|
|
@@ -49,33 +65,71 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
convenience init() {
|
|
|
self.init(windowNibName: "KMTTSWindowController")
|
|
|
}
|
|
|
+
|
|
|
deinit {
|
|
|
DistributedNotificationCenter.default().removeObserver(self)
|
|
|
NotificationCenter.default.removeObserver(self)
|
|
|
}
|
|
|
+
|
|
|
override func windowDidLoad() {
|
|
|
super.windowDidLoad()
|
|
|
- self.window?.title = NSLocalizedString("TTS", comment: "")
|
|
|
|
|
|
- self.speedStepper.minValue = Double(minSpeed)
|
|
|
- self.speedStepper.maxValue = Double(maxSpeed);
|
|
|
- self.speedSlider.minValue = Double(minSpeed);
|
|
|
- self.speedSlider.maxValue = Double(maxSpeed);
|
|
|
+ setUpproperty()
|
|
|
+ }
|
|
|
+
|
|
|
+ func setUpproperty() {
|
|
|
+
|
|
|
+ titleLabel.stringValue = KMLocalizedString("TTS")
|
|
|
+ titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
|
|
|
+ titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
|
|
|
|
|
|
- self.nextButton.toolTip = KMLocalizedString("Next Page")
|
|
|
- self.forwardButton.toolTip = KMLocalizedString("Previous Page")
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
- self.sppendCountLabel.stringValue = KMLocalizedString("SpeedX")
|
|
|
- let str = String(format: "%.1f", KMTTSManager.defalutManager.rate/Float(standardSpeed))
|
|
|
- self.speedStepper.stringValue = str
|
|
|
- self.speedTextField.stringValue = str
|
|
|
- self.speedSlider.stringValue = str//[NSString stringWithFormat:@"%.1f",([KMTTSManager defaultManager].rate/standardSpeed)];
|
|
|
+ previousButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true, icon: NSImage(named: "previous_fill"))
|
|
|
+ playButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true, icon: NSImage(named: "pause_fill"))
|
|
|
+ nextButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true, icon: NSImage(named: "next_fill"))
|
|
|
+
|
|
|
+ previousButton.setTarget(self, action: #selector(buttonItemClick_Forward(_:)))
|
|
|
+ playButton.setTarget(self, action: #selector(buttonItemClick_Play(_:)))
|
|
|
+ nextButton.setTarget(self, action: #selector(buttonItemClick_Next(_:)))
|
|
|
+
|
|
|
+ languageLabel.stringValue = KMLocalizedString("Language:")
|
|
|
+ languageLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
|
|
|
+ languageLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-regular")
|
|
|
+
|
|
|
+ languageSelect.properties = ComponentSelectProperties(size: .s,
|
|
|
+ state: .normal,
|
|
|
+ creatable: false,
|
|
|
+ text: "English (Albert)",
|
|
|
+ textUnit: "")
|
|
|
+ languageSelect.delegate = self
|
|
|
+
|
|
|
+ speedLabel.stringValue = KMLocalizedString("Speed:")
|
|
|
+ speedLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
|
|
|
+ speedLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-regular")
|
|
|
+
|
|
|
+ speedSlider.properties = ComponentSliderProperty(size: .m, percent: 1)
|
|
|
+ speedSlider.delegate = self
|
|
|
+
|
|
|
+ speedInput.properties = ComponentInputNumberProperty(alignment: .left,
|
|
|
+ size: .s,
|
|
|
+ state: .normal,
|
|
|
+ isError: false,
|
|
|
+ showErrorInfo: false,
|
|
|
+ isDisabled: false,
|
|
|
+ showPrefix: false,
|
|
|
+ showSuffix: false,
|
|
|
+ minSize: 1,
|
|
|
+ maxSize: 11,
|
|
|
+ text:"1",
|
|
|
+ valueType: .floatType)
|
|
|
+ speedInput.delegate = self
|
|
|
+
|
|
|
+ continueCheckbox.properties = ComponentCheckBoxProperty(size: .s,
|
|
|
+ state: .normal,
|
|
|
+ isDisabled: false,
|
|
|
+ showhelp: false,
|
|
|
+ text: KMLocalizedString("Continuous Reading"),
|
|
|
+ checkboxType: .normal)
|
|
|
|
|
|
- self.sontinuouButton.title = KMLocalizedString("Continuous Reading");
|
|
|
- self.speedLabel.stringValue = KMLocalizedString("Speed") + ":"//[NSString stringWithFormat:@"%@:",KMLocalizedString("Speed")];
|
|
|
- self.languageLabel.stringValue = KMLocalizedString("Language") + ":" //[NSString stringWithFormat:@"%@:",KMLocalizedString(@"Language")];
|
|
|
|
|
|
let array = KMTTSManager.defalutManager.availableVoices()
|
|
|
let currentVoicName = KMTTSManager.defalutManager.voice()
|
|
@@ -84,7 +138,6 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
|
|
|
for voiceType: NSSpeechSynthesizer.VoiceName in array {
|
|
|
let voiceDic = NSMutableDictionary()
|
|
|
- // let dic = KMTTSManager.defalutManager.attributesForVoice(voiceType)
|
|
|
let voiceLocaleIdentifier = ( NSSpeechSynthesizer.attributes( forVoice: voiceType )[ NSSpeechSynthesizer.VoiceAttributeKey.localeIdentifier ] as! String )
|
|
|
|
|
|
let name = self.switchLanguage(withCode: voiceLocaleIdentifier)
|
|
@@ -92,6 +145,8 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
voiceDic["voiceName"] = name
|
|
|
voiceArrays.add(voiceDic)
|
|
|
}
|
|
|
+
|
|
|
+ var opacityItems: [ComponentMenuitemProperty] = []
|
|
|
voiceArrays = self.sortArray(voiceArrays)
|
|
|
for i in 0..<voiceArrays.count {
|
|
|
let voiceDic = voiceArrays[i] as! NSDictionary
|
|
@@ -108,77 +163,35 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
if voiceName.count > 0 {
|
|
|
languageStaring = "\(name)(\(voiceName))"
|
|
|
}
|
|
|
-
|
|
|
- let font = NSFont.systemFont(ofSize: 12.0)
|
|
|
- let namefont = NSFont.systemFont(ofSize: 10.0)
|
|
|
-
|
|
|
- let textRowSpace = NSMutableAttributedString(string: languageStaring ?? "")
|
|
|
- textRowSpace.addAttribute(.font, value: font, range: NSRange(location: 0, length: name.count))
|
|
|
- textRowSpace.addAttribute(.font, value: namefont, range: NSRange(location: name.count, length: languageStaring!.count - name.count))
|
|
|
- let item = NSMenuItem()
|
|
|
- item.attributedTitle = textRowSpace
|
|
|
- menu.addItem(item)
|
|
|
+ if let value = languageStaring, value.count > 0 {
|
|
|
+ let item = ComponentMenuitemProperty(type: .normal, text: value)
|
|
|
+ opacityItems.append(item)
|
|
|
+ }
|
|
|
+ languageSelect.updateMenuItemsArr(opacityItems)
|
|
|
}
|
|
|
- self.languageComboBox.menu = menu
|
|
|
- self.languageComboBox.selectItem(at: currentIndex)
|
|
|
+ languageSelect.selectItemAtIndex(currentIndex)
|
|
|
+
|
|
|
KMTTSManager.defalutManager.delegate = self
|
|
|
+
|
|
|
self.updateViewColor()
|
|
|
- self.window?.standardWindowButton(.zoomButton)?.isHidden = true
|
|
|
+
|
|
|
if KMTTSManager.defalutManager.isContinue {
|
|
|
- self.sontinuouButton.state = .on
|
|
|
+ continueCheckbox.properties.checkboxType = .selected
|
|
|
} else {
|
|
|
- self.sontinuouButton.state = .off
|
|
|
+ continueCheckbox.properties.checkboxType = .normal
|
|
|
}
|
|
|
+ continueCheckbox.setTarget(self, action: #selector(buttonItemClick_Continue(_:)))
|
|
|
+ continueCheckbox.reloadData()
|
|
|
+
|
|
|
DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChanged(notification:)), name: NSNotification.Name("AppleInterfaceThemeChangedNotification"), object: nil)
|
|
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(handlePageChangedNotification), name: NSNotification.Name.CPDFViewPageChanged, object: self.pdfView)
|
|
|
}
|
|
|
|
|
|
func updateViewColor() {
|
|
|
- var viewBackcolor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
|
|
|
- var textColor = NSColor(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)
|
|
|
- var contentColor = NSColor(red: 102.0/255.0, green: 102.0/255.0, blue: 102.0/255.0, alpha: 1.0)
|
|
|
- var fillColor = NSColor.white
|
|
|
- if #available(macOS 10.14, *) {
|
|
|
- let appearanceName = NSApp.effectiveAppearance.bestMatch(from: [.aqua, .darkAqua])
|
|
|
- if appearanceName == .darkAqua {
|
|
|
- viewBackcolor = NSColor(red: 69.0/255.0, green: 69.0/255.0, blue: 71.0/255.0, alpha: 1.0)
|
|
|
- textColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
|
|
|
- contentColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 0.6)
|
|
|
- fillColor = NSColor(red: 101.0/255.0, green: 101.0/255.0, blue: 101.0/255.0, alpha: 1.0)
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- self.window?.backgroundColor = viewBackcolor
|
|
|
- self.window?.isMovableByWindowBackground = true
|
|
|
- self.languageLabel.textColor = contentColor
|
|
|
- self.speedLabel.textColor = contentColor
|
|
|
- self.speedTextField.textColor = textColor
|
|
|
- self.speedBox.fillColor = fillColor
|
|
|
- self.sontinuouButton.setTitleColor(contentColor)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- @objc func themeChanged(notification: NSNotification) {
|
|
|
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
|
|
- self.updateViewColor()
|
|
|
- }
|
|
|
- }
|
|
|
- @objc func handlePageChangedNotification(notification: NSNotification) {
|
|
|
- guard let PDFView = notification.object as? CPDFView else { return }
|
|
|
- if PDFView == self.pdfView {
|
|
|
- if self.pdfView.canGoToNextPage() {
|
|
|
- self.nextButton.isEnabled = true
|
|
|
- } else{
|
|
|
- self.nextButton.isEnabled = false
|
|
|
- }
|
|
|
- if self.pdfView.canGoToPreviousPage() {
|
|
|
- self.forwardButton.isEnabled = true
|
|
|
- } else {
|
|
|
- self.forwardButton.isEnabled = false
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
func sortArray(_ array: NSArray) -> NSMutableArray {
|
|
|
let sortDesc = [NSSortDescriptor(key: "voiceName", ascending: true)]
|
|
|
let sortedArr = array.sortedArray(using: sortDesc) as NSArray
|
|
@@ -196,27 +209,40 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
|
|
|
override func showWindow(_ sender: Any?) {
|
|
|
super.showWindow(sender)
|
|
|
+
|
|
|
self.isChangePage = false
|
|
|
if self.pdfView.canGoToNextPage() {
|
|
|
- self.nextButton.isEnabled = true
|
|
|
+ nextButton.properties.isDisabled = false
|
|
|
} else{
|
|
|
- self.nextButton.isEnabled = false
|
|
|
+ nextButton.properties.isDisabled = true
|
|
|
}
|
|
|
+ nextButton.reloadData()
|
|
|
+
|
|
|
if self.pdfView.canGoToPreviousPage() {
|
|
|
- self.forwardButton.isEnabled = true
|
|
|
+ previousButton.properties.isDisabled = false
|
|
|
} else {
|
|
|
- self.forwardButton.isEnabled = false
|
|
|
+ previousButton.properties.isDisabled = true
|
|
|
}
|
|
|
+ previousButton.reloadData()
|
|
|
+
|
|
|
+ speedSlider.reloadData()
|
|
|
+
|
|
|
}
|
|
|
|
|
|
func stopSpeaking() {
|
|
|
if KMTTSManager.defalutManager.isSpeaking() || KMTTSManager.defalutManager.isPaused {
|
|
|
self.isChangePage = true
|
|
|
KMTTSManager.defalutManager.stopSpeaking()
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.playButton.toolTip = NSLocalizedString("Play", comment: "")
|
|
|
+
|
|
|
+ speedSlider.properties.isDisabled = false
|
|
|
+ speedSlider.reloadData()
|
|
|
+
|
|
|
+ speedInput.properties.isDisabled = false
|
|
|
+ speedInput.reloadData()
|
|
|
+
|
|
|
+ playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ playButton.reloadData()
|
|
|
+
|
|
|
self.pdfView.setHighlightedSelections([])
|
|
|
}
|
|
|
self.pdfSelection = nil
|
|
@@ -231,28 +257,36 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
self.currentPageIndex = Int(self.pdfView.document?.index(for: page) ?? 0)
|
|
|
self.startSpeakingPDFPage(page)
|
|
|
}
|
|
|
+
|
|
|
func startSpeakingPDFPage(_ page: CPDFPage) {
|
|
|
- let dex = self.languageComboBox.indexOfSelectedItem
|
|
|
+
|
|
|
+ let dex = self.languageSelect.indexOfSelect()
|
|
|
if dex >= 0 && dex < self.voiceArrays.count {
|
|
|
let dic: NSMutableDictionary = self.voiceArrays[dex] as! NSMutableDictionary
|
|
|
if let voiceName = dic["voiceType"] {
|
|
|
KMTTSManager.defalutManager.setVoice(voice: voiceName as! NSSpeechSynthesizer.VoiceName)
|
|
|
}
|
|
|
}
|
|
|
- KMTTSManager.defalutManager.rate = self.speedSlider.floatValue * Float(standardSpeed)
|
|
|
+ KMTTSManager.defalutManager.rate = Float(self.speedSlider.properties.percent) * Float(standardSpeed)
|
|
|
let isSuccess = KMTTSManager.defalutManager.startSpeakingPDFPage(page)
|
|
|
if isSuccess {
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSPause")
|
|
|
- self.playButton.toolTip = NSLocalizedString("Pause", comment: "")
|
|
|
- self.speedSlider.isEnabled = false
|
|
|
- self.speedStepper.isEnabled = false
|
|
|
+ playButton.properties.icon = NSImage(named: "play_fill")
|
|
|
+ playButton.toolTip = NSLocalizedString("Pause", comment: "")
|
|
|
+ speedSlider.properties.isDisabled = true
|
|
|
+ speedInput.properties.isDisabled = true
|
|
|
+
|
|
|
} else {
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.playButton.toolTip = NSLocalizedString("Play", comment: "")
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
+ playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ playButton.toolTip = NSLocalizedString("Play", comment: "")
|
|
|
+ speedSlider.properties.isDisabled = false
|
|
|
+ speedInput.properties.isDisabled = false
|
|
|
+
|
|
|
}
|
|
|
+ playButton.reloadData()
|
|
|
+ speedSlider.reloadData()
|
|
|
+ speedInput.reloadData()
|
|
|
}
|
|
|
+
|
|
|
func startSpeakingPDFSelection(_ selection: CPDFSelection) {
|
|
|
if KMTTSManager.defalutManager.isSpeaking() || KMTTSManager.defalutManager.isPaused {
|
|
|
KMTTSManager.defalutManager.stopSpeaking()
|
|
@@ -260,28 +294,60 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
}
|
|
|
self.pdfSelection = selection
|
|
|
self.pdfView?.setCurrentSelection(nil, animate: false)
|
|
|
- let dex = self.languageComboBox.indexOfSelectedItem
|
|
|
+ let dex = self.languageSelect.indexOfSelect()
|
|
|
if dex >= 0 && dex < self.voiceArrays.count {
|
|
|
let dic: NSMutableDictionary = self.voiceArrays[dex] as! NSMutableDictionary
|
|
|
if let voiceName = dic["voiceType"] as? NSSpeechSynthesizer.VoiceName {
|
|
|
KMTTSManager.defalutManager.setVoice(voice: voiceName)
|
|
|
}
|
|
|
}
|
|
|
- KMTTSManager.defalutManager.rate = self.speedSlider.floatValue * Float(standardSpeed)
|
|
|
+ KMTTSManager.defalutManager.rate = Float(self.speedSlider.properties.percent) * Float(standardSpeed)
|
|
|
let isSuccess = KMTTSManager.defalutManager.startSpeakingPDFSelection(selection)
|
|
|
if isSuccess {
|
|
|
- self.speedSlider.isEnabled = false
|
|
|
- self.speedStepper.isEnabled = false
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSPause")
|
|
|
- self.playButton.toolTip = NSLocalizedString("Pause", comment: "")
|
|
|
+ playButton.properties.icon = NSImage(named: "play_fill")
|
|
|
+ playButton.toolTip = NSLocalizedString("Pause", comment: "")
|
|
|
+ speedSlider.properties.isDisabled = true
|
|
|
+ speedInput.properties.isDisabled = true
|
|
|
+
|
|
|
} else {
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.playButton.toolTip = NSLocalizedString("Play", comment: "")
|
|
|
+ playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ playButton.toolTip = NSLocalizedString("Play", comment: "")
|
|
|
+ speedSlider.properties.isDisabled = false
|
|
|
+ speedInput.properties.isDisabled = false
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - Noti
|
|
|
+ @objc func themeChanged(notification: NSNotification) {
|
|
|
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
|
|
+ self.updateViewColor()
|
|
|
}
|
|
|
}
|
|
|
- @IBAction func buttonItemClick_Next(_ sender: NSButton) {
|
|
|
+
|
|
|
+ @objc func handlePageChangedNotification(notification: NSNotification) {
|
|
|
+ guard let PDFView = notification.object as? CPDFView else { return }
|
|
|
+ if PDFView == self.pdfView {
|
|
|
+
|
|
|
+ if self.pdfView.canGoToNextPage() {
|
|
|
+ nextButton.properties.isDisabled = false
|
|
|
+ } else{
|
|
|
+ nextButton.properties.isDisabled = true
|
|
|
+ }
|
|
|
+ nextButton.reloadData()
|
|
|
+
|
|
|
+ if self.pdfView.canGoToPreviousPage() {
|
|
|
+ previousButton.properties.isDisabled = false
|
|
|
+ } else {
|
|
|
+ previousButton.properties.isDisabled = true
|
|
|
+ }
|
|
|
+ previousButton.reloadData()
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - IBAction
|
|
|
+ @objc func buttonItemClick_Next(_ sender: NSView) {
|
|
|
if (KMTTSManager.defalutManager.isSpeaking()) {
|
|
|
var currentPageNum = self.currentPageIndex;
|
|
|
var page: CPDFPage?
|
|
@@ -298,7 +364,8 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
self.startSpeakingPDFPage(page!)
|
|
|
}
|
|
|
}
|
|
|
- @IBAction func buttonItemClick_Forward(_ sender: NSButton) {
|
|
|
+
|
|
|
+ @objc func buttonItemClick_Forward(_ sender: NSView) {
|
|
|
if (KMTTSManager.defalutManager.isSpeaking()) {
|
|
|
var currentPageNum = self.currentPageIndex;
|
|
|
var page: CPDFPage?
|
|
@@ -315,20 +382,22 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
self.startSpeakingPDFPage(page!)
|
|
|
}
|
|
|
}
|
|
|
- @IBAction func buttonItemClick_Play(_ sender: KMToolbarItem) {
|
|
|
+
|
|
|
+ @objc func buttonItemClick_Play(_ sender: NSView) {
|
|
|
if (KMTTSManager.defalutManager.isPaused) {
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSPause")
|
|
|
+ self.playButton.properties.icon = NSImage(named: "play_fill")
|
|
|
self.playButton.toolTip = KMLocalizedString("Pause")
|
|
|
- self.speedSlider.isEnabled = false
|
|
|
- self.speedStepper.isEnabled = false
|
|
|
+ self.speedSlider.properties.isDisabled = true
|
|
|
+ self.speedInput.properties.isDisabled = true
|
|
|
+
|
|
|
KMTTSManager.defalutManager.continueSpeaking()
|
|
|
} else if (KMTTSManager.defalutManager.isSpeaking()) {
|
|
|
self.isChangePage = true
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
+ self.playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
+ self.speedSlider.properties.isDisabled = false
|
|
|
+ self.speedInput.properties.isDisabled = false
|
|
|
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
self.pdfView.setHighlightedSelection(nil, animated: false)
|
|
|
KMTTSManager.defalutManager.pauseSpeaking()
|
|
|
} else {
|
|
@@ -343,28 +412,32 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- @IBAction func buttonItemClick_Continue(_ sender: NSButton) {
|
|
|
+
|
|
|
+ @objc func buttonItemClick_Continue(_ sender: NSView) {
|
|
|
KMTTSManager.defalutManager.isContinue = !(KMTTSManager.defalutManager.isContinue)
|
|
|
}
|
|
|
- @IBAction func stepperItemClick_Speed(_ sender: NSButton) {
|
|
|
- var rate = self.speedStepper.floatValue
|
|
|
- let str = String(format: "%.1f", rate)
|
|
|
- self.speedStepper.stringValue = str
|
|
|
- self.speedTextField.stringValue = str
|
|
|
- self.speedSlider.stringValue = str
|
|
|
- rate = Float(standardSpeed) * rate
|
|
|
- KMTTSManager.defalutManager.rate = rate
|
|
|
+
|
|
|
+ func stepperItemClick_Speed(_ sender: NSButton) {
|
|
|
+ // var rate = self.speedStepper.floatValue
|
|
|
+ // let str = String(format: "%.1f", rate)
|
|
|
+ // self.speedStepper.stringValue = str
|
|
|
+ // self.speedTextField.stringValue = str
|
|
|
+ // self.speedSlider.stringValue = str
|
|
|
+ // rate = Float(standardSpeed) * rate
|
|
|
+ // KMTTSManager.defalutManager.rate = rate
|
|
|
}
|
|
|
- @IBAction func sliderItemClick_Speed(_ sender: NSButton) {
|
|
|
- var rate: CGFloat = CGFloat(self.speedSlider.floatValue)
|
|
|
- let str = String(format: "%.1f", rate)
|
|
|
- self.speedStepper.stringValue = str
|
|
|
- self.speedTextField.stringValue = str
|
|
|
- self.speedSlider.stringValue = str
|
|
|
- rate = CGFloat(standardSpeed) * rate
|
|
|
- KMTTSManager.defalutManager.rate = Float(rate)
|
|
|
+
|
|
|
+ func sliderItemClick_Speed(_ sender: NSButton) {
|
|
|
+ // var rate: CGFloat = CGFloat(self.speedSlider.floatValue)
|
|
|
+ // let str = String(format: "%.1f", rate)
|
|
|
+ // self.speedStepper.stringValue = str
|
|
|
+ // self.speedTextField.stringValue = str
|
|
|
+ // self.speedSlider.stringValue = str
|
|
|
+ // rate = CGFloat(standardSpeed) * rate
|
|
|
+ // KMTTSManager.defalutManager.rate = Float(rate)
|
|
|
}
|
|
|
- @IBAction func buttonItemClick_Language(_ sender: NSButton) {
|
|
|
+
|
|
|
+ func buttonItemClick_Language() {
|
|
|
if KMTTSManager.defalutManager.isSpeaking() {
|
|
|
self.isChangePage = true
|
|
|
if let pdfSelection = self.pdfSelection {
|
|
@@ -378,85 +451,12 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //MARK: - MouseEvent
|
|
|
override func mouseDown(with event: NSEvent) {
|
|
|
super.mouseDown(with: event)
|
|
|
self.window?.makeFirstResponder(self)
|
|
|
}
|
|
|
- //MARK: KMTTSManagerDelegate
|
|
|
- func ttsMananger(_ tts: KMTTSManager, willSpeak selection: CPDFSelection) {
|
|
|
- self.pdfView?.setHighlightedSelection(selection, animated: false)
|
|
|
- }
|
|
|
- func ttsManangerDidFinishSpeech(_ tts: KMTTSManager) -> Bool {
|
|
|
- var isFinish = true
|
|
|
- if self.pdfSelection != nil {
|
|
|
- self.pdfSelection = nil
|
|
|
- self.pdfView.setHighlightedSelections(nil)
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
- } else {
|
|
|
- if KMTTSManager.defalutManager.isContinue {
|
|
|
- if !isChangePage {
|
|
|
- if let pdfSelection = self.pdfSelection {
|
|
|
- self.pdfView.setHighlightedSelections(nil)
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
- } else {
|
|
|
- let currentPageIndex = self.currentPageIndex
|
|
|
- if currentPageIndex + 1 < self.pdfView.document.pageCount {
|
|
|
- let page = self.pdfView.document.page(at: UInt(currentPageIndex+1))
|
|
|
- self.currentPageIndex = currentPageIndex+1
|
|
|
- self.pdfView.go(to: page)
|
|
|
- self.startSpeakingPDFPage(page!)
|
|
|
- isFinish = false
|
|
|
- } else {
|
|
|
- self.pdfView.setHighlightedSelections(nil)
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- if !isChangePage {
|
|
|
- self.speedSlider.isEnabled = true
|
|
|
- self.speedStepper.isEnabled = true
|
|
|
- self.pdfView.setHighlightedSelections(nil)
|
|
|
- self.playButton.image = NSImage(named: "KMImageNameTTSStop")
|
|
|
- self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
- }
|
|
|
- }
|
|
|
- if isChangePage {
|
|
|
- isChangePage = false
|
|
|
- }
|
|
|
- }
|
|
|
- return isFinish
|
|
|
- }
|
|
|
- func ttsManangerdidErrorSpeech(_ tts: KMTTSManager, message: String) {
|
|
|
-
|
|
|
- }
|
|
|
- //MARK: NSTextFieldDelegate
|
|
|
- func controlTextDidEndEditing(_ obj: Notification) {
|
|
|
- if let textField = obj.object as? NSTextField {
|
|
|
- if textField == self.speedTextField {
|
|
|
- var rate: Float = Float(textField.stringValue) ?? 0
|
|
|
- if maxSpeed - rate < 0 {
|
|
|
- rate = maxSpeed
|
|
|
- } else if rate - minSpeed < 0 {
|
|
|
- rate = minSpeed
|
|
|
- }
|
|
|
- self.speedStepper.stringValue = String(format: "%.1f", rate)
|
|
|
- self.speedTextField.stringValue = String(format: "%.1f", rate)
|
|
|
- self.speedSlider.stringValue = String(format: "%.1f", rate)
|
|
|
- rate = standardSpeed * rate
|
|
|
- KMTTSManager.defalutManager.rate = rate
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
func switchLanguage(withCode code: String) -> String {
|
|
|
var language = code
|
|
@@ -542,3 +542,110 @@ class KMTTSWindowController: NSWindowController, KMTTSManagerDelegate, NSWindowD
|
|
|
}
|
|
|
|
|
|
|
|
|
+//MARK: KMTTSManagerDelegate
|
|
|
+extension KMTTSWindowController: KMTTSManagerDelegate {
|
|
|
+ func ttsMananger(_ tts: KMTTSManager, willSpeak selection: CPDFSelection) {
|
|
|
+ self.pdfView?.setHighlightedSelection(selection, animated: false)
|
|
|
+ }
|
|
|
+
|
|
|
+ func ttsManangerDidFinishSpeech(_ tts: KMTTSManager) -> Bool {
|
|
|
+ var isFinish = true
|
|
|
+ if self.pdfSelection != nil {
|
|
|
+ self.pdfSelection = nil
|
|
|
+ self.pdfView.setHighlightedSelections(nil)
|
|
|
+ self.playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ self.speedSlider.properties.isDisabled = false
|
|
|
+ self.speedInput.properties.isDisabled = false
|
|
|
+ self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
+ } else {
|
|
|
+ if KMTTSManager.defalutManager.isContinue {
|
|
|
+ if !isChangePage {
|
|
|
+ if let pdfSelection = self.pdfSelection {
|
|
|
+ self.pdfView.setHighlightedSelections(nil)
|
|
|
+ self.playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+
|
|
|
+ self.speedSlider.properties.isDisabled = false
|
|
|
+ self.speedInput.properties.isDisabled = false
|
|
|
+ self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
+ } else {
|
|
|
+ let currentPageIndex = self.currentPageIndex
|
|
|
+ if currentPageIndex + 1 < self.pdfView.document.pageCount {
|
|
|
+ let page = self.pdfView.document.page(at: UInt(currentPageIndex+1))
|
|
|
+ self.currentPageIndex = currentPageIndex+1
|
|
|
+ self.pdfView.go(to: page)
|
|
|
+ self.startSpeakingPDFPage(page!)
|
|
|
+ isFinish = false
|
|
|
+ } else {
|
|
|
+ self.pdfView.setHighlightedSelections(nil)
|
|
|
+ self.playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ self.speedSlider.properties.isDisabled = false
|
|
|
+ self.speedInput.properties.isDisabled = false
|
|
|
+ self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if !isChangePage {
|
|
|
+ self.speedSlider.properties.isDisabled = false
|
|
|
+ self.speedInput.properties.isDisabled = false
|
|
|
+ self.pdfView.setHighlightedSelections(nil)
|
|
|
+ self.playButton.properties.icon = NSImage(named: "pause_fill")
|
|
|
+ self.playButton.toolTip = KMLocalizedString("Play")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isChangePage {
|
|
|
+ isChangePage = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return isFinish
|
|
|
+ }
|
|
|
+ func ttsManangerdidErrorSpeech(_ tts: KMTTSManager, message: String) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: NSTextFieldDelegate
|
|
|
+extension KMTTSWindowController: NSTextFieldDelegate {
|
|
|
+ func controlTextDidEndEditing(_ obj: Notification) {
|
|
|
+ // if let textField = obj.object as? NSTextField {
|
|
|
+ // if textField == self.speedTextField {
|
|
|
+ // var rate: Float = Float(textField.stringValue) ?? 0
|
|
|
+ // if maxSpeed - rate < 0 {
|
|
|
+ // rate = maxSpeed
|
|
|
+ // } else if rate - minSpeed < 0 {
|
|
|
+ // rate = minSpeed
|
|
|
+ // }
|
|
|
+ // self.speedStepper.stringValue = String(format: "%.1f", rate)
|
|
|
+ // self.speedTextField.stringValue = String(format: "%.1f", rate)
|
|
|
+ // self.speedSlider.stringValue = String(format: "%.1f", rate)
|
|
|
+ // rate = standardSpeed * rate
|
|
|
+ // KMTTSManager.defalutManager.rate = rate
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: ComponentSelectDelegate
|
|
|
+extension KMTTSWindowController: ComponentSelectDelegate {
|
|
|
+ func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
|
|
|
+ buttonItemClick_Language()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: ComponentSliderDelegate
|
|
|
+extension KMTTSWindowController: ComponentSliderDelegate {
|
|
|
+ func componentSliderDidUpdate(_ view: ComponentSlider) {
|
|
|
+ let percent = view.properties.percent
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: ComponentInputNumberDelegate
|
|
|
+extension KMTTSWindowController: ComponentInputNumberDelegate {
|
|
|
+ func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?) {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|