Merge pull request #207012 from microsoft/merogge/diff-editor-announcement

announce when a diff editor becomes the active editor
This commit is contained in:
Megan Rogge 2024-03-06 13:58:42 -08:00 committed by GitHub
commit 0608109a61
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 67 additions and 1 deletions

View file

@ -15,6 +15,7 @@ import { AccessibilityStatus } from 'vs/workbench/contrib/accessibility/browser/
import { EditorAccessibilityHelpContribution } from 'vs/workbench/contrib/accessibility/browser/editorAccessibilityHelp';
import { SaveAccessibilitySignalContribution } from 'vs/workbench/contrib/accessibility/browser/saveAccessibilitySignal';
import { CommentsAccessibilityHelpContribution } from 'vs/workbench/contrib/comments/browser/commentsAccessibility';
import { DiffEditorActiveAnnouncementContribution } from 'vs/workbench/contrib/accessibility/browser/openDiffEditorAnnouncement';
registerAccessibilityConfiguration();
registerSingleton(IAccessibleViewService, AccessibleViewService, InstantiationType.Delayed);
@ -30,4 +31,5 @@ workbenchRegistry.registerWorkbenchContribution(InlineCompletionsAccessibleViewC
registerWorkbenchContribution2(AccessibilityStatus.ID, AccessibilityStatus, WorkbenchPhase.BlockRestore);
registerWorkbenchContribution2(SaveAccessibilitySignalContribution.ID, SaveAccessibilitySignalContribution, WorkbenchPhase.AfterRestored);
registerWorkbenchContribution2(DiffEditorActiveAnnouncementContribution.ID, DiffEditorActiveAnnouncementContribution, WorkbenchPhase.AfterRestored);
registerWorkbenchContribution2(DynamicSpeechAccessibilityConfiguration.ID, DynamicSpeechAccessibilityConfiguration, WorkbenchPhase.AfterRestored);

View file

@ -53,7 +53,8 @@ export const enum AccessibilityVerbositySettingId {
Hover = 'accessibility.verbosity.hover',
Notification = 'accessibility.verbosity.notification',
EmptyEditorHint = 'accessibility.verbosity.emptyEditorHint',
Comments = 'accessibility.verbosity.comments'
Comments = 'accessibility.verbosity.comments',
DiffEditorActive = 'accessibility.verbosity.diffEditorActive'
}
export const enum AccessibleViewProviderId {
@ -170,6 +171,10 @@ const configuration: IConfigurationNode = {
description: localize('verbosity.comments', 'Provide information about actions that can be taken in the comment widget or in a file which contains comments.'),
...baseVerbosityProperty
},
[AccessibilityVerbositySettingId.DiffEditorActive]: {
description: localize('verbosity.diffEditorActive', 'Indicate when a diff editor becomes the active editor.'),
...baseVerbosityProperty
},
[AccessibilityAlertSettingId.Save]: {
'markdownDescription': localize('announcement.save', "Indicates when a file is saved. Also see {0}.", '`#audioCues.save#`'),
'enum': ['userGesture', 'always', 'never'],

View file

@ -0,0 +1,56 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { isDiffEditor } from 'vs/editor/browser/editorBrowser';
import { localize } from 'vs/nls';
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { Event } from 'vs/base/common/event';
import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration';
export class DiffEditorActiveAnnouncementContribution extends Disposable implements IWorkbenchContribution {
static readonly ID = 'workbench.contrib.diffEditorActiveAnnouncement';
private _onDidActiveEditorChangeListener?: IDisposable;
constructor(
@IEditorService private readonly _editorService: IEditorService,
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,
@IConfigurationService private readonly _configurationService: IConfigurationService
) {
super();
this._register(Event.runAndSubscribe(_accessibilityService.onDidChangeScreenReaderOptimized, () => this._updateListener()));
this._register(_configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration(AccessibilityVerbositySettingId.DiffEditorActive)) {
this._updateListener();
}
}));
}
private _updateListener(): void {
const announcementEnabled = this._configurationService.getValue(AccessibilityVerbositySettingId.DiffEditorActive);
const screenReaderOptimized = this._accessibilityService.isScreenReaderOptimized();
if (!announcementEnabled || !screenReaderOptimized) {
this._onDidActiveEditorChangeListener?.dispose();
this._onDidActiveEditorChangeListener = undefined;
return;
}
if (this._onDidActiveEditorChangeListener) {
return;
}
this._onDidActiveEditorChangeListener = this._register(this._editorService.onDidActiveEditorChange(() => {
if (isDiffEditor(this._editorService.activeTextEditorControl)) {
this._accessibilityService.alert(localize('openDiffEditorAnnouncement', "Diff editor"));
}
}));
}
}

View file

@ -110,11 +110,14 @@ function createScreenReaderHelp(): IDisposable {
switchSides = localize('switchSidesNoKb', "Run the command Diff Editor: Switch Side, which is currently not triggerable via keybinding, to toggle between the original and modified editors.");
}
const diffEditorActiveAnnouncement = localize('msg5', "The setting, accessibility.verbosity.diffEditorActive, controls if a diff editor announcement is made when it becomes the active editor.");
const keys = ['accessibility.signals.diffLineDeleted', 'accessibility.signals.diffLineInserted', 'accessibility.signals.diffLineModified'];
const content = [
localize('msg1', "You are in a diff editor."),
localize('msg2', "View the next ({0}) or previous ({1}) diff in diff review mode, which is optimized for screen readers.", next, previous),
switchSides,
diffEditorActiveAnnouncement,
localize('msg4', "To control which accessibility signals should be played, the following settings can be configured: {0}.", keys.join(', ')),
];
const commentCommandInfo = getCommentCommandInfo(keybindingService, contextKeyService, codeEditor);