mirror of
https://github.com/mathuo/dockview
synced 2025-02-02 14:35:46 +00:00
feat: remove panels caching layer
caching layer is not required, just read panels directly from the group models
This commit is contained in:
parent
8a9f00169e
commit
8484db6968
@ -811,4 +811,31 @@ describe('dockviewComponent', () => {
|
|||||||
|
|
||||||
disposable.dispose();
|
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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -7,7 +7,7 @@ import { Position } from '../dnd/droptarget';
|
|||||||
import { tail, sequenceEquals } from '../array';
|
import { tail, sequenceEquals } from '../array';
|
||||||
import { GroupviewPanelState, IGroupPanel } from '../groupview/groupPanel';
|
import { GroupviewPanelState, IGroupPanel } from '../groupview/groupPanel';
|
||||||
import { DockviewGroupPanel } from './dockviewGroupPanel';
|
import { DockviewGroupPanel } from './dockviewGroupPanel';
|
||||||
import { CompositeDisposable, IValueDisposable } from '../lifecycle';
|
import { CompositeDisposable } from '../lifecycle';
|
||||||
import { Event, Emitter } from '../events';
|
import { Event, Emitter } from '../events';
|
||||||
import { Watermark } from './components/watermark/watermark';
|
import { Watermark } from './components/watermark/watermark';
|
||||||
import {
|
import {
|
||||||
@ -100,7 +100,6 @@ export interface IDockviewComponent extends IBaseGrid<GroupviewPanel> {
|
|||||||
getGroupPanel: (id: string) => IGroupPanel | undefined;
|
getGroupPanel: (id: string) => IGroupPanel | undefined;
|
||||||
fireMouseEvent(event: LayoutMouseEvent): void;
|
fireMouseEvent(event: LayoutMouseEvent): void;
|
||||||
createWatermarkComponent(): IWatermarkRenderer;
|
createWatermarkComponent(): IWatermarkRenderer;
|
||||||
|
|
||||||
// lifecycle
|
// lifecycle
|
||||||
addEmptyGroup(options?: AddGroupOptions): void;
|
addEmptyGroup(options?: AddGroupOptions): void;
|
||||||
closeAllGroups(): void;
|
closeAllGroups(): void;
|
||||||
@ -119,7 +118,7 @@ export class DockviewComponent
|
|||||||
extends BaseGrid<GroupviewPanel>
|
extends BaseGrid<GroupviewPanel>
|
||||||
implements IDockviewComponent
|
implements IDockviewComponent
|
||||||
{
|
{
|
||||||
private readonly _panels = new Map<string, IValueDisposable<IGroupPanel>>();
|
// private readonly _panels = new Map<string, IValueDisposable<IGroupPanel>>();
|
||||||
|
|
||||||
// events
|
// events
|
||||||
private readonly _onTabInteractionEvent = new Emitter<LayoutMouseEvent>();
|
private readonly _onTabInteractionEvent = new Emitter<LayoutMouseEvent>();
|
||||||
@ -139,11 +138,11 @@ export class DockviewComponent
|
|||||||
private _options: DockviewComponentOptions;
|
private _options: DockviewComponentOptions;
|
||||||
|
|
||||||
get totalPanels(): number {
|
get totalPanels(): number {
|
||||||
return this._panels.size;
|
return this.panels.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
get panels(): IGroupPanel[] {
|
get panels(): IGroupPanel[] {
|
||||||
return Array.from(this._panels.values()).map((_) => _.value);
|
return this.groups.flatMap((group) => group.model.panels);
|
||||||
}
|
}
|
||||||
|
|
||||||
get deserializer(): IPanelDeserializer | undefined {
|
get deserializer(): IPanelDeserializer | undefined {
|
||||||
@ -235,7 +234,7 @@ export class DockviewComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
getGroupPanel(id: string): IGroupPanel | undefined {
|
getGroupPanel(id: string): IGroupPanel | undefined {
|
||||||
return this._panels.get(id)?.value;
|
return this.panels.find((panel) => panel.id === id);
|
||||||
}
|
}
|
||||||
|
|
||||||
setActivePanel(panel: IGroupPanel): void {
|
setActivePanel(panel: IGroupPanel): void {
|
||||||
@ -296,35 +295,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
|
* Serialize the current state of the layout
|
||||||
*
|
*
|
||||||
@ -333,13 +303,10 @@ export class DockviewComponent
|
|||||||
toJSON(): SerializedDockview {
|
toJSON(): SerializedDockview {
|
||||||
const data = this.gridview.serialize();
|
const data = this.gridview.serialize();
|
||||||
|
|
||||||
const panels = Array.from(this._panels.values()).reduce(
|
const panels = this.panels.reduce((collection, panel) => {
|
||||||
(collection, panel) => {
|
collection[panel.id] = panel.toJSON();
|
||||||
collection[panel.value.id] = panel.value.toJSON();
|
|
||||||
return collection;
|
return collection;
|
||||||
},
|
}, {} as { [key: string]: GroupviewPanelState });
|
||||||
{} as { [key: string]: GroupviewPanelState }
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
grid: data,
|
grid: data,
|
||||||
@ -351,11 +318,9 @@ export class DockviewComponent
|
|||||||
|
|
||||||
fromJSON(data: SerializedDockview): void {
|
fromJSON(data: SerializedDockview): void {
|
||||||
this.gridview.clear();
|
this.gridview.clear();
|
||||||
this._panels.forEach((panel) => {
|
this.panels.forEach((panel) => {
|
||||||
panel.disposable.dispose();
|
panel.dispose();
|
||||||
panel.value.dispose();
|
|
||||||
});
|
});
|
||||||
this._panels.clear();
|
|
||||||
this._groups.clear();
|
this._groups.clear();
|
||||||
|
|
||||||
if (!this.deserializer) {
|
if (!this.deserializer) {
|
||||||
@ -377,7 +342,6 @@ export class DockviewComponent
|
|||||||
createPanel: (id) => {
|
createPanel: (id) => {
|
||||||
const panelData = panels[id];
|
const panelData = panels[id];
|
||||||
const panel = this.deserializer!.fromJSON(panelData);
|
const panel = this.deserializer!.fromJSON(panelData);
|
||||||
this.registerPanel(panel);
|
|
||||||
return panel;
|
return panel;
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -457,7 +421,6 @@ export class DockviewComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
removePanel(panel: IGroupPanel): void {
|
removePanel(panel: IGroupPanel): void {
|
||||||
this.unregisterPanel(panel);
|
|
||||||
const group = panel.group;
|
const group = panel.group;
|
||||||
|
|
||||||
if (!group) {
|
if (!group) {
|
||||||
@ -491,9 +454,9 @@ export class DockviewComponent
|
|||||||
const group = this.createGroup();
|
const group = this.createGroup();
|
||||||
|
|
||||||
if (options) {
|
if (options) {
|
||||||
const referencePanel = this._panels.get(
|
const referencePanel = this.panels.find(
|
||||||
options.referencePanel
|
(panel) => panel.id === options.referencePanel
|
||||||
)?.value;
|
);
|
||||||
|
|
||||||
if (!referencePanel) {
|
if (!referencePanel) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
@ -551,7 +514,7 @@ export class DockviewComponent
|
|||||||
if (!target || target === Position.Center) {
|
if (!target || target === Position.Center) {
|
||||||
const groupItem: IGroupPanel | undefined =
|
const groupItem: IGroupPanel | undefined =
|
||||||
sourceGroup?.model.removePanel(itemId) ||
|
sourceGroup?.model.removePanel(itemId) ||
|
||||||
this._panels.get(itemId)?.value;
|
this.panels.find((panel) => panel.id === itemId);
|
||||||
|
|
||||||
if (!groupItem) {
|
if (!groupItem) {
|
||||||
throw new Error(`No panel with id ${itemId}`);
|
throw new Error(`No panel with id ${itemId}`);
|
||||||
@ -603,7 +566,7 @@ export class DockviewComponent
|
|||||||
} else {
|
} else {
|
||||||
const groupItem: IGroupPanel | undefined =
|
const groupItem: IGroupPanel | undefined =
|
||||||
sourceGroup?.model.removePanel(itemId) ||
|
sourceGroup?.model.removePanel(itemId) ||
|
||||||
this._panels.get(itemId)?.value;
|
this.panels.find((panel) => panel.id === itemId);
|
||||||
|
|
||||||
if (!groupItem) {
|
if (!groupItem) {
|
||||||
throw new Error(`No panel with id ${itemId}`);
|
throw new Error(`No panel with id ${itemId}`);
|
||||||
@ -732,7 +695,6 @@ export class DockviewComponent
|
|||||||
params: options?.params || {},
|
params: options?.params || {},
|
||||||
});
|
});
|
||||||
|
|
||||||
this.registerPanel(panel);
|
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user