From baef193d78424b94a00b4107242090cc66f69a99 Mon Sep 17 00:00:00 2001 From: mathuo <6710312+mathuo@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:12:50 +0100 Subject: [PATCH] feat: enhance onWillShowOverlay event --- .../components/titlebar/tabsContainer.ts | 13 ++++++- .../src/dockview/dockviewComponent.ts | 8 +++++ .../src/dockview/dockviewGroupPanelModel.ts | 36 ++++++++++++++----- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/packages/dockview-core/src/dockview/components/titlebar/tabsContainer.ts b/packages/dockview-core/src/dockview/components/titlebar/tabsContainer.ts index 0dbc59702..8271c8f56 100644 --- a/packages/dockview-core/src/dockview/components/titlebar/tabsContainer.ts +++ b/packages/dockview-core/src/dockview/components/titlebar/tabsContainer.ts @@ -15,6 +15,7 @@ import { DockviewGroupDropLocation, WillShowOverlayLocationEvent, } from '../../dockviewGroupPanelModel'; +import { getPanelData } from '../../../dnd/dataTransfer'; export interface TabDropIndexEvent { readonly event: DragEvent; @@ -247,6 +248,10 @@ export class TabsContainer this._onWillShowOverlay.fire( new WillShowOverlayLocationEvent(event, { kind: 'header_space', + panel: this.group.activePanel, + api: this.accessor.api, + group: this.group, + getData: getPanelData, }) ); }), @@ -408,7 +413,13 @@ export class TabsContainer }), tab.onWillShowOverlay((event) => { this._onWillShowOverlay.fire( - new WillShowOverlayLocationEvent(event, { kind: 'tab' }) + new WillShowOverlayLocationEvent(event, { + kind: 'tab', + panel: this.group.activePanel, + api: this.accessor.api, + group: this.group, + getData: getPanelData, + }) ); }) ); diff --git a/packages/dockview-core/src/dockview/dockviewComponent.ts b/packages/dockview-core/src/dockview/dockviewComponent.ts index 8b6ef7a08..ce5238f44 100644 --- a/packages/dockview-core/src/dockview/dockviewComponent.ts +++ b/packages/dockview-core/src/dockview/dockviewComponent.ts @@ -429,6 +429,10 @@ export class DockviewComponent return this.options.defaultRenderer ?? 'onlyWhenVisible'; } + get api(): DockviewApi { + return this._api; + } + constructor(options: DockviewComponentOptions) { super({ proportionalLayout: true, @@ -579,6 +583,10 @@ export class DockviewComponent this._onWillShowOverlay.fire( new WillShowOverlayLocationEvent(event, { kind: 'edge', + panel: undefined, + api: this._api, + group: undefined, + getData: getPanelData, }) ); }), diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts index e1989dd68..fc212b401 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts @@ -190,13 +190,9 @@ export type DockviewGroupLocation = | { type: 'floating' } | { type: 'popout'; getWindow: () => Window }; -type A = typeof WillShowOverlayEvent; - export class WillShowOverlayLocationEvent implements IDockviewEvent { - private _kind: DockviewGroupDropLocation; - get kind(): DockviewGroupDropLocation { - return this._kind; + return this.options.kind; } get nativeEvent(): DragEvent { @@ -211,18 +207,36 @@ export class WillShowOverlayLocationEvent implements IDockviewEvent { return this.event.defaultPrevented; } + get panel(): IDockviewPanel | undefined { + return this.options.panel; + } + + get api(): DockviewApi { + return this.options.api; + } + + get group(): DockviewGroupPanel | undefined { + return this.options.group; + } + preventDefault(): void { this.event.preventDefault(); } + getData(): PanelTransfer | undefined { + return this.options.getData(); + } + constructor( private readonly event: WillShowOverlayEvent, - options: { + private readonly options: { kind: DockviewGroupDropLocation; + panel: IDockviewPanel | undefined; + api: DockviewApi; + group: DockviewGroupPanel | undefined; + getData: () => PanelTransfer | undefined; } - ) { - this._kind = options.kind; - } + ) {} } export class DockviewGroupPanelModel @@ -464,6 +478,10 @@ export class DockviewGroupPanelModel this._onWillShowOverlay.fire( new WillShowOverlayLocationEvent(event, { kind: 'content', + panel: this.activePanel, + api: this._api, + group: this.groupPanel, + getData: getPanelData, }) ); }),