From c6dcef537f4ac4861f23c17f82e8b4cbaed51784 Mon Sep 17 00:00:00 2001 From: mathuo <6710312+mathuo@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:47:53 +0000 Subject: [PATCH] bug: setup onDidAcitvePanelChange subscription quicker --- .../dockview/dockviewGroupPanel.spec.ts | 48 ++++++++++++++++++- .../src/api/dockviewGroupPanelApi.ts | 24 +--------- .../src/dockview/dockviewGroupPanel.ts | 6 +++ 3 files changed, 55 insertions(+), 23 deletions(-) diff --git a/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanel.spec.ts b/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanel.spec.ts index bbebcfb89..eb2ab5320 100644 --- a/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanel.spec.ts +++ b/packages/dockview-core/src/__tests__/dockview/dockviewGroupPanel.spec.ts @@ -2,10 +2,12 @@ import { DockviewComponent } from '../../dockview/dockviewComponent'; import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel'; import { fromPartial } from '@total-typescript/shoehorn'; import { GroupOptions } from '../../dockview/dockviewGroupPanelModel'; -import { DockviewPanel } from '../../dockview/dockviewPanel'; +import { DockviewPanel, IDockviewPanel } from '../../dockview/dockviewPanel'; import { DockviewPanelModelMock } from '../__mocks__/mockDockviewPanelModel'; import { IContentRenderer, ITabRenderer } from '../../dockview/types'; import { OverlayRenderContainer } from '../../overlay/overlayRenderContainer'; +import { IDockviewPanelModel } from '../../dockview/dockviewPanelModel'; +import { ContentContainer } from '../../dockview/components/panel/content'; describe('dockviewGroupPanel', () => { test('default minimum/maximium width/height', () => { @@ -24,6 +26,50 @@ describe('dockviewGroupPanel', () => { expect(cut.maximumWidth).toBe(Number.MAX_SAFE_INTEGER); }); + test('that onDidActivePanelChange is configured at inline', () => { + const accessor = fromPartial({ + onDidActivePanelChange: jest.fn(), + onDidAddPanel: jest.fn(), + onDidRemovePanel: jest.fn(), + options: {}, + api: {}, + renderer: 'always', + overlayRenderContainer: { + attach: jest.fn(), + detatch: jest.fn(), + }, + doSetGroupActive: jest.fn(), + }); + const options = fromPartial({}); + + const cut = new DockviewGroupPanel(accessor, 'test_id', options); + + let counter = 0; + + cut.api.onDidActivePanelChange((event) => { + counter++; + }); + + cut.model.openPanel( + fromPartial({ + updateParentGroup: jest.fn(), + view: { + tab: { element: document.createElement('div') }, + content: new ContentContainer(accessor, cut.model), + }, + api: { + renderer: 'onlyWhenVisible', + onDidTitleChange: jest.fn(), + onDidParametersChange: jest.fn(), + }, + layout: jest.fn(), + runEvents: jest.fn(), + }) + ); + + expect(counter).toBe(1); + }); + test('group constraints', () => { const accessor = fromPartial({ onDidActivePanelChange: jest.fn(), diff --git a/packages/dockview-core/src/api/dockviewGroupPanelApi.ts b/packages/dockview-core/src/api/dockviewGroupPanelApi.ts index 12424debb..73b5a461b 100644 --- a/packages/dockview-core/src/api/dockviewGroupPanelApi.ts +++ b/packages/dockview-core/src/api/dockviewGroupPanelApi.ts @@ -6,7 +6,6 @@ import { DockviewGroupLocation, } from '../dockview/dockviewGroupPanelModel'; import { Emitter, Event } from '../events'; -import { MutableDisposable } from '../lifecycle'; import { GridviewPanelApi, GridviewPanelApiImpl } from './gridviewPanelApi'; export interface DockviewGroupMoveParams { @@ -41,8 +40,6 @@ const NOT_INITIALIZED_MESSAGE = 'dockview: DockviewGroupPanelApiImpl not initialized'; export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl { - private readonly _mutableDisposable = new MutableDisposable(); - private _group: DockviewGroupPanel | undefined; readonly _onDidLocationChange = @@ -50,8 +47,7 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl { readonly onDidLocationChange: Event = this._onDidLocationChange.event; - private readonly _onDidActivePanelChange = - new Emitter(); + readonly _onDidActivePanelChange = new Emitter(); readonly onDidActivePanelChange = this._onDidActivePanelChange.event; get location(): DockviewGroupLocation { @@ -66,8 +62,7 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl { this.addDisposables( this._onDidLocationChange, - this._onDidActivePanelChange, - this._mutableDisposable + this._onDidActivePanelChange ); } @@ -140,21 +135,6 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl { } initialize(group: DockviewGroupPanel): void { - /** - * TODO: Annoying initialization order caveat, find a better way to initialize and avoid needing null checks - * - * Due to the order on initialization we know that the model isn't defined until later in the same stack-frame of setup. - * By queuing a microtask we can ensure the setup is completed within the same stack-frame, but after everything else has - * finished ensuring the `model` is defined. - */ - this._group = group; - - queueMicrotask(() => { - this._mutableDisposable.value = - this._group!.model.onDidActivePanelChange((event) => { - this._onDidActivePanelChange.fire(event); - }); - }); } } diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanel.ts index a3e714829..fd5e70fe3 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanel.ts @@ -124,6 +124,12 @@ export class DockviewGroupPanel options, this ); + + this.addDisposables( + this.model.onDidActivePanelChange((event) => { + this.api._onDidActivePanelChange.fire(event); + }) + ); } override focus(): void {