From b3a8aa8598d0b0f959703024345c66045891d177 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 28 Oct 2019 21:34:11 +0100 Subject: [PATCH] [theme] Copy input from theme picker when no theme was found. Fixes #40518 --- .../themes/browser/themes.contribution.ts | 96 ++++++++++++------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts index e389c436f63..268b0fcda80 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts @@ -59,17 +59,10 @@ export class SelectColorThemeAction extends Action { } selectThemeTimeout = window.setTimeout(() => { selectThemeTimeout = undefined; - - let themeId = theme.id; - if (typeof theme.id === 'undefined') { // 'pick in marketplace' entry - if (applyTheme) { - openExtensionViewlet(this.viewletService, 'category:themes '); - } - themeId = currentTheme.id; - } + const themeId = theme && theme.id !== undefined ? theme.id : currentTheme.id; let target: ConfigurationTarget | undefined = undefined; if (applyTheme) { - let confValue = this.configurationService.inspect(COLOR_THEME_SETTING); + const confValue = this.configurationService.inspect(COLOR_THEME_SETTING); target = typeof confValue.workspace !== 'undefined' ? ConfigurationTarget.WORKSPACE : ConfigurationTarget.USER; } @@ -82,15 +75,35 @@ export class SelectColorThemeAction extends Action { }, applyTheme ? 0 : 200); }; - const placeHolder = localize('themes.selectTheme', "Select Color Theme (Up/Down Keys to Preview)"); - const autoFocusIndex = firstIndex(picks, p => isItem(p) && p.id === currentTheme.id); - const activeItem: ThemeItem = picks[autoFocusIndex] as ThemeItem; - - const chooseTheme = (theme: ThemeItem) => selectTheme(theme || currentTheme, true); - const tryTheme = (theme: ThemeItem) => selectTheme(theme, false); - - return this.quickInputService.pick(picks, { placeHolder, activeItem, onDidFocus: tryTheme }) - .then(chooseTheme); + return new Promise((s, _) => { + let isCompleted = false; + + const autoFocusIndex = firstIndex(picks, p => isItem(p) && p.id === currentTheme.id); + const quickpick = this.quickInputService.createQuickPick(); + quickpick.items = picks; + quickpick.placeholder = localize('themes.selectTheme', "Select Color Theme (Up/Down Keys to Preview)"); + quickpick.activeItems = [picks[autoFocusIndex] as ThemeItem]; + quickpick.canSelectMany = false; + quickpick.onDidAccept(_ => { + const theme = quickpick.activeItems[0]; + if (!theme || typeof theme.id === 'undefined') { // 'pick in marketplace' entry + openExtensionViewlet(this.viewletService, `category:themes ${quickpick.value}`); + } else { + selectTheme(theme, true); + } + isCompleted = true; + quickpick.hide(); + s(); + }); + quickpick.onDidChangeActive(themes => selectTheme(themes[0], false)); + quickpick.onDidHide(() => { + if (!isCompleted) { + selectTheme(currentTheme, true); + s(); + } + }); + quickpick.show(); + }); }); } } @@ -131,16 +144,10 @@ class SelectIconThemeAction extends Action { } selectThemeTimeout = window.setTimeout(() => { selectThemeTimeout = undefined; - let themeId = theme.id; - if (typeof theme.id === 'undefined') { // 'pick in marketplace' entry - if (applyTheme) { - openExtensionViewlet(this.viewletService, 'tag:icon-theme '); - } - themeId = currentTheme.id; - } + const themeId = theme && theme.id !== undefined ? theme.id : currentTheme.id; let target: ConfigurationTarget | undefined = undefined; if (applyTheme) { - let confValue = this.configurationService.inspect(ICON_THEME_SETTING); + const confValue = this.configurationService.inspect(ICON_THEME_SETTING); target = typeof confValue.workspace !== 'undefined' ? ConfigurationTarget.WORKSPACE : ConfigurationTarget.USER; } this.themeService.setFileIconTheme(themeId, target).then(undefined, @@ -152,14 +159,35 @@ class SelectIconThemeAction extends Action { }, applyTheme ? 0 : 200); }; - const placeHolder = localize('themes.selectIconTheme', "Select File Icon Theme"); - const autoFocusIndex = firstIndex(picks, p => isItem(p) && p.id === currentTheme.id); - const activeItem: ThemeItem = picks[autoFocusIndex] as ThemeItem; - const chooseTheme = (theme: ThemeItem) => selectTheme(theme || currentTheme, true); - const tryTheme = (theme: ThemeItem) => selectTheme(theme, false); - - return this.quickInputService.pick(picks, { placeHolder, activeItem, onDidFocus: tryTheme }) - .then(chooseTheme); + return new Promise((s, _) => { + let isCompleted = false; + + const autoFocusIndex = firstIndex(picks, p => isItem(p) && p.id === currentTheme.id); + const quickpick = this.quickInputService.createQuickPick(); + quickpick.items = picks; + quickpick.placeholder = localize('themes.selectIconTheme', "Select File Icon Theme"); + quickpick.activeItems = [picks[autoFocusIndex] as ThemeItem]; + quickpick.canSelectMany = false; + quickpick.onDidAccept(_ => { + const theme = quickpick.activeItems[0]; + if (!theme || typeof theme.id === 'undefined') { // 'pick in marketplace' entry + openExtensionViewlet(this.viewletService, `tag:icon-theme ${quickpick.value}`); + } else { + selectTheme(theme, true); + } + isCompleted = true; + quickpick.hide(); + s(); + }); + quickpick.onDidChangeActive(themes => selectTheme(themes[0], false)); + quickpick.onDidHide(() => { + if (!isCompleted) { + selectTheme(currentTheme, true); + s(); + } + }); + quickpick.show(); + }); }); } } -- GitLab