From b904d13d001c1325ce23b6ba814e116bd0c3f922 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 13 Jul 2016 16:44:21 +0200 Subject: [PATCH] allow to always show a pick entry even when the user searches (for #5073) --- .../parts/quickopen/quickOpenController.ts | 49 ++++++++++++++----- .../electron-browser/themes.contribution.ts | 1 + .../quickopen/common/quickOpenService.ts | 1 + 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 5882881fb94..5ed9caabbe5 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -289,13 +289,13 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Model let model = new QuickOpenModel(); - let entries = picks.map((e) => { + let entries = picks.map(e => { let entry = (e); if (entry.height && entry.render) { - return new PickOpenItem(entry.label, entry.description, entry.height, entry.render.bind(entry), () => progress(e)); + return new PickOpenItem(entry.label, entry.description, entry.height, entry.render.bind(entry), () => progress(e), entry.alwaysShow); } - return new PickOpenEntry(entry.label, entry.description, entry.detail, () => progress(e), entry.separator && entry.separator.border, entry.separator && entry.separator.label); + return new PickOpenEntry(entry.label, entry.description, entry.detail, () => progress(e), entry.separator && entry.separator.border, entry.separator && entry.separator.label, entry.alwaysShow); }); if (picks.length === 0) { @@ -346,7 +346,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Reset filtering if (!value) { - entries.forEach((e) => { + entries.forEach(e => { e.setHighlights(null); e.setHidden(false); }); @@ -354,12 +354,12 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Filter by value else { - entries.forEach((entry) => { + entries.forEach(entry => { let labelHighlights = filters.matchesFuzzy(value, entry.getLabel()); let descriptionHighlights = options.matchOnDescription && filters.matchesFuzzy(value, entry.getDescription()); let detailHighlights = options.matchOnDetail && entry.getDetail() && filters.matchesFuzzy(value, entry.getDetail()); - if (labelHighlights || descriptionHighlights || detailHighlights) { + if (entry.shouldAlwaysShow() || labelHighlights || descriptionHighlights || detailHighlights) { entry.setHighlights(labelHighlights, descriptionHighlights, detailHighlights); entry.setHidden(false); } else { @@ -441,7 +441,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe this.previousValue = prefix; - let promiseCompletedOnHide = new TPromise((c) => { + let promiseCompletedOnHide = new TPromise(c => { this.promisesToCompleteOnHide.push(c); }); @@ -660,13 +660,13 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Resolve all default handlers let resolvePromises: TPromise[] = []; - defaultHandlers.forEach((defaultHandler) => { + defaultHandlers.forEach(defaultHandler => { resolvePromises.push(this.resolveHandler(defaultHandler)); }); return TPromise.join(resolvePromises).then((resolvedHandlers: QuickOpenHandler[]) => { let resultPromises: TPromise[] = []; - resolvedHandlers.forEach((resolvedHandler) => { + resolvedHandlers.forEach(resolvedHandler => { // Return early if the handler can not run in the current environment let canRun = resolvedHandler.canRun(); @@ -675,7 +675,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe } // Receive Results from Handler and apply - resultPromises.push(resolvedHandler.getResults(value).then((result) => { + resultPromises.push(resolvedHandler.getResults(value).then(result => { if (this.currentResultToken === currentResultToken) { let handlerResults = result && result.entries; @@ -788,7 +788,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe } // Receive Results from Handler and apply - return resolvedHandler.getResults(value).then((result) => { + return resolvedHandler.getResults(value).then(result => { if (this.currentResultToken === currentResultToken) { if (!result || !result.entries.length) { const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(resolvedHandler.getEmptyLabel(value))]); @@ -891,7 +891,15 @@ class PickOpenEntry extends PlaceholderQuickOpenEntry { private description: string; private detail: string; - constructor(label: string, description?: string, detail?: string, private onPreview?: () => void, private hasSeparator?: boolean, private separatorLabel?: string) { + constructor( + label: string, + description?: string, + detail?: string, + private onPreview?: () => void, + private hasSeparator?: boolean, + private separatorLabel?: string, + private alwaysShow?: boolean + ) { super(label); this.description = description; @@ -918,6 +926,10 @@ class PickOpenEntry extends PlaceholderQuickOpenEntry { return this.separatorLabel; } + public shouldAlwaysShow(): boolean { + return this.alwaysShow; + } + public run(mode: Mode, context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { this._shouldRunWithContext = context; @@ -936,7 +948,14 @@ class PickOpenEntry extends PlaceholderQuickOpenEntry { class PickOpenItem extends QuickOpenEntryItem { private _shouldRunWithContext: IEntryRunContext; - constructor(private label: string, private description: string, private height: number, private renderFn: (tree: ITree, container: HTMLElement, previousCleanupFn: IElementCallback) => IElementCallback, private onPreview?: () => void) { + constructor( + private label: string, + private description: string, + private height: number, + private renderFn: (tree: ITree, container: HTMLElement, previousCleanupFn: IElementCallback) => IElementCallback, + private onPreview?: () => void, + private alwaysShow?: boolean + ) { super(); } @@ -960,6 +979,10 @@ class PickOpenItem extends QuickOpenEntryItem { return this.description; } + public shouldAlwaysShow(): boolean { + return this.alwaysShow; + } + public run(mode: Mode, context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { this._shouldRunWithContext = context; diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts index 72e01b0924f..53ac0a47f62 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts @@ -71,6 +71,7 @@ class SelectThemeAction extends Action { id: 'themes.findmore', label: localize('findMore', "Find more in the Marketplace..."), separator: { border: true }, + alwaysShow: true, run }); } diff --git a/src/vs/workbench/services/quickopen/common/quickOpenService.ts b/src/vs/workbench/services/quickopen/common/quickOpenService.ts index 1adade277c0..5bdda84a0ca 100644 --- a/src/vs/workbench/services/quickopen/common/quickOpenService.ts +++ b/src/vs/workbench/services/quickopen/common/quickOpenService.ts @@ -15,6 +15,7 @@ export interface IPickOpenEntry { description?: string; detail?: string; separator?: ISeparator; + alwaysShow?: boolean; run?: (context: IEntryRunContext) => void; }