Skip to content

Commit 0440d3f

Browse files
authored
- only update/reposition inline widget when showing again (microsoft#196830)
- when hiding the first view port line, don't restore previous view port again fixes microsoft/vscode-copilot#2288
1 parent 35419fc commit 0440d3f

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,12 @@ export class ViewModel extends Disposable implements IViewModel {
491491
this.viewLayout.onFlushed(this.getLineCount());
492492
this.viewLayout.onHeightMaybeChanged();
493493
}
494-
stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);
494+
495+
const firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;
496+
const firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);
497+
if (!firstModelLineIsHidden) {
498+
stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);
499+
}
495500
} finally {
496501
this._eventDispatcher.endEmitViewEvents();
497502
}

src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,19 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider {
321321
this._positionMarkerId.set([{ range, options: ModelDecorationOptions.EMPTY }]);
322322
}
323323

324+
updatePositionAndHeight(rangeOrPos: IRange | IPosition, heightInLines?: number): void {
325+
if (this._viewZone) {
326+
rangeOrPos = Range.isIRange(rangeOrPos) ? Range.getStartPosition(rangeOrPos) : rangeOrPos;
327+
this._viewZone.afterLineNumber = rangeOrPos.lineNumber;
328+
this._viewZone.afterColumn = rangeOrPos.column;
329+
this._viewZone.heightInLines = heightInLines ?? this._viewZone.heightInLines;
330+
331+
this.editor.changeViewZones(accessor => {
332+
accessor.layoutZone(this._viewZone!.id);
333+
});
334+
}
335+
}
336+
324337
hide(): void {
325338
if (this._viewZone) {
326339
this.editor.changeViewZones(accessor => {

src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,12 @@ export class InlineChatController implements IEditorContribution {
273273
if (this._strategy) {
274274
needsMargin = this._strategy.needsMargin();
275275
}
276-
this._zone.value.setWidgetMargins(widgetPosition, !needsMargin ? 0 : undefined);
277-
this._zone.value.show(widgetPosition);
276+
if (!this._zone.value.position) {
277+
this._zone.value.setWidgetMargins(widgetPosition, !needsMargin ? 0 : undefined);
278+
this._zone.value.show(widgetPosition);
279+
} else {
280+
this._zone.value.updatePositionAndHeight(widgetPosition);
281+
}
278282
}
279283

280284
protected async _nextState(state: State, options: InlineChatRunOptions): Promise<void> {

src/vs/workbench/contrib/inlineChat/browser/inlineChatLivePreviewWidget.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { LineRange } from 'vs/editor/common/core/lineRange';
2121
import { LineRangeMapping } from 'vs/editor/common/diff/rangeMapping';
2222
import { Position } from 'vs/editor/common/core/position';
2323
import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions';
24-
import { IEditorDecorationsCollection, ScrollType } from 'vs/editor/common/editorCommon';
24+
import { IEditorDecorationsCollection } from 'vs/editor/common/editorCommon';
2525
import { ILogService } from 'vs/platform/log/common/log';
2626
import { lineRangeAsRange, invertLineRange } from 'vs/workbench/contrib/inlineChat/browser/utils';
2727
import { ResourceLabel } from 'vs/workbench/browser/labels';
@@ -57,7 +57,7 @@ export class InlineChatLivePreviewWidget extends ZoneWidget {
5757
@ILogService private readonly _logService: ILogService,
5858
@IAccessibilityService private readonly accessibilityService: IAccessibilityService,
5959
) {
60-
super(editor, { showArrow: false, showFrame: false, isResizeable: false, isAccessible: true, allowUnlimitedHeight: true, showInHiddenAreas: true, ordinal: 10000 + 1 });
60+
super(editor, { showArrow: false, showFrame: false, isResizeable: false, isAccessible: true, allowUnlimitedHeight: true, showInHiddenAreas: true, keepEditorSelection: true, ordinal: 10000 + 1 });
6161
super.create();
6262
assertType(editor.hasModel());
6363

@@ -203,7 +203,7 @@ export class InlineChatLivePreviewWidget extends ZoneWidget {
203203
this._hideEditorRanges(this._diffEditor.getOriginalEditor(), ranges.originalDiffHidden);
204204
this._hideEditorRanges(this._diffEditor.getModifiedEditor(), ranges.modifiedDiffHidden);
205205

206-
this._diffEditor.revealLine(ranges.modifiedHidden.startLineNumber, ScrollType.Immediate);
206+
// this._diffEditor.revealLine(ranges.modifiedHidden.startLineNumber, ScrollType.Immediate);
207207

208208
const lineCountModified = ranges.modifiedHidden.length;
209209
const lineCountOriginal = ranges.originalHidden.length;

0 commit comments

Comments
 (0)