From c361c4a31c591984f33b502107befff6e5f68f6a Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 18 Jun 2018 17:41:38 +0200 Subject: [PATCH] Back button constant (#49340) --- .../platform/quickinput/common/quickInput.ts | 4 ++ src/vs/vscode.proposed.d.ts | 6 ++- .../electron-browser/mainThreadQuickOpen.ts | 18 ++++++--- src/vs/workbench/api/node/extHost.api.impl.ts | 5 +++ src/vs/workbench/api/node/extHostQuickOpen.ts | 9 ++++- .../parts/quickinput/media/dark/back.svg | 1 + .../parts/quickinput/media/light/back.svg | 1 + .../quickinput/quickInput.contribution.ts | 10 ++++- .../browser/parts/quickinput/quickInput.ts | 39 +++++++++++++++++++ 9 files changed, 82 insertions(+), 11 deletions(-) create mode 100755 src/vs/workbench/browser/parts/quickinput/media/dark/back.svg create mode 100755 src/vs/workbench/browser/parts/quickinput/media/light/back.svg diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index acfda318d5e..ae0f47d225f 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -184,6 +184,8 @@ export interface IQuickInputService { */ input(options?: IInputOptions, token?: CancellationToken): TPromise; + backButton: IQuickInputButton; + createQuickPick(): IQuickPick; createInputBox(): IInputBox; @@ -195,5 +197,7 @@ export interface IQuickInputService { accept(): TPromise; + back(): TPromise; + cancel(): TPromise; } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 44c776e8f4e..69c74a17ebb 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -523,6 +523,8 @@ declare module 'vscode' { export namespace window { + export const quickInputBackButton: QuickInputButton; + /** * Implementation incomplete. See #49340. */ @@ -610,8 +612,8 @@ declare module 'vscode' { } export interface QuickInputButton { - iconPath: string | Uri | { light: string | Uri; dark: string | Uri } | ThemeIcon; - tooltip?: string | undefined; + readonly iconPath: string | Uri | { light: string | Uri; dark: string | Uri } | ThemeIcon; + readonly tooltip?: string | undefined; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts index 0430d5a27db..1afbe3b936e 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts @@ -170,14 +170,20 @@ export class MainThreadQuickOpen implements MainThreadQuickOpenShape { session.hide(); } } else if (param === 'buttons') { - params.buttons.forEach(button => { - const iconPath = button.iconPath; - iconPath.dark = URI.revive(iconPath.dark); - if (iconPath.light) { - iconPath.light = URI.revive(iconPath.light); + session[param] = params.buttons.map(button => { + if (button.handle === -1) { + return this._quickInputService.backButton; } + const { iconPath, tooltip, handle } = button; + return { + iconPath: { + dark: URI.revive(iconPath.dark), + light: iconPath.light && URI.revive(iconPath.light) + }, + tooltip, + handle + }; }); - session[param] = params[param]; } else { session[param] = params[param]; } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 64c5d869756..5bf7319a832 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -455,6 +455,11 @@ export function createApiFactory( registerProtocolHandler: proposedApiFunction(extension, (handler: vscode.ProtocolHandler) => { return extHostUrls.registerProtocolHandler(extension.id, handler); }), + get quickInputBackButton() { + return proposedApiFunction(extension, (): vscode.QuickInputButton => { + return extHostQuickOpen.backButton; + })(); + }, createQuickPick: proposedApiFunction(extension, (): vscode.QuickPick => { return extHostQuickOpen.createQuickPick(extension.id); }), diff --git a/src/vs/workbench/api/node/extHostQuickOpen.ts b/src/vs/workbench/api/node/extHostQuickOpen.ts index a3445ad1239..b7fd0b53aa0 100644 --- a/src/vs/workbench/api/node/extHostQuickOpen.ts +++ b/src/vs/workbench/api/node/extHostQuickOpen.ts @@ -16,6 +16,8 @@ import { ExtHostQuickOpenShape, IMainContext, MainContext, MainThreadQuickOpenSh import URI from 'vs/base/common/uri'; import { ThemeIcon } from 'vs/workbench/api/node/extHostTypes'; +const backButton: QuickInputButton = { iconPath: 'back.svg' }; + export type Item = string | QuickPickItem; export class ExtHostQuickOpen implements ExtHostQuickOpenShape { @@ -151,6 +153,8 @@ export class ExtHostQuickOpen implements ExtHostQuickOpenShape { // ---- QuickInput + backButton = backButton; + createQuickPick(extensionId: string): QuickPick { const session = new ExtHostQuickPick(this._proxy, extensionId, () => this._sessions.delete(session._id)); this._sessions.set(session._id, session); @@ -324,13 +328,14 @@ class ExtHostQuickInput implements QuickInput { this._buttons = buttons; this._handlesToButtons.clear(); buttons.forEach((button, i) => { - this._handlesToButtons.set(i, button); + const handle = button === backButton ? -1 : i; + this._handlesToButtons.set(handle, button); }); this.update({ buttons: buttons.map((button, i) => ({ iconPath: getIconUris(button.iconPath), tooltip: button.tooltip, - handle: i, + handle: button === backButton ? -1 : i, })) }); } diff --git a/src/vs/workbench/browser/parts/quickinput/media/dark/back.svg b/src/vs/workbench/browser/parts/quickinput/media/dark/back.svg new file mode 100755 index 00000000000..c5c4f472b4d --- /dev/null +++ b/src/vs/workbench/browser/parts/quickinput/media/dark/back.svg @@ -0,0 +1 @@ +CollapseChevronLeft_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/quickinput/media/light/back.svg b/src/vs/workbench/browser/parts/quickinput/media/light/back.svg new file mode 100755 index 00000000000..324ab15b1ec --- /dev/null +++ b/src/vs/workbench/browser/parts/quickinput/media/light/back.svg @@ -0,0 +1 @@ +CollapseChevronLeft_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.contribution.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.contribution.ts index 5aea4a4cfce..cc7fb7c7577 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.contribution.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.contribution.ts @@ -4,7 +4,15 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { QuickPickManyToggle } from 'vs/workbench/browser/parts/quickinput/quickInput'; +import { QuickPickManyToggle, BackAction } from 'vs/workbench/browser/parts/quickinput/quickInput'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { inQuickOpenContext } from 'vs/workbench/browser/parts/quickopen/quickopen'; KeybindingsRegistry.registerCommandAndKeybindingRule(QuickPickManyToggle); + +const registry = Registry.as(ActionExtensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(BackAction, BackAction.ID, BackAction.LABEL, { primary: null, win: { primary: KeyMod.Alt | KeyCode.LeftArrow }, mac: { primary: KeyMod.WinCtrl | KeyCode.US_MINUS }, linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.US_MINUS } }, inQuickOpenContext, KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Back'); diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 9ba6faf423c..83529563f38 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -54,6 +54,7 @@ interface QuickInputUI { progressBar: ProgressBar; list: QuickInputList; onDidAccept: Event; + onDidTriggerButton: Event; ignoreFocusOut: boolean; show(controller: QuickInput): void; setVisibilities(visibilities: Visibilities): void; @@ -166,6 +167,13 @@ class QuickInput implements IQuickInput { if (this.visible) { return; } + this.disposables.push( + this.ui.onDidTriggerButton(button => { + if (this.buttons.indexOf(button) !== -1) { + this.onDidTriggerButtonEmitter.fire(button); + } + }), + ); this.ui.show(this); this.visible = true; this.update(); @@ -642,6 +650,7 @@ export class QuickInputService extends Component implements IQuickInputService { private inQuickOpenWidgets: Record = {}; private inQuickOpenContext: IContextKey; private onDidAcceptEmitter = new Emitter(); + private onDidTriggerButtonEmitter = new Emitter(); private controller: QuickInput; @@ -806,6 +815,7 @@ export class QuickInputService extends Component implements IQuickInputService { progressBar, list, onDidAccept: this.onDidAcceptEmitter.event, + onDidTriggerButton: this.onDidTriggerButtonEmitter.event, ignoreFocusOut: false, show: controller => this.show(controller), hide: () => this.hide(), @@ -928,6 +938,15 @@ export class QuickInputService extends Component implements IQuickInputService { }); } + backButton = { + iconPath: { + dark: URI.parse(require.toUrl('vs/workbench/browser/parts/quickinput/media/dark/back.svg')), + light: URI.parse(require.toUrl('vs/workbench/browser/parts/quickinput/media/light/back.svg')) + }, + tooltip: localize('quickInput.back', "Back"), + handle: -1 // TODO + }; + createQuickPick(): IQuickPick { this.create(); return new QuickPick(this.ui); @@ -1034,6 +1053,11 @@ export class QuickInputService extends Component implements IQuickInputService { return TPromise.as(undefined); } + back() { + this.onDidTriggerButtonEmitter.fire(this.backButton); + return TPromise.as(undefined); + } + cancel() { this.hide(); return TPromise.as(undefined); @@ -1111,3 +1135,18 @@ export const QuickPickManyToggle: ICommandAndKeybindingRule = { quickInputService.toggle(); } }; + +export class BackAction extends Action { + + public static readonly ID = 'workbench.action.quickInputBack'; + public static readonly LABEL = localize('back', "Back"); + + constructor(id: string, label: string, @IQuickInputService private quickInputService: IQuickInputService) { + super(id, label); + } + + public run(): TPromise { + this.quickInputService.back(); + return TPromise.as(null); + } +} -- GitLab