Skip to content

Commit 4bd4261

Browse files
committed
fix scm menus
1 parent ab94d9b commit 4bd4261

3 files changed

Lines changed: 49 additions & 23 deletions

File tree

src/vs/workbench/contrib/scm/browser/menus.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1010
import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions';
1111
import { IAction } from 'vs/base/common/actions';
1212
import { createAndFillInContextMenuActions, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
13-
import { ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/contrib/scm/common/scm';
13+
import { ISCMResource, ISCMResourceGroup, ISCMProvider } from 'vs/workbench/contrib/scm/common/scm';
1414
import { isSCMResource } from './util';
1515
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
1616
import { equals } from 'vs/base/common/arrays';
1717
import { ISplice } from 'vs/base/common/sequence';
18+
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
19+
import { memoize } from 'vs/base/common/decorators';
1820

1921
function actionEquals(a: IAction, b: IAction): boolean {
2022
return a.id === b.id;
@@ -35,7 +37,7 @@ export function getSCMResourceContextKey(resource: ISCMResourceGroup | ISCMResou
3537
return isSCMResource(resource) ? resource.resourceGroup.id : resource.id;
3638
}
3739

38-
export class SCMMenus implements IDisposable {
40+
export class SCMRepositoryMenus implements IDisposable {
3941

4042
private contextKeyService: IContextKeyService;
4143
private titleMenu: IMenu;
@@ -183,3 +185,26 @@ export class SCMMenus implements IDisposable {
183185
this.resourceGroupMenuEntries.forEach(e => e.disposable.dispose());
184186
}
185187
}
188+
189+
export class SCMMenus {
190+
191+
private menus = new WeakMap<ISCMProvider, SCMRepositoryMenus>();
192+
193+
constructor(@IInstantiationService private instantiationService: IInstantiationService) { }
194+
195+
@memoize
196+
getDefaultMenus(): SCMRepositoryMenus {
197+
return this.instantiationService.createInstance(SCMRepositoryMenus, undefined);
198+
}
199+
200+
getRepositoryMenus(provider: ISCMProvider): SCMRepositoryMenus {
201+
let result = this.menus.get(provider);
202+
203+
if (!result) {
204+
result = this.instantiationService.createInstance(SCMRepositoryMenus, provider);
205+
this.menus.set(provider, result);
206+
}
207+
208+
return result;
209+
}
210+
}

src/vs/workbench/contrib/scm/browser/scmViewPane.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { IDisposable, Disposable, DisposableStore, combinedDisposable, dispose }
1010
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer';
1111
import { append, $, addClass, toggleClass, removeClass, Dimension } from 'vs/base/browser/dom';
1212
import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list';
13-
import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMService, ISCMRepository, ISCMProvider, ISCMInput } from 'vs/workbench/contrib/scm/common/scm';
13+
import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMService, ISCMRepository, ISCMInput } from 'vs/workbench/contrib/scm/common/scm';
1414
import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels';
1515
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
1616
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
@@ -335,7 +335,7 @@ class ResourceGroupRenderer implements ICompressibleTreeRenderer<ISCMResourceGro
335335
constructor(
336336
private actionViewItemProvider: IActionViewItemProvider,
337337
private themeService: IThemeService,
338-
private menus: Map<ISCMProvider, SCMMenus>
338+
private menus: SCMMenus
339339
) { }
340340

341341
renderTemplate(container: HTMLElement): ResourceGroupTemplate {
@@ -365,7 +365,7 @@ class ResourceGroupRenderer implements ICompressibleTreeRenderer<ISCMResourceGro
365365
template.count.setCount(group.elements.length);
366366

367367
const disposables = new DisposableStore();
368-
const menus = this.menus.get(group.provider)!;
368+
const menus = this.menus.getRepositoryMenus(group.provider);
369369
disposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceGroupMenu(group), template.actionBar));
370370

371371
template.elementDisposables = disposables;
@@ -425,7 +425,7 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
425425
private actionViewItemProvider: IActionViewItemProvider,
426426
private actionRunner: ActionRunner,
427427
private themeService: IThemeService,
428-
private menus: Map<ISCMProvider, SCMMenus>
428+
private menus: SCMMenus
429429
) { }
430430

431431
renderTemplate(container: HTMLElement): ResourceTemplate {
@@ -471,18 +471,18 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
471471

472472
if (ResourceTree.isResourceNode(resourceOrFolder)) {
473473
if (resourceOrFolder.element) {
474-
const menus = this.menus.get(resourceOrFolder.element.resourceGroup.provider)!;
474+
const menus = this.menus.getRepositoryMenus(resourceOrFolder.element.resourceGroup.provider);
475475
elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceMenu(resourceOrFolder.element.resourceGroup), template.actionBar));
476476
toggleClass(template.name, 'strike-through', resourceOrFolder.element.decorations.strikeThrough);
477477
toggleClass(template.element, 'faded', resourceOrFolder.element.decorations.faded);
478478
} else {
479-
const menus = this.menus.get(resourceOrFolder.context.provider)!;
479+
const menus = this.menus.getRepositoryMenus(resourceOrFolder.context.provider);
480480
elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceFolderMenu(resourceOrFolder.context), template.actionBar));
481481
removeClass(template.name, 'strike-through');
482482
removeClass(template.element, 'faded');
483483
}
484484
} else {
485-
const menus = this.menus.get(resourceOrFolder.resourceGroup.provider)!;
485+
const menus = this.menus.getRepositoryMenus(resourceOrFolder.resourceGroup.provider);
486486
elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceMenu(resourceOrFolder.resourceGroup), template.actionBar));
487487
toggleClass(template.name, 'strike-through', resourceOrFolder.decorations.strikeThrough);
488488
toggleClass(template.element, 'faded', resourceOrFolder.decorations.faded);
@@ -529,7 +529,7 @@ class ResourceRenderer implements ICompressibleTreeRenderer<ISCMResource | IReso
529529
template.actionBar.clear();
530530
template.actionBar.context = folder;
531531

