Merge pull request #39 from mathuo/38-remove-panels-cache-in-dockview

feat: remove panels caching layer
This commit is contained in:
mathuo 2022-03-17 19:40:03 +00:00 committed by GitHub
commit b14443c009
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 68 deletions

View File

@ -13,11 +13,12 @@
"forceConsistentCasingInFileNames": true,
"strict": true,
"lib": [
"ES2015",
"ES2016.Array.Include",
"ES2017.String",
"ES2018.Promise",
"DOM",
]
"ES2015",
"ES2016.Array.Include",
"ES2017.String",
"ES2018.Promise",
"ES2019",
"DOM",
]
}
}

View File

@ -13,11 +13,12 @@
"forceConsistentCasingInFileNames": true,
"strict": true,
"lib": [
"ES2015",
"ES2016.Array.Include",
"ES2017.String",
"ES2018.Promise",
"DOM",
]
"ES2015",
"ES2016.Array.Include",
"ES2017.String",
"ES2018.Promise",
"ES2019",
"DOM",
]
}
}

View File

@ -811,4 +811,31 @@ describe('dockviewComponent', () => {
disposable.dispose();
});
test('that removing a panel from a group reflects in the dockviewcomponent when searching for a panel', () => {
dockview.layout(500, 500);
const panel1 = dockview.addPanel({
id: 'panel1',
component: 'default',
});
const panel2 = dockview.addPanel({
id: 'panel2',
component: 'default',
});
expect(dockview.getGroupPanel('panel1')).toEqual(panel1);
expect(dockview.getGroupPanel('panel2')).toEqual(panel2);
panel1.group.model.removePanel(panel1);
expect(dockview.getGroupPanel('panel1')).toBeUndefined();
expect(dockview.getGroupPanel('panel2')).toEqual(panel2);
dockview.removePanel(panel2);
expect(dockview.getGroupPanel('panel1')).toBeUndefined();
expect(dockview.getGroupPanel('panel2')).toBeUndefined();
});
});

View File

@ -7,7 +7,7 @@ import { Position } from '../dnd/droptarget';
import { tail, sequenceEquals } from '../array';
import { GroupviewPanelState, IGroupPanel } from '../groupview/groupPanel';
import { DockviewGroupPanel } from './dockviewGroupPanel';
import { CompositeDisposable, IValueDisposable } from '../lifecycle';
import { CompositeDisposable } from '../lifecycle';
import { Event, Emitter } from '../events';
import { Watermark } from './components/watermark/watermark';
import {
@ -100,7 +100,6 @@ export interface IDockviewComponent extends IBaseGrid<GroupviewPanel> {
getGroupPanel: (id: string) => IGroupPanel | undefined;
fireMouseEvent(event: LayoutMouseEvent): void;
createWatermarkComponent(): IWatermarkRenderer;
// lifecycle
addEmptyGroup(options?: AddGroupOptions): void;
closeAllGroups(): void;
@ -123,7 +122,7 @@ export class DockviewComponent
extends BaseGrid<GroupviewPanel>
implements IDockviewComponent
{
private readonly _panels = new Map<string, IValueDisposable<IGroupPanel>>();
// private readonly _panels = new Map<string, IValueDisposable<IGroupPanel>>();
// events
private readonly _onTabInteractionEvent = new Emitter<LayoutMouseEvent>();
@ -156,11 +155,11 @@ export class DockviewComponent
private _options: DockviewComponentOptions;
get totalPanels(): number {
return this._panels.size;
return this.panels.length;
}
get panels(): IGroupPanel[] {
return Array.from(this._panels.values()).map((_) => _.value);
return this.groups.flatMap((group) => group.model.panels);
}
get deserializer(): IPanelDeserializer | undefined {
@ -252,7 +251,7 @@ export class DockviewComponent
}
getGroupPanel(id: string): IGroupPanel | undefined {
return this._panels.get(id)?.value;
return this.panels.find((panel) => panel.id === id);
}
setActivePanel(panel: IGroupPanel): void {
@ -313,35 +312,6 @@ export class DockviewComponent
}
}
private registerPanel(panel: IGroupPanel): void {
if (this._panels.has(panel.id)) {
throw new Error(`panel ${panel.id} already exists`);
}
this._panels.set(panel.id, {
value: panel,
disposable: {
dispose: () => {
/** noop */
},
},
});
}
private unregisterPanel(panel: IGroupPanel): void {
if (!this._panels.has(panel.id)) {
throw new Error(`panel ${panel.id} doesn't exist`);
}
const item = this._panels.get(panel.id);
if (item) {
item.disposable.dispose();
item.value.dispose();
}
this._panels.delete(panel.id);
}
/**
* Serialize the current state of the layout
*
@ -350,13 +320,10 @@ export class DockviewComponent
toJSON(): SerializedDockview {
const data = this.gridview.serialize();
const panels = Array.from(this._panels.values()).reduce(
(collection, panel) => {
collection[panel.value.id] = panel.value.toJSON();
return collection;
},
{} as { [key: string]: GroupviewPanelState }
);
const panels = this.panels.reduce((collection, panel) => {
collection[panel.id] = panel.toJSON();
return collection;
}, {} as { [key: string]: GroupviewPanelState });
return {
grid: data,
@ -368,11 +335,9 @@ export class DockviewComponent
fromJSON(data: SerializedDockview): void {
this.gridview.clear();
this._panels.forEach((panel) => {
panel.disposable.dispose();
panel.value.dispose();
this.panels.forEach((panel) => {
panel.dispose();
});
this._panels.clear();
this._groups.clear();
if (!this.deserializer) {
@ -393,9 +358,7 @@ export class DockviewComponent
new DefaultDeserializer(this, {
createPanel: (id) => {
const panelData = panels[id];
const panel = this.deserializer!.fromJSON(panelData);
this.registerPanel(panel);
return panel;
return this.deserializer!.fromJSON(panelData);
},
})
);
@ -474,7 +437,6 @@ export class DockviewComponent
}
removePanel(panel: IGroupPanel): void {
this.unregisterPanel(panel);
const group = panel.group;
if (!group) {
@ -508,9 +470,9 @@ export class DockviewComponent
const group = this.createGroup();
if (options) {
const referencePanel = this._panels.get(
options.referencePanel
)?.value;
const referencePanel = this.panels.find(
(panel) => panel.id === options.referencePanel
);
if (!referencePanel) {
throw new Error(
@ -568,7 +530,7 @@ export class DockviewComponent
if (!target || target === Position.Center) {
const groupItem: IGroupPanel | undefined =
sourceGroup?.model.removePanel(itemId) ||
this._panels.get(itemId)?.value;
this.panels.find((panel) => panel.id === itemId);
if (!groupItem) {
throw new Error(`No panel with id ${itemId}`);
@ -620,7 +582,7 @@ export class DockviewComponent
} else {
const groupItem: IGroupPanel | undefined =
sourceGroup?.model.removePanel(itemId) ||
this._panels.get(itemId)?.value;
this.panels.find((panel) => panel.id === itemId);
if (!groupItem) {
throw new Error(`No panel with id ${itemId}`);
@ -753,7 +715,6 @@ export class DockviewComponent
params: options?.params || {},
});
this.registerPanel(panel);
return panel;
}