diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 7ab40cdb97aa4166c550dff936aafd49154a02f3..3806f25f5dda725e7aeb9c2a3752e637eecb2931 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -576,4 +576,14 @@ export interface ITerminalInstance { * Triggers a quick pick to rename this terminal. */ rename(): Promise; + + /** + * Triggers a quick pick to rename this terminal. + */ + changeIcon(): Promise; + + /** + * Allows the user to configure this terminal. + */ + configure(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 0ea82068505cb8b3e1ff02f5c8f1c90f8d240294..2986732e0bedf15c026d0eac7f7c52c939c18292 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -616,6 +616,34 @@ export function registerTerminalActions() { } } }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.CONFIGURE_ACTIVE, + title: { value: localize('workbench.action.terminal.configureActive', "Configure Active Terminal"), original: 'Configure Active Terminal' }, + f1: true, + category, + precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED + }); + } + async run(accessor: ServicesAccessor) { + return accessor.get(ITerminalService).getActiveInstance()?.configure(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.CHANGE_ICON, + title: { value: localize('workbench.action.terminal.changeIcon', "Change Icon"), original: 'Change Icon' }, + f1: true, + category, + precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED + }); + } + async run(accessor: ServicesAccessor) { + return accessor.get(ITerminalService).getActiveInstance()?.changeIcon(); + } + }); registerAction2(class extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 1c7fd85d6b999063368bf0b496b2a6975495974b..5f2d03c1842c4112d224ff3d7862dd3cb68ceb5e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -52,7 +52,7 @@ import { formatMessageForTerminal } from 'vs/workbench/contrib/terminal/common/t import { AutoOpenBarrier } from 'vs/base/common/async'; import { Codicon, iconRegistry } from 'vs/base/common/codicons'; import { ITerminalStatusList, TerminalStatus, TerminalStatusList } from 'vs/workbench/contrib/terminal/browser/terminalStatusList'; -import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { isMacintosh, isWindows, OperatingSystem, OS } from 'vs/base/common/platform'; @@ -1744,6 +1744,33 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this.setTitle(name, TitleEventSource.Api); } } + + public async changeIcon() { + const items: IQuickPickItem[] = []; + for (const icon of iconRegistry.all) { + items.push({ label: `$(${icon.id})`, description: `${icon.id}` }); + } + const result = await this._quickInputService.pick(items, { + title: nls.localize('changeTerminalIcon', "Change Icon"), + matchOnDescription: true + }); + if (result) { + this.shellLaunchConfig.icon = result.description; + this._onTitleChanged.fire(this); + } + } + + public async configure(): Promise { + const changeIcon: IQuickPickItem = { label: nls.localize('changeIconTerminal', 'Change Icon') }; + const rename: IQuickPickItem = { label: nls.localize('renameTerminal', 'Rename') }; + const result = await this._quickInputService.pick([changeIcon, rename], { + title: nls.localize('configureTerminalTitle', "Configure Terminal") + }); + switch (result) { + case changeIcon: return this.changeIcon(); + case rename: return this.rename(); + } + } } registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsWidget.ts index a28cb6f1b07c9cf7642c16a0f0d9b181b269bbe0..bf7afb733f21f0f06f790a1d678760a622340ee6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabsWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsWidget.ts @@ -222,12 +222,12 @@ class TerminalTabsRenderer implements ITreeRenderer instance.rename()); + const configure = new Action(TERMINAL_COMMAND_ID.CONFIGURE_ACTIVE, localize('terminal.configure', "Configure"), ThemeIcon.asClassName(Codicon.gear), true, () => instance.configure()); const split = new Action(TERMINAL_COMMAND_ID.SPLIT, localize('terminal.split', "Split"), ThemeIcon.asClassName(Codicon.splitHorizontal), true, async () => this._terminalService.splitInstance(instance)); const kill = new Action(TERMINAL_COMMAND_ID.KILL, localize('terminal.kill', "Kill"), ThemeIcon.asClassName(Codicon.trashcan), true, async () => instance.dispose(true)); // TODO: Cache these in a way that will use the correct instance template.actionBar.clear(); - template.actionBar.push(rename, { icon: true, label: false }); + template.actionBar.push(configure, { icon: true, label: false }); template.actionBar.push(split, { icon: true, label: false }); template.actionBar.push(kill, { icon: true, label: false }); } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 9e6408b37151a0bb10036604dfbd169ffaf85329..0cad4ab6435a0fc3b3a0ad74d422e2374a37dca2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -453,6 +453,8 @@ export const enum TERMINAL_COMMAND_ID { SCROLL_TO_TOP = 'workbench.action.terminal.scrollToTop', CLEAR = 'workbench.action.terminal.clear', CLEAR_SELECTION = 'workbench.action.terminal.clearSelection', + CONFIGURE_ACTIVE = 'workbench.action.terminal.configureActive', + CHANGE_ICON = 'workbench.action.terminal.changeIcon', RENAME = 'workbench.action.terminal.rename', RENAME_WITH_ARG = 'workbench.action.terminal.renameWithArg', FIND_FOCUS = 'workbench.action.terminal.focusFind',