ux tweaks: only have show more / less when there is a good chance of details, #39441

This commit is contained in:
Johannes Rieken 2020-02-11 13:03:27 +01:00
parent 97cc40b922
commit 031bb8e6c3
3 changed files with 13 additions and 4 deletions

View file

@ -26,6 +26,7 @@ export const Context = {
MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true),
AcceptSuggestionsOnEnter: new RawContextKey<boolean>('acceptSuggestionOnEnter', true),
HasInsertAndReplaceRange: new RawContextKey('suggestionHasInsertAndReplaceRange', false),
CanResolve: new RawContextKey('suggestionCanResolve', false),
};
export const suggestWidgetStatusbarMenu = new MenuId('suggestWidgetStatusBar');
@ -34,9 +35,12 @@ export class CompletionItem {
_brand!: 'ISuggestionItem';
private static readonly _defaultResolve = () => Promise.resolve();
readonly resolve: (token: CancellationToken) => Promise<void>;
isResolved: boolean = false;
//
readonly editStart: IPosition;
readonly editInsertEnd: IPosition;
@ -87,7 +91,7 @@ export class CompletionItem {
// create the suggestion resolver
const { resolveCompletionItem } = provider;
if (typeof resolveCompletionItem !== 'function') {
this.resolve = () => Promise.resolve();
this.resolve = CompletionItem._defaultResolve;
this.isResolved = true;
} else {
let cached: Promise<void> | undefined;

View file

@ -139,10 +139,12 @@ export class SuggestController implements IEditorContribution {
// Wire up makes text edit context key
const ctxMakesTextEdit = SuggestContext.MakesTextEdit.bindTo(this._contextKeyService);
const ctxHasInsertAndReplace = SuggestContext.HasInsertAndReplaceRange.bindTo(this._contextKeyService);
const ctxCanResolve = SuggestContext.CanResolve.bindTo(this._contextKeyService);
this._toDispose.add(toDisposable(() => {
ctxMakesTextEdit.reset();
ctxHasInsertAndReplace.reset();
ctxCanResolve.reset();
}));
this._toDispose.add(widget.onDidFocus(({ item }) => {
@ -172,6 +174,9 @@ export class SuggestController implements IEditorContribution {
// (ctx: hasInsertAndReplaceRange)
ctxHasInsertAndReplace.set(!Position.equals(item.editInsertEnd, item.editReplaceEnd));
// (ctx: canResolve)
ctxCanResolve.set(Boolean(item.provider.resolveCompletionItem) || Boolean(item.completion.documentation) || item.completion.detail !== item.completion.label);
}));
this._toDispose.add(widget.onDetailsKeyDown(e => {
@ -695,13 +700,13 @@ registerEditorCommand(new SuggestCommand({
menuId: suggestWidgetStatusbarMenu,
group: 'right',
order: 1,
when: SuggestContext.DetailsVisible,
when: ContextKeyExpr.and(SuggestContext.DetailsVisible, SuggestContext.CanResolve),
title: nls.localize('detail.more', "show less")
}, {
menuId: suggestWidgetStatusbarMenu,
group: 'right',
order: 1,
when: SuggestContext.DetailsVisible.toNegated(),
when: ContextKeyExpr.and(SuggestContext.DetailsVisible.toNegated(), SuggestContext.CanResolve),
title: nls.localize('detail.less', "show more")
}]
}));

View file

@ -154,7 +154,7 @@ export class SnippetCompletionProvider implements CompletionItemProvider {
});
}
resolveCompletionItem?(model: ITextModel, position: Position, item: CompletionItem): CompletionItem {
resolveCompletionItem(_model: ITextModel, _position: Position, item: CompletionItem): CompletionItem {
return (item instanceof SnippetCompletion) ? item.resolve() : item;
}