diff --git a/extensions/git/package.json b/extensions/git/package.json index f2445eb3978..ccac6222db9 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -16,6 +16,7 @@ "contribMergeEditorMenus", "contribMultiDiffEditorMenus", "contribDiffEditorGutterToolBarMenus", + "contribSourceControlHistoryItemChangesMenu", "contribSourceControlHistoryItemGroupMenu", "contribSourceControlHistoryItemMenu", "contribSourceControlInputBoxMenu", @@ -1915,6 +1916,28 @@ "group": "1_modification@3" } ], + "scm/historyItemChanges/title": [ + { + "command": "git.fetchRef", + "group": "navigation@1", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote" + }, + { + "command": "git.pullRef", + "group": "navigation@2", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote" + }, + { + "command": "git.pushRef", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote", + "group": "navigation@3" + }, + { + "command": "git.publish", + "when": "scmProvider == git && !scmHistoryItemGroupHasRemote", + "group": "navigation@3" + } + ], "scm/incomingChanges": [ { "command": "git.fetchRef", diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index a3f677336d1..dd767bf8a07 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -118,6 +118,9 @@ const _allApiProposals = { contribShareMenu: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', }, + contribSourceControlHistoryItemChangesMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts', + }, contribSourceControlHistoryItemGroupMenu: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemGroupMenu.d.ts', }, diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 67564cd4aab..77d39d94f9d 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -96,7 +96,7 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { stripIcons } from 'vs/base/common/iconLabels'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { editorSelectionBackground, foreground, inputBackground, inputForeground, listActiveSelectionForeground, registerColor, selectionBackground, transparent } from 'vs/platform/theme/common/colorRegistry'; -import { IMenuWorkbenchToolBarOptions, MenuWorkbenchToolBar, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; +import { IMenuWorkbenchToolBarOptions, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { clamp, rot } from 'vs/base/common/numbers'; @@ -1201,7 +1201,9 @@ class HistoryItemChangeRenderer implements ICompressibleTreeRenderer { @@ -1226,31 +1228,46 @@ class SeparatorRenderer implements ICompressibleTreeRenderer('scm.experimental.showHistoryGraph') !== true) { - const toolBar = new MenuWorkbenchToolBar(append(element, $('.actions')), MenuId.SCMChangesSeparator, { moreIcon: Codicon.gear }, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); - disposables.add(toolBar); - } + const options = { moreIcon: this.configurationService.getValue('scm.experimental.showHistoryGraph') === true ? Codicon.more : Codicon.gear } satisfies IMenuWorkbenchToolBarOptions; + const toolBar = new WorkbenchToolBar(append(element, $('.actions')), options, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); + templateDisposables.add(toolBar); - return { label, disposables }; + return { label, toolBar, elementDisposables: new DisposableStore(), templateDisposables }; } renderElement(element: ITreeNode, index: number, templateData: SeparatorTemplate, height: number | undefined): void { + const currentHistoryItemGroup = element.element.repository.provider.historyProvider?.currentHistoryItemGroup; + + // Label templateData.label.setLabel(element.element.label, undefined, { title: element.element.ariaLabel }); + + // Toolbar + const contextKeyService = this.contextKeyService.createOverlay([ + ['scmHistoryItemGroupHasRemote', !!currentHistoryItemGroup?.remote], + ]); + const menu = this.menuService.createMenu(MenuId.SCMChangesSeparator, contextKeyService); + templateData.elementDisposables.add(connectPrimaryMenu(menu, (primary, secondary) => { + templateData.toolBar.setActions(primary, secondary, [MenuId.SCMChangesSeparator]); + })); } renderCompressedElements(node: ITreeNode, void>, index: number, templateData: SeparatorTemplate, height: number | undefined): void { throw new Error('Should never happen since node is incompressible'); } - disposeTemplate(templateData: SeparatorTemplate): void { - templateData.disposables.dispose(); + disposeElement(node: ITreeNode, index: number, templateData: SeparatorTemplate, height: number | undefined): void { + templateData.elementDisposables.clear(); } + disposeTemplate(templateData: SeparatorTemplate): void { + templateData.elementDisposables.dispose(); + templateData.templateDisposables.dispose(); + } } class ListDelegate implements IListVirtualDelegate { @@ -1672,14 +1689,16 @@ MenuRegistry.appendMenuItem(MenuId.SCMChangesSeparator, { title: localize('incomingChanges', "Show Incoming Changes"), submenu: MenuId.SCMIncomingChangesSetting, group: '1_incoming&outgoing', - order: 1 + order: 1, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); MenuRegistry.appendMenuItem(Menus.ChangesSettings, { title: localize('incomingChanges', "Show Incoming Changes"), submenu: MenuId.SCMIncomingChangesSetting, group: '1_incoming&outgoing', - order: 1 + order: 1, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); registerAction2(class extends SCMChangesSettingAction { @@ -1723,14 +1742,16 @@ MenuRegistry.appendMenuItem(MenuId.SCMChangesSeparator, { title: localize('outgoingChanges', "Show Outgoing Changes"), submenu: MenuId.SCMOutgoingChangesSetting, group: '1_incoming&outgoing', - order: 2 + order: 2, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); MenuRegistry.appendMenuItem(Menus.ChangesSettings, { title: localize('outgoingChanges', "Show Outgoing Changes"), submenu: MenuId.SCMOutgoingChangesSetting, group: '1_incoming&outgoing', - order: 2 + order: 2, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); registerAction2(class extends SCMChangesSettingAction { @@ -1781,8 +1802,16 @@ registerAction2(class extends Action2 { f1: false, toggled: ContextKeyExpr.equals('config.scm.showChangesSummary', true), menu: [ - { id: MenuId.SCMChangesSeparator, order: 3 }, - { id: Menus.ChangesSettings, order: 3 }, + { + id: MenuId.SCMChangesSeparator, + order: 3, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) + }, + { + id: Menus.ChangesSettings, + order: 3, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) + }, ] }); } diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 9e34f460806..17d4e15c4fa 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -169,6 +169,12 @@ const apiMenus: IAPIMenu[] = [ description: localize('menus.input', "The Source Control input box menu"), proposed: 'contribSourceControlInputBoxMenu' }, + { + key: 'scm/historyItemChanges/title', + id: MenuId.SCMChangesSeparator, + description: localize('menus.historyItemChanges', "The Source Control incoming/outgoing changes title menu"), + proposed: 'contribSourceControlHistoryItemChangesMenu' + }, { key: 'scm/incomingChanges', id: MenuId.SCMIncomingChanges, diff --git a/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts new file mode 100644 index 00000000000..a9d758fa24b --- /dev/null +++ b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.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/historyItemChanges/title`-menu contribution point +// https://github.com/microsoft/vscode/issues/201997