|
|
@@ -510,6 +510,8 @@ final class ViewController: NSViewController {
|
|
|
private let aiCompanionPreferredLanguage1DefaultsKey = "aiCompanion.preferredLanguage1"
|
|
|
private let aiCompanionPreferredLanguage2DefaultsKey = "aiCompanion.preferredLanguage2"
|
|
|
private weak var activeMeetingConsentWindow: NSWindow?
|
|
|
+ private weak var meetingConsentPrimaryLanguagePopup: NSPopUpButton?
|
|
|
+ private weak var meetingConsentSecondaryLanguagePopup: NSPopUpButton?
|
|
|
private var didTapInlineMeetingConsentClose = false
|
|
|
private let ratingEligibleUsageSeconds: TimeInterval = 30 * 60
|
|
|
private let meetingTranscriptionService = MeetingTranscriptionService()
|
|
|
@@ -1350,6 +1352,8 @@ private extension ViewController {
|
|
|
let language1Popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
|
language1Popup.translatesAutoresizingMaskIntoConstraints = false
|
|
|
language1Popup.controlSize = .regular
|
|
|
+ language1Popup.target = self
|
|
|
+ language1Popup.action = #selector(meetingConsentSpeechLanguageChanged(_:))
|
|
|
for option in speechOptions {
|
|
|
language1Popup.addItem(withTitle: option.displayName)
|
|
|
language1Popup.lastItem?.representedObject = option.identifier
|
|
|
@@ -1363,6 +1367,8 @@ private extension ViewController {
|
|
|
let language2Popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
|
language2Popup.translatesAutoresizingMaskIntoConstraints = false
|
|
|
language2Popup.controlSize = .regular
|
|
|
+ language2Popup.target = self
|
|
|
+ language2Popup.action = #selector(meetingConsentSpeechLanguageChanged(_:))
|
|
|
language2Popup.addItem(withTitle: "None")
|
|
|
language2Popup.lastItem?.representedObject = ""
|
|
|
for option in speechOptions {
|
|
|
@@ -1415,6 +1421,8 @@ private extension ViewController {
|
|
|
alert.accessoryView = languageContainer
|
|
|
didTapInlineMeetingConsentClose = false
|
|
|
activeMeetingConsentWindow = alert.window
|
|
|
+ meetingConsentPrimaryLanguagePopup = language1Popup
|
|
|
+ meetingConsentSecondaryLanguagePopup = language2Popup
|
|
|
if let contentView = alert.window.contentView {
|
|
|
let topCloseButton = NSButton(title: "✕", target: self, action: #selector(meetingConsentInlineCloseTapped(_:)))
|
|
|
topCloseButton.translatesAutoresizingMaskIntoConstraints = false
|
|
|
@@ -1434,6 +1442,8 @@ private extension ViewController {
|
|
|
}
|
|
|
let response = alert.runModal()
|
|
|
activeMeetingConsentWindow = nil
|
|
|
+ meetingConsentPrimaryLanguagePopup = nil
|
|
|
+ meetingConsentSecondaryLanguagePopup = nil
|
|
|
|
|
|
if didTapInlineMeetingConsentClose {
|
|
|
return .dismissed
|
|
|
@@ -1465,6 +1475,22 @@ private extension ViewController {
|
|
|
consentWindow.orderOut(nil)
|
|
|
}
|
|
|
|
|
|
+ @objc private func meetingConsentSpeechLanguageChanged(_ sender: NSPopUpButton) {
|
|
|
+ guard let primary = meetingConsentPrimaryLanguagePopup?.selectedItem?.representedObject as? String,
|
|
|
+ primary.isEmpty == false else { return }
|
|
|
+
|
|
|
+ var secondary: String? = meetingConsentSecondaryLanguagePopup?.selectedItem?.representedObject as? String
|
|
|
+ if secondary?.isEmpty == true {
|
|
|
+ secondary = nil
|
|
|
+ }
|
|
|
+ if let secondaryValue = secondary,
|
|
|
+ secondaryValue.replacingOccurrences(of: "_", with: "-").lowercased() == primary.replacingOccurrences(of: "_", with: "-").lowercased() {
|
|
|
+ secondary = nil
|
|
|
+ meetingConsentSecondaryLanguagePopup?.selectItem(at: 0)
|
|
|
+ }
|
|
|
+ updateAiCompanionPreferredSpeechLanguages(primary: primary, secondary: secondary)
|
|
|
+ }
|
|
|
+
|
|
|
private func loadAiCompanionLocalRecordings() {
|
|
|
guard let raw = UserDefaults.standard.data(forKey: aiCompanionLocalRecordingsDefaultsKey) else {
|
|
|
aiCompanionLocalRecordings = []
|