diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 62d27bfc8ec..aa936423b46 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -25,6 +25,8 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IntervalCounter } from 'vs/base/common/async'; import { assertIsDefined } from 'vs/base/common/types'; import { NotificationsToastsVisibleContext } from 'vs/workbench/common/contextkeys'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; interface INotificationToast { readonly item: INotificationViewItem; @@ -83,7 +85,9 @@ export class NotificationsToasts extends Themable implements INotificationsToast @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @ILifecycleService private readonly lifecycleService: ILifecycleService, - @IHostService private readonly hostService: IHostService + @IHostService private readonly hostService: IHostService, + @IKeybindingService private readonly _keybindingService: IKeybindingService, + @IConfigurationService private readonly _configurationService: IConfigurationService ) { super(themeService); @@ -187,11 +191,24 @@ export class NotificationsToasts extends Themable implements INotificationsToast const notificationList = this.instantiationService.createInstance(NotificationsList, notificationToast, { verticalScrollMode: ScrollbarVisibility.Hidden, widgetAriaLabel: (() => { - if (!item.source) { - return localize('notificationAriaLabel', "{0}, notification", item.message.raw); + let accessibleViewHint: string | undefined; + const keybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel(); + if (this._configurationService.getValue('accessibility.verbosity.notification')) { + accessibleViewHint = keybinding ? localize('chatAccessibleViewHint', "Inspect the response in the accessible view with {0}", keybinding) : localize('chatAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding"); } - return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", item.message.raw, item.source); + if (!item.source) { + if (accessibleViewHint) { + return localize('notificationAriaLabelViewHint', "{0}, notification {1}", item.message.raw, accessibleViewHint); + } else { + return localize('notificationAriaLabel', "{0}, notification", item.message.raw); + } + } + if (accessibleViewHint) { + return localize('notificationWithSourceAriaLabelViewHint', "{0}, source: {1}, notification {2}", item.message.raw, item.source, accessibleViewHint); + } else { + return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", item.message.raw, item.source); + } })() }); itemDisposables.add(notificationList); diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts b/src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts index 63adda5f1fa..29976a108a5 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts @@ -12,7 +12,7 @@ import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/b import { localize } from 'vs/nls'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { AccessibilityHelpAction, AccessibleViewAction, AccessibleViewNextAction, AccessibleViewPreviousAction, registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; +import { AccessibilityHelpAction, AccessibilityVerbositySettingId, AccessibleViewAction, AccessibleViewNextAction, AccessibleViewPreviousAction, registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; import * as strings from 'vs/base/common/strings'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; @@ -36,7 +36,7 @@ class AccessibilityHelpProvider implements IAccessibleContentProvider { this._editor.focus(); } options: IAccessibleViewOptions = { type: AccessibleViewType.HelpMenu, ariaLabel: localize('editor-help', "editor accessibility help"), readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' }; - verbositySettingKey: string = 'editor'; + verbositySettingKey = AccessibilityVerbositySettingId.Editor; constructor( private readonly _editor: ICodeEditor, @IKeybindingService private readonly _keybindingService: IKeybindingService @@ -118,7 +118,7 @@ class HoverAccessibleViewContribution extends Disposable { return false; } accessibleViewService.show({ - verbositySettingKey: 'hover', + verbositySettingKey: AccessibilityVerbositySettingId.Hover, provideContent() { return editorHoverContent; }, onClose() { }, options: this._options @@ -135,7 +135,7 @@ class HoverAccessibleViewContribution extends Disposable { return false; } accessibleViewService.show({ - verbositySettingKey: 'hover', + verbositySettingKey: AccessibilityVerbositySettingId.Hover, provideContent() { return extensionHoverContent; }, onClose() { }, options: this._options @@ -208,7 +208,7 @@ class NotificationAccessibleViewContribution extends Disposable { list.focusPrevious(); renderAccessibleView(); }, - verbositySettingKey: 'notifications', + verbositySettingKey: AccessibilityVerbositySettingId.Notification, options: { ariaLabel: localize('notification', "Notification Accessible View"), type: AccessibleViewType.View diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibilityContribution.ts b/src/vs/workbench/contrib/accessibility/browser/accessibilityContribution.ts index 9dc863f3efd..80e55ef368e 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibilityContribution.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibilityContribution.ts @@ -17,7 +17,10 @@ export const enum AccessibilityVerbositySettingId { Chat = 'accessibility.verbosity.panelChat', InlineChat = 'accessibility.verbosity.inlineChat', KeybindingsEditor = 'accessibility.verbosity.keybindingsEditor', - Notebook = 'accessibility.verbosity.notebook' + Notebook = 'accessibility.verbosity.notebook', + Editor = 'accessibility.verbosity.editor', + Hover = 'accessibility.verbosity.hover', + Notification = 'accessibility.verbosity.notification' } const baseProperty: object = { @@ -54,6 +57,14 @@ const configuration: IConfigurationNode = { [AccessibilityVerbositySettingId.Notebook]: { description: localize('verbosity.notebook', 'Provide information about how to focus the cell container or inner editor when a notebook cell is focused.'), ...baseProperty + }, + [AccessibilityVerbositySettingId.Hover]: { + description: localize('verbosity.hover', 'Provide information about how to open the hover in an accessible view.'), + ...baseProperty + }, + [AccessibilityVerbositySettingId.Notification]: { + description: localize('verbosity.notification', 'Provide information about how to open the notification in an accessible view.'), + ...baseProperty } } }; @@ -118,7 +129,7 @@ export const AccessibleViewNextAction = registerCommand(new MultiCommand({ menuOpts: [{ menuId: MenuId.CommandPalette, group: '', - title: localize('editor.action.accessibleViewNext', "Next Accessible View"), + title: localize('editor.action.accessibleViewNext', "Show Next in Accessible View"), order: 1 }], })); @@ -133,7 +144,7 @@ export const AccessibleViewPreviousAction = registerCommand(new MultiCommand({ menuOpts: [{ menuId: MenuId.CommandPalette, group: '', - title: localize('editor.action.accessibleViewPrevious', "Previous Accessible View"), + title: localize('editor.action.accessibleViewPrevious', "Show Previous in Accessible View"), order: 1 }], })); diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts b/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts index 52e818673be..fad255a9efb 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibleView.ts @@ -25,6 +25,8 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { AccessibilityVerbositySettingId, AccessibleViewAction, AccessibleViewNextAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; const enum DEFAULT { WIDTH = 800, @@ -32,7 +34,7 @@ const enum DEFAULT { } export interface IAccessibleContentProvider { - verbositySettingKey: string; + verbositySettingKey: AccessibilityVerbositySettingId; provideContent(): string; onClose(): void; onKeyDown?(e: IKeyboardEvent): void; @@ -48,6 +50,7 @@ export interface IAccessibleViewService { show(provider: IAccessibleContentProvider): void; next(): void; previous(): void; + getOpenAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string; } export const enum AccessibleViewType { @@ -79,7 +82,8 @@ class AccessibleView extends Disposable { @IModelService private readonly _modelService: IModelService, @IContextViewService private readonly _contextViewService: IContextViewService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, - @IAccessibilityService private readonly _accessibilityService: IAccessibilityService + @IAccessibilityService private readonly _accessibilityService: IAccessibilityService, + @IKeybindingService private readonly _keybindingService: IKeybindingService ) { super(); this._accessiblityHelpIsShown = accessibilityHelpIsShown.bindTo(this._contextKeyService); @@ -169,7 +173,7 @@ class AccessibleView extends Disposable { ? AccessibilityHelpNLS.changeConfigToOnMac : AccessibilityHelpNLS.changeConfigToOnWinLinux ); - if (accessibilitySupport && provider.verbositySettingKey === 'editor') { + if (accessibilitySupport && provider.verbositySettingKey === AccessibilityVerbositySettingId.Editor) { message = AccessibilityHelpNLS.auto_on; message += '\n'; } else if (!accessibilitySupport) { @@ -193,7 +197,7 @@ class AccessibleView extends Disposable { model.setLanguage(provider.options.language); } container.appendChild(this._editorContainer); - this._editorWidget.updateOptions({ ariaLabel: provider.options.ariaLabel }); + this._editorWidget.updateOptions({ ariaLabel: provider.next && provider.previous ? localize('accessibleViewAriaLabelWithNav', "{0} {1}", provider.options.ariaLabel, this._getNavigationAriaHint(provider.verbositySettingKey)) : localize('accessibleViewAriaLabel', "{0}", provider.options.ariaLabel) }); this._editorWidget.focus(); }); const disposableStore = new DisposableStore(); @@ -235,6 +239,16 @@ class AccessibleView extends Disposable { } return this._modelService.createModel(resource.fragment, null, resource, false); } + + private _getNavigationAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string { + let hint = ''; + const nextKeybinding = this._keybindingService.lookupKeybinding(AccessibleViewNextAction.id)?.getAriaLabel(); + const previousKeybinding = this._keybindingService.lookupKeybinding(AccessibleViewNextAction.id)?.getAriaLabel(); + if (this._configurationService.getValue(verbositySettingKey)) { + hint = (nextKeybinding && previousKeybinding) ? localize('chatAccessibleViewNextPreviousHint', "Show the next {0} or previous {1} item in the accessible view", nextKeybinding, previousKeybinding) : localize('chatAccessibleViewNextPreviousHintNoKb', "Show the next or previous item in the accessible view by configuring keybindings for Show Next / Previous in Accessible View"); + } + return hint; + } } export class AccessibleViewService extends Disposable implements IAccessibleViewService { @@ -242,7 +256,9 @@ export class AccessibleViewService extends Disposable implements IAccessibleView private _accessibleView: AccessibleView | undefined; constructor( - @IInstantiationService private readonly _instantiationService: IInstantiationService + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IKeybindingService private readonly _keybindingService: IKeybindingService ) { super(); } @@ -259,4 +275,12 @@ export class AccessibleViewService extends Disposable implements IAccessibleView previous(): void { this._accessibleView?.previous(); } + getOpenAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string { + let hint = ''; + const keybinding = this._keybindingService.lookupKeybinding(AccessibleViewAction.id)?.getAriaLabel(); + if (this._configurationService.getValue(verbositySettingKey)) { + hint = keybinding ? localize('chatAccessibleViewHint', "Inspect the response in the accessible view with {0}", keybinding) : localize('chatAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding"); + } + return hint; + } } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts index fd147f172ea..b1aeb256378 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts @@ -12,6 +12,7 @@ import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat'; import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; +import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; export function getAccessibilityHelpText(accessor: ServicesAccessor, type: 'panelChat' | 'inlineChat'): string { const keybindingService = accessor.get(IKeybindingService); @@ -70,7 +71,7 @@ export async function runAccessibilityHelpAction(accessor: ServicesAccessor, edi inputEditor.getSupportedActions(); const helpText = getAccessibilityHelpText(accessor, type); accessibleViewService.show({ - verbositySettingKey: type, + verbositySettingKey: type as AccessibilityVerbositySettingId, provideContent: () => helpText, onClose: () => { if (type === 'panelChat' && cachedPosition) { diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 656485ed70a..a9742eba96f 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -37,7 +37,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import '../common/chatColors'; import { registerMoveActions } from 'vs/workbench/contrib/chat/browser/actions/chatMoveActions'; import { registerClearActions } from 'vs/workbench/contrib/chat/browser/actions/chatClearActions'; -import { AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; +import { AccessibilityVerbositySettingId, AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { CONTEXT_IN_CHAT_SESSION } from 'vs/workbench/contrib/chat/common/chatContextKeys'; @@ -135,48 +135,61 @@ class ChatAccessibleViewContribution extends Disposable { const accessibleViewService = accessor.get(IAccessibleViewService); const widgetService = accessor.get(IChatWidgetService); const codeEditorService = accessor.get(ICodeEditorService); + return renderAccessibleView(accessibleViewService, widgetService, codeEditorService, true); + function renderAccessibleView(accessibleViewService: IAccessibleViewService, widgetService: IChatWidgetService, codeEditorService: ICodeEditorService, initialRender?: boolean): boolean { + let widget = widgetService.lastFocusedWidget; + if (!widget) { + return false; + } - let widget = widgetService.lastFocusedWidget; - if (!widget) { - return false; + const chatInputFocused = initialRender && !!(codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor()); + + if (chatInputFocused) { + widget.focusLastMessage(); + widget = widgetService.lastFocusedWidget; + } + + if (!widget) { + return false; + } + + const verifiedWidget: IChatWidget = widget; + const focusedItem = verifiedWidget.getFocus(); + + if (!focusedItem) { + return false; + } + + widget.focus(focusedItem); + + const responseContent = isResponseVM(focusedItem) ? focusedItem.response.value : undefined; + if (!responseContent) { + return false; + } + + accessibleViewService.show({ + verbositySettingKey: AccessibilityVerbositySettingId.Chat, + provideContent(): string { return responseContent; }, + onClose() { + if (chatInputFocused) { + verifiedWidget.focusInput(); + } else { + verifiedWidget.reveal(focusedItem); + verifiedWidget.focus(focusedItem); + } + }, + next() { + verifiedWidget.moveFocus(focusedItem, 'next'); + renderAccessibleView(accessibleViewService, widgetService, codeEditorService); + }, + previous() { + verifiedWidget.moveFocus(focusedItem, 'previous'); + renderAccessibleView(accessibleViewService, widgetService, codeEditorService); + }, + options: { ariaLabel: nls.localize('chatAccessibleView', "Chat Accessible View"), language: 'typescript', type: AccessibleViewType.View } + }); + return true; } - - const chatInputFocused = !!(codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor()); - - if (chatInputFocused) { - widget.focusLastMessage(); - widget = widgetService.lastFocusedWidget; - } - - if (!widget) { - return false; - } - - const verifiedWidget: IChatWidget = widget; - const focusedItem = verifiedWidget.getFocus(); - - if (!focusedItem) { - return false; - } - - const responseContent = isResponseVM(focusedItem) ? focusedItem.response.value : undefined; - if (!responseContent) { - return false; - } - - accessibleViewService.show({ - verbositySettingKey: 'panelChat', - provideContent(): string { return responseContent; }, - onClose() { - if (chatInputFocused) { - verifiedWidget.focusInput(); - } else { - verifiedWidget.focus(focusedItem); - } - }, - options: { ariaLabel: nls.localize('chatAccessibleView', "Chat Accessible View"), language: 'typescript', type: AccessibleViewType.View } - }); - return true; }, CONTEXT_IN_CHAT_SESSION)); } } diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index 996a999286c..a2ad6867efa 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -56,6 +56,7 @@ export interface IChatWidget { reveal(item: ChatTreeItem): void; focus(item: ChatTreeItem): void; + moveFocus(item: ChatTreeItem, type: 'next' | 'previous'): void; getFocus(): ChatTreeItem | undefined; acceptInput(query?: string): void; focusLastMessage(): void; diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 1307054639e..341ac9ea4c4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -50,6 +50,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { ILogService } from 'vs/platform/log/common/log'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; +import { IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { IChatCodeBlockActionContext } from 'vs/workbench/contrib/chat/browser/actions/chatCodeblockActions'; import { ChatTreeItem, IChatCodeBlockInfo } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatFollowups } from 'vs/workbench/contrib/chat/browser/chatFollowups'; @@ -517,6 +518,12 @@ export class ChatListDelegate implements IListVirtualDelegate { } export class ChatAccessibilityProvider implements IListAccessibilityProvider { + + constructor( + @IAccessibleViewService private readonly _accessibleViewService: IAccessibleViewService + ) { + + } getWidgetRole(): AriaRole { return 'list'; } @@ -546,15 +553,21 @@ export class ChatAccessibilityProvider implements IListAccessibilityProvider token.type === 'code')?.length ?? 0; switch (codeBlockCount) { case 0: - return element.response.value; + label = localize('noCodeBlocks', "{0} {1}", element.response.value, accessibleViewHint); + break; case 1: - return localize('singleCodeBlock', "1 code block: {0}", element.response.value); + label = localize('singleCodeBlock', "1 code block: {0} {1}", element.response.value, accessibleViewHint); + break; default: - return localize('multiCodeBlock', "{0} code blocks: {1}", codeBlockCount, element.response.value); + label = localize('multiCodeBlock', "{0} code blocks: {1}", codeBlockCount, element.response.value, accessibleViewHint); + break; } + return label; } } diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 4b948be922b..1f57d98b958 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -118,7 +118,8 @@ export class ChatWidget extends Disposable implements IChatWidget { @IChatService private readonly chatService: IChatService, @IChatWidgetService chatWidgetService: IChatWidgetService, @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IChatAccessibilityService private readonly _chatAccessibilityService: IChatAccessibilityService + @IChatAccessibilityService private readonly _chatAccessibilityService: IChatAccessibilityService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); CONTEXT_IN_CHAT_SESSION.bindTo(contextKeyService).set(true); @@ -177,6 +178,23 @@ export class ChatWidget extends Disposable implements IChatWidget { this.inputPart.focus(); } + moveFocus(item: ChatTreeItem, type: 'next' | 'previous'): void { + const items = this.viewModel?.getItems(); + if (!items) { + return; + } + const responseItems = items.filter(i => isResponseVM(i)); + const targetIndex = responseItems.indexOf(item); + if (targetIndex === undefined) { + return; + } + const indexToFocus = type === 'next' ? targetIndex + 1 : targetIndex - 1; + if (indexToFocus < 0 || indexToFocus === responseItems.length - 1) { + return; + } + this.focus(responseItems[indexToFocus]); + } + private onDidChangeItems() { if (this.tree && this.visible) { const treeItems = (this.viewModel?.getItems() ?? []) @@ -288,7 +306,7 @@ export class ChatWidget extends Disposable implements IChatWidget { horizontalScrolling: false, supportDynamicHeights: true, hideTwistiesOfChildlessElements: true, - accessibilityProvider: new ChatAccessibilityProvider(), + accessibilityProvider: this._instantiationService.createInstance(ChatAccessibilityProvider), keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: ChatTreeItem) => isRequestVM(e) ? e.message : isResponseVM(e) ? e.response.value : '' }, // TODO setRowLineHeight: false, overrideStyles: { diff --git a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts index 7f017f54f5c..c759bc6f8b5 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts @@ -17,7 +17,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { FloatingClickWidget } from 'vs/workbench/browser/codeeditor'; -import { AccessibilityHelpAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; +import { AccessibilityHelpAction, AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { localize } from 'vs/nls'; @@ -101,7 +101,7 @@ function createScreenReaderHelp(): IDisposable { const keys = ['audioCues.diffLineDeleted', 'audioCues.diffLineInserted', 'audioCues.diffLineModified']; accessibleViewService.show({ - verbositySettingKey: 'diffEditor', + verbositySettingKey: AccessibilityVerbositySettingId.DiffEditor, provideContent: () => [ localize('msg1', "You are in a diff editor."), localize('msg2', "Press {0} or {1} to view the next or previous diff in the diff review mode that is optimized for screen readers.", next, previous), diff --git a/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp.ts b/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp.ts index 717b6167614..c5671a24877 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp.ts @@ -9,6 +9,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; +import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; export function getAccessibilityHelpText(accessor: ServicesAccessor): string { const keybindingService = accessor.get(IKeybindingService); @@ -46,7 +47,7 @@ export async function runAccessibilityHelpAction(accessor: ServicesAccessor, edi const accessibleViewService = accessor.get(IAccessibleViewService); const helpText = getAccessibilityHelpText(accessor); accessibleViewService.show({ - verbositySettingKey: 'notebook', + verbositySettingKey: AccessibilityVerbositySettingId.Notebook, provideContent: () => helpText, onClose: () => { editor.focus(); diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp.ts index d5d73c308a1..a442d9933fa 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp.ts @@ -10,6 +10,7 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ShellIntegrationStatus, WindowsShellType } from 'vs/platform/terminal/common/terminal'; +import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution'; import { AccessibleViewType, IAccessibleContentProvider, IAccessibleViewOptions } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { ITerminalInstance, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -34,7 +35,7 @@ export class TerminalAccessibleContentProvider extends Disposable implements IAc ariaLabel: localize('terminal-help-label', "terminal accessibility help"), readMoreUrl: 'https://code.visualstudio.com/docs/editor/accessibility#_terminal-accessibility' }; - verbositySettingKey: string = 'terminal'; + verbositySettingKey = AccessibilityVerbositySettingId.Terminal; constructor( private readonly _instance: Pick,