feat: dnd control changes

This commit is contained in:
mathuo 2024-01-17 22:34:10 +00:00
parent 8a67f60747
commit 512a8d2c72
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
7 changed files with 37 additions and 54 deletions

View File

@ -1,6 +1,5 @@
import { DockviewComponent } from '../../dockview/dockviewComponent';
import {
DockviewDropTargets,
GroupPanelPartInitParameters,
IContentRenderer,
ITabRenderer,
@ -2967,7 +2966,7 @@ describe('dockviewComponent', () => {
expect(showDndOverlay).toHaveBeenCalledWith({
nativeEvent: eventLeft,
position: 'left',
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
expect(showDndOverlay).toBeCalledTimes(1);
@ -2986,7 +2985,7 @@ describe('dockviewComponent', () => {
expect(showDndOverlay).toHaveBeenCalledWith({
nativeEvent: eventRight,
position: 'right',
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
expect(showDndOverlay).toBeCalledTimes(2);
@ -3005,7 +3004,7 @@ describe('dockviewComponent', () => {
expect(showDndOverlay).toHaveBeenCalledWith({
nativeEvent: eventTop,
position: 'top',
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
expect(showDndOverlay).toBeCalledTimes(3);
@ -3024,7 +3023,7 @@ describe('dockviewComponent', () => {
expect(showDndOverlay).toHaveBeenCalledWith({
nativeEvent: eventBottom,
position: 'bottom',
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
expect(showDndOverlay).toBeCalledTimes(4);
@ -3060,7 +3059,7 @@ describe('dockviewComponent', () => {
expect(showDndOverlay).toHaveBeenCalledWith({
nativeEvent: eventTop,
position: 'center',
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
expect(showDndOverlay).toBeCalledTimes(5);

View File

@ -10,7 +10,6 @@ import { DockviewComponent } from '../../dockviewComponent';
import { Droptarget } from '../../../dnd/droptarget';
import { DockviewGroupPanelModel } from '../../dockviewGroupPanelModel';
import { getPanelData } from '../../../dnd/dataTransfer';
import { DockviewDropTargets } from '../../types';
export interface IContentContainer extends IDisposable {
readonly dropTarget: Droptarget;
@ -95,11 +94,7 @@ export class ContentContainer
return !groupHasOnePanelAndIsActiveDragElement;
}
return this.group.canDisplayOverlay(
event,
position,
DockviewDropTargets.Panel
);
return this.group.canDisplayOverlay(event, position, 'panel');
},
});

View File

@ -7,7 +7,7 @@ import {
} from '../../../dnd/dataTransfer';
import { toggleClass } from '../../../dom';
import { DockviewComponent } from '../../dockviewComponent';
import { DockviewDropTargets, ITabRenderer } from '../../types';
import { ITabRenderer } from '../../types';
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
import { DroptargetEvent, Droptarget } from '../../../dnd/droptarget';
import { DragHandler } from '../../../dnd/abstractDragHandler';
@ -112,7 +112,7 @@ export class Tab extends CompositeDisposable implements ITab {
return this.group.model.canDisplayOverlay(
event,
position,
DockviewDropTargets.Tab
'tab'
);
},
});

View File

@ -6,7 +6,6 @@ import { DockviewComponent } from '../../dockviewComponent';
import { addDisposableListener, Emitter, Event } from '../../../events';
import { CompositeDisposable } from '../../../lifecycle';
import { DockviewGroupPanel } from '../../dockviewGroupPanel';
import { DockviewDropTargets } from '../../types';
export class VoidContainer extends CompositeDisposable {
private readonly _element: HTMLElement;
@ -62,11 +61,7 @@ export class VoidContainer extends CompositeDisposable {
return last(this.group.panels)?.id !== data.panelId;
}
return group.model.canDisplayOverlay(
event,
position,
DockviewDropTargets.Panel
);
return group.model.canDisplayOverlay(event, position, 'panel');
},
});

View File

@ -10,11 +10,7 @@ import { DockviewPanel, IDockviewPanel } from './dockviewPanel';
import { CompositeDisposable, Disposable } from '../lifecycle';
import { Event, Emitter } from '../events';
import { Watermark } from './components/watermark/watermark';
import {
IWatermarkRenderer,
GroupviewPanelState,
DockviewDropTargets,
} from './types';
import { IWatermarkRenderer, GroupviewPanelState } from './types';
import { sequentialNumberGenerator } from '../math';
import { DefaultDockviewDeserialzier } from './deserializer';
import { createComponent } from '../panel/componentFactory';
@ -455,7 +451,7 @@ export class DockviewComponent
return this.options.showDndOverlay({
nativeEvent: event,
position: position,
target: DockviewDropTargets.Edge,
target: 'edge',
getData: getPanelData,
});
}

View File

@ -22,26 +22,6 @@ import { DockviewGroupPanel } from './dockviewGroupPanel';
import { IDockviewPanel } from './dockviewPanel';
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 {
groupId: string;
itemId?: string;
@ -321,7 +301,12 @@ export class DockviewGroupPanelModel
this._onGroupDragStart.fire(event);
}),
this.tabsContainer.onDrop((event) => {
this.handleDropEvent(event.event, 'center', event.index);
this.handleDropEvent(
'header',
event.event,
'center',
event.index
);
}),
this.contentContainer.onDidFocus(() => {
this.accessor.doSetGroupActive(this.groupPanel, true);
@ -330,7 +315,11 @@ export class DockviewGroupPanelModel
// noop
}),
this.contentContainer.dropTarget.onDrop((event) => {
this.handleDropEvent(event.nativeEvent, event.position);
this.handleDropEvent(
'content',
event.nativeEvent,
event.position
);
}),
this._onMove,
this._onDidChange,
@ -775,6 +764,7 @@ export class DockviewGroupPanelModel
}
private handleDropEvent(
type: 'header' | 'content',
event: DragEvent,
position: Position,
index?: number
@ -783,6 +773,17 @@ export class DockviewGroupPanelModel
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();
if (data && data.viewId === this.accessor.id) {
@ -790,6 +791,7 @@ export class DockviewGroupPanelModel
// this is a group move dnd event
const { groupId } = data;
// TODO: intercept
this._onMove.fire({
target: position,
groupId: groupId,
@ -814,6 +816,7 @@ export class DockviewGroupPanelModel
}
}
// TODO: intercept
this._onMove.fire({
target: position,
groupId: data.groupId,

View File

@ -7,12 +7,7 @@ import { Optional } from '../types';
import { DockviewGroupPanel, IDockviewGroupPanel } from './dockviewGroupPanel';
import { DockviewPanelRenderer } from '../overlayRenderContainer';
export enum DockviewDropTargets {
Tab,
Panel,
TabContainer,
Edge,
}
export type DockviewDropTargets = 'tab' | 'panel' | 'tabContainer' | 'edge';
export interface HeaderPartInitParameters {
title: string;