From dcb1dd6804565fede0067e14e11cd7d2c251f9e5 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Wed, 29 May 2024 13:03:37 +0200 Subject: [PATCH] Fix quick pick separators from plugins --- .../src/main/browser/quick-open-main.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/plugin-ext/src/main/browser/quick-open-main.ts b/packages/plugin-ext/src/main/browser/quick-open-main.ts index 2a7f262bb66a1..39398d457438b 100644 --- a/packages/plugin-ext/src/main/browser/quick-open-main.ts +++ b/packages/plugin-ext/src/main/browser/quick-open-main.ts @@ -35,6 +35,7 @@ import { QuickInputButtonHandle, QuickInputService, QuickPickItem, + QuickPickItemOrSeparator, codiconArray } from '@theia/core/lib/browser'; import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable'; @@ -46,10 +47,11 @@ import { UriComponents } from '../../common/uri-components'; import { URI } from '@theia/core/shared/vscode-uri'; import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/base/common/themables'; import { isUriComponents } from '@theia/monaco-editor-core/esm/vs/base/common/uri'; +import { QuickPickSeparator } from '@theia/core'; export interface QuickInputSession { input: QuickInput; - handlesToItems: Map; + handlesToItems: Map; } interface IconPath { @@ -63,7 +65,7 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { private proxy: QuickOpenExt; private delegate: MonacoQuickInputService; private readonly items: Record = {}; @@ -80,7 +82,7 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { } async $show(instance: number, options: TransferQuickPickOptions, token: CancellationToken): Promise { - const contents = new Promise((resolve, reject) => { + const contents = new Promise((resolve, reject) => { this.items[instance] = { resolve, reject }; }); @@ -92,7 +94,7 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { this.proxy.$onItemSelected(Number.parseInt((el).id!)); } }, - activeItem: activeItem ? this.toQuickPickItem(activeItem) : undefined + activeItem: this.isItem(activeItem) ? this.toQuickPickItem(activeItem) : undefined }; const result = await this.delegate.pick(contents, transformedOptions, token); @@ -105,6 +107,10 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { return undefined; } + private isItem(item?: TransferQuickPickItem): item is TransferQuickPickItem & { kind: 'item' } { + return item?.kind === 'item'; + } + private normalizeIconPath(path: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon | undefined): { iconPath?: IconPath iconClasses?: string[] @@ -127,10 +133,17 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { } private toQuickPickItem(item: undefined): undefined; - private toQuickPickItem(item: TransferQuickPickItem): QuickPickItem; - private toQuickPickItem(item: TransferQuickPickItem | undefined): QuickPickItem | undefined { + private toQuickPickItem(item: TransferQuickPickItem & { kind: 'item' }): QuickPickItem; + private toQuickPickItem(item: TransferQuickPickItem & { kind: 'separator' }): QuickPickSeparator; + private toQuickPickItem(item: TransferQuickPickItem): QuickPickItemOrSeparator; + private toQuickPickItem(item: TransferQuickPickItem | undefined): QuickPickItemOrSeparator | undefined { if (!item) { return undefined; + } else if (item.kind === 'separator') { + return { + type: 'separator', + label: item.label + }; } return { ...this.normalizeIconPath(item.iconPath), @@ -309,7 +322,7 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { } } else if (param === 'items') { handlesToItems.clear(); - const items: QuickPickItem[] = []; + const items: QuickPickItemOrSeparator[] = []; params[param].forEach((transferItem: TransferQuickPickItem) => { const item = this.toQuickPickItem(transferItem); items.push(item);