From 4afb8f7f2bac5cdc9bf67707ded743eeef7fb02f Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 12 Oct 2023 17:09:06 +0200 Subject: [PATCH] SourceControl - `scm/inputBox` menu proposal (#195475) Initial implementation --- src/vs/platform/actions/common/actions.ts | 1 + .../workbench/contrib/scm/browser/media/scm.css | 8 ++++++++ src/vs/workbench/contrib/scm/browser/menus.ts | 10 ++++++++++ .../contrib/scm/browser/scmViewPane.ts | 17 +++++++++++++++-- src/vs/workbench/contrib/scm/common/scm.ts | 1 + .../actions/common/menusExtensionPoint.ts | 6 ++++++ .../extensions/common/extensionsApiProposals.ts | 1 + ...oposed.contribSourceControlInputBoxMenu.d.ts | 7 +++++++ 8 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 10a31c9853127..165a2ed363653 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -109,6 +109,7 @@ export class MenuId { static readonly SCMResourceFolderContext = new MenuId('SCMResourceFolderContext'); static readonly SCMResourceGroupContext = new MenuId('SCMResourceGroupContext'); static readonly SCMSourceControl = new MenuId('SCMSourceControl'); + static readonly SCMInputBox = new MenuId('SCMInputBox'); static readonly SCMTitle = new MenuId('SCMTitle'); static readonly SearchContext = new MenuId('SearchContext'); static readonly SearchActionMenu = new MenuId('SearchActionContext'); diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index f92c54db113ed..efd1ace9387e7 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -242,6 +242,14 @@ border-radius: 2px; } +.scm-view .scm-input .actions { + position: absolute; + top: 6px; + right: 20px; + border: 1px solid var(--vscode-toolbar-hoverBackground); + border-radius: 5px; +} + .scm-view .scm-editor-container .monaco-editor { border-radius: 2px; } diff --git a/src/vs/workbench/contrib/scm/browser/menus.ts b/src/vs/workbench/contrib/scm/browser/menus.ts index 9918414d4c0ba..d1bde83d780b2 100644 --- a/src/vs/workbench/contrib/scm/browser/menus.ts +++ b/src/vs/workbench/contrib/scm/browser/menus.ts @@ -161,6 +161,16 @@ export class SCMRepositoryMenus implements ISCMRepositoryMenus, IDisposable { return this._repositoryMenu; } + private _inputBoxMenu: IMenu | undefined; + get inputBoxMenu(): IMenu { + if (!this._inputBoxMenu) { + this._inputBoxMenu = this.menuService.createMenu(MenuId.SCMInputBox, this.contextKeyService); + this.disposables.add(this._inputBoxMenu); + } + + return this._inputBoxMenu; + } + private readonly disposables = new DisposableStore(); constructor( diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 9e3fbce5719fa..46151c7881d58 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -227,6 +227,7 @@ class SCMTreeDragAndDrop implements ITreeDragAndDrop { interface InputTemplate { readonly inputWidget: SCMInputWidget; inputWidgetHeight: number; + actionBar: ActionBar; readonly elementDisposables: DisposableStore; readonly templateDisposable: IDisposable; } @@ -246,7 +247,9 @@ class InputRenderer implements ICompressibleTreeRenderer void, + private actionViewItemProvider: IActionViewItemProvider, @IInstantiationService private instantiationService: IInstantiationService, + @ISCMViewService private scmViewService: ISCMViewService ) { } renderTemplate(container: HTMLElement): InputTemplate { @@ -261,7 +264,10 @@ class InputRenderer implements ICompressibleTreeRenderer, index: number, templateData: InputTemplate): void { @@ -314,6 +320,13 @@ class InputRenderer implements ICompressibleTreeRenderer templateData.inputWidget.layout(); templateData.elementDisposables.add(this.outerLayout.onDidChange(layoutEditor)); layoutEditor(); + + // Action bar + templateData.actionBar.clear(); + templateData.actionBar.context = input.repository.provider; + + const menus = this.scmViewService.menus.getRepositoryMenus(input.repository.provider); + templateData.elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.inputBoxMenu, templateData.actionBar)); } renderCompressedElements(): void { @@ -2348,7 +2361,7 @@ export class SCMViewPane extends ViewPane { this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.providerCountBadge'), this.disposables)(updateProviderCountVisibility)); updateProviderCountVisibility(); - this.inputRenderer = this.instantiationService.createInstance(InputRenderer, this.layoutCache, overflowWidgetsDomNode, (input, height) => this.tree.updateElementHeight(input, height)); + this.inputRenderer = this.instantiationService.createInstance(InputRenderer, this.layoutCache, overflowWidgetsDomNode, (input, height) => this.tree.updateElementHeight(input, height), getActionViewItemProvider(this.instantiationService)); const delegate = new ListDelegate(this.inputRenderer); this.actionButtonRenderer = this.instantiationService.createInstance(ActionButtonRenderer); diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index e7d39bfecbb2a..af7852084c7ef 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -172,6 +172,7 @@ export interface ISCMTitleMenu { export interface ISCMRepositoryMenus { readonly titleMenu: ISCMTitleMenu; readonly repositoryMenu: IMenu; + readonly inputBoxMenu: IMenu; getResourceGroupMenu(group: ISCMResourceGroup): IMenu; getResourceMenu(resource: ISCMResource): IMenu; getResourceFolderMenu(group: ISCMResourceGroup): IMenu; diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index bb1993e9d95ee..56609d8331feb 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -124,6 +124,12 @@ const apiMenus: IAPIMenu[] = [ id: MenuId.SCMSourceControl, description: localize('menus.scmSourceControl', "The Source Control menu") }, + { + key: 'scm/inputBox', + id: MenuId.SCMInputBox, + description: localize('menus.scmInputBox', "The Source Control input box menu"), + proposed: 'contribSourceControlInputBoxMenu' + }, { key: 'scm/resourceState/context', id: MenuId.SCMResourceContext, diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 4eba13aa59c82..3724be62923f9 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -30,6 +30,7 @@ export const allApiProposals = Object.freeze({ contribNotebookStaticPreloads: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribNotebookStaticPreloads.d.ts', contribRemoteHelp: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribRemoteHelp.d.ts', contribShareMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', + contribSourceControlInputBoxMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts', contribStatusBarItems: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribStatusBarItems.d.ts', contribViewsRemote: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsRemote.d.ts', contribViewsWelcome: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsWelcome.d.ts', diff --git a/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts b/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts new file mode 100644 index 0000000000000..4774bf46fef9c --- /dev/null +++ b/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts @@ -0,0 +1,7 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// empty placeholder declaration for the `scm/inputBox` menu contribution point +// https://github.com/microsoft/vscode/issues/195474