|
|
@@ -510,6 +510,8 @@ final class ViewController: NSViewController {
|
|
510
|
510
|
private let aiCompanionPreferredLanguage1DefaultsKey = "aiCompanion.preferredLanguage1"
|
|
511
|
511
|
private let aiCompanionPreferredLanguage2DefaultsKey = "aiCompanion.preferredLanguage2"
|
|
512
|
512
|
private weak var activeMeetingConsentWindow: NSWindow?
|
|
|
513
|
+ private weak var meetingConsentPrimaryLanguagePopup: NSPopUpButton?
|
|
|
514
|
+ private weak var meetingConsentSecondaryLanguagePopup: NSPopUpButton?
|
|
513
|
515
|
private var didTapInlineMeetingConsentClose = false
|
|
514
|
516
|
private let ratingEligibleUsageSeconds: TimeInterval = 30 * 60
|
|
515
|
517
|
private let meetingTranscriptionService = MeetingTranscriptionService()
|
|
|
@@ -1350,6 +1352,8 @@ private extension ViewController {
|
|
1350
|
1352
|
let language1Popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
1351
|
1353
|
language1Popup.translatesAutoresizingMaskIntoConstraints = false
|
|
1352
|
1354
|
language1Popup.controlSize = .regular
|
|
|
1355
|
+ language1Popup.target = self
|
|
|
1356
|
+ language1Popup.action = #selector(meetingConsentSpeechLanguageChanged(_:))
|
|
1353
|
1357
|
for option in speechOptions {
|
|
1354
|
1358
|
language1Popup.addItem(withTitle: option.displayName)
|
|
1355
|
1359
|
language1Popup.lastItem?.representedObject = option.identifier
|
|
|
@@ -1363,6 +1367,8 @@ private extension ViewController {
|
|
1363
|
1367
|
let language2Popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
1364
|
1368
|
language2Popup.translatesAutoresizingMaskIntoConstraints = false
|
|
1365
|
1369
|
language2Popup.controlSize = .regular
|
|
|
1370
|
+ language2Popup.target = self
|
|
|
1371
|
+ language2Popup.action = #selector(meetingConsentSpeechLanguageChanged(_:))
|
|
1366
|
1372
|
language2Popup.addItem(withTitle: "None")
|
|
1367
|
1373
|
language2Popup.lastItem?.representedObject = ""
|
|
1368
|
1374
|
for option in speechOptions {
|
|
|
@@ -1415,6 +1421,8 @@ private extension ViewController {
|
|
1415
|
1421
|
alert.accessoryView = languageContainer
|
|
1416
|
1422
|
didTapInlineMeetingConsentClose = false
|
|
1417
|
1423
|
activeMeetingConsentWindow = alert.window
|
|
|
1424
|
+ meetingConsentPrimaryLanguagePopup = language1Popup
|
|
|
1425
|
+ meetingConsentSecondaryLanguagePopup = language2Popup
|
|
1418
|
1426
|
if let contentView = alert.window.contentView {
|
|
1419
|
1427
|
let topCloseButton = NSButton(title: "✕", target: self, action: #selector(meetingConsentInlineCloseTapped(_:)))
|
|
1420
|
1428
|
topCloseButton.translatesAutoresizingMaskIntoConstraints = false
|
|
|
@@ -1434,6 +1442,8 @@ private extension ViewController {
|
|
1434
|
1442
|
}
|
|
1435
|
1443
|
let response = alert.runModal()
|
|
1436
|
1444
|
activeMeetingConsentWindow = nil
|
|
|
1445
|
+ meetingConsentPrimaryLanguagePopup = nil
|
|
|
1446
|
+ meetingConsentSecondaryLanguagePopup = nil
|
|
1437
|
1447
|
|
|
1438
|
1448
|
if didTapInlineMeetingConsentClose {
|
|
1439
|
1449
|
return .dismissed
|
|
|
@@ -1465,6 +1475,22 @@ private extension ViewController {
|
|
1465
|
1475
|
consentWindow.orderOut(nil)
|
|
1466
|
1476
|
}
|
|
1467
|
1477
|
|
|
|
1478
|
+ @objc private func meetingConsentSpeechLanguageChanged(_ sender: NSPopUpButton) {
|
|
|
1479
|
+ guard let primary = meetingConsentPrimaryLanguagePopup?.selectedItem?.representedObject as? String,
|
|
|
1480
|
+ primary.isEmpty == false else { return }
|
|
|
1481
|
+
|
|
|
1482
|
+ var secondary: String? = meetingConsentSecondaryLanguagePopup?.selectedItem?.representedObject as? String
|
|
|
1483
|
+ if secondary?.isEmpty == true {
|
|
|
1484
|
+ secondary = nil
|
|
|
1485
|
+ }
|
|
|
1486
|
+ if let secondaryValue = secondary,
|
|
|
1487
|
+ secondaryValue.replacingOccurrences(of: "_", with: "-").lowercased() == primary.replacingOccurrences(of: "_", with: "-").lowercased() {
|
|
|
1488
|
+ secondary = nil
|
|
|
1489
|
+ meetingConsentSecondaryLanguagePopup?.selectItem(at: 0)
|
|
|
1490
|
+ }
|
|
|
1491
|
+ updateAiCompanionPreferredSpeechLanguages(primary: primary, secondary: secondary)
|
|
|
1492
|
+ }
|
|
|
1493
|
+
|
|
1468
|
1494
|
private func loadAiCompanionLocalRecordings() {
|
|
1469
|
1495
|
guard let raw = UserDefaults.standard.data(forKey: aiCompanionLocalRecordingsDefaultsKey) else {
|
|
1470
|
1496
|
aiCompanionLocalRecordings = []
|