From fc4fba3d9328cd3fd20d4bcb25cd955d28c39a20 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Tue, 17 Jan 2023 15:44:27 -0800 Subject: [PATCH] Initial cut of seeded command palette (#171293) * Initial cut of seeded command palette * hook up setting and product.json entry --- src/vs/base/common/product.ts | 2 ++ .../quickinput/browser/commandsQuickAccess.ts | 33 ++++++++++++++++--- src/vs/workbench/browser/quickaccess.ts | 3 ++ .../browser/workbench.contribution.ts | 5 +++ .../browser/commandsQuickAccess.ts | 19 +++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 897d806cc62..64e6e3484a5 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -91,6 +91,8 @@ export interface IProductConfiguration { readonly trustedExtensionUrlPublicKeys?: { [id: string]: string[] }; readonly trustedExtensionAuthAccess?: readonly string[]; + readonly commandPaletteSuggestedCommandIds?: string[]; + readonly crashReporter?: { readonly companyName: string; readonly productName: string; diff --git a/src/vs/platform/quickinput/browser/commandsQuickAccess.ts b/src/vs/platform/quickinput/browser/commandsQuickAccess.ts index 864507213a9..cedc8b01fc7 100644 --- a/src/vs/platform/quickinput/browser/commandsQuickAccess.ts +++ b/src/vs/platform/quickinput/browser/commandsQuickAccess.ts @@ -30,6 +30,7 @@ export interface ICommandQuickPick extends IPickerQuickAccessItem { export interface ICommandsQuickAccessOptions extends IPickerQuickAccessProviderOptions { showAlias: boolean; + suggestedCommandIds?: Set; } export abstract class AbstractCommandsQuickAccessProvider extends PickerQuickAccessProvider implements IDisposable { @@ -115,13 +116,30 @@ export abstract class AbstractCommandsQuickAccessProvider extends PickerQuickAcc return 1; // other command was used so it wins over the command } + if (this.options.suggestedCommandIds) { + const commandASuggestion = this.options.suggestedCommandIds.has(commandPickA.commandId); + const commandBSuggestion = this.options.suggestedCommandIds.has(commandPickB.commandId); + if (commandASuggestion && commandBSuggestion) { + return 0; // honor the order of the array + } + + if (commandASuggestion) { + return -1; // first command was suggested, so it wins over the non suggested one + } + + if (commandBSuggestion) { + return 1; // other command was suggested so it wins over the command + } + } + // both commands were never used, so we sort by name return commandPickA.label.localeCompare(commandPickB.label); }); const commandPicks: Array = []; - let addSeparator = false; + let addOtherSeparator = false; + let addCommonlyUsedSeparator = !!this.options.suggestedCommandIds; for (let i = 0; i < filteredCommandPicks.length; i++) { const commandPick = filteredCommandPicks[i]; const keybinding = this.keybindingService.lookupKeybinding(commandPick.commandId); @@ -132,13 +150,20 @@ export abstract class AbstractCommandsQuickAccessProvider extends PickerQuickAcc // Separator: recently used if (i === 0 && this.commandsHistory.peek(commandPick.commandId)) { commandPicks.push({ type: 'separator', label: localize('recentlyUsed', "recently used") }); - addSeparator = true; + addOtherSeparator = true; + } + + // Separator: commonly used + if (addCommonlyUsedSeparator && !this.commandsHistory.peek(commandPick.commandId) && this.options.suggestedCommandIds?.has(commandPick.commandId)) { + commandPicks.push({ type: 'separator', label: localize('commonlyUsed', "commonly used") }); + addOtherSeparator = true; + addCommonlyUsedSeparator = false; } // Separator: other commands - if (i !== 0 && addSeparator && !this.commandsHistory.peek(commandPick.commandId)) { + if (addOtherSeparator && !this.commandsHistory.peek(commandPick.commandId) && !this.options.suggestedCommandIds?.has(commandPick.commandId)) { commandPicks.push({ type: 'separator', label: localize('morecCommands', "other commands") }); - addSeparator = false; // only once + addOtherSeparator = false; } // Command diff --git a/src/vs/workbench/browser/quickaccess.ts b/src/vs/workbench/browser/quickaccess.ts index a7e0980b6d2..d8f56f310d8 100644 --- a/src/vs/workbench/browser/quickaccess.ts +++ b/src/vs/workbench/browser/quickaccess.ts @@ -21,6 +21,9 @@ export interface IWorkbenchQuickAccessConfiguration { commandPalette: { history: number; preserveInput: boolean; + experimental: { + suggestCommands: boolean; + }; }; quickOpen: { enableExperimentalNewVersion: boolean; diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 9113865ba18..4ea06cce5ed 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -333,6 +333,11 @@ const registry = Registry.as(ConfigurationExtensions.Con 'description': localize('preserveInput', "Controls whether the last typed input to the command palette should be restored when opening it the next time."), 'default': false }, + 'workbench.commandPalette.experimental.suggestCommands': { + 'type': 'boolean', + 'description': localize('suggestCommands', "Controls whether the command palette should have a list of commonly used commands."), + 'default': false + }, 'workbench.quickOpen.closeOnFocusLost': { 'type': 'boolean', 'description': localize('closeOnFocusLost', "Controls whether Quick Open should close automatically once it loses focus."), diff --git a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts index 81f6bb84a09..53180059878 100644 --- a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts +++ b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts @@ -32,6 +32,9 @@ import { TriggerAction } from 'vs/platform/quickinput/browser/pickerQuickAccess' import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { stripIcons } from 'vs/base/common/iconLabels'; import { isFirefox } from 'vs/base/browser/browser'; +import { IProductService } from 'vs/platform/product/common/productService'; + +const SUGGEST_COMMANDS_ID = 'workbench.commandPalette.experimental.suggestCommands'; export class CommandsQuickAccessProvider extends AbstractEditorCommandsQuickAccessProvider { @@ -66,14 +69,30 @@ export class CommandsQuickAccessProvider extends AbstractEditorCommandsQuickAcce @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IPreferencesService private readonly preferencesService: IPreferencesService, + @IProductService productService: IProductService ) { + const suggestCommands = configurationService.getValue('workbench.commandPalette.experimental.suggestCommands'); + const suggestedCommandIds = suggestCommands && productService.commandPaletteSuggestedCommandIds?.length + ? new Set(productService.commandPaletteSuggestedCommandIds) + : undefined; super({ + suggestedCommandIds, showAlias: !Language.isDefaultVariant(), noResultsPick: { label: localize('noCommandResults', "No matching commands"), commandId: '' } }, instantiationService, keybindingService, commandService, telemetryService, dialogService); + + this._register(configurationService.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration(SUGGEST_COMMANDS_ID)) { + const suggestCommands = configurationService.getValue('workbench.commandPalette.experimental.suggestCommands'); + const suggestedCommandIds = suggestCommands && productService.commandPaletteSuggestedCommandIds?.length + ? new Set(productService.commandPaletteSuggestedCommandIds) + : undefined; + this.options.suggestedCommandIds = suggestedCommandIds; + } + })); } private get configuration() {