This commit is contained in:
Henning Dieterichs 2023-05-26 17:39:42 +02:00 committed by GitHub
parent 89db3e46dd
commit aaadde5489
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 27 deletions

View file

@ -198,7 +198,7 @@ export class ToggleAlwaysShowInlineSuggestionToolbar extends Action2 {
group: 'secondary',
order: 10,
}],
toggled: InlineCompletionContextKeys.alwaysShowInlineSuggestionToolbar,
toggled: ContextKeyExpr.equals('config.editor.inlineSuggest.showToolbar', 'always')
});
}

View file

@ -15,7 +15,6 @@ export class InlineCompletionContextKeys extends Disposable {
public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, localize('inlineSuggestionVisible', "Whether an inline suggestion is visible"));
public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace"));
public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab"));
public static readonly alwaysShowInlineSuggestionToolbar = new RawContextKey<boolean>('alwaysShowInlineSuggestionToolbar', false, localize('alwaysShowInlineSuggestionToolbar', "Whether the inline suggestion toolbar should always be visible"));
public static readonly suppressSuggestions = new RawContextKey<boolean | undefined>('inlineSuggestionSuppressSuggestions', undefined, localize('suppressSuggestions', "Whether suggestions should be suppressed for the current suggestion"));
public readonly inlineCompletionVisible = InlineCompletionContextKeys.inlineSuggestionVisible.bindTo(this.contextKeyService);

View file

@ -20,7 +20,7 @@ import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents';
import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/browser/commandIds';
import { GhostTextWidget } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextWidget';
import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys';
import { InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget';
import { InlineCompletionsHintsWidget, InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget';
import { InlineCompletionsModel, VersionIdChangeReason } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel';
import { SuggestWidgetAdaptor } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider';
import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService';
@ -191,6 +191,8 @@ export class InlineCompletionsController extends Disposable {
});
}
}));
this._register(new InlineCompletionsHintsWidget(this.editor, this.model, this.instantiationService));
}
/**

View file

@ -12,6 +12,7 @@ import { RunOnceScheduler } from 'vs/base/common/async';
import { Codicon } from 'vs/base/common/codicons';
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { IObservable, autorun, derived, observableFromEvent } from 'vs/base/common/observable';
import { autorunWithStore2 } from 'vs/base/common/observableImpl/autorun';
import { OS } from 'vs/base/common/platform';
import { ThemeIcon } from 'vs/base/common/themables';
import 'vs/css!./inlineCompletionsHintsWidget';
@ -35,14 +36,14 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
export class InlineCompletionsHintsWidget extends Disposable {
private readonly showToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar);
private readonly alwaysShowToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar === 'always');
private sessionPosition: Position | undefined = undefined;
private readonly position = derived('position', reader => {
const ghostText = this.model.ghostText.read(reader);
const ghostText = this.model.read(reader)?.ghostText.read(reader);
if (this.showToolbar.read(reader) !== 'always' || !ghostText) {
if (!this.alwaysShowToolbar.read(reader) || !ghostText || ghostText.parts.length === 0) {
this.sessionPosition = undefined;
return null;
}
@ -53,37 +54,44 @@ export class InlineCompletionsHintsWidget extends Disposable {
}
const position = new Position(ghostText.lineNumber, Math.min(firstColumn, this.sessionPosition?.column ?? Number.MAX_SAFE_INTEGER));
this.sessionPosition = position;
return position;
});
private readonly contentWidget = this._register(this.instantiationService.createInstance(
InlineSuggestionHintsContentWidget,
this.editor,
true,
this.position,
this.model.selectedInlineCompletionIndex,
this.model.inlineCompletionsCount,
this.model.selectedInlineCompletion.map(v => v?.inlineCompletion.source.inlineCompletions.commands ?? []),
));
constructor(
private readonly editor: ICodeEditor,
private readonly model: InlineCompletionsModel,
private readonly model: IObservable<InlineCompletionsModel | undefined>,
@IInstantiationService private readonly instantiationService: IInstantiationService,
) {
super();
editor.addContentWidget(this.contentWidget);
this._register(toDisposable(() => editor.removeContentWidget(this.contentWidget)));
this._register(autorun('request explicit', reader => {
const position = this.position.read(reader);
if (!position) {
this._register(autorunWithStore2('setup content widget', (reader, store) => {
const model = this.model.read(reader);
if (!model || !this.alwaysShowToolbar.read(reader)) {
return;
}
if (this.model.lastTriggerKind.read(reader) !== InlineCompletionTriggerKind.Explicit) {
this.model.triggerExplicitly();
}
const contentWidget = store.add(this.instantiationService.createInstance(
InlineSuggestionHintsContentWidget,
this.editor,
true,
this.position,
model.selectedInlineCompletionIndex,
model.inlineCompletionsCount,
model.selectedInlineCompletion.map(v => v?.inlineCompletion.source.inlineCompletions.commands ?? []),
));
editor.addContentWidget(contentWidget);
store.add(toDisposable(() => editor.removeContentWidget(contentWidget)));
store.add(autorun('request explicit', reader => {
const position = this.position.read(reader);
if (!position) {
return;
}
if (model.lastTriggerKind.read(reader) !== InlineCompletionTriggerKind.Explicit) {
model.triggerExplicitly();
}
}));
}));
}
}

View file

@ -89,10 +89,10 @@ export class InlineCompletionsSource extends Disposable {
}
}
this._updateOperation.clear();
transaction(tx => {
target.set(completions, tx);
});
this._updateOperation.clear();
return true;
})();