diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts index dcb9c506701..6d206412a5f 100644 --- a/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts +++ b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts @@ -97,6 +97,10 @@ Registry.as(ConfigurationExtensions.Configuration).regis 'description': localize('audioCues.terminalQuickFix', "Plays a sound when terminal Quick Fixes are available."), ...audioCueFeatureBase, }, + 'audioCues.terminalBell': { + 'description': localize('audioCues.terminalBell', "Plays a sound when the terminal bell is ringing."), + ...audioCueFeatureBase, + }, 'audioCues.diffLineInserted': { 'description': localize('audioCues.diffLineInserted', "Plays a sound when the focus moves to an inserted line in Accessible Diff Viewer mode or to the next/previous change."), ...audioCueFeatureBase, diff --git a/src/vs/workbench/contrib/audioCues/browser/commands.ts b/src/vs/workbench/contrib/audioCues/browser/commands.ts index bda17b0a3e9..d4a5cd47f72 100644 --- a/src/vs/workbench/contrib/audioCues/browser/commands.ts +++ b/src/vs/workbench/contrib/audioCues/browser/commands.ts @@ -9,9 +9,9 @@ import { localize } from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { Action2 } from 'vs/platform/actions/common/actions'; import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; export class ShowAudioCueHelp extends Action2 { static readonly ID = 'audioCues.help'; @@ -29,36 +29,44 @@ export class ShowAudioCueHelp extends Action2 { override async run(accessor: ServicesAccessor): Promise { const audioCueService = accessor.get(IAudioCueService); - const quickPickService = accessor.get(IQuickInputService); - const preferencesService = accessor.get(IPreferencesService); + const quickInputService = accessor.get(IQuickInputService); + const configurationService = accessor.get(IConfigurationService); const accessibilityService = accessor.get(IAccessibilityService); - + const userGestureCues = [AudioCue.save, AudioCue.format]; const items: (IQuickPickItem & { audioCue: AudioCue })[] = AudioCue.allAudioCues.map((cue, idx) => ({ - label: accessibilityService.isScreenReaderOptimized() ? - `${cue.name}${audioCueService.isCueEnabled(cue) ? '' : ' (' + localize('disabled', "Disabled") + ')'}` - : `${audioCueService.isCueEnabled(cue) ? '$(check)' : ' '} ${cue.name}`, + label: userGestureCues.includes(cue) ? `${cue.name} (${configurationService.getValue(cue.settingsKey)})` : cue.name, audioCue: cue, - buttons: [{ + buttons: userGestureCues.includes(cue) ? [{ iconClass: ThemeIcon.asClassName(Codicon.settingsGear), tooltip: localize('audioCues.help.settings', 'Enable/Disable Audio Cue'), - }], + alwaysVisible: true + }] : [] })); - - const quickPick = quickPickService.pick( - items, - { - activeItem: items[0], - onDidFocus: (item) => { - audioCueService.playSound(item.audioCue.sound.getSound(true), true); - }, - onDidTriggerItemButton: (context) => { - preferencesService.openSettings({ query: context.item.audioCue.settingsKey }); - }, - placeHolder: localize('audioCues.help.placeholder', 'Select an audio cue to play'), + const qp = quickInputService.createQuickPick(); + qp.items = items; + qp.selectedItems = items.filter(i => audioCueService.isCueEnabled(i.audioCue)); + qp.onDidHide(() => { + const enabledCues = qp.selectedItems.map(i => i.audioCue); + const disabledCues = AudioCue.allAudioCues.filter(cue => !enabledCues.includes(cue)); + for (const cue of enabledCues) { + if (!userGestureCues.includes(cue)) { + configurationService.updateValue(cue.settingsKey, accessibilityService.isScreenReaderOptimized() ? 'auto' : 'on'); + } } - ); - - await quickPick; + for (const cue of disabledCues) { + if (userGestureCues.includes(cue)) { + configurationService.updateValue(cue.settingsKey, 'never'); + } else { + configurationService.updateValue(cue.settingsKey, 'off'); + } + } + }); + qp.onDidChangeActive(() => { + audioCueService.playSound(qp.activeItems[0].audioCue.sound.getSound(true), true); + }); + qp.placeholder = localize('audioCues.help.placeholder', 'Select an audio cue to play and configure'); + qp.canSelectMany = true; + await qp.show(); } } @@ -78,32 +86,39 @@ export class ShowAccessibilityAlertHelp extends Action2 { override async run(accessor: ServicesAccessor): Promise { const audioCueService = accessor.get(IAudioCueService); - const quickPickService = accessor.get(IQuickInputService); - const preferencesService = accessor.get(IPreferencesService); - const accessibilityService = accessor.get(IAccessibilityService); - - const items: (IQuickPickItem & { audioCue: AudioCue })[] = AudioCue.allAudioCues.filter(c => !!c.alertMessage).map((cue, idx) => ({ - label: accessibilityService.isScreenReaderOptimized() ? - `${cue.name}${audioCueService.isAlertEnabled(cue) ? '' : ' (' + localize('disabled', "Disabled") + ')'}` - : `${audioCueService.isAlertEnabled(cue) ? '$(check)' : ' '} ${cue.name}`, + const quickInputService = accessor.get(IQuickInputService); + const configurationService = accessor.get(IConfigurationService); + const userGestureAlerts = [AudioCue.save, AudioCue.format]; + const items: (IQuickPickItem & { audioCue: AudioCue })[] = AudioCue.allAudioCues.filter(c => c.alertSettingsKey).map((cue, idx) => ({ + label: userGestureAlerts.includes(cue) && cue.alertSettingsKey ? `${cue.name} (${configurationService.getValue(cue.alertSettingsKey)})` : cue.name, audioCue: cue, - buttons: [{ + buttons: userGestureAlerts.includes(cue) ? [{ iconClass: ThemeIcon.asClassName(Codicon.settingsGear), - tooltip: localize('alerts.help.settings', 'Enable/Disable Audio Cue'), - }], + tooltip: localize('alert.help.settings', 'Enable/Disable Alert'), + alwaysVisible: true + }] : [] })); - - const quickPick = quickPickService.pick( - items, - { - activeItem: items[0], - onDidTriggerItemButton: (context) => { - preferencesService.openSettings({ query: context.item.audioCue.alertSettingsKey }); - }, - placeHolder: localize('alerts.help.placeholder', 'Inspect and configure the status of an alert'), + const qp = quickInputService.createQuickPick(); + qp.items = items; + qp.selectedItems = items.filter(i => audioCueService.isAlertEnabled(i.audioCue)); + qp.onDidHide(() => { + const enabledAlerts = qp.selectedItems.map(i => i.audioCue); + const disabledAlerts = AudioCue.allAudioCues.filter(cue => !enabledAlerts.includes(cue)); + for (const cue of enabledAlerts) { + if (!userGestureAlerts.includes(cue)) { + configurationService.updateValue(cue.alertSettingsKey!, true); + } } - ); - - await quickPick; + for (const cue of disabledAlerts) { + if (userGestureAlerts.includes(cue)) { + configurationService.updateValue(cue.alertSettingsKey!, 'never'); + } else { + configurationService.updateValue(cue.alertSettingsKey!, false); + } + } + }); + qp.placeholder = localize('alert.help.placeholder', 'Select an alert to configure'); + qp.canSelectMany = true; + await qp.show(); } }