diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 0fc2fd42342d2330638baace7e49e1b87fd4d711..2382e8f95347f2597e5c64b4985904d77f51e412 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -242,6 +242,11 @@ export class ActivitybarPart extends Part { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + public dispose(): void { if (this.compositeBar) { this.compositeBar.dispose(); diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 682931b6b8f4e07135fe2459dee1988f9ff1a761..19b667d8cebd9c565690fa802a7d14072ffa49e2 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -34,6 +34,11 @@ export interface ICompositeBarOptions { hidePart: () => TPromise; } +interface CompositeState { + id: string; + pinned: boolean; +} + export class CompositeBar implements ICompositeBar { private readonly _onDidContextMenu: Emitter; @@ -50,6 +55,7 @@ export class CompositeBar implements ICompositeBar { private compositeIdToActivityStack: { [compositeId: string]: ICompositeActivity[]; }; private compositeSizeInBar: Map; + private initialCompositesStates: CompositeState[]; private pinnedComposites: string[]; private activeCompositeId: string; private activeUnpinnedCompositeId: string; @@ -66,31 +72,35 @@ export class CompositeBar implements ICompositeBar { this.compositeSizeInBar = new Map(); this._onDidContextMenu = new Emitter(); - - const pinnedComposites = JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, null)) as string[]; - if (pinnedComposites) { - const compositeIds = this.options.composites.map(c => c.id); - this.pinnedComposites = pinnedComposites.filter(pcid => compositeIds.indexOf(pcid) >= 0); - } else { - this.pinnedComposites = this.options.composites.map(c => c.id); - } + this.initialCompositesStates = this.loadCompositesStates(); + this.pinnedComposites = this.initialCompositesStates + .filter(c => c.pinned) + .map(c => c.id) + .filter(id => this.options.composites.some(c => c.id === id)); } public get onDidContextMenu(): Event { return this._onDidContextMenu.event; } - public addComposite(compositeData: { id: string; name: string, order: number }, pin: boolean): void { + public addComposite(compositeData: { id: string; name: string, order: number }, activate: boolean): void { if (this.options.composites.filter(c => c.id === compositeData.id).length) { return; } - let i = 0; - while (i < this.options.composites.length && this.options.composites[i].order < compositeData.order) { - i++; - } this.options.composites.push(compositeData); - if (pin) { - this.pin(compositeData.id, true, i); + + const compositeState = this.initialCompositesStates.filter(c => c.id === compositeData.id)[0]; + if (!compositeState /* new composites are pinned by default */ || compositeState.pinned) { + let index; + if (compositeState) { + index = this.initialCompositesStates.indexOf(compositeState); + } else { + index = 0; + while (index < this.options.composites.length && this.options.composites[index].order < compositeData.order) { + index++; + } + } + this.pin(compositeData.id, true, index, activate); } } @@ -437,19 +447,20 @@ export class CompositeBar implements ICompositeBar { }); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public isPinned(compositeId: string): boolean { return this.pinnedComposites.indexOf(compositeId) >= 0; } - public pin(compositeId: string, update = true, index = this.pinnedComposites.length): void { + public pin(compositeId: string, update = true, index = this.pinnedComposites.length, activate: boolean = true): void { if (this.isPinned(compositeId)) { return; } - this.options.openComposite(compositeId).then(() => { + const activatePromise = activate ? this.options.openComposite(compositeId) : TPromise.as(null); + activatePromise.then(() => { this.pinnedComposites.splice(index, 0, compositeId); this.pinnedComposites = arrays.distinct(this.pinnedComposites); @@ -458,7 +469,7 @@ export class CompositeBar implements ICompositeBar { } // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); }); } @@ -490,7 +501,7 @@ export class CompositeBar implements ICompositeBar { }, 0); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public layout(dimension: Dimension): void { @@ -514,8 +525,30 @@ export class CompositeBar implements ICompositeBar { this.updateCompositeSwitcher(); } - private savePinnedComposites(): void { - this.storageService.store(this.options.storageId, JSON.stringify(this.pinnedComposites), StorageScope.GLOBAL); + private loadCompositesStates(): CompositeState[] { + const storedStates = >JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, '[]')); + const compositeStates = storedStates.map(c => + typeof c === 'string' /* migration from pinned states to composites states */ ? { id: c, pinned: true } : c); + + const newComposites = this.options.composites.filter(c => compositeStates.every(s => s.id !== c.id)); + newComposites.sort((c1, c2) => c1.order < c2.order ? -1 : 1); + newComposites.forEach(c => compositeStates.push({ id: c.id, pinned: true /* new composites are pinned by default */ })); + + return compositeStates; + } + + private saveCompositesStates(): void { + const toSave = this.pinnedComposites.map(id => ({ id, pinned: true })); + for (const composite of this.options.composites) { + if (this.pinnedComposites.indexOf(composite.id) === -1) { // Unpinned composites + toSave.push({ id: composite.id, pinned: false }); + } + } + this.storageService.store(this.options.storageId, JSON.stringify(toSave), StorageScope.GLOBAL); + } + + public shutdown(): void { + this.saveCompositesStates(); } public dispose(): void { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 747f4c56d684cb4c08cfae055414c581da3def0b..d339b0cfe04a18464aa673eee0adf62a49fb43a1 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -243,6 +243,11 @@ export class PanelPart extends CompositePart implements IPanelService { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + private layoutCompositeBar(): void { if (this.dimension) { let availableWidth = this.dimension.width - 40; // take padding into account