From aa00a4d022a99db0cc1ee3375d60a3953ae54303 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 23 Nov 2016 17:53:57 +0100 Subject: [PATCH] wip: show scm viewlet contents --- .../git/electron-browser/gitSCMProvider.ts | 21 +++++ .../workbench/parts/scm/browser/scmViewlet.ts | 78 ++++++++++++++----- src/vs/workbench/services/scm/common/scm.ts | 1 + 3 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/parts/git/electron-browser/gitSCMProvider.ts b/src/vs/workbench/parts/git/electron-browser/gitSCMProvider.ts index 8d6108dbb50..90be034a949 100644 --- a/src/vs/workbench/parts/git/electron-browser/gitSCMProvider.ts +++ b/src/vs/workbench/parts/git/electron-browser/gitSCMProvider.ts @@ -4,15 +4,36 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import { localize } from 'vs/nls'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; +import { ISCMResourceGroup } from 'vs/workbench/services/scm/common/scm'; import { SCMProvider } from 'vs/workbench/services/scm/common/scmProvider'; export class GitSCMProvider extends SCMProvider { + private mergeGroup: ISCMResourceGroup; + private indexGroup: ISCMResourceGroup; + private workingTreeGroup: ISCMResourceGroup; + constructor( ) { super('git', 'Git'); + + this.mergeGroup = this.createResourceGroup('merge', localize('conflict changes', "Conflict Changes")); + this.indexGroup = this.createResourceGroup('index', localize('staged changes', "Staged Changes")); + this.workingTreeGroup = this.createResourceGroup('workingtree', localize('changes', "Changes")); + + this.indexGroup.set( + { uri: URI.parse('file:///Users/joao/hello.ts') }, + { uri: URI.parse('file:///Users/joao/cool.ts') }, + { uri: URI.parse('file:///Users/joao/works.ts') } + ); + + this.workingTreeGroup.set( + { uri: URI.parse('file:///Users/joao/works.ts') }, + { uri: URI.parse('file:///Users/joao/monkey.ts') } + ); } commit(message: string): TPromise { diff --git a/src/vs/workbench/parts/scm/browser/scmViewlet.ts b/src/vs/workbench/parts/scm/browser/scmViewlet.ts index a5d52803628..a8b9249ca23 100644 --- a/src/vs/workbench/parts/scm/browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/browser/scmViewlet.ts @@ -15,41 +15,69 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; -import { ISCMService } from 'vs/workbench/services/scm/common/scm'; +import { ISCMService, ISCMResourceGroup, ISCMResource } from 'vs/workbench/services/scm/common/scm'; interface SearchInputEvent extends Event { target: HTMLInputElement; immediate?: boolean; } -type RendererType = any; -type RendererTemplateType = any; +interface ResourceGroupTemplate { + container: HTMLElement; +} -class Renderer implements IRenderer { +class ResourceGroupRenderer implements IRenderer { - templateId: string; - - renderTemplate(container: HTMLElement): RendererTemplateType { + static TEMPLATE_ID = 'resource group'; + get templateId(): string { return ResourceGroupRenderer.TEMPLATE_ID; } + renderTemplate(container: HTMLElement): ResourceGroupTemplate { + return { container }; } - renderElement(element: RendererType, index: number, templateData: RendererTemplateType): void { - + renderElement(group: ISCMResourceGroup, index: number, template: ResourceGroupTemplate): void { + template.container.textContent = group.label; } - disposeTemplate(templateData: RendererTemplateType): void { - + disposeTemplate(templateData: ResourceGroupTemplate): void { + // noop } } -class Delegate implements IDelegate { - getHeight() { return 62; } - getTemplateId() { return 'extension'; } +interface ResourceTemplate { + container: HTMLElement; +} + +class ResourceRenderer implements IRenderer { + + static TEMPLATE_ID = 'resource'; + get templateId(): string { return ResourceRenderer.TEMPLATE_ID; } + + renderTemplate(container: HTMLElement): ResourceTemplate { + return { container }; + } + + renderElement(resource: ISCMResource, index: number, template: ResourceTemplate): void { + template.container.textContent = resource.uri.fsPath; + } + + disposeTemplate(templateData: ResourceTemplate): void { + // noop + } +} + +class Delegate implements IDelegate { + + getHeight() { return 22; } + + getTemplateId(element: ISCMResourceGroup | ISCMResource) { + return (element as ISCMResource).uri ? ResourceRenderer.TEMPLATE_ID : ResourceGroupRenderer.TEMPLATE_ID; + } } export class SCMViewlet extends Viewlet { - private list: List; + private list: List; private disposables: IDisposable[] = []; constructor( @@ -57,8 +85,6 @@ export class SCMViewlet extends Viewlet { @ISCMService private scmService: ISCMService ) { super(VIEWLET_ID, telemetryService); - - console.log(scmService.activeProvider); } create(parent: Builder): TPromise { @@ -69,17 +95,31 @@ export class SCMViewlet extends Viewlet { const list = append(root, $('.scm-status')); const delegate = new Delegate(); - const renderer = new Renderer(); - this.list = new List(list, delegate, [renderer]); + + this.list = new List(list, delegate, [ + new ResourceGroupRenderer(), + new ResourceRenderer() + ]); + // chain(this.list.onSelectionChange) // .map(e => e.elements[0]) // .filter(e => !!e) // .on(this.openExtension, this, this.disposables); + this.update(); + return TPromise.as(null); } + private update(): void { + const provider = this.scmService.activeProvider; + const groups = provider.resourceGroups; + const elements = groups.reduce<(ISCMResourceGroup | ISCMResource)[]>((result, group) => [...result, group, ...group.get()], []); + + this.list.splice(0, this.list.length, ...elements); + } + layout({ height }: Dimension): void { this.list.layout(height); } diff --git a/src/vs/workbench/services/scm/common/scm.ts b/src/vs/workbench/services/scm/common/scm.ts index da449ee5b44..28dd1ec17e9 100644 --- a/src/vs/workbench/services/scm/common/scm.ts +++ b/src/vs/workbench/services/scm/common/scm.ts @@ -22,6 +22,7 @@ export interface ISCMResource { } export interface ISCMResourceGroup { + label: string; onChange: Event; set(...resources: ISCMResource[]): void; get(): ISCMResource[];