mirror of
https://github.com/mathuo/dockview
synced 2025-09-07 01:46:33 +00:00
feat: dnd control changes
This commit is contained in:
parent
8a67f60747
commit
512a8d2c72
@ -1,6 +1,5 @@
|
|||||||
import { DockviewComponent } from '../../dockview/dockviewComponent';
|
import { DockviewComponent } from '../../dockview/dockviewComponent';
|
||||||
import {
|
import {
|
||||||
DockviewDropTargets,
|
|
||||||
GroupPanelPartInitParameters,
|
GroupPanelPartInitParameters,
|
||||||
IContentRenderer,
|
IContentRenderer,
|
||||||
ITabRenderer,
|
ITabRenderer,
|
||||||
@ -2967,7 +2966,7 @@ describe('dockviewComponent', () => {
|
|||||||
expect(showDndOverlay).toHaveBeenCalledWith({
|
expect(showDndOverlay).toHaveBeenCalledWith({
|
||||||
nativeEvent: eventLeft,
|
nativeEvent: eventLeft,
|
||||||
position: 'left',
|
position: 'left',
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
expect(showDndOverlay).toBeCalledTimes(1);
|
expect(showDndOverlay).toBeCalledTimes(1);
|
||||||
@ -2986,7 +2985,7 @@ describe('dockviewComponent', () => {
|
|||||||
expect(showDndOverlay).toHaveBeenCalledWith({
|
expect(showDndOverlay).toHaveBeenCalledWith({
|
||||||
nativeEvent: eventRight,
|
nativeEvent: eventRight,
|
||||||
position: 'right',
|
position: 'right',
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
expect(showDndOverlay).toBeCalledTimes(2);
|
expect(showDndOverlay).toBeCalledTimes(2);
|
||||||
@ -3005,7 +3004,7 @@ describe('dockviewComponent', () => {
|
|||||||
expect(showDndOverlay).toHaveBeenCalledWith({
|
expect(showDndOverlay).toHaveBeenCalledWith({
|
||||||
nativeEvent: eventTop,
|
nativeEvent: eventTop,
|
||||||
position: 'top',
|
position: 'top',
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
expect(showDndOverlay).toBeCalledTimes(3);
|
expect(showDndOverlay).toBeCalledTimes(3);
|
||||||
@ -3024,7 +3023,7 @@ describe('dockviewComponent', () => {
|
|||||||
expect(showDndOverlay).toHaveBeenCalledWith({
|
expect(showDndOverlay).toHaveBeenCalledWith({
|
||||||
nativeEvent: eventBottom,
|
nativeEvent: eventBottom,
|
||||||
position: 'bottom',
|
position: 'bottom',
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
expect(showDndOverlay).toBeCalledTimes(4);
|
expect(showDndOverlay).toBeCalledTimes(4);
|
||||||
@ -3060,7 +3059,7 @@ describe('dockviewComponent', () => {
|
|||||||
expect(showDndOverlay).toHaveBeenCalledWith({
|
expect(showDndOverlay).toHaveBeenCalledWith({
|
||||||
nativeEvent: eventTop,
|
nativeEvent: eventTop,
|
||||||
position: 'center',
|
position: 'center',
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
expect(showDndOverlay).toBeCalledTimes(5);
|
expect(showDndOverlay).toBeCalledTimes(5);
|
||||||
|
@ -10,7 +10,6 @@ import { DockviewComponent } from '../../dockviewComponent';
|
|||||||
import { Droptarget } from '../../../dnd/droptarget';
|
import { Droptarget } from '../../../dnd/droptarget';
|
||||||
import { DockviewGroupPanelModel } from '../../dockviewGroupPanelModel';
|
import { DockviewGroupPanelModel } from '../../dockviewGroupPanelModel';
|
||||||
import { getPanelData } from '../../../dnd/dataTransfer';
|
import { getPanelData } from '../../../dnd/dataTransfer';
|
||||||
import { DockviewDropTargets } from '../../types';
|
|
||||||
|
|
||||||
export interface IContentContainer extends IDisposable {
|
export interface IContentContainer extends IDisposable {
|
||||||
readonly dropTarget: Droptarget;
|
readonly dropTarget: Droptarget;
|
||||||
@ -95,11 +94,7 @@ export class ContentContainer
|
|||||||
return !groupHasOnePanelAndIsActiveDragElement;
|
return !groupHasOnePanelAndIsActiveDragElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.group.canDisplayOverlay(
|
return this.group.canDisplayOverlay(event, position, 'panel');
|
||||||
event,
|
|
||||||
position,
|
|
||||||
DockviewDropTargets.Panel
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import {
|
|||||||
} from '../../../dnd/dataTransfer';
|
} from '../../../dnd/dataTransfer';
|
||||||
import { toggleClass } from '../../../dom';
|
import { toggleClass } from '../../../dom';
|
||||||
import { DockviewComponent } from '../../dockviewComponent';
|
import { DockviewComponent } from '../../dockviewComponent';
|
||||||
import { DockviewDropTargets, ITabRenderer } from '../../types';
|
import { ITabRenderer } from '../../types';
|
||||||
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
|
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
|
||||||
import { DroptargetEvent, Droptarget } from '../../../dnd/droptarget';
|
import { DroptargetEvent, Droptarget } from '../../../dnd/droptarget';
|
||||||
import { DragHandler } from '../../../dnd/abstractDragHandler';
|
import { DragHandler } from '../../../dnd/abstractDragHandler';
|
||||||
@ -112,7 +112,7 @@ export class Tab extends CompositeDisposable implements ITab {
|
|||||||
return this.group.model.canDisplayOverlay(
|
return this.group.model.canDisplayOverlay(
|
||||||
event,
|
event,
|
||||||
position,
|
position,
|
||||||
DockviewDropTargets.Tab
|
'tab'
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -6,7 +6,6 @@ import { DockviewComponent } from '../../dockviewComponent';
|
|||||||
import { addDisposableListener, Emitter, Event } from '../../../events';
|
import { addDisposableListener, Emitter, Event } from '../../../events';
|
||||||
import { CompositeDisposable } from '../../../lifecycle';
|
import { CompositeDisposable } from '../../../lifecycle';
|
||||||
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
|
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
|
||||||
import { DockviewDropTargets } from '../../types';
|
|
||||||
|
|
||||||
export class VoidContainer extends CompositeDisposable {
|
export class VoidContainer extends CompositeDisposable {
|
||||||
private readonly _element: HTMLElement;
|
private readonly _element: HTMLElement;
|
||||||
@ -62,11 +61,7 @@ export class VoidContainer extends CompositeDisposable {
|
|||||||
return last(this.group.panels)?.id !== data.panelId;
|
return last(this.group.panels)?.id !== data.panelId;
|
||||||
}
|
}
|
||||||
|
|
||||||
return group.model.canDisplayOverlay(
|
return group.model.canDisplayOverlay(event, position, 'panel');
|
||||||
event,
|
|
||||||
position,
|
|
||||||
DockviewDropTargets.Panel
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -10,11 +10,7 @@ import { DockviewPanel, IDockviewPanel } from './dockviewPanel';
|
|||||||
import { CompositeDisposable, Disposable } from '../lifecycle';
|
import { CompositeDisposable, Disposable } 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 { IWatermarkRenderer, GroupviewPanelState } from './types';
|
||||||
IWatermarkRenderer,
|
|
||||||
GroupviewPanelState,
|
|
||||||
DockviewDropTargets,
|
|
||||||
} from './types';
|
|
||||||
import { sequentialNumberGenerator } from '../math';
|
import { sequentialNumberGenerator } from '../math';
|
||||||
import { DefaultDockviewDeserialzier } from './deserializer';
|
import { DefaultDockviewDeserialzier } from './deserializer';
|
||||||
import { createComponent } from '../panel/componentFactory';
|
import { createComponent } from '../panel/componentFactory';
|
||||||
@ -455,7 +451,7 @@ export class DockviewComponent
|
|||||||
return this.options.showDndOverlay({
|
return this.options.showDndOverlay({
|
||||||
nativeEvent: event,
|
nativeEvent: event,
|
||||||
position: position,
|
position: position,
|
||||||
target: DockviewDropTargets.Edge,
|
target: 'edge',
|
||||||
getData: getPanelData,
|
getData: getPanelData,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -22,26 +22,6 @@ import { DockviewGroupPanel } from './dockviewGroupPanel';
|
|||||||
import { IDockviewPanel } from './dockviewPanel';
|
import { IDockviewPanel } from './dockviewPanel';
|
||||||
import { IHeaderActionsRenderer } from './options';
|
import { IHeaderActionsRenderer } from './options';
|
||||||
|
|
||||||
export interface DndService {
|
|
||||||
canDisplayOverlay(
|
|
||||||
group: IDockviewGroupPanelModel,
|
|
||||||
event: DragEvent,
|
|
||||||
target: DockviewDropTargets
|
|
||||||
): boolean;
|
|
||||||
onDrop(
|
|
||||||
group: IDockviewGroupPanelModel,
|
|
||||||
event: DragEvent,
|
|
||||||
position: Position,
|
|
||||||
index?: number
|
|
||||||
): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IGroupItem {
|
|
||||||
id: string;
|
|
||||||
header: { element: HTMLElement };
|
|
||||||
body: { element: HTMLElement };
|
|
||||||
}
|
|
||||||
|
|
||||||
interface GroupMoveEvent {
|
interface GroupMoveEvent {
|
||||||
groupId: string;
|
groupId: string;
|
||||||
itemId?: string;
|
itemId?: string;
|
||||||
@ -321,7 +301,12 @@ export class DockviewGroupPanelModel
|
|||||||
this._onGroupDragStart.fire(event);
|
this._onGroupDragStart.fire(event);
|
||||||
}),
|
}),
|
||||||
this.tabsContainer.onDrop((event) => {
|
this.tabsContainer.onDrop((event) => {
|
||||||
this.handleDropEvent(event.event, 'center', event.index);
|
this.handleDropEvent(
|
||||||
|
'header',
|
||||||
|
event.event,
|
||||||
|
'center',
|
||||||
|
event.index
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
this.contentContainer.onDidFocus(() => {
|
this.contentContainer.onDidFocus(() => {
|
||||||
this.accessor.doSetGroupActive(this.groupPanel, true);
|
this.accessor.doSetGroupActive(this.groupPanel, true);
|
||||||
@ -330,7 +315,11 @@ export class DockviewGroupPanelModel
|
|||||||
// noop
|
// noop
|
||||||
}),
|
}),
|
||||||
this.contentContainer.dropTarget.onDrop((event) => {
|
this.contentContainer.dropTarget.onDrop((event) => {
|
||||||
this.handleDropEvent(event.nativeEvent, event.position);
|
this.handleDropEvent(
|
||||||
|
'content',
|
||||||
|
event.nativeEvent,
|
||||||
|
event.position
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
this._onMove,
|
this._onMove,
|
||||||
this._onDidChange,
|
this._onDidChange,
|
||||||
@ -775,6 +764,7 @@ export class DockviewGroupPanelModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
private handleDropEvent(
|
private handleDropEvent(
|
||||||
|
type: 'header' | 'content',
|
||||||
event: DragEvent,
|
event: DragEvent,
|
||||||
position: Position,
|
position: Position,
|
||||||
index?: number
|
index?: number
|
||||||
@ -783,6 +773,17 @@ export class DockviewGroupPanelModel
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getKind(): 'tab' | 'header_space' | 'content' {
|
||||||
|
switch (type) {
|
||||||
|
case 'header':
|
||||||
|
return typeof index === 'number' ? 'tab' : 'header_space';
|
||||||
|
case 'content':
|
||||||
|
return 'content';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const kind = getKind();
|
||||||
|
|
||||||
const data = getPanelData();
|
const data = getPanelData();
|
||||||
|
|
||||||
if (data && data.viewId === this.accessor.id) {
|
if (data && data.viewId === this.accessor.id) {
|
||||||
@ -790,6 +791,7 @@ export class DockviewGroupPanelModel
|
|||||||
// this is a group move dnd event
|
// this is a group move dnd event
|
||||||
const { groupId } = data;
|
const { groupId } = data;
|
||||||
|
|
||||||
|
// TODO: intercept
|
||||||
this._onMove.fire({
|
this._onMove.fire({
|
||||||
target: position,
|
target: position,
|
||||||
groupId: groupId,
|
groupId: groupId,
|
||||||
@ -814,6 +816,7 @@ export class DockviewGroupPanelModel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: intercept
|
||||||
this._onMove.fire({
|
this._onMove.fire({
|
||||||
target: position,
|
target: position,
|
||||||
groupId: data.groupId,
|
groupId: data.groupId,
|
||||||
|
@ -7,12 +7,7 @@ import { Optional } from '../types';
|
|||||||
import { DockviewGroupPanel, IDockviewGroupPanel } from './dockviewGroupPanel';
|
import { DockviewGroupPanel, IDockviewGroupPanel } from './dockviewGroupPanel';
|
||||||
import { DockviewPanelRenderer } from '../overlayRenderContainer';
|
import { DockviewPanelRenderer } from '../overlayRenderContainer';
|
||||||
|
|
||||||
export enum DockviewDropTargets {
|
export type DockviewDropTargets = 'tab' | 'panel' | 'tabContainer' | 'edge';
|
||||||
Tab,
|
|
||||||
Panel,
|
|
||||||
TabContainer,
|
|
||||||
Edge,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HeaderPartInitParameters {
|
export interface HeaderPartInitParameters {
|
||||||
title: string;
|
title: string;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user