提交 40f2700e 编写于 作者: S Sandeep Somavarapu

- Store all current composites with pinned state

- Retain the composites states
- Compute pinned composites from loaded composite states and  current composites
- Store on shutdown
- Parameter in add api to activate the added composite
- Pin the added composite at currect location
上级 f60e0f91
......@@ -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();
......
......@@ -34,6 +34,11 @@ export interface ICompositeBarOptions {
hidePart: () => TPromise<any>;
}
interface CompositeState {
id: string;
pinned: boolean;
}
export class CompositeBar implements ICompositeBar {
private readonly _onDidContextMenu: Emitter<MouseEvent>;
......@@ -50,6 +55,7 @@ export class CompositeBar implements ICompositeBar {
private compositeIdToActivityStack: { [compositeId: string]: ICompositeActivity[]; };
private compositeSizeInBar: Map<string, number>;
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<string, number>();
this._onDidContextMenu = new Emitter<MouseEvent>();
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<MouseEvent> {
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 = <Array<string | CompositeState>>JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, '[]'));
const compositeStates = <CompositeState[]>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 => (<CompositeState>{ 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 {
......
......@@ -243,6 +243,11 @@ export class PanelPart extends CompositePart<Panel> 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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册