Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/inlineChat/browser/inlineChatGutterAffordance.ts
5241 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Codicon } from '../../../../base/common/codicons.js';
7
import { autorun, constObservable, derived, IObservable, ISettableObservable, observableValue } from '../../../../base/common/observable.js';
8
import { ObservableCodeEditor } from '../../../../editor/browser/observableCodeEditor.js';
9
import { LineRange } from '../../../../editor/common/core/ranges/lineRange.js';
10
import { Selection, SelectionDirection } from '../../../../editor/common/core/selection.js';
11
import { InlineEditsGutterIndicator, InlineEditsGutterIndicatorData, InlineSuggestionGutterMenuData, SimpleInlineSuggestModel } from '../../../../editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js';
12
import { InlineEditTabAction } from '../../../../editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js';
13
import { localize } from '../../../../nls.js';
14
import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';
15
import { IHoverService } from '../../../../platform/hover/browser/hover.js';
16
import { HoverService } from '../../../../platform/hover/browser/hoverService.js';
17
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
18
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
19
import { IThemeService } from '../../../../platform/theme/common/themeService.js';
20
import { IUserInteractionService } from '../../../../platform/userInteraction/browser/userInteractionService.js';
21
import { ACTION_START } from '../common/inlineChat.js';
22
23
export class InlineChatGutterAffordance extends InlineEditsGutterIndicator {
24
25
constructor(
26
private readonly _myEditorObs: ObservableCodeEditor,
27
selection: IObservable<Selection | undefined>,
28
private readonly _hover: ISettableObservable<{ rect: DOMRect; above: boolean; lineNumber: number } | undefined>,
29
@IKeybindingService private readonly _keybindingService: IKeybindingService,
30
@IHoverService hoverService: HoverService,
31
@IInstantiationService instantiationService: IInstantiationService,
32
@IAccessibilityService accessibilityService: IAccessibilityService,
33
@IThemeService themeService: IThemeService,
34
@IUserInteractionService userInteractionService: IUserInteractionService,
35
) {
36
const data = derived<InlineEditsGutterIndicatorData | undefined>(r => {
37
const value = selection.read(r);
38
if (!value) {
39
return undefined;
40
}
41
42
// Use the cursor position (active end of selection) to determine the line
43
const cursorPosition = value.getPosition();
44
const lineRange = new LineRange(cursorPosition.lineNumber, cursorPosition.lineNumber + 1);
45
46
// Create minimal gutter menu data (empty for prototype)
47
const gutterMenuData = new InlineSuggestionGutterMenuData(
48
undefined, // action
49
'', // displayName
50
[], // extensionCommands
51
undefined, // alternativeAction
52
undefined, // modelInfo
53
undefined, // setModelId
54
);
55
56
return new InlineEditsGutterIndicatorData(
57
gutterMenuData,
58
lineRange,
59
new SimpleInlineSuggestModel(() => { }, () => this._doShowHover()),
60
undefined, // altAction
61
{
62
icon: Codicon.sparkle,
63
}
64
);
65
});
66
67
const focusIsInMenu = observableValue<boolean>({}, false);
68
69
super(
70
_myEditorObs, data, constObservable(InlineEditTabAction.Inactive), constObservable(0), constObservable(false), focusIsInMenu,
71
hoverService, instantiationService, accessibilityService, themeService, userInteractionService
72
);
73
74
this._store.add(autorun(r => {
75
const element = _hover.read(r);
76
this._hoverVisible.set(!!element, undefined);
77
}));
78
}
79
80
protected override _showHover(): void {
81
this._hoverService.showInstantHover({
82
target: this._iconRef.element,
83
content: this._keybindingService.appendKeybinding(localize('inlineChatGutterHover', "Inline Chat"), ACTION_START),
84
// appearance: { showPointer: true }
85
});
86
}
87
88
private _doShowHover(): void {
89
if (this._hoverVisible.get()) {
90
return;
91
}
92
93
// Use the icon element from the base class as anchor
94
const iconElement = this._iconRef.element;
95
if (!iconElement) {
96
this._hover.set(undefined, undefined);
97
return;
98
}
99
100
const selection = this._myEditorObs.cursorSelection.get();
101
const direction = selection?.getDirection() ?? SelectionDirection.LTR;
102
const lineNumber = selection?.getPosition().lineNumber ?? 1;
103
this._hover.set({ rect: iconElement.getBoundingClientRect(), above: direction === SelectionDirection.RTL, lineNumber }, undefined);
104
}
105
106
}
107
108