From bda93fcb858e340bb19708dd2b2183d28a490a12 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Thu, 17 Aug 2023 14:29:27 -0700 Subject: [PATCH] skip scroll to reveal when copying output and select the correct output --- .../notebook/browser/controller/cellOutputActions.ts | 2 +- .../workbench/contrib/notebook/browser/notebookBrowser.ts | 1 + .../contrib/notebook/browser/notebookEditorWidget.ts | 6 +++--- .../notebook/browser/view/renderers/backLayerWebView.ts | 4 ++-- .../notebook/browser/view/renderers/webviewMessages.ts | 2 +- .../notebook/browser/view/renderers/webviewPreloads.ts | 6 +++--- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts index 25d0ffbc1ba..d71503c9cb6 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts @@ -39,7 +39,7 @@ registerAction2(class CopyCellOutputAction extends NotebookAction { if (mimeType?.startsWith('image/')) { const editorService = accessor.get(IEditorService); const editor = editorService.activeEditorPane?.getControl() as INotebookEditor; - await editor.focusNotebookCell(outputViewModel.cellViewModel as ICellViewModel, 'output'); + await editor.focusNotebookCell(outputViewModel.cellViewModel as ICellViewModel, 'output', { skipReveal: true, outputId: outputViewModel.model.outputId }); editor.copyOutputImage(outputViewModel); } else { const clipboardService = accessor.get(IClipboardService); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index d7516848531..587b8619587 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -151,6 +151,7 @@ export interface IFocusNotebookCellOptions { readonly skipReveal?: boolean; readonly focusEditorLine?: number; readonly minimalScrolling?: boolean; + readonly outputId?: string; } //#endregion diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index d424587ada8..f4f76b539db 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -2341,6 +2341,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } else if (focusItem === 'output') { this.focusElement(cell); + if (!this.hasEditorFocus()) { this._list.focusView(); } @@ -2349,9 +2350,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return; } - if (!options?.skipReveal) { - this._webview.focusOutput(cell.id, this._webviewFocused); - } + const focusElementId = options?.outputId ?? cell.id; + this._webview.focusOutput(focusElementId, this._webviewFocused); cell.updateEditState(CellEditState.Preview, 'focusNotebookCell'); cell.focusMode = CellFocusMode.Output; diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 5b3bb79f8e0..1b67d83daf6 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -1606,7 +1606,7 @@ export class BackLayerWebView extends Themable { this.webview?.focus(); } - focusOutput(cellId: string, viewFocused: boolean) { + focusOutput(cellOrOutputId: string, viewFocused: boolean) { if (this._disposed) { return; } @@ -1617,7 +1617,7 @@ export class BackLayerWebView extends Themable { this._sendMessageToWebview({ type: 'focus-output', - cellId, + cellOrOutputId: cellOrOutputId, }); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts index 653a16a35bd..e74e173ae33 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts @@ -273,7 +273,7 @@ export interface ICopyImageMessage { export interface IFocusOutputMessage { readonly type: 'focus-output'; - readonly cellId: string; + readonly cellOrOutputId: string; } export interface IAckOutputHeight { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index 28e91de05c4..ca2ad71955c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -474,8 +474,8 @@ async function webviewPreloads(ctx: PreloadContext) { }); }; - function focusFirstFocusableOrContainerInOutput(cellId: string) { - const cellOutputContainer = document.getElementById(cellId); + function focusFirstFocusableOrContainerInOutput(cellOrOutputId: string) { + const cellOutputContainer = document.getElementById(cellOrOutputId); if (cellOutputContainer) { if (cellOutputContainer.contains(document.activeElement)) { return; @@ -1523,7 +1523,7 @@ async function webviewPreloads(ctx: PreloadContext) { break; } case 'focus-output': - focusFirstFocusableOrContainerInOutput(event.data.cellId); + focusFirstFocusableOrContainerInOutput(event.data.cellOrOutputId); break; case 'decorations': { let outputContainer = document.getElementById(event.data.cellId);