Skip to content

Commit c5e2ae4

Browse files
committed
chore: align api with existing components
1 parent c14b66e commit c5e2ae4

File tree

8 files changed

+228
-223
lines changed

8 files changed

+228
-223
lines changed

packages/dockview-core/src/api/component.api.ts

+8-12
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ import {
5151
DockviewWillDropEvent,
5252
WillShowOverlayLocationEvent,
5353
} from '../dockview/dockviewGroupPanelModel';
54-
import { PaneviewComponentOptions } from '../paneview/options';
54+
import {
55+
PaneviewComponentOptions,
56+
PaneviewDndOverlayEvent,
57+
} from '../paneview/options';
5558
import { SplitviewComponentOptions } from '../splitview/options';
5659
import { GridviewComponentOptions } from '../gridview/options';
5760

@@ -295,18 +298,11 @@ export class PaneviewApi implements CommonApi<SerializedPaneview> {
295298
* Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.
296299
*/
297300
get onDidDrop(): Event<PaneviewDropEvent> {
298-
const emitter = new Emitter<PaneviewDropEvent>();
299-
300-
const disposable = this.component.onDidDrop((e) => {
301-
emitter.fire({ ...e, api: this });
302-
});
303-
304-
emitter.dispose = () => {
305-
disposable.dispose();
306-
emitter.dispose();
307-
};
301+
return this.component.onDidDrop;
302+
}
308303

309-
return emitter.event;
304+
get onUnhandledDragOverEvent(): Event<PaneviewDndOverlayEvent> {
305+
return this.component.onUnhandledDragOverEvent;
310306
}
311307

312308
constructor(private readonly component: IPaneviewComponent) {}

packages/dockview-core/src/dockview/options.ts

+8-15
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
1616
import { IGroupHeaderProps } from './framework';
1717
import { FloatingGroupOptions } from './dockviewComponent';
1818
import { Contraints } from '../gridview/gridviewPanel';
19+
import { AcceptableEvent, IAcceptableEvent } from '../events';
1920

2021
export interface IHeaderActionsRenderer extends IDisposable {
2122
readonly element: HTMLElement;
@@ -65,34 +66,26 @@ export interface DockviewOptions {
6566
noPanelsOverlay?: 'emptyGroup' | 'watermark';
6667
}
6768

68-
export interface DockviewDndOverlayEvent {
69+
export interface DockviewDndOverlayEvent extends IAcceptableEvent {
6970
nativeEvent: DragEvent;
7071
target: DockviewGroupDropLocation;
7172
position: Position;
7273
group?: DockviewGroupPanel;
7374
getData: () => PanelTransfer | undefined;
74-
//
75-
isAccepted: boolean;
76-
accept(): void;
7775
}
7876

79-
export class DockviewUnhandledDragOverEvent implements DockviewDndOverlayEvent {
80-
private _isAccepted = false;
81-
82-
get isAccepted(): boolean {
83-
return this._isAccepted;
84-
}
85-
77+
export class DockviewUnhandledDragOverEvent
78+
extends AcceptableEvent
79+
implements DockviewDndOverlayEvent
80+
{
8681
constructor(
8782
readonly nativeEvent: DragEvent,
8883
readonly target: DockviewGroupDropLocation,
8984
readonly position: Position,
9085
readonly getData: () => PanelTransfer | undefined,
9186
readonly group?: DockviewGroupPanel
92-
) {}
93-
94-
accept(): void {
95-
this._isAccepted = true;
87+
) {
88+
super();
9689
}
9790
}
9891

packages/dockview-core/src/events.ts

+17
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,23 @@ export class DockviewEvent implements IDockviewEvent {
4141
}
4242
}
4343

44+
export interface IAcceptableEvent {
45+
readonly isAccepted: boolean;
46+
accept(): void;
47+
}
48+
49+
export class AcceptableEvent implements IAcceptableEvent {
50+
private _isAccepted = false;
51+
52+
get isAccepted(): boolean {
53+
return this._isAccepted;
54+
}
55+
56+
accept(): void {
57+
this._isAccepted = true;
58+
}
59+
}
60+
4461
class LeakageMonitor {
4562
readonly events = new Map<Event<any>, Stacktrace>();
4663

packages/dockview-core/src/paneview/draggablePaneviewPanel.ts

+22-10
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ import {
66
PaneTransfer,
77
} from '../dnd/dataTransfer';
88
import { Droptarget, DroptargetEvent } from '../dnd/droptarget';
9-
import { Emitter } from '../events';
9+
import { Emitter, Event } from '../events';
1010
import { IDisposable } from '../lifecycle';
1111
import { Orientation } from '../splitview/splitview';
12+
import {
13+
PaneviewDndOverlayEvent,
14+
PaneviewUnhandledDragOverEvent,
15+
} from './options';
1216
import { IPaneviewComponent } from './paneviewComponent';
1317
import {
1418
IPaneviewPanel,
@@ -29,6 +33,11 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
2933
private readonly _onDidDrop = new Emitter<PaneviewDropEvent>();
3034
readonly onDidDrop = this._onDidDrop.event;
3135

36+
private readonly _onUnhandledDragOverEvent =
37+
new Emitter<PaneviewDndOverlayEvent>();
38+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent> =
39+
this._onUnhandledDragOverEvent.event;
40+
3241
constructor(
3342
private readonly accessor: IPaneviewComponent,
3443
id: string,
@@ -40,6 +49,8 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
4049
) {
4150
super(id, component, headerComponent, orientation, isExpanded, true);
4251

52+
this.addDisposables(this._onDidDrop, this._onUnhandledDragOverEvent);
53+
4354
if (!disableDnd) {
4455
this.initDragFeatures();
4556
}
@@ -76,7 +87,7 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
7687
overlayModel: {
7788
activationSize: { type: 'percentage', value: 50 },
7889
},
79-
canDisplayOverlay: (event) => {
90+
canDisplayOverlay: (event, position) => {
8091
const data = getPaneData();
8192

8293
if (data) {
@@ -88,15 +99,16 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
8899
}
89100
}
90101

91-
if (this.accessor.options.showDndOverlay) {
92-
return this.accessor.options.showDndOverlay({
93-
nativeEvent: event,
94-
getData: getPaneData,
95-
panel: this,
96-
});
97-
}
102+
const firedEvent = new PaneviewUnhandledDragOverEvent(
103+
event,
104+
position,
105+
getPaneData,
106+
this
107+
);
108+
109+
this._onUnhandledDragOverEvent.fire(firedEvent);
98110

99-
return false;
111+
return firedEvent.isAccepted;
100112
},
101113
});
102114

packages/dockview-core/src/paneview/options.ts

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import { PaneTransfer } from '../dnd/dataTransfer';
2+
import { Position } from '../dnd/droptarget';
13
import { CreateComponentOptions } from '../dockview/options';
2-
import { PaneviewDndOverlayEvent } from './paneviewComponent';
3-
import { IPanePart } from './paneviewPanel';
4+
import { AcceptableEvent, IAcceptableEvent } from '../events';
5+
import { IPanePart, IPaneviewPanel } from './paneviewPanel';
46

57
export interface PaneviewOptions {
68
disableAutoResizing?: boolean;
79
disableDnd?: boolean;
8-
showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
910
className?: string;
1011
}
1112

@@ -27,9 +28,29 @@ export const PROPERTY_KEYS_PANEVIEW: (keyof PaneviewOptions)[] = (() => {
2728
const properties: Record<keyof PaneviewOptions, undefined> = {
2829
disableAutoResizing: undefined,
2930
disableDnd: undefined,
30-
showDndOverlay: undefined,
3131
className: undefined,
3232
};
3333

3434
return Object.keys(properties) as (keyof PaneviewOptions)[];
3535
})();
36+
37+
export interface PaneviewDndOverlayEvent extends IAcceptableEvent {
38+
nativeEvent: DragEvent;
39+
position: Position;
40+
panel: IPaneviewPanel;
41+
getData: () => PaneTransfer | undefined;
42+
}
43+
44+
export class PaneviewUnhandledDragOverEvent
45+
extends AcceptableEvent
46+
implements PaneviewDndOverlayEvent
47+
{
48+
constructor(
49+
readonly nativeEvent: DragEvent,
50+
readonly position: Position,
51+
readonly getData: () => PaneTransfer | undefined,
52+
readonly panel: IPaneviewPanel
53+
) {
54+
super();
55+
}
56+
}

packages/dockview-core/src/paneview/paneviewComponent.ts

+17-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
MutableDisposable,
77
} from '../lifecycle';
88
import { LayoutPriority, Orientation, Sizing } from '../splitview/splitview';
9-
import { PaneviewComponentOptions } from './options';
9+
import { PaneviewComponentOptions, PaneviewDndOverlayEvent } from './options';
1010
import { Paneview } from './paneview';
1111
import { IPanePart, PaneviewPanel, IPaneviewPanel } from './paneviewPanel';
1212
import {
@@ -22,12 +22,6 @@ import { Classnames } from '../dom';
2222

2323
const nextLayoutId = sequentialNumberGenerator();
2424

25-
export interface PaneviewDndOverlayEvent {
26-
nativeEvent: DragEvent;
27-
panel: IPaneviewPanel;
28-
getData: () => PaneTransfer | undefined;
29-
}
30-
3125
export interface SerializedPaneviewPanel {
3226
snap?: boolean;
3327
priority?: LayoutPriority;
@@ -109,6 +103,7 @@ export interface IPaneviewComponent extends IDisposable {
109103
readonly onDidDrop: Event<PaneviewDropEvent>;
110104
readonly onDidLayoutChange: Event<void>;
111105
readonly onDidLayoutFromJSON: Event<void>;
106+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent>;
112107
addPanel<T extends object = Parameters>(
113108
options: AddPaneviewComponentOptions<T>
114109
): IPaneviewPanel;
@@ -146,6 +141,11 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
146141
private readonly _onDidRemoveView = new Emitter<PaneviewPanel>();
147142
readonly onDidRemoveView = this._onDidRemoveView.event;
148143

144+
private readonly _onUnhandledDragOverEvent =
145+
new Emitter<PaneviewDndOverlayEvent>();
146+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent> =
147+
this._onUnhandledDragOverEvent.event;
148+
149149
private readonly _classNames: Classnames;
150150

151151
get id(): string {
@@ -204,7 +204,8 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
204204
this._onDidLayoutfromJSON,
205205
this._onDidDrop,
206206
this._onDidAddView,
207-
this._onDidRemoveView
207+
this._onDidRemoveView,
208+
this._onUnhandledDragOverEvent
208209
);
209210

210211
this._classNames = new Classnames(this.element);
@@ -442,9 +443,14 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
442443
}
443444

444445
private doAddPanel(panel: PaneFramework): void {
445-
const disposable = panel.onDidDrop((event) => {
446-
this._onDidDrop.fire(event);
447-
});
446+
const disposable = new CompositeDisposable(
447+
panel.onDidDrop((event) => {
448+
this._onDidDrop.fire(event);
449+
}),
450+
panel.onUnhandledDragOverEvent((event) => {
451+
this._onUnhandledDragOverEvent.fire(event);
452+
})
453+
);
448454

449455
this._viewDisposables.set(panel.id, disposable);
450456
}

packages/dockview/src/paneview/paneview.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22
import {
33
PaneviewPanelApi,
4-
PaneviewDndOverlayEvent,
54
PaneviewApi,
65
PaneviewDropEvent,
76
createPaneview,
@@ -32,7 +31,6 @@ export interface IPaneviewReactProps extends PaneviewOptions {
3231
string,
3332
React.FunctionComponent<IPaneviewPanelProps>
3433
>;
35-
showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
3634
onDidDrop?(event: PaneviewDropEvent): void;
3735
}
3836

0 commit comments

Comments
 (0)