diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index e28b8cfc171..fedfdeeb3c2 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -205,6 +205,10 @@ export class InlineChatController implements IEditorContribution { this._zone.value.setMargins(widgetPosition); } else { widgetPosition = this._strategy.getWidgetPosition() ?? this._zone.value.position ?? this._activeSession.wholeRange.value.getEndPosition(); + const needsMargin = this._strategy.needsMargin(); + if (!needsMargin) { + this._zone.value.setMargins(widgetPosition, 0); + } } this._zone.value.show(widgetPosition); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index 6effff16c18..cc9836e8f8a 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -47,6 +47,8 @@ export abstract class EditModeStrategy { abstract hasFocus(): boolean; abstract getWidgetPosition(): Position | undefined; + + abstract needsMargin(): boolean; } export class PreviewStrategy extends EditModeStrategy { @@ -145,6 +147,10 @@ export class PreviewStrategy extends EditModeStrategy { hasFocus(): boolean { return this._widget.hasFocus(); } + + needsMargin(): boolean { + return true; + } } class InlineDiffDecorations { @@ -359,6 +365,10 @@ export class LiveStrategy extends EditModeStrategy { return lastLineOfLocalEdits ? new Position(lastLineOfLocalEdits, 1) : undefined; } + override needsMargin(): boolean { + return Boolean(this._session.lastTextModelChanges.length); + } + hasFocus(): boolean { return this._widget.hasFocus(); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index f25ef458cfe..da046893374 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -797,10 +797,10 @@ export class InlineChatZoneWidget extends ZoneWidget { this._ctxVisible.set(true); } - public setMargins(position: Position): void { + private _calculateIndentationWidth(position: Position): number { const viewModel = this.editor._getViewModel(); if (!viewModel) { - return; + return 0; } const visibleRange = viewModel.getCompletelyVisibleViewRange(); const startLineVisibleRange = visibleRange.startLineNumber; @@ -815,7 +815,16 @@ export class InlineChatZoneWidget extends ZoneWidget { break; } } - this._indentationWidth = this.editor.getOffsetForColumn(indentationLineNumber ?? positionLine, indentationLevel ?? viewModel.getLineFirstNonWhitespaceColumn(positionLine)); + return this.editor.getOffsetForColumn(indentationLineNumber ?? positionLine, indentationLevel ?? viewModel.getLineFirstNonWhitespaceColumn(positionLine)); + } + + setMargins(position: Position, indentationWidth?: number): void { + if (indentationWidth === undefined) { + indentationWidth = this._calculateIndentationWidth(position); + } + if (this._indentationWidth === indentationWidth) { + return; + } const info = this.editor.getLayoutInfo(); const marginWithoutIndentation = info.glyphMarginWidth + info.decorationsWidth + info.lineNumbersWidth; const marginWithIndentation = marginWithoutIndentation + this._indentationWidth;