Skip to content

Commit 0ddd487

Browse files
authored
add navigate code block actions in accessible view (microsoft#210480)
1 parent 14c1414 commit 0ddd487

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export interface IAccessibleViewService {
8383
showAccessibleViewHelp(): void;
8484
next(): void;
8585
previous(): void;
86+
navigateToCodeBlock(type: 'next' | 'previous'): void;
8687
goToSymbol(): void;
8788
disableHint(): void;
8889
getPosition(id: AccessibleViewProviderId): Position | undefined;
@@ -290,6 +291,19 @@ export class AccessibleView extends Disposable {
290291
return { code: codeBlock.code, languageId: codeBlock.languageId, codeBlockIndex, element: undefined };
291292
}
292293

294+
navigateToCodeBlock(type: 'next' | 'previous'): void {
295+
const position = this._editorWidget.getPosition();
296+
if (!this._codeBlocks?.length || !position) {
297+
return;
298+
}
299+
const codeBlockIndex = this._codeBlocks.findIndex(c => type === 'previous' ? c.endLine >= position.lineNumber : c.startLine > position.lineNumber);
300+
if (codeBlockIndex === -1) {
301+
return;
302+
}
303+
const codeBlock = this._codeBlocks[codeBlockIndex];
304+
this.setPosition(new Position(codeBlock.startLine, 1), true);
305+
}
306+
293307
showLastProvider(id: AccessibleViewProviderId): void {
294308
if (!this._lastProvider || this._lastProvider.options.id !== id) {
295309
return;
@@ -840,6 +854,9 @@ export class AccessibleViewService extends Disposable implements IAccessibleView
840854
getCodeBlockContext(): ICodeBlockActionContext | undefined {
841855
return this._accessibleView?.getCodeBlockContext();
842856
}
857+
navigateToCodeBlock(type: 'next' | 'previous'): void {
858+
this._accessibleView?.navigateToCodeBlock(type);
859+
}
843860
}
844861

845862
class AccessibleViewSymbolQuickPick {

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

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/act
1111
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
1212
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
1313
import { AccessibilityCommandId } from 'vs/workbench/contrib/accessibility/common/accessibilityCommands';
14-
import { AccessibleViewProviderId, accessibilityHelpIsShown, accessibleViewCurrentProviderId, accessibleViewGoToSymbolSupported, accessibleViewIsShown, accessibleViewSupportsNavigation, accessibleViewVerbosityEnabled } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration';
14+
import { AccessibleViewProviderId, accessibilityHelpIsShown, accessibleViewContainsCodeBlocks, accessibleViewCurrentProviderId, accessibleViewGoToSymbolSupported, accessibleViewIsShown, accessibleViewSupportsNavigation, accessibleViewVerbosityEnabled } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration';
1515
import { IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView';
1616
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
1717
import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController';
@@ -52,6 +52,56 @@ class AccessibleViewNextAction extends Action2 {
5252
registerAction2(AccessibleViewNextAction);
5353

5454

55+
class AccessibleViewNextCodeBlockAction extends Action2 {
56+
constructor() {
57+
super({
58+
id: AccessibilityCommandId.NextCodeBlock,
59+
precondition: ContextKeyExpr.and(accessibleViewContainsCodeBlocks, ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.Chat)),
60+
keybinding: {
61+
primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown,
62+
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, },
63+
weight: KeybindingWeight.WorkbenchContrib,
64+
},
65+
icon: Codicon.arrowRight,
66+
menu:
67+
{
68+
...accessibleViewMenu,
69+
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
70+
},
71+
title: localize('editor.action.accessibleViewNextCodeBlock', "Accessible View: Next Code Block")
72+
});
73+
}
74+
run(accessor: ServicesAccessor): void {
75+
accessor.get(IAccessibleViewService).navigateToCodeBlock('next');
76+
}
77+
}
78+
registerAction2(AccessibleViewNextCodeBlockAction);
79+
80+
81+
class AccessibleViewPreviousCodeBlockAction extends Action2 {
82+
constructor() {
83+
super({
84+
id: AccessibilityCommandId.PreviousCodeBlock,
85+
precondition: ContextKeyExpr.and(accessibleViewContainsCodeBlocks, ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.Chat)),
86+
keybinding: {
87+
primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp,
88+
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp, },
89+
weight: KeybindingWeight.WorkbenchContrib,
90+
},
91+
icon: Codicon.arrowLeft,
92+
menu: {
93+
...accessibleViewMenu,
94+
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
95+
},
96+
title: localize('editor.action.accessibleViewPreviousCodeBlock', "Accessible View: Previous Code Block")
97+
});
98+
}
99+
run(accessor: ServicesAccessor): void {
100+
accessor.get(IAccessibleViewService).navigateToCodeBlock('previous');
101+
}
102+
}
103+
registerAction2(AccessibleViewPreviousCodeBlockAction);
104+
55105
class AccessibleViewPreviousAction extends Action2 {
56106
constructor() {
57107
super({

src/vs/workbench/contrib/accessibility/common/accessibilityCommands.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ export const enum AccessibilityCommandId {
1010
GoToSymbol = 'editor.action.accessibleViewGoToSymbol',
1111
ShowNext = 'editor.action.accessibleViewNext',
1212
ShowPrevious = 'editor.action.accessibleViewPrevious',
13-
AccessibleViewAcceptInlineCompletion = 'editor.action.accessibleViewAcceptInlineCompletion'
13+
AccessibleViewAcceptInlineCompletion = 'editor.action.accessibleViewAcceptInlineCompletion',
14+
NextCodeBlock = 'editor.action.accessibleViewNextCodeBlock',
15+
PreviousCodeBlock = 'editor.action.accessibleViewPreviousCodeBlock'
1416
}

0 commit comments

Comments
 (0)