Skip to content

Commit 6f558be

Browse files
author
Benjamin Pasero
committed
1 parent 56df825 commit 6f558be

10 files changed

Lines changed: 95 additions & 37 deletions

File tree

src/vs/base/parts/quickinput/common/quickInput.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ export type QuickPickInput<T = IQuickPickItem> = T | IQuickPickSeparator;
326326

327327
//region Fuzzy Scorer Support
328328

329-
export type IQuickPickItemWithResource = IQuickPickItem & { resource: URI | undefined };
329+
export type IQuickPickItemWithResource = IQuickPickItem & { resource?: URI };
330330

331331
export class QuickPickItemScorerAccessor implements IItemAccessor<IQuickPickItemWithResource> {
332332

src/vs/platform/quickinput/browser/commandsQuickAccess.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common
2525

2626
export interface ICommandQuickPick extends IPickerQuickAccessItem {
2727
commandId: string;
28-
commandAlias: string | undefined;
28+
commandAlias?: string;
2929
}
3030

31-
export interface ICommandsQuickAccessOptions extends IPickerQuickAccessProviderOptions {
31+
export interface ICommandsQuickAccessOptions extends IPickerQuickAccessProviderOptions<ICommandQuickPick> {
3232
showAlias: boolean;
3333
}
3434

src/vs/platform/quickinput/browser/pickerQuickAccess.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,17 @@ export interface IPickerQuickAccessItem extends IQuickPickItem {
5959
trigger?(buttonIndex: number, keyMods: IKeyMods): TriggerAction | Promise<TriggerAction>;
6060
}
6161

62-
export interface IPickerQuickAccessProviderOptions {
62+
export interface IPickerQuickAccessProviderOptions<T extends IPickerQuickAccessItem> {
63+
64+
/**
65+
* Enables support for opening picks in the background via gesture.
66+
*/
6367
canAcceptInBackground?: boolean;
68+
69+
/**
70+
* Enables to show a pick entry when no results are returned from a search.
71+
*/
72+
noResultsPick?: T;
6473
}
6574

6675
export type Pick<T> = T | IQuickPickSeparator;
@@ -85,7 +94,7 @@ export abstract class PickerQuickAccessProvider<T extends IPickerQuickAccessItem
8594

8695
private static FAST_PICKS_RACE_DELAY = 200; // timeout before we accept fast results before slow results are present
8796

88-
constructor(private prefix: string, protected options?: IPickerQuickAccessProviderOptions) {
97+
constructor(private prefix: string, protected options?: IPickerQuickAccessProviderOptions<T>) {
8998
super();
9099
}
91100

@@ -113,9 +122,10 @@ export abstract class PickerQuickAccessProvider<T extends IPickerQuickAccessItem
113122

114123
// Collect picks and support both long running and short or combined
115124
const picksToken = picksCts.token;
116-
const providedPicks = this.getPicks(picker.value.substr(this.prefix.length).trim(), picksDisposables, picksToken);
125+
const picksFilter = picker.value.substr(this.prefix.length).trim();
126+
const providedPicks = this.getPicks(picksFilter, picksDisposables, picksToken);
117127

118-
function applyPicks(picks: Picks<T>, skipEmpty?: boolean): boolean {
128+
const applyPicks = (picks: Picks<T>, skipEmpty?: boolean): boolean => {
119129
let items: ReadonlyArray<Pick<T>>;
120130
let activeItem: T | undefined = undefined;
121131

@@ -126,8 +136,14 @@ export abstract class PickerQuickAccessProvider<T extends IPickerQuickAccessItem
126136
items = picks;
127137
}
128138

129-
if (items.length === 0 && skipEmpty) {
130-
return false;
139+
if (items.length === 0) {
140+
if (skipEmpty) {
141+
return false;
142+
}
143+
144+
if (picksFilter.length > 0 && this.options?.noResultsPick) {
145+
items = [this.options.noResultsPick];
146+
}
131147
}
132148

133149
picker.items = items;
@@ -136,7 +152,7 @@ export abstract class PickerQuickAccessProvider<T extends IPickerQuickAccessItem
136152
}
137153

138154
return true;
139-
}
155+
};
140156

141157
// No Picks
142158
if (providedPicks === null) {

src/vs/workbench/browser/parts/editor/editorQuickAccess.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import { prepareQuery, scoreItemFuzzy, compareItemsByFuzzyScore, FuzzyScorerCach
1717
import { CancellationToken } from 'vs/base/common/cancellation';
1818
import { IDisposable } from 'vs/base/common/lifecycle';
1919

20-
interface IEditorQuickPickItem extends IQuickPickItemWithResource, IEditorIdentifier, IPickerQuickAccessItem { }
20+
interface IEditorQuickPickItem extends IQuickPickItemWithResource, IPickerQuickAccessItem {
21+
groupId: GroupIdentifier;
22+
}
2123

2224
export abstract class BaseEditorQuickAccessProvider extends PickerQuickAccessProvider<IEditorQuickPickItem> {
2325

@@ -45,7 +47,15 @@ export abstract class BaseEditorQuickAccessProvider extends PickerQuickAccessPro
4547
@IModelService private readonly modelService: IModelService,
4648
@IModeService private readonly modeService: IModeService
4749
) {
48-
super(prefix, { canAcceptInBackground: true });
50+
super(prefix,
51+
{
52+
canAcceptInBackground: true,
53+
noResultsPick: {
54+
label: localize('noViewResults', "No editor matching"),
55+
groupId: -1
56+
}
57+
}
58+
);
4959
}
5060

5161
provide(picker: IQuickPick<IEditorQuickPickItem>, token: CancellationToken): IDisposable {
@@ -130,7 +140,6 @@ export abstract class BaseEditorQuickAccessProvider extends PickerQuickAccessPro
130140
const isDirty = editor.isDirty() && !editor.isSaving();
131141

132142
return {
133-
editor,
134143
groupId,
135144
resource,
136145
label: editor.getName(),

src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ export class StartDebugQuickAccessProvider extends PickerQuickAccessProvider<IPi
2424
@ICommandService private readonly commandService: ICommandService,
2525
@INotificationService private readonly notificationService: INotificationService
2626
) {
27-
super(StartDebugQuickAccessProvider.PREFIX);
27+
super(StartDebugQuickAccessProvider.PREFIX, {
28+
noResultsPick: {
29+
label: localize('noDebugResults', "No launch configuration matching")
30+
}
31+
});
2832
}
2933

3034
protected getPicks(filter: string): (IQuickPickSeparator | IPickerQuickAccessItem)[] {

src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ export class CommandsQuickAccessProvider extends AbstractEditorCommandsQuickAcce
6060
@INotificationService notificationService: INotificationService,
6161
@IConfigurationService private readonly configurationService: IConfigurationService
6262
) {
63-
super({ showAlias: !Language.isDefaultVariant() }, instantiationService, keybindingService, commandService, telemetryService, notificationService);
63+
super({
64+
showAlias: !Language.isDefaultVariant(),
65+
noResultsPick: {
66+
label: localize('noCommandResults', "No command matching"),
67+
commandId: ''
68+
}
69+
}, instantiationService, keybindingService, commandService, telemetryService, notificationService);
6470
}
6571

6672
private get configuration() {

src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ export class ViewQuickAccessProvider extends PickerQuickAccessProvider<IViewQuic
3737
@IPanelService private readonly panelService: IPanelService,
3838
@IContextKeyService private readonly contextKeyService: IContextKeyService
3939
) {
40-
super(ViewQuickAccessProvider.PREFIX);
40+
super(ViewQuickAccessProvider.PREFIX, {
41+
noResultsPick: {
42+
label: localize('noViewResults', "No view matching"),
43+
containerLabel: ''
44+
}
45+
});
4146
}
4247

4348
protected getPicks(filter: string): Array<IViewQuickPickItem | IQuickPickSeparator> {

src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import 'vs/css!./media/anythingQuickAccess';
7-
import { IQuickInputButton, IKeyMods, quickPickItemScorerAccessor, QuickPickItemScorerAccessor, IQuickPick } from 'vs/platform/quickinput/common/quickInput';
7+
import { IQuickInputButton, IKeyMods, quickPickItemScorerAccessor, QuickPickItemScorerAccessor, IQuickPick, IQuickPickItemWithResource } from 'vs/platform/quickinput/common/quickInput';
88
import { IPickerQuickAccessItem, PickerQuickAccessProvider, TriggerAction, FastAndSlowPicks, Picks, PicksWithActive } from 'vs/platform/quickinput/browser/pickerQuickAccess';
99
import { prepareQuery, IPreparedQuery, compareItemsByFuzzyScore, scoreItemFuzzy, FuzzyScorerCache } from 'vs/base/common/fuzzyScorer';
1010
import { IFileQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder';
@@ -50,9 +50,7 @@ import { getCodeEditor } from 'vs/editor/browser/editorBrowser';
5050
import { withNullAsUndefined } from 'vs/base/common/types';
5151
import { stripCodicons } from 'vs/base/common/codicons';
5252

53-
interface IAnythingQuickPickItem extends IPickerQuickAccessItem {
54-
resource: URI | undefined;
55-
}
53+
interface IAnythingQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemWithResource { }
5654

5755
interface IEditorSymbolAnythingQuickPickItem extends IAnythingQuickPickItem {
5856
resource: URI;
@@ -163,7 +161,12 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
163161
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService,
164162
@ITextModelService private readonly textModelService: ITextModelService
165163
) {
166-
super(AnythingQuickAccessProvider.PREFIX, { canAcceptInBackground: true });
164+
super(AnythingQuickAccessProvider.PREFIX, {
165+
canAcceptInBackground: true,
166+
noResultsPick: {
167+
label: localize('noAnythingResults', "No result matching")
168+
}
169+
});
167170
}
168171

169172
private get configuration() {

src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,16 @@ import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/
1717
import { Range } from 'vs/editor/common/core/range';
1818
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1919
import { IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor';
20-
import { IKeyMods } from 'vs/platform/quickinput/common/quickInput';
21-
import { URI } from 'vs/base/common/uri';
20+
import { IKeyMods, IQuickPickItemWithResource } from 'vs/platform/quickinput/common/quickInput';
2221
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
2322
import { getSelectionSearchString } from 'vs/editor/contrib/find/findController';
2423
import { withNullAsUndefined } from 'vs/base/common/types';
2524
import { prepareQuery, IPreparedQuery, scoreFuzzy2, pieceToQuery } from 'vs/base/common/fuzzyScorer';
2625
import { IMatch } from 'vs/base/common/filters';
2726

28-
interface ISymbolQuickPickItem extends IPickerQuickAccessItem {
29-
resource: URI | undefined;
27+
interface ISymbolQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemWithResource {
3028
score?: number;
31-
symbol: IWorkspaceSymbol;
29+
symbol?: IWorkspaceSymbol;
3230
}
3331

3432
export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider<ISymbolQuickPickItem> {
@@ -67,7 +65,12 @@ export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider<ISymbo
6765
@IConfigurationService private readonly configurationService: IConfigurationService,
6866
@ICodeEditorService private readonly codeEditorService: ICodeEditorService
6967
) {
70-
super(SymbolsQuickAccessProvider.PREFIX, { canAcceptInBackground: true });
68+
super(SymbolsQuickAccessProvider.PREFIX, {
69+
canAcceptInBackground: true,
70+
noResultsPick: {
71+
label: localize('noSymbolResults', "No workspace symbol matching")
72+
}
73+
});
7174
}
7275

7376
private get configuration() {
@@ -241,22 +244,30 @@ export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider<ISymbo
241244
if (symbolA.score && symbolB.score) {
242245
if (symbolA.score > symbolB.score) {
243246
return -1;
244-
} else if (symbolA.score < symbolB.score) {
247+
}
248+
249+
if (symbolA.score < symbolB.score) {
245250
return 1;
246251
}
247252
}
248253

249254
// By name
250-
const symbolAName = symbolA.symbol.name.toLowerCase();
251-
const symbolBName = symbolB.symbol.name.toLowerCase();
252-
const res = symbolAName.localeCompare(symbolBName);
253-
if (res !== 0) {
254-
return res;
255+
if (symbolA.symbol && symbolB.symbol) {
256+
const symbolAName = symbolA.symbol.name.toLowerCase();
257+
const symbolBName = symbolB.symbol.name.toLowerCase();
258+
const res = symbolAName.localeCompare(symbolBName);
259+
if (res !== 0) {
260+
return res;
261+
}
255262
}
256263

257264
// By kind
258-
const symbolAKind = SymbolKinds.toCssClassName(symbolA.symbol.kind);
259-
const symbolBKind = SymbolKinds.toCssClassName(symbolB.symbol.kind);
260-
return symbolAKind.localeCompare(symbolBKind);
265+
if (symbolA.symbol && symbolB.symbol) {
266+
const symbolAKind = SymbolKinds.toCssClassName(symbolA.symbol.kind);
267+
const symbolBKind = SymbolKinds.toCssClassName(symbolB.symbol.kind);
268+
return symbolAKind.localeCompare(symbolBKind);
269+
}
270+
271+
return 0;
261272
}
262273
}

src/vs/workbench/contrib/tasks/browser/tasksQuickAccess.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ export class TasksQuickAccessProvider extends PickerQuickAccessProvider<IPickerQ
2828
@IConfigurationService private configurationService: IConfigurationService,
2929
@IQuickInputService private quickInputService: IQuickInputService
3030
) {
31-
super(TasksQuickAccessProvider.PREFIX);
31+
super(TasksQuickAccessProvider.PREFIX, {
32+
noResultsPick: {
33+
label: localize('noTaskResults', "No task matching")
34+
}
35+
});
3236

3337
this.activationPromise = extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask');
3438
}

0 commit comments

Comments
 (0)