532-
const menus = this.menus.get(folder.context.provider)!;
532+
const menus = this.menus.getRepositoryMenus(folder.context.provider);
533533
elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceFolderMenu(folder.context), template.actionBar));
534534

535535
removeClass(template.name, 'strike-through');
@@ -921,7 +921,9 @@ class ViewModel {
921921
}
922922

923923
private refresh(item?: IRepositoryItem | IGroupItem): void {
924-
if (item) {
924+
if (this.items.length === 1 && (!item || isRepositoryItem(item))) {
925+
this.tree.setChildren(null, this.render(this.items[0]).children);
926+
} else if (item) {
925927
this.tree.setChildren(item.element, this.render(item).children);
926928
} else {
927929
this.tree.setChildren(null, this.items.map(item => this.render(item)));
@@ -1363,7 +1365,7 @@ export class SCMViewPane extends ViewPane {
13631365
private tree!: WorkbenchCompressibleObjectTree<TreeElement, FuzzyScore>;
13641366
private viewModel!: ViewModel;
13651367
private listLabels!: ResourceLabels;
1366-
private menus = new Map<ISCMProvider, SCMMenus>();
1368+
private menus: SCMMenus;
13671369

13681370
constructor(
13691371
options: IViewPaneOptions,
@@ -1385,6 +1387,7 @@ export class SCMViewPane extends ViewPane {
13851387
@ITelemetryService telemetryService: ITelemetryService,
13861388
) {
13871389
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
1390+
this.menus = instantiationService.createInstance(SCMMenus);
13881391
this._register(Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository)(() => this._onDidChangeViewWelcomeState.fire()));
13891392
}
13901393

@@ -1453,9 +1456,6 @@ export class SCMViewPane extends ViewPane {
14531456
viewMode = storageMode;
14541457
}
14551458

1456-
this._register(this.scmService.onDidAddRepository(r => this.menus.set(r.provider, this.instantiationService.createInstance(SCMMenus, r.provider))));
1457-
this._register(this.scmService.onDidRemoveRepository(r => this.menus.delete(r.provider)));
1458-
14591459
const repositories = new SimpleSequence(this.scmService.repositories, this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository);
14601460
this._register(repositories);
14611461

@@ -1542,7 +1542,7 @@ export class SCMViewPane extends ViewPane {
15421542
// TODO@joao
15431543
getActions(): IAction[] {
15441544
return [];
1545-
// return this.menus.getTitleActions();
1545+
// return this.menus.getRepositoryMenusTitleActions(;
15461546
}
15471547

15481548
// TODO@joao
@@ -1552,7 +1552,7 @@ export class SCMViewPane extends ViewPane {
15521552
}
15531553

15541554
const result: IAction[] = [new SCMViewSubMenuAction(this.viewModel)];
1555-
// const secondaryActions = this.menus.getTitleSecondaryActions();
1555+
// const secondaryActions = this.menus.getRepositoryMenusTitleSecondaryActions(;
15561556

15571557
// if (secondaryActions.length > 0) {
15581558
// result.push(new Separator(), ...secondaryActions);
@@ -1603,18 +1603,18 @@ export class SCMViewPane extends ViewPane {
16031603
} else if (isSCMInput(element)) {
16041604
// TODO@joao
16051605
} else if (isSCMResourceGroup(element)) {
1606-
const menus = this.menus.get(element.provider)!;
1606+
const menus = this.menus.getRepositoryMenus(element.provider);
16071607
actions = menus.getResourceGroupContextActions(element);
16081608
} else if (ResourceTree.isResourceNode(element)) {
16091609
if (element.element) {
1610-
const menus = this.menus.get(element.element.resourceGroup.provider)!;
1610+
const menus = this.menus.getRepositoryMenus(element.element.resourceGroup.provider);
16111611
actions = menus.getResourceContextActions(element.element);
16121612
} else {
1613-
const menus = this.menus.get(element.context.provider)!;
1613+
const menus = this.menus.getRepositoryMenus(element.context.provider);
16141614
actions = menus.getResourceFolderContextActions(element.context);
16151615
}
16161616
} else {
1617-
const menus = this.menus.get(element.resourceGroup.provider)!;
1617+
const menus = this.menus.getRepositoryMenus(element.resourceGroup.provider);
16181618
actions = menus.getResourceContextActions(element);
16191619
}
16201620

src/vs/workbench/contrib/scm/browser/scmViewPaneContainer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ export class SCMViewPaneContainer extends ViewPaneContainer {
4646
) {
4747
super(VIEWLET_ID, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService);
4848

49-
this.menus = instantiationService.createInstance(SCMMenus, undefined);
50-
this._register(this.menus.onDidChangeTitle(this.updateTitleArea, this));
49+
this.menus = instantiationService.createInstance(SCMMenus);
50+
const menus = this.menus.getDefaultMenus();
51+
this._register(menus.onDidChangeTitle(this.updateTitleArea, this));
5152
}
5253

5354
create(parent: HTMLElement): void {

0 commit comments

Comments
 (0)