diff --git a/packages/scm/src/browser/scm-contribution.ts b/packages/scm/src/browser/scm-contribution.ts index 8095d16743c68..b50cff2561769 100644 --- a/packages/scm/src/browser/scm-contribution.ts +++ b/packages/scm/src/browser/scm-contribution.ts @@ -67,6 +67,13 @@ export namespace SCM_COMMANDS { iconClass: 'codicon codicon-list-flat', label: 'Toggle to List View', }; + export const COLLAPSE_ALL = { + id: 'scm.collapseAll', + category: 'SCM', + tooltip: 'Collapse All', + iconClass: 'codicon codicon-collapse-all', + label: 'Collapse All', + }; } export namespace ScmColors { @@ -181,6 +188,27 @@ export class ScmContribution extends AbstractViewContribution impleme }; registerToggleViewItem(SCM_COMMANDS.TREE_VIEW_MODE, 'tree'); registerToggleViewItem(SCM_COMMANDS.LIST_VIEW_MODE, 'list'); + + this.commandRegistry.registerCommand(SCM_COMMANDS.COLLAPSE_ALL, { + execute: widget => { + const scmWidget = extractScmWidget(widget); + if (scmWidget && scmWidget.viewMode === 'tree') { + scmWidget.collapseScmTree(); + } + }, + isVisible: widget => { + const scmWidget = extractScmWidget(widget); + if (scmWidget) { + return !!this.scmService.selectedRepository && scmWidget.viewMode === 'tree'; + } + return false; + } + }); + + registry.registerItem({ + ...SCM_COMMANDS.COLLAPSE_ALL, + command: SCM_COMMANDS.COLLAPSE_ALL.id + }); } registerKeybindings(keybindings: KeybindingRegistry): void { diff --git a/packages/scm/src/browser/scm-widget.tsx b/packages/scm/src/browser/scm-widget.tsx index 9c1a0f75fa0a8..6884c9788cac1 100644 --- a/packages/scm/src/browser/scm-widget.tsx +++ b/packages/scm/src/browser/scm-widget.tsx @@ -20,7 +20,7 @@ import { Message } from '@phosphor/messaging'; import { injectable, inject, postConstruct } from 'inversify'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { - BaseWidget, Widget, StatefulWidget, Panel, PanelLayout, MessageLoop, PreferenceChangeEvent + BaseWidget, Widget, StatefulWidget, Panel, PanelLayout, MessageLoop, PreferenceChangeEvent, CompositeTreeNode, SelectableTreeNode, } from '@theia/core/lib/browser'; import { ScmCommitWidget } from './scm-commit-widget'; import { ScmAmendWidget } from './scm-amend-widget'; @@ -171,4 +171,22 @@ export class ScmWidget extends BaseWidget implements StatefulWidget { this.resourceWidget.restoreState(changesTreeState); } + collapseScmTree(): void { + const { model } = this.resourceWidget; + const root = model.root; + if (CompositeTreeNode.is(root)) { + root.children.map(group => { + if (CompositeTreeNode.is(group)) { + group.children.map(folderNode => { + if (CompositeTreeNode.is(folderNode)) { + model.collapseAll(folderNode); + } + if (SelectableTreeNode.isSelected(folderNode)) { + model.toggleNode(folderNode); + } + }); + } + }); + } + } }