From 1611f01102d2841b665fb2d16727dfd48a2fc309 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 30 Oct 2019 17:20:48 +0100 Subject: [PATCH] Improve flickering when skipping task quick pick Fixes #83648 --- .../tasks/browser/abstractTaskService.ts | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 3cd2fae47a6..6730312bde9 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -2020,17 +2020,32 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return entries; } - private showQuickPick(tasks: Promise | Task[], placeHolder: string, defaultEntry?: TaskQuickPickEntry, group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, additionalEntries?: TaskQuickPickEntry[]): Promise { + private async showQuickPick(tasks: Promise | Task[], placeHolder: string, defaultEntry?: TaskQuickPickEntry, group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, additionalEntries?: TaskQuickPickEntry[]): Promise { const tokenSource = new CancellationTokenSource(); const cancellationToken: CancellationToken = tokenSource.token; - let _createEntries = (): Promise[]> => { + let _createEntries = new Promise[]>((resolve) => { if (Array.isArray(tasks)) { - return Promise.resolve(this.createTaskQuickPickEntries(tasks, group, sort, selectedEntry)); + resolve(this.createTaskQuickPickEntries(tasks, group, sort, selectedEntry)); } else { - return tasks.then((tasks) => this.createTaskQuickPickEntries(tasks, group, sort, selectedEntry)); + resolve(tasks.then((tasks) => this.createTaskQuickPickEntries(tasks, group, sort, selectedEntry))); } - }; - const pickEntries = _createEntries().then((entries) => { + }); + + const timeout: boolean = await Promise.race([new Promise(async (resolve) => { + await _createEntries; + resolve(false); + }), new Promise((resolve) => { + const timer = setTimeout(() => { + clearTimeout(timer); + resolve(true); + }, 200); + })]); + + if (!timeout && ((await _createEntries).length === 1) && this.configurationService.getValue(QUICKOPEN_SKIP_CONFIG)) { + return ((await _createEntries)[0]); + } + + const pickEntries = _createEntries.then((entries) => { if ((entries.length === 1) && this.configurationService.getValue(QUICKOPEN_SKIP_CONFIG)) { tokenSource.cancel(); } else if ((entries.length === 0) && defaultEntry) { @@ -2447,7 +2462,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } - private runConfigureTasks(): void { + private async runConfigureTasks(): Promise { if (!this.canRunCommand()) { return undefined; } @@ -2477,11 +2492,22 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return this.fileService.resolve(folder.toResource('.vscode/tasks.json')).then(stat => stat, () => undefined); }); + type EntryType = (IQuickPickItem & { task: Task; }) | (IQuickPickItem & { folder: IWorkspaceFolder; }); + function handleSelection(this: any, selection: EntryType) { + if (!selection) { + return; + } + if (isTaskEntry(selection)) { + configureTask(selection.task); + } else { + this.openTaskFile(selection.folder.toResource('.vscode/tasks.json')); + } + } + let createLabel = nls.localize('TaskService.createJsonFile', 'Create tasks.json file from template'); let openLabel = nls.localize('TaskService.openJsonFile', 'Open tasks.json file'); const tokenSource = new CancellationTokenSource(); const cancellationToken: CancellationToken = tokenSource.token; - type EntryType = (IQuickPickItem & { task: Task; }) | (IQuickPickItem & { folder: IWorkspaceFolder; }); let entries = Promise.all(stats).then((stats) => { return taskPromise.then((taskMap) => { let entries: QuickPickInput[] = []; @@ -2534,6 +2560,21 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }); }); + const timeout: boolean = await Promise.race([new Promise(async (resolve) => { + await entries; + resolve(false); + }), new Promise((resolve) => { + const timer = setTimeout(() => { + clearTimeout(timer); + resolve(true); + }, 200); + })]); + + if (!timeout && ((await entries).length === 1) && this.configurationService.getValue(QUICKOPEN_SKIP_CONFIG)) { + handleSelection(((await entries)[0])); + return; + } + this.quickInputService.pick(entries, { placeHolder: nls.localize('TaskService.pickTask', 'Select a task to configure') }, cancellationToken). then(async (selection) => { @@ -2544,14 +2585,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer selection = task; } } - if (!selection) { - return; - } - if (isTaskEntry(selection)) { - configureTask(selection.task); - } else { - this.openTaskFile(selection.folder.toResource('.vscode/tasks.json')); - } + handleSelection(selection); }); }