Skip to content

Commit 0603a46

Browse files
authored
allow strategies to control whole range deco, let live not render it (microsoft#201224)
1 parent 7f21faa commit 0603a46

File tree

2 files changed

+35
-26
lines changed

2 files changed

+35
-26
lines changed

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import { renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer';
77
import * as aria from 'vs/base/browser/ui/aria/aria';
8-
import { coalesceInPlace } from 'vs/base/common/arrays';
98
import { Barrier, Queue, raceCancellation, raceCancellationError } from 'vs/base/common/async';
109
import { CancellationTokenSource } from 'vs/base/common/cancellation';
1110
import { toErrorMessage } from 'vs/base/common/errorMessage';
@@ -25,7 +24,6 @@ import { IRange, Range } from 'vs/editor/common/core/range';
2524
import { ISelection, Selection } from 'vs/editor/common/core/selection';
2625
import { IEditorContribution } from 'vs/editor/common/editorCommon';
2726
import { TextEdit } from 'vs/editor/common/languages';
28-
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
2927
import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker';
3028
import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController';
3129
import { localize } from 'vs/nls';
@@ -98,13 +96,6 @@ export class InlineChatController implements IEditorContribution {
9896
return editor.getContribution<InlineChatController>(INLINE_CHAT_ID);
9997
}
10098

101-
private static _decoBlock = ModelDecorationOptions.register({
102-
description: 'inline-chat',
103-
showIfCollapsed: false,
104-
isWholeLine: true,
105-
className: 'inline-chat-block-selection',
106-
});
107-
10899
private static _storageKey = 'inline-chat-history';
109100
private static _promptHistory: string[] = [];
110101
private _historyOffset: number = -1;
@@ -386,10 +377,7 @@ export class InlineChatController implements IEditorContribution {
386377

387378
const wholeRangeDecoration = this._editor.createDecorationsCollection();
388379
const updateWholeRangeDecoration = () => {
389-
390-
const ranges = [this._activeSession!.wholeRange.value];//this._activeSession!.wholeRange.values;
391-
const newDecorations = ranges.map(range => range.isEmpty() ? undefined : ({ range, options: InlineChatController._decoBlock }));
392-
coalesceInPlace(newDecorations);
380+
const newDecorations = this._strategy?.getWholeRangeDecoration() ?? [];
393381
wholeRangeDecoration.set(newDecorations);
394382
};
395383
this._sessionStore.add(toDisposable(() => wholeRangeDecoration.clear()));

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

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { disposableWindowInterval } from 'vs/base/browser/dom';
77
import { $window } from 'vs/base/browser/window';
88
import { IAction, toAction } from 'vs/base/common/actions';
9-
import { equals, tail } from 'vs/base/common/arrays';
9+
import { coalesceInPlace, equals, tail } from 'vs/base/common/arrays';
1010
import { AsyncIterableObject, AsyncIterableSource } from 'vs/base/common/async';
1111
import { CancellationToken } from 'vs/base/common/cancellation';
1212
import { Codicon } from 'vs/base/common/codicons';
@@ -45,6 +45,14 @@ import { CTX_INLINE_CHAT_CHANGE_HAS_DIFF, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, CTX
4545

4646
export abstract class EditModeStrategy {
4747

48+
protected static _decoBlock = ModelDecorationOptions.register({
49+
description: 'inline-chat',
50+
showIfCollapsed: false,
51+
isWholeLine: true,
52+
className: 'inline-chat-block-selection',
53+
});
54+
55+
4856
protected readonly _onDidAccept = new Emitter<void>();
4957
protected readonly _onDidDiscard = new Emitter<void>();
5058

@@ -53,7 +61,10 @@ export abstract class EditModeStrategy {
5361

5462
toggleDiff?: () => any;
5563

56-
constructor(protected readonly _zone: InlineChatZoneWidget) { }
64+
constructor(
65+
protected readonly _session: Session,
66+
protected readonly _zone: InlineChatZoneWidget,
67+
) { }
5768

5869
dispose(): void {
5970
this._onDidAccept.dispose();
@@ -75,6 +86,13 @@ export abstract class EditModeStrategy {
7586
abstract renderChanges(response: ReplyResponse): Promise<Position | undefined>;
7687

7788
abstract hasFocus(): boolean;
89+
90+
getWholeRangeDecoration(): IModelDeltaDecoration[] {
91+
const ranges = [this._session.wholeRange.value];
92+
const newDecorations = ranges.map(range => range.isEmpty() ? undefined : ({ range, options: EditModeStrategy._decoBlock }));
93+
coalesceInPlace(newDecorations);
94+
return newDecorations;
95+
}
7896
}
7997

8098
export class PreviewStrategy extends EditModeStrategy {
@@ -83,16 +101,16 @@ export class PreviewStrategy extends EditModeStrategy {
83101
private readonly _listener: IDisposable;
84102

85103
constructor(
86-
private readonly _session: Session,
104+
session: Session,
87105
zone: InlineChatZoneWidget,
88106
@IContextKeyService contextKeyService: IContextKeyService,
89107
) {
90-
super(zone);
108+
super(session, zone);
91109

92110
this._ctxDocumentChanged = CTX_INLINE_CHAT_DOCUMENT_CHANGED.bindTo(contextKeyService);
93-
this._listener = Event.debounce(_session.textModelN.onDidChangeContent.bind(_session.textModelN), () => { }, 350)(_ => {
94-
if (!_session.textModelN.isDisposed() && !_session.textModel0.isDisposed()) {
95-
this._ctxDocumentChanged.set(_session.hasChangedText);
111+
this._listener = Event.debounce(session.textModelN.onDidChangeContent.bind(session.textModelN), () => { }, 350)(_ => {
112+
if (!session.textModelN.isDisposed() && !session.textModel0.isDisposed()) {
113+
this._ctxDocumentChanged.set(session.hasChangedText);
96114
}
97115
});
98116
}
@@ -179,15 +197,15 @@ export class LivePreviewStrategy extends EditModeStrategy {
179197
private _editCount: number = 0;
180198

181199
constructor(
182-
private readonly _session: Session,
200+
session: Session,
183201
private readonly _editor: ICodeEditor,
184202
zone: InlineChatZoneWidget,
185203
@IStorageService storageService: IStorageService,
186204
@IBulkEditService bulkEditService: IBulkEditService,
187205
@IEditorWorkerService private readonly _editorWorkerService: IEditorWorkerService,
188206
@IInstantiationService private readonly _instaService: IInstantiationService,
189207
) {
190-
super(zone);
208+
super(session, zone);
191209

192210
this._previewZone = new Lazy(() => _instaService.createInstance(InlineChatFileCreatePreviewWidget, _editor));
193211
}
@@ -500,16 +518,14 @@ export class LiveStrategy extends EditModeStrategy {
500518
private _editCount: number = 0;
501519

502520
constructor(
503-
protected readonly _session: Session,
521+
session: Session,
504522
protected readonly _editor: ICodeEditor,
505523
zone: InlineChatZoneWidget,
506524
@IContextKeyService contextKeyService: IContextKeyService,
507-
@IStorageService protected _storageService: IStorageService,
508-
@IBulkEditService protected readonly _bulkEditService: IBulkEditService,
509525
@IEditorWorkerService protected readonly _editorWorkerService: IEditorWorkerService,
510526
@IInstantiationService protected readonly _instaService: IInstantiationService,
511527
) {
512-
super(zone);
528+
super(session, zone);
513529
this._ctxCurrentChangeHasDiff = CTX_INLINE_CHAT_CHANGE_HAS_DIFF.bindTo(contextKeyService);
514530
this._ctxCurrentChangeShowsDiff = CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF.bindTo(contextKeyService);
515531

@@ -893,6 +909,11 @@ export class LiveStrategy extends EditModeStrategy {
893909
hasFocus(): boolean {
894910
return this._zone.widget.hasFocus();
895911
}
912+
913+
override getWholeRangeDecoration(): IModelDeltaDecoration[] {
914+
// don't render the blue in live mode
915+
return [];
916+
}
896917
}
897918

898919

0 commit comments

Comments
 (0)