diff --git a/src/vs/platform/quickinput/browser/pickerQuickAccess.ts b/src/vs/platform/quickinput/browser/pickerQuickAccess.ts index 86160c9e26aa9..0613c557abcd7 100644 --- a/src/vs/platform/quickinput/browser/pickerQuickAccess.ts +++ b/src/vs/platform/quickinput/browser/pickerQuickAccess.ts @@ -326,6 +326,14 @@ export abstract class PickerQuickAccessProvider { + if (runOptions?.handleAccept) { + if (!event.inBackground) { + picker.hide(); // hide picker unless we accept in background + } + runOptions.handleAccept?.(picker.activeItems[0]); + return; + } + const [item] = picker.selectedItems; if (typeof item?.accept === 'function') { if (!event.inBackground) { diff --git a/src/vs/platform/quickinput/common/quickAccess.ts b/src/vs/platform/quickinput/common/quickAccess.ts index 23c80d0246d5c..4e6e3e4e6714d 100644 --- a/src/vs/platform/quickinput/common/quickAccess.ts +++ b/src/vs/platform/quickinput/common/quickAccess.ts @@ -16,6 +16,12 @@ import { Registry } from 'vs/platform/registry/common/platform'; export interface IQuickAccessProviderRunOptions { readonly from?: string; readonly placeholder?: string; + /** + * A handler to invoke when an item is accepted for + * this particular showing of the quick access. + * @param item The item that was accepted. + */ + readonly handleAccept?: (item: IQuickPickItem) => void; } /** @@ -54,7 +60,7 @@ export interface IQuickAccessOptions { /** * Provider specific options for this particular showing of the * quick access. - */ + */ readonly providerOptions?: IQuickAccessProviderRunOptions; /** @@ -65,7 +71,7 @@ export interface IQuickAccessOptions { /** * A placeholder to use for this particular showing of the quick access. - */ + */ readonly placeholder?: string; } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index a6516a796de2d..a60487b7169a7 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -13,7 +13,7 @@ import { localize, localize2 } from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { AnythingQuickAccessProviderRunOptions } from 'vs/platform/quickinput/common/quickAccess'; -import { IQuickInputService, QuickPickItem } from 'vs/platform/quickinput/common/quickInput'; +import { IQuickInputService, IQuickPickItem, QuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { CHAT_CATEGORY } from 'vs/workbench/contrib/chat/browser/actions/chatActions'; import { IChatWidget, IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat'; import { SelectAndInsertFileAction } from 'vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables'; @@ -56,10 +56,26 @@ class AttachContextAction extends Action2 { }); } + private _attachContext(widget: IChatWidget, ...picks: IQuickPickItem[]) { + widget?.attachContext(...picks.map((p) => ({ + fullName: p.label, + icon: 'icon' in p && ThemeIcon.isThemeIcon(p.icon) ? p.icon : undefined, + name: 'name' in p && typeof p.name === 'string' ? p.name : p.label, + value: 'resource' in p && URI.isUri(p.resource) ? p.resource : undefined, + id: 'id' in p && typeof p.id === 'string' ? p.id : + 'resource' in p && URI.isUri(p.resource) ? `${SelectAndInsertFileAction.Name}:${p.resource.toString()}` : '' + }))); + } + override async run(accessor: ServicesAccessor, ...args: any[]): Promise { const quickInputService = accessor.get(IQuickInputService); const chatVariablesService = accessor.get(IChatVariablesService); const widgetService = accessor.get(IChatWidgetService); + const context: { widget?: IChatWidget } | undefined = args[0]; + const widget = context?.widget ?? widgetService.lastFocusedWidget; + if (!widget) { + return; + } const quickPickItems: (QuickPickItem & { name?: string; icon?: ThemeIcon })[] = []; for (const variable of chatVariablesService.getVariables()) { @@ -72,10 +88,13 @@ class AttachContextAction extends Action2 { quickPickItems.push(SelectAndInsertFileAction.Item, { type: 'separator' }); } - const picks = await quickInputService.quickAccess.pick('', { + quickInputService.quickAccess.show('', { enabledProviderPrefixes: [AnythingQuickAccessProvider.PREFIX], placeholder: localize('chatContext.attach.placeholder', 'Search attachments'), providerOptions: { + handleAccept: (item: IQuickPickItem) => { + this._attachContext(widget, item); + }, additionPicks: quickPickItems, includeSymbols: false, filter: (item) => { @@ -87,18 +106,5 @@ class AttachContextAction extends Action2 { } }); - if (picks?.length) { - const context: { widget?: IChatWidget } | undefined = args[0]; - - const widget = context?.widget ?? widgetService.lastFocusedWidget; - widget?.attachContext(...picks.map((p) => ({ - fullName: p.label, - icon: 'icon' in p && ThemeIcon.isThemeIcon(p.icon) ? p.icon : undefined, - name: 'name' in p && typeof p.name === 'string' ? p.name : p.label, - value: 'resource' in p && URI.isUri(p.resource) ? p.resource : undefined, - id: 'id' in p && typeof p.id === 'string' ? p.id : - 'resource' in p && URI.isUri(p.resource) ? `${SelectAndInsertFileAction.Name}:${p.resource.toString()}` : '' - }))); - } } }