Skip to content

Commit 924ae6c

Browse files
committed
add a bunch more
1 parent fd68fa6 commit 924ae6c

File tree

10 files changed

+138
-61
lines changed

10 files changed

+138
-61
lines changed

src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/b
1212
import { localize } from 'vs/nls';
1313
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
1414
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
15-
import { AccessibilityHelpAction, AccessibleViewAction, AccessibleViewNextAction, AccessibleViewPreviousAction, registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
15+
import { AccessibilityHelpAction, AccessibilityVerbositySettingId, AccessibleViewAction, AccessibleViewNextAction, AccessibleViewPreviousAction, registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
1616
import * as strings from 'vs/base/common/strings';
1717
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1818
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
@@ -36,7 +36,7 @@ class AccessibilityHelpProvider implements IAccessibleContentProvider {
3636
this._editor.focus();
3737
}
3838
options: IAccessibleViewOptions = { type: AccessibleViewType.HelpMenu, ariaLabel: localize('editor-help', "editor accessibility help"), readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' };
39-
verbositySettingKey: string = 'editor';
39+
verbositySettingKey = AccessibilityVerbositySettingId.Editor;
4040
constructor(
4141
private readonly _editor: ICodeEditor,
4242
@IKeybindingService private readonly _keybindingService: IKeybindingService
@@ -118,7 +118,7 @@ class HoverAccessibleViewContribution extends Disposable {
118118
return false;
119119
}
120120
accessibleViewService.show({
121-
verbositySettingKey: 'hover',
121+
verbositySettingKey: AccessibilityVerbositySettingId.Hover,
122122
provideContent() { return editorHoverContent; },
123123
onClose() { },
124124
options: this._options
@@ -135,7 +135,7 @@ class HoverAccessibleViewContribution extends Disposable {
135135
return false;
136136
}
137137
accessibleViewService.show({
138-
verbositySettingKey: 'hover',
138+
verbositySettingKey: AccessibilityVerbositySettingId.Hover,
139139
provideContent() { return extensionHoverContent; },
140140
onClose() { },
141141
options: this._options
@@ -208,7 +208,7 @@ class NotificationAccessibleViewContribution extends Disposable {
208208
list.focusPrevious();
209209
renderAccessibleView();
210210
},
211-
verbositySettingKey: 'notifications',
211+
verbositySettingKey: AccessibilityVerbositySettingId.Notification,
212212
options: {
213213
ariaLabel: localize('notification', "Notification Accessible View"),
214214
type: AccessibleViewType.View

src/vs/workbench/contrib/accessibility/browser/accessibilityContribution.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ export const enum AccessibilityVerbositySettingId {
1717
Chat = 'accessibility.verbosity.panelChat',
1818
InlineChat = 'accessibility.verbosity.inlineChat',
1919
KeybindingsEditor = 'accessibility.verbosity.keybindingsEditor',
20-
Notebook = 'accessibility.verbosity.notebook'
20+
Notebook = 'accessibility.verbosity.notebook',
21+
Editor = 'accessibility.verbosity.editor',
22+
Hover = 'accessibility.verbosity.hover',
23+
Notification = 'accessibility.verbosity.notification'
2124
}
2225

2326
const baseProperty: object = {
@@ -54,6 +57,14 @@ const configuration: IConfigurationNode = {
5457
[AccessibilityVerbositySettingId.Notebook]: {
5558
description: localize('verbosity.notebook', 'Provide information about how to focus the cell container or inner editor when a notebook cell is focused.'),
5659
...baseProperty
60+
},
61+
[AccessibilityVerbositySettingId.Hover]: {
62+
description: localize('verbosity.hover', 'Provide information about how to open the hover in an accessible view.'),
63+
...baseProperty
64+
},
65+
[AccessibilityVerbositySettingId.Notification]: {
66+
description: localize('verbosity.notification', 'Provide information about how to open the notification in an accessible view.'),
67+
...baseProperty
5768
}
5869
}
5970
};
@@ -118,7 +129,7 @@ export const AccessibleViewNextAction = registerCommand(new MultiCommand({
118129
menuOpts: [{
119130
menuId: MenuId.CommandPalette,
120131
group: '',
121-
title: localize('editor.action.accessibleViewNext', "Next Accessible View"),
132+
title: localize('editor.action.accessibleViewNext', "Show Next in Accessible View"),
122133
order: 1
123134
}],
124135
}));
@@ -133,7 +144,7 @@ export const AccessibleViewPreviousAction = registerCommand(new MultiCommand({
133144
menuOpts: [{
134145
menuId: MenuId.CommandPalette,
135146
group: '',
136-
title: localize('editor.action.accessibleViewPrevious', "Previous Accessible View"),
147+
title: localize('editor.action.accessibleViewPrevious', "Show Previous in Accessible View"),
137148
order: 1
138149
}],
139150
}));

src/vs/workbench/contrib/accessibility/browser/accessibleView.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const enum DEFAULT {
3434
}
3535

3636
export interface IAccessibleContentProvider {
37-
verbositySettingKey: string;
37+
verbositySettingKey: AccessibilityVerbositySettingId;
3838
provideContent(): string;
3939
onClose(): void;
4040
onKeyDown?(e: IKeyboardEvent): void;
@@ -51,7 +51,6 @@ export interface IAccessibleViewService {
5151
next(): void;
5252
previous(): void;
5353
getOpenAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string;
54-
getNavigationAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string;
5554
}
5655

5756
export const enum AccessibleViewType {
@@ -83,7 +82,8 @@ class AccessibleView extends Disposable {
8382
@IModelService private readonly _modelService: IModelService,
8483
@IContextViewService private readonly _contextViewService: IContextViewService,
8584
@IContextKeyService private readonly _contextKeyService: IContextKeyService,
86-
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService
85+
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,
86+
@IKeybindingService private readonly _keybindingService: IKeybindingService
8787
) {
8888
super();
8989
this._accessiblityHelpIsShown = accessibilityHelpIsShown.bindTo(this._contextKeyService);
@@ -173,7 +173,7 @@ class AccessibleView extends Disposable {
173173
? AccessibilityHelpNLS.changeConfigToOnMac
174174
: AccessibilityHelpNLS.changeConfigToOnWinLinux
175175
);
176-
if (accessibilitySupport && provider.verbositySettingKey === 'editor') {
176+
if (accessibilitySupport && provider.verbositySettingKey === AccessibilityVerbositySettingId.Editor) {
177177
message = AccessibilityHelpNLS.auto_on;
178178
message += '\n';
179179
} else if (!accessibilitySupport) {
@@ -197,7 +197,7 @@ class AccessibleView extends Disposable {
197197
model.setLanguage(provider.options.language);
198198
}
199199
container.appendChild(this._editorContainer);
200-
this._editorWidget.updateOptions({ ariaLabel: provider.options.ariaLabel });
200+
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) });
201201
this._editorWidget.focus();
202202
});
203203
const disposableStore = new DisposableStore();
@@ -239,6 +239,16 @@ class AccessibleView extends Disposable {
239239
}
240240
return this._modelService.createModel(resource.fragment, null, resource, false);
241241
}
242+
243+
private _getNavigationAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string {
244+
let hint = '';
245+
const nextKeybinding = this._keybindingService.lookupKeybinding(AccessibleViewNextAction.id)?.getAriaLabel();
246+
const previousKeybinding = this._keybindingService.lookupKeybinding(AccessibleViewNextAction.id)?.getAriaLabel();
247+
if (this._configurationService.getValue(verbositySettingKey)) {
248+
hint = (nextKeybinding && previousKeybinding) ? localize('chatAccessibleViewNextPreviousHint', "Focus the next {0} or previous {1} item without leaving the accessible view", nextKeybinding, previousKeybinding) : localize('chatAccessibleViewNextPreviousHintNoKb', "Focus the next or previous item without leaving the accessible view by configuring keybindings for Show Next / Previous in Accessible View");
249+
}
250+
return hint;
251+
}
242252
}
243253

244254
export class AccessibleViewService extends Disposable implements IAccessibleViewService {
@@ -273,12 +283,6 @@ export class AccessibleViewService extends Disposable implements IAccessibleView
273283
}
274284
return hint;
275285
}
276-
getNavigationAriaHint(verbositySettingKey: AccessibilityVerbositySettingId): string {
277-
let hint = '';
278-
const nextKeybinding = this._keybindingService.lookupKeybinding(AccessibleViewNextAction.id)?.getAriaLabel();
279-
if (this._configurationService.getValue(verbositySettingKey)) {
280-
hint = nextKeybinding ? localize('chatAccessibleViewHint', "Inspect the response in the accessible view with {0}", nextKeybinding) : localize('chatAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding");
281-
}
282-
return hint;
283-
}
284286
}
287+
288+

src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
1212
import { IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat';
1313
import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController';
1414
import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
15+
import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
1516

1617
export function getAccessibilityHelpText(accessor: ServicesAccessor, type: 'panelChat' | 'inlineChat'): string {
1718
const keybindingService = accessor.get(IKeybindingService);
@@ -70,7 +71,7 @@ export async function runAccessibilityHelpAction(accessor: ServicesAccessor, edi
7071
inputEditor.getSupportedActions();
7172
const helpText = getAccessibilityHelpText(accessor, type);
7273
accessibleViewService.show({
73-
verbositySettingKey: type,
74+
verbositySettingKey: type as AccessibilityVerbositySettingId,
7475
provideContent: () => helpText,
7576
onClose: () => {
7677
if (type === 'panelChat' && cachedPosition) {

src/vs/workbench/contrib/chat/browser/chat.contribution.ts

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle
3737
import '../common/chatColors';
3838
import { registerMoveActions } from 'vs/workbench/contrib/chat/browser/actions/chatMoveActions';
3939
import { registerClearActions } from 'vs/workbench/contrib/chat/browser/actions/chatClearActions';
40-
import { AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
40+
import { AccessibilityVerbositySettingId, AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
4141
import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
4242
import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel';
4343
import { CONTEXT_IN_CHAT_SESSION } from 'vs/workbench/contrib/chat/common/chatContextKeys';
@@ -135,48 +135,63 @@ class ChatAccessibleViewContribution extends Disposable {
135135
const accessibleViewService = accessor.get(IAccessibleViewService);
136136
const widgetService = accessor.get(IChatWidgetService);
137137
const codeEditorService = accessor.get(ICodeEditorService);
138+
return renderAccessibleView(false, accessibleViewService, widgetService, codeEditorService);
139+
function renderAccessibleView(ignoreChatInput: boolean, accessibleViewService: IAccessibleViewService, widgetService: IChatWidgetService, codeEditorService: ICodeEditorService): boolean {
138140

139-
let widget = widgetService.lastFocusedWidget;
140-
if (!widget) {
141-
return false;
142-
}
141+
let widget = widgetService.lastFocusedWidget;
142+
if (!widget) {
143+
return false;
144+
}
143145

144-
const chatInputFocused = !!(codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor());
146+
const chatInputFocused = !ignoreChatInput && !!(codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor());
145147

146-
if (chatInputFocused) {
147-
widget.focusLastMessage();
148-
widget = widgetService.lastFocusedWidget;
149-
}
148+
if (chatInputFocused) {
149+
widget.focusLastMessage();
150+
widget = widgetService.lastFocusedWidget;
151+
}
150152

151-
if (!widget) {
152-
return false;
153-
}
153+
if (!widget) {
154+
return false;
155+
}
154156

155-
const verifiedWidget: IChatWidget = widget;
156-
const focusedItem = verifiedWidget.getFocus();
157+
const verifiedWidget: IChatWidget = widget;
158+
const focusedItem = verifiedWidget.getFocus();
157159

158-
if (!focusedItem) {
159-
return false;
160-
}
160+
if (!focusedItem) {
161+
return false;
162+
}
161163

162-
const responseContent = isResponseVM(focusedItem) ? focusedItem.response.value : undefined;
163-
if (!responseContent) {
164-
return false;
165-
}
164+
widget.focus(focusedItem);
165+
166+
const responseContent = isResponseVM(focusedItem) ? focusedItem.response.value : undefined;
167+
if (!responseContent) {
168+
return false;
169+
}
166170

167-
accessibleViewService.show({
168-
verbositySettingKey: 'panelChat',
169-
provideContent(): string { return responseContent; },
170-
onClose() {
171-
if (chatInputFocused) {
172-
verifiedWidget.focusInput();
173-
} else {
171+
accessibleViewService.show({
172+
verbositySettingKey: AccessibilityVerbositySettingId.Chat,
173+
provideContent(): string { return responseContent; },
174+
onClose() {
175+
if (chatInputFocused) {
176+
verifiedWidget.focusInput();
177+
} else {
178+
verifiedWidget.focus(focusedItem);
179+
}
180+
},
181+
next() {
182+
verifiedWidget.focus(focusedItem);
183+
verifiedWidget.focusNext(focusedItem.id);
184+
renderAccessibleView(true, accessibleViewService, widgetService, codeEditorService);
185+
},
186+
previous() {
174187
verifiedWidget.focus(focusedItem);
175-
}
176-
},
177-
options: { ariaLabel: nls.localize('chatAccessibleView', "Chat Accessible View"), language: 'typescript', type: AccessibleViewType.View }
178-
});
179-
return true;
188+
verifiedWidget.focusPrevious(focusedItem.id);
189+
renderAccessibleView(true, accessibleViewService, widgetService, codeEditorService);
190+
},
191+
options: { ariaLabel: nls.localize('chatAccessibleView', "Chat Accessible View"), language: 'typescript', type: AccessibleViewType.View }
192+
});
193+
return true;
194+
}
180195
}, CONTEXT_IN_CHAT_SESSION));
181196
}
182197
}

src/vs/workbench/contrib/chat/browser/chat.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ export interface IChatWidget {
5656

5757
reveal(item: ChatTreeItem): void;
5858
focus(item: ChatTreeItem): void;
59+
focusNext(id: string): void;
60+
focusPrevious(id: string): void;
5961
getFocus(): ChatTreeItem | undefined;
6062
acceptInput(query?: string): void;
6163
focusLastMessage(): void;

src/vs/workbench/contrib/chat/browser/chatWidget.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,46 @@ export class ChatWidget extends Disposable implements IChatWidget {
168168
this.inputPart.focus();
169169
}
170170

171+
focusNext(id: string): void {
172+
const items = this.viewModel?.getItems();
173+
if (!items) {
174+
return;
175+
}
176+
const focusedElement = items?.find(i => i.id === id) as any as IChatResponseViewModel;
177+
const responseItems = items?.filter(i => isResponseVM(i));
178+
if (!focusedElement) {
179+
return;
180+
}
181+
const currentlyFocusedIndex = responseItems?.indexOf(focusedElement);
182+
if (currentlyFocusedIndex === undefined || !responseItems) {
183+
return;
184+
}
185+
if (currentlyFocusedIndex === responseItems.length - 1) {
186+
return;
187+
}
188+
this.focus(responseItems[currentlyFocusedIndex + 1], true);
189+
}
190+
191+
focusPrevious(id: string): void {
192+
const items = this.viewModel?.getItems();
193+
if (!items) {
194+
return;
195+
}
196+
const focusedElement = items.find(i => i.id === id) as any as IChatResponseViewModel;
197+
const responseItems = items.filter(i => isResponseVM(i));
198+
if (!focusedElement) {
199+
return;
200+
}
201+
const currentlyFocusedIndex = responseItems?.indexOf(focusedElement);
202+
if (!currentlyFocusedIndex || !responseItems) {
203+
return;
204+
}
205+
if (currentlyFocusedIndex - 1 < 0) {
206+
return;
207+
}
208+
this.focus(responseItems[currentlyFocusedIndex - 1], true);
209+
}
210+
171211
private onDidChangeItems() {
172212
if (this.tree && this.visible) {
173213
const treeItems = (this.viewModel?.getItems() ?? [])
@@ -387,15 +427,17 @@ export class ChatWidget extends Disposable implements IChatWidget {
387427
this.tree.reveal(item);
388428
}
389429

390-
focus(item: ChatTreeItem): void {
430+
focus(item: ChatTreeItem, noDomFocus?: boolean): void {
391431
const items = this.tree.getNode(null).children;
392432
const node = items.find(i => i.element?.id === item.id);
393433
if (!node) {
394434
return;
395435
}
396436

397437
this.tree.setFocus([node.element]);
438+
// if (!noDomFocus) {
398439
this.tree.domFocus();
440+
// }
399441
}
400442

401443
async acceptInput(query?: string | IChatReplyFollowup): Promise<void> {

src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
1717
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
1818
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
1919
import { FloatingClickWidget } from 'vs/workbench/browser/codeeditor';
20-
import { AccessibilityHelpAction } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
20+
import { AccessibilityHelpAction, AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
2121
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
2222
import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
2323
import { localize } from 'vs/nls';
@@ -101,7 +101,7 @@ function createScreenReaderHelp(): IDisposable {
101101
const keys = ['audioCues.diffLineDeleted', 'audioCues.diffLineInserted', 'audioCues.diffLineModified'];
102102

103103
accessibleViewService.show({
104-
verbositySettingKey: 'diffEditor',
104+
verbositySettingKey: AccessibilityVerbositySettingId.DiffEditor,
105105
provideContent: () => [
106106
localize('msg1', "You are in a diff editor."),
107107
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),

src/vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
99
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1010
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
1111
import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
12+
import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
1213

1314
export function getAccessibilityHelpText(accessor: ServicesAccessor): string {
1415
const keybindingService = accessor.get(IKeybindingService);
@@ -46,7 +47,7 @@ export async function runAccessibilityHelpAction(accessor: ServicesAccessor, edi
4647
const accessibleViewService = accessor.get(IAccessibleViewService);
4748
const helpText = getAccessibilityHelpText(accessor);
4849
accessibleViewService.show({
49-
verbositySettingKey: 'notebook',
50+
verbositySettingKey: AccessibilityVerbositySettingId.Notebook,
5051
provideContent: () => helpText,
5152
onClose: () => {
5253
editor.focus();

0 commit comments

Comments
 (0)