Skip to content

Commit

Permalink
Longman features #61: Separate volume and on/off switcher. Move volum…
Browse files Browse the repository at this point in the history
…es and switchers to menu.
  • Loading branch information
filimo committed Feb 5, 2020
1 parent 85cf594 commit 7e82cac
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 24 deletions.
4 changes: 2 additions & 2 deletions ReaderTranslator/Components/SpeechSynthesizer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class SpeechSynthesizer {
text: String = Store.shared.translateAction.getText(),
voiceName: String = AudioStore.shared.voiceName,
stopSpeaking: Bool = false,
isVoiceEnabled: Bool = AudioStore.shared.isEnabled
isVoiceEnabled: Bool = AudioStore.shared.isSpeakSentences
) {
if speechSynthesizer.isSpeaking {
SpeechSynthesizer.stop()
Expand All @@ -88,7 +88,7 @@ class SpeechSynthesizer {
let speechUtterance: AVSpeechUtterance = AVSpeechUtterance(string: text)

speechUtterance.voice = AVSpeechSynthesisVoice.speechVoices().first(where: { $0.name == voiceName })
speechUtterance.volume = AudioStore.shared.volume
speechUtterance.volume = AudioStore.shared.sentencesVolume
speechUtterance.rate = AudioStore.shared.rate
if isVoiceEnabled {
speechSynthesizer = AVSpeechSynthesizer()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,11 @@
if(elm) {
if(event.shiftKey) {
elm.style.color = "yellow"
sendIn200('selectionchange', 'document', event, getSelectedPhrases())
sendIn500('selectionchange', 'document', event, getSelectedPhrases())
}else{
clearAllSelections()
elm.style.color = "yellow"
sendIn200('selectionchange', 'document', event, elm.text.trim())
sendIn500('selectionchange', 'document', event, elm.text.trim())
}
lastElm = elm
lastElm.click()
Expand All @@ -288,11 +288,11 @@
}
if(event.shiftKey) {
lastElm.style.color = "yellow"
sendIn200('selectionchange', 'document', event, getSelectedPhrases())
sendIn500('selectionchange', 'document', event, getSelectedPhrases())
}else{
clearAllSelections()
lastElm.style.color = "yellow"
sendIn200('selectionchange', 'document', event, lastElm.text.trim())
sendIn500('selectionchange', 'document', event, lastElm.text.trim())
}
lastElm.click()
}
Expand Down
10 changes: 8 additions & 2 deletions ReaderTranslator/Extentions/Stack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@ import Foundation
struct Stack<Element> {
private var items = [Element]()

var value: Element? { items.first }
var count: Int { items.count }

mutating func push(_ item: Element) { items.append(item) }

mutating func pop() -> Element? {
guard items.isEmpty == false else { return nil }
return items.removeFirst()
}
var value: Element? { items.first }
var count: Int { items.count }

mutating func removeAll() {
items.removeAll()
}
}
6 changes: 4 additions & 2 deletions ReaderTranslator/Stores/AudioStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ final class AudioStore: ObservableObject {
@Published(key: "favoriteVoiceNames") var favoriteVoiceNames: [FavoriteVoiceName] = []
@Published(key: "voiceLanguage") var language = "Select language"
@Published(key: "voiceName") var voiceName = "Select voice"
@Published(key: "isVoiceEnabled") var isEnabled = true { didSet { SpeechSynthesizer.speak() } }
@Published(key: "isSpeakSentences") var isSpeakSentences = true { didSet { SpeechSynthesizer.speak() } }
@Published(key: "isSpeakWords") var isSpeakWords = true { didSet { SpeechSynthesizer.speak() } }
@Published(key: "voiceRate") var rate: Float = 0.5
@Published(key: "voiceVolume") var volume: Float = 1
@Published(key: "sentencesVolume") var sentencesVolume: Float = 1
@Published(key: "wordsVolume") var wordsVolume: Float = 1
@Published(key: "playbackRate") var playbackRate: Float = 1.0
}
5 changes: 3 additions & 2 deletions ReaderTranslator/Stores/LongmanStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ final class LongmanStore: NSObject, ObservableObject {
do {
let document = try SwiftSoup.parse(html)

self.audioUrls.removeAll()
let isBreExist = self.addAudio(selector: ".brefile", document: document)
let isAmeExist = self.addAudio(selector: ".amefile", document: document)

Expand Down Expand Up @@ -122,7 +123,7 @@ extension LongmanStore {
func play() {
guard let url = audioUrls.pop() else { return }

if AudioStore.shared.isEnabled {
if AudioStore.shared.isSpeakWords {
player = AVAudioNetPlayer()
player?.delegate = self
player?.play(url: url)
Expand All @@ -136,7 +137,7 @@ extension LongmanStore: AVAudioNetPlayerDelegate {
func audioPlayerCreateSuccessOccur(player: AVAudioPlayer) {
player.enableRate = true
player.rate = audioRate
player.volume = AudioStore.shared.volume
player.volume = AudioStore.shared.wordsVolume
player.play()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ struct ReaderView_Pdf_Toolbar_PlayButtons: View {
timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { _ in
guard let player = self.audioPlayer.player else { return }
self.currentStatus = self.audioPlayer.status
player.volume = self.audioStore.volume
player.volume = self.audioStore.sentencesVolume
if self.isPlaying != player.isPlaying { self.isPlaying = player.isPlaying }
}
}
Expand Down
2 changes: 1 addition & 1 deletion ReaderTranslator/Views/ReaderView/Modes/SafariView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct SafariView: View {
extra.shiftKey != true,
extra.metaKey != true {
if extra.altKey == true, extra.keyCode == 65 { // Alt+a
audioStore.isEnabled.toggle()
audioStore.isSpeakSentences.toggle()
return
}
if extra.altKey == true, extra.keyCode == 83 { // Alt+s
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,36 @@ import SwiftUI

struct StatusBarView_Voice_Toggle: View {
@ObservedObject var audio = AudioStore.shared

private var isSpeakSentencesSign: Character {
audio.isSpeakSentences ? "👍" : "👎"
}

private var isSpeakWordsSign: Character {
audio.isSpeakWords ? "👍" : "👎"
}

var body: some View {
Group {
Toggle(isOn: $audio.isEnabled) {
Text("On:")
}.fixedSize()
Image.sfSymbol(audio.isEnabled ? "speaker.3.fill" : "speaker")
.onTapGesture {
SpeechSynthesizer.speak(stopSpeaking: true, isVoiceEnabled: true)
}
.contextMenu {
Slider(value: $audio.volume, in: 0.1 ... 1.0).frame(width: 100, height: 50)
MenuButton("Speaker: \(isSpeakSentencesSign)\(isSpeakWordsSign)") {
VStack(spacing: 0) {
Text("Speak sentences")
HStack {
Image.sfSymbol(audio.isSpeakSentences ? "speaker.3.fill" : "speaker")
.onTapGesture { self.audio.isSpeakSentences.toggle() }
Slider(value: $audio.sentencesVolume, in: 0.1 ... 1.0).frame(width: 100)
}
Divider()
Text("Speak words")
HStack {
Image.sfSymbol(audio.isSpeakWords ? "speaker.3.fill" : "speaker")
.onTapGesture { self.audio.isSpeakWords.toggle() }
Slider(value: $audio.wordsVolume, in: 0.1 ... 1.0).frame(width: 100)
}
}
}
.menuButtonStyle(BorderlessButtonMenuButtonStyle())
.fixedSize()
}
}
}
2 changes: 1 addition & 1 deletion ReaderTranslatorMac/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.9.2</string>
<string>1.9.3</string>
<key>CFBundleVersion</key>
<string>1800</string>
<key>LSApplicationCategoryType</key>
Expand Down

0 comments on commit 7e82cac

Please sign in to comment.