diff --git a/packages/dockview-core/src/__tests__/dockview/dockviewComponent.spec.ts b/packages/dockview-core/src/__tests__/dockview/dockviewComponent.spec.ts index a52b16088..1ec04ab90 100644 --- a/packages/dockview-core/src/__tests__/dockview/dockviewComponent.spec.ts +++ b/packages/dockview-core/src/__tests__/dockview/dockviewComponent.spec.ts @@ -4628,12 +4628,6 @@ describe('dockviewComponent', () => { }); test('that emits onDidPanelTitleChange and onDidLayoutChange when the panel set a title', () => { - const container = document.createElement('div'); - - const didPanelTitleChangeHandler = jest.fn(); - const { dispose: disposeDidPanelTitleChangeHandler } = - dockview.onDidPanelTitleChange(didPanelTitleChangeHandler); - const didLayoutChangeHandler = jest.fn(); const { dispose: disposeDidLayoutChangeHandler } = dockview.onDidLayoutChange(didLayoutChangeHandler); @@ -4642,20 +4636,12 @@ describe('dockviewComponent', () => { jest.runAllTimers(); - expect(didPanelTitleChangeHandler).toHaveBeenCalledTimes(1); expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1); - disposeDidPanelTitleChangeHandler(); disposeDidLayoutChangeHandler(); }); test('that emits onDidPanelParametersChange and onDidLayoutChange when the panel updates parameters', () => { - const didPanelParametersChangeHandler = jest.fn(); - const { dispose: disposeDidPanelParametersChangeHandler } = - dockview.onDidPanelParametersChange( - didPanelParametersChangeHandler - ); - const didLayoutChangeHandler = jest.fn(); const { dispose: disposeDidLayoutChangeHandler } = dockview.onDidLayoutChange(didLayoutChangeHandler); @@ -4664,10 +4650,8 @@ describe('dockviewComponent', () => { jest.runAllTimers(); - expect(didPanelParametersChangeHandler).toHaveBeenCalledTimes(1); expect(didLayoutChangeHandler).toHaveBeenCalledTimes(1); - disposeDidPanelParametersChangeHandler(); disposeDidLayoutChangeHandler(); }); }); diff --git a/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanelModel.spec.ts b/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanelModel.spec.ts index 31f710d03..939380ec6 100644 --- a/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanelModel.spec.ts +++ b/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanelModel.spec.ts @@ -38,11 +38,11 @@ import { FocusEvent, VisibilityEvent, ActiveEvent, - HiddenEvent, WillFocusEvent, } from '../../api/panelApi'; import { Position } from '../../dnd/droptarget'; import { Emitter, Event } from '../../events'; +import { fromPartial } from '@total-typescript/shoehorn'; enum GroupChangeKind2 { ADD_PANEL, @@ -269,11 +269,11 @@ describe('dockviewGroupPanelModel', () => { options = {}; - panelApi = { + panelApi = fromPartial({ renderer: 'onlyWhenVisibile', onDidTitleChange: new Emitter().event, - onUpdateParameters: new Emitter().event, - } as DockviewPanelApi; + onDidParametersChange: new Emitter().event, + }); dockview = (>{ options: { parentElement: document.createElement('div') }, diff --git a/packages/dockview-core/src/api/panelApi.ts b/packages/dockview-core/src/api/panelApi.ts index 989931e00..ad332613a 100644 --- a/packages/dockview-core/src/api/panelApi.ts +++ b/packages/dockview-core/src/api/panelApi.ts @@ -24,8 +24,7 @@ export interface PanelApi { readonly onDidFocusChange: Event; readonly onDidVisibilityChange: Event; readonly onDidActiveChange: Event; - readonly onDidHiddenChange: Event; - readonly onUpdateParameters: Event; + readonly onDidParametersChange: Event; setActive(): void; setVisible(isVisible: boolean): void; updateParameters(parameters: Parameters): void; @@ -55,6 +54,8 @@ export interface PanelApi { readonly height: number; readonly onWillFocus: Event; + + getParameters(): T; } export class WillFocusEvent extends DockviewEvent { @@ -72,6 +73,7 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi { private _isVisible = true; private _width = 0; private _height = 0; + private _parameters: Parameters = {}; private readonly panelUpdatesDisposable = new MutableDisposable(); @@ -99,9 +101,9 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi { readonly _onActiveChange = new Emitter(); readonly onActiveChange: Event = this._onActiveChange.event; - readonly _onUpdateParameters = new Emitter(); - readonly onUpdateParameters: Event = - this._onUpdateParameters.event; + readonly _onDidParametersChange = new Emitter(); + readonly onDidParametersChange: Event = + this._onDidParametersChange.event; get isFocused(): boolean { return this._isFocused; @@ -149,13 +151,18 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi { this._onActiveChange, this._onWillFocus, this._onWillVisibilityChange, - this._onUpdateParameters + this._onDidParametersChange ); } + getParameters(): T { + return this._parameters as T; + } + public initialize(panel: IPanel): void { - this.panelUpdatesDisposable.value = this._onUpdateParameters.event( + this.panelUpdatesDisposable.value = this._onDidParametersChange.event( (parameters) => { + this._parameters = parameters; panel.update({ params: parameters, }); @@ -172,6 +179,6 @@ export class PanelApiImpl extends CompositeDisposable implements PanelApi { } updateParameters(parameters: Parameters): void { - this._onUpdateParameters.fire(parameters); + this._onDidParametersChange.fire(parameters); } } diff --git a/packages/dockview-core/src/dockview/dockviewComponent.ts b/packages/dockview-core/src/dockview/dockviewComponent.ts index a0318a1cd..220a5ad1c 100644 --- a/packages/dockview-core/src/dockview/dockviewComponent.ts +++ b/packages/dockview-core/src/dockview/dockviewComponent.ts @@ -361,14 +361,6 @@ export class DockviewComponent private readonly _onDidAddPanel = new Emitter(); readonly onDidAddPanel: Event = this._onDidAddPanel.event; - private readonly _onDidPanelTitleChange = new Emitter(); - readonly onDidPanelTitleChange: Event = - this._onDidPanelTitleChange.event; - - private readonly _onDidPanelParametersChange = new Emitter(); - readonly onDidPanelParametersChange: Event = - this._onDidPanelParametersChange.event; - private readonly _onDidLayoutFromJSON = new Emitter(); readonly onDidLayoutFromJSON: Event = this._onDidLayoutFromJSON.event; @@ -495,9 +487,7 @@ export class DockviewComponent Event.any( this.onDidAddPanel, this.onDidRemovePanel, - this.onDidActivePanelChange, - this.onDidPanelTitleChange, - this.onDidPanelParametersChange + this.onDidActivePanelChange )(() => { this._bufferOnDidLayoutChange.fire(); }), @@ -2187,11 +2177,11 @@ export class DockviewComponent this._onDidActivePanelChange.fire(event.panel); } }), - view.model.onDidPanelTitleChange((event) => { - this._onDidPanelTitleChange.fire(event); - }), - view.model.onDidPanelParametersChange((event) => { - this._onDidPanelParametersChange.fire(event); + Event.any( + view.model.onDidPanelTitleChange, + view.model.onDidPanelParametersChange + )(() => { + this._bufferOnDidLayoutChange.fire(); }) ); diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts index 7adbdf1df..e1989dd68 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts @@ -239,8 +239,6 @@ export class DockviewGroupPanelModel private _leftHeaderActions: IHeaderActionsRenderer | undefined; private _prefixHeaderActions: IHeaderActionsRenderer | undefined; - private _panelDisposables = new Map(); - private _location: DockviewGroupLocation = { type: 'grid' }; private mostRecentlyUsed: IDockviewPanel[] = []; @@ -253,6 +251,7 @@ export class DockviewGroupPanelModel private _height = 0; private _panels: IDockviewPanel[] = []; + private readonly _panelDisposables = new Map(); private readonly _onMove = new Emitter(); readonly onMove: Event = this._onMove.event; @@ -842,11 +841,11 @@ export class DockviewGroupPanelModel ); } - const panelDisposables = this._panelDisposables.get(panel.id); - - this._panelDisposables.delete(panel.id); - - panelDisposables?.forEach(({ dispose }) => dispose()); + const disposable = this._panelDisposables.get(panel.id); + if (disposable) { + disposable.dispose(); + this._panelDisposables.delete(panel.id); + } this._onDidRemovePanel.fire({ panel }); } @@ -878,14 +877,17 @@ export class DockviewGroupPanelModel this.updateMru(panel); this.panels.splice(index, 0, panel); - this._panelDisposables.set(panel.id, [ - panel.api.onDidTitleChange((event) => - this._onDidPanelTitleChange.fire(event) - ), - panel.api.onUpdateParameters((event) => - this._onDidPanelParametersChange.fire(event) - ), - ]); + this._panelDisposables.set( + panel.id, + new CompositeDisposable( + panel.api.onDidTitleChange((event) => + this._onDidPanelTitleChange.fire(event) + ), + panel.api.onDidParametersChange((event) => + this._onDidPanelParametersChange.fire(event) + ) + ) + ); this._onDidAddPanel.fire({ panel }); }