Skip to content

Commit 929a8ba

Browse files
committed
fix: inline chat first line visible
1 parent c7bbf3b commit 929a8ba

5 files changed

Lines changed: 36 additions & 18 deletions

File tree

packages/ai-native/src/browser/widget/inline-chat/inline-chat.handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ export class InlineChatHandler extends Disposable {
560560
if (crossSelection.endLineNumber === model!.getLineCount()) {
561561
// 如果用户是选中了最后一行,直接显示在最后一行
562562
const lineHeight = monacoEditor.getOption(monacoApi.editor.EditorOption.lineHeight);
563-
this.aiInlineContentWidget.offsetTop(lineHeight * count + 12);
563+
this.aiInlineContentWidget.setOffsetTop(lineHeight * count + 12);
564564
}
565565
});
566566
}),

packages/ai-native/src/browser/widget/inline-chat/inline-content-widget.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,13 @@ const AIInlineChatController = (props: IAIInlineChatControllerProps) => {
157157
);
158158
}, [operationList, moreOperation, customOperationRender, onResultClick, status, interactiveInputVisible]);
159159

160-
return (
161-
<div className={styles.inline_chat_controller_box} style={isDone ? { transform: 'translateY(-15px)' } : {}}>
162-
{renderContent()}
163-
</div>
164-
);
160+
return <div className={styles.inline_chat_controller_box}>{renderContent()}</div>;
165161
};
166162

167163
@Injectable({ multiple: true })
168164
export class AIInlineContentWidget extends ReactInlineContentWidget {
165+
allowEditorOverflow = true;
166+
169167
@Autowired(INJECTOR_TOKEN)
170168
private readonly injector: Injector;
171169

@@ -174,8 +172,6 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
174172

175173
private readonly aiNativeContextKey: AINativeContextKey;
176174

177-
private originTop = 0;
178-
179175
private readonly _onActionClickEmitter = new Emitter<{ actionId: string; source: string }>();
180176
public readonly onActionClick = this._onActionClickEmitter.event;
181177

@@ -279,13 +275,8 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
279275
this.options = options;
280276
}
281277

282-
public offsetTop(top: number): void {
283-
if (this.originTop === 0) {
284-
const top = this.domNode.style.top;
285-
this.originTop = top ? parseInt(top, 10) : 0;
286-
}
287-
288-
this.domNode.style.top = `${this.originTop + top}px`;
278+
public setOffsetTop(top: number): void {
279+
this.domNode.style.transform = `translateY(${top}px)`;
289280
}
290281

291282
id(): string {

packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
315315
getPosition(): IPosition {
316316
const zone = this.node?.getZone();
317317
if (zone) {
318-
return Position.lift({ lineNumber: Math.max(0, zone.startLineNumber - 1), column: 1 });
318+
return Position.lift({ lineNumber: zone.startLineNumber, column: 1 });
319319
}
320320
return Position.lift({ lineNumber: 1, column: 1 });
321321
}
@@ -338,8 +338,30 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
338338
return Disposable.NULL;
339339
}
340340
layout(): void {
341-
this.inlineContentWidget?.setPositionPreference([ContentWidgetPositionPreference.EXACT]);
341+
this.inlineContentWidget?.setPositionPreference([
342+
ContentWidgetPositionPreference.ABOVE,
343+
ContentWidgetPositionPreference.BELOW,
344+
]);
342345
super.layout();
346+
347+
const position = this.getPosition();
348+
if (position && this.inlineContentWidget) {
349+
// 如果第一个 removed widget 的 lineNumber 和 position 的 lineNumber 相等,则需要将 inline content widget 往上移动被删除的行数,避免遮挡
350+
const removedWidgets = this.node?.livePreviewDiffDecorationModel.getRemovedWidgets();
351+
if (removedWidgets?.length) {
352+
const lineNumber = position.lineNumber;
353+
const firstRemovedWidget = removedWidgets[0];
354+
355+
if (firstRemovedWidget) {
356+
const firstRemovedWidgetLineNumber = firstRemovedWidget.getLastPosition()?.lineNumber;
357+
if (firstRemovedWidgetLineNumber <= lineNumber) {
358+
const lineHeight = this.inlineContentWidget.getLineHeight();
359+
const len = firstRemovedWidget.height;
360+
this.inlineContentWidget.setOffsetTop(-lineHeight * len - 4);
361+
}
362+
}
363+
}
364+
}
343365
}
344366
onData(data: ReplyResponse): void {
345367
const { message } = data;

packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
6161

6262
public previewerOptions: IDiffPreviewerOptions;
6363

64-
private livePreviewDiffDecorationModel: LivePreviewDiffDecorationModel;
6564
private originalModel: ITextModel;
6665
private virtualModel: ITextModel;
6766

@@ -70,6 +69,8 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
7069
private rawOriginalTextLinesTokens: LineTokens[] = [];
7170
private undoRedoGroup: UndoRedoGroup;
7271

72+
public livePreviewDiffDecorationModel: LivePreviewDiffDecorationModel;
73+
7374
constructor(private readonly monacoEditor: ICodeEditor) {
7475
super();
7576

packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ export class LivePreviewDiffDecorationModel extends Disposable {
159159
this.updateZone(zone);
160160
}
161161

162+
getRemovedWidgets(): RemovedZoneWidget[] {
163+
return this.removedZoneWidgets;
164+
}
165+
162166
restoreSnapshot(snapshot: ILivePreviewDiffDecorationSnapshotData): void {
163167
const {
164168
addedDecList,

0 commit comments

Comments
 (0)