From 3ccf16ef212a0dc07477e31c24dc59bcaef71d50 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 7 Jun 2023 15:29:10 +0200 Subject: [PATCH] do not auto finish session when inline chat widgets have focus (#184492) * do not auto finish session when inline chat widgets have focus re https://github.com/microsoft/vscode-internalbacklog/issues/4354 * fix compile errors caused by new base method --- .../contrib/zoneWidget/browser/zoneWidget.ts | 4 ++++ .../contrib/debug/browser/exceptionWidget.ts | 2 +- .../inlineChat/browser/inlineChatController.ts | 2 +- .../inlineChat/browser/inlineChatStrategies.ts | 14 ++++++++++++++ .../contrib/inlineChat/browser/inlineChatWidget.ts | 6 +++++- .../contrib/scm/browser/dirtydiffDecorator.ts | 2 +- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index 5726b0a775f..a003de17958 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -307,6 +307,10 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { return range.getStartPosition(); } + hasFocus() { + return this.domNode.contains(dom.getActiveElement()); + } + protected _isShowing: boolean = false; show(rangeOrPos: IRange | IPosition, heightInLines: number): void { diff --git a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index 1ebb7c9e5ff..b553cb5626e 100644 --- a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -122,7 +122,7 @@ export class ExceptionWidget extends ZoneWidget { this.container?.focus(); } - hasFocus(): boolean { + override hasFocus(): boolean { return dom.isAncestor(document.activeElement, this.container); } } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 8b41fc56def..b955e2f3e70 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -281,7 +281,7 @@ export class InteractiveEditorController implements IEditorContribution { })); this._sessionStore.add(this._editor.onDidChangeModelContent(e => { - if (this._ignoreModelContentChanged) { + if (this._ignoreModelContentChanged || this._strategy?.hasFocus()) { return; } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index c4da4e2090d..4e5a627b6cc 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -40,6 +40,8 @@ export abstract class EditModeStrategy { abstract renderChanges(response: EditResponse): Promise; abstract toggleDiff(): void; + + abstract hasFocus(): boolean; } export class PreviewStrategy extends EditModeStrategy { @@ -126,6 +128,10 @@ export class PreviewStrategy extends EditModeStrategy { toggleDiff(): void { // nothing to do } + + hasFocus(): boolean { + return this._widget.hasFocus(); + } } class InlineDiffDecorations { @@ -318,6 +324,10 @@ export class LiveStrategy extends EditModeStrategy { } this._widget.updateStatus(message); } + + hasFocus(): boolean { + return this._widget.hasFocus(); + } } export class LivePreviewStrategy extends LiveStrategy { @@ -372,6 +382,10 @@ export class LivePreviewStrategy extends LiveStrategy { } scrollState.restore(this._editor); } + + override hasFocus(): boolean { + return super.hasFocus() || this._diffZone.hasFocus() || this._previewZone.hasFocus(); + } } function showSingleCreateFile(accessor: ServicesAccessor, edit: EditResponse) { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index c517f32ae59..a66f9dee50d 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -14,7 +14,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import { CTX_INTERACTIVE_EDITOR_FOCUSED, CTX_INTERACTIVE_EDITOR_INNER_CURSOR_FIRST, CTX_INTERACTIVE_EDITOR_INNER_CURSOR_LAST, CTX_INTERACTIVE_EDITOR_EMPTY, CTX_INTERACTIVE_EDITOR_OUTER_CURSOR_POSITION, CTX_INTERACTIVE_EDITOR_VISIBLE, MENU_INTERACTIVE_EDITOR_WIDGET, MENU_INTERACTIVE_EDITOR_WIDGET_STATUS, MENU_INTERACTIVE_EDITOR_WIDGET_MARKDOWN_MESSAGE, CTX_INTERACTIVE_EDITOR_MESSAGE_CROP_STATE, IInteractiveEditorSlashCommand, MENU_INTERACTIVE_EDITOR_WIDGET_FEEDBACK, ACTION_ACCEPT_CHANGES } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model'; -import { Dimension, addDisposableListener, getTotalHeight, getTotalWidth, h, reset } from 'vs/base/browser/dom'; +import { Dimension, addDisposableListener, getActiveElement, getTotalHeight, getTotalWidth, h, reset } from 'vs/base/browser/dom'; import { Emitter, Event, MicrotaskEmitter } from 'vs/base/common/event'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; @@ -553,6 +553,10 @@ export class InteractiveEditorWidget { this._inputEditor.focus(); } + hasFocus() { + return this.domNode.contains(getActiveElement()); + } + // --- preview showEditsPreview(textModelv0: ITextModel, edits: ISingleEditOperation[], changes: readonly LineRangeMapping[]) { diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 9234b8da055..09798922953 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -467,7 +467,7 @@ class DirtyDiffWidget extends PeekViewWidget { this.editor.revealLineInCenterIfOutsideViewport(range.endLineNumber, ScrollType.Smooth); } - hasFocus(): boolean { + override hasFocus(): boolean { return this.diffEditor.hasTextFocus(); }