This commit is contained in:
mathuo 2022-03-10 22:06:55 +00:00
parent 26f2908b39
commit a637ca714b
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
3 changed files with 45 additions and 55 deletions

View File

@ -1,14 +1,15 @@
import { MutableDisposable } from '..';
import { getElementsByTagName } from '../dom'; import { getElementsByTagName } from '../dom';
import { addDisposableListener, Emitter } from '../events'; import { addDisposableListener, Emitter } from '../events';
import { CompositeDisposable, IDisposable } from '../lifecycle'; import { CompositeDisposable, IDisposable } from '../lifecycle';
export abstract class DragHandler extends CompositeDisposable { export abstract class DragHandler extends CompositeDisposable {
private iframes: HTMLElement[] = []; private readonly disposable = new MutableDisposable();
private readonly _onDragStart = new Emitter<void>(); private readonly _onDragStart = new Emitter<void>();
readonly onDragStart = this._onDragStart.event; readonly onDragStart = this._onDragStart.event;
private disposable: IDisposable | undefined; private iframes: HTMLElement[] = [];
constructor(private readonly el: HTMLElement) { constructor(private readonly el: HTMLElement) {
super(); super();
@ -32,8 +33,11 @@ export abstract class DragHandler extends CompositeDisposable {
this.el.classList.add('dragged'); this.el.classList.add('dragged');
setTimeout(() => this.el.classList.remove('dragged'), 0); setTimeout(() => this.el.classList.remove('dragged'), 0);
this.disposable?.dispose(); this.disposable.value = this.getData();
this.disposable = this.getData();
if (event.dataTransfer) {
event.dataTransfer.effectAllowed = 'move';
}
}), }),
addDisposableListener(this.el, 'dragend', (ev) => { addDisposableListener(this.el, 'dragend', (ev) => {
for (const iframe of this.iframes) { for (const iframe of this.iframes) {
@ -41,8 +45,7 @@ export abstract class DragHandler extends CompositeDisposable {
} }
this.iframes = []; this.iframes = [];
this.disposable?.dispose(); this.disposable.dispose();
this.disposable = undefined;
}) })
); );
} }

View File

@ -1,17 +1,18 @@
import { addDisposableListener, Emitter, Event } from '../events'; import { addDisposableListener, Emitter, Event } from '../events';
import { CompositeDisposable } from '../lifecycle'; import { CompositeDisposable, IDisposable } from '../lifecycle';
import { import {
getPanelData, getPanelData,
LocalSelectionTransfer, LocalSelectionTransfer,
PanelTransfer, PanelTransfer,
} from '../dnd/dataTransfer'; } from '../dnd/dataTransfer';
import { getElementsByTagName, toggleClass } from '../dom'; import { toggleClass } from '../dom';
import { IDockviewComponent } from '../dockview/dockviewComponent'; import { IDockviewComponent } from '../dockview/dockviewComponent';
import { ITabRenderer } from './types'; import { ITabRenderer } from './types';
import { IGroupPanel } from './groupPanel'; import { IGroupPanel } from './groupPanel';
import { GroupviewPanel } from './groupviewPanel'; import { GroupviewPanel } from './groupviewPanel';
import { DroptargetEvent, Droptarget } from '../dnd/droptarget'; import { DroptargetEvent, Droptarget } from '../dnd/droptarget';
import { DockviewDropTargets } from './dnd'; import { DockviewDropTargets } from './dnd';
import { DragHandler } from '../dnd/abstractDragHandler';
export enum MouseEventKind { export enum MouseEventKind {
CLICK = 'CLICK', CLICK = 'CLICK',
@ -19,15 +20,15 @@ export enum MouseEventKind {
} }
export interface LayoutMouseEvent { export interface LayoutMouseEvent {
kind: MouseEventKind; readonly kind: MouseEventKind;
event: MouseEvent; readonly event: MouseEvent;
panel?: IGroupPanel; readonly panel?: IGroupPanel;
tab?: boolean; readonly tab?: boolean;
} }
export interface ITab { export interface ITab {
panelId: string; readonly panelId: string;
element: HTMLElement; readonly element: HTMLElement;
setContent: (element: ITabRenderer) => void; setContent: (element: ITabRenderer) => void;
onChanged: Event<LayoutMouseEvent>; onChanged: Event<LayoutMouseEvent>;
onDrop: Event<DroptargetEvent>; onDrop: Event<DroptargetEvent>;
@ -35,8 +36,8 @@ export interface ITab {
} }
export class Tab extends CompositeDisposable implements ITab { export class Tab extends CompositeDisposable implements ITab {
private _element: HTMLElement; private readonly _element: HTMLElement;
private droptarget: Droptarget; private readonly droptarget: Droptarget;
private content?: ITabRenderer; private content?: ITabRenderer;
private readonly _onChanged = new Emitter<LayoutMouseEvent>(); private readonly _onChanged = new Emitter<LayoutMouseEvent>();
@ -45,19 +46,14 @@ export class Tab extends CompositeDisposable implements ITab {
private readonly _onDropped = new Emitter<DroptargetEvent>(); private readonly _onDropped = new Emitter<DroptargetEvent>();
readonly onDrop: Event<DroptargetEvent> = this._onDropped.event; readonly onDrop: Event<DroptargetEvent> = this._onDropped.event;
private readonly panelTransfer =
LocalSelectionTransfer.getInstance<PanelTransfer>();
public get element() { public get element() {
return this._element; return this._element;
} }
private iframes: HTMLElement[] = [];
constructor( constructor(
public panelId: string, public readonly panelId: string,
private readonly accessor: IDockviewComponent, accessor: IDockviewComponent,
private group: GroupviewPanel private readonly group: GroupviewPanel
) { ) {
super(); super();
@ -69,42 +65,32 @@ export class Tab extends CompositeDisposable implements ITab {
this._element.draggable = true; this._element.draggable = true;
this.addDisposables( this.addDisposables(
addDisposableListener(this._element, 'dragstart', (event) => { new (class Handler extends DragHandler {
this.iframes = [ private readonly panelTransfer =
...getElementsByTagName('iframe'), LocalSelectionTransfer.getInstance<PanelTransfer>();
...getElementsByTagName('webview'),
];
for (const iframe of this.iframes) {
iframe.style.pointerEvents = 'none';
}
this.element.classList.add('dragged');
setTimeout(() => this.element.classList.remove('dragged'), 0);
getData(): IDisposable {
this.panelTransfer.setData( this.panelTransfer.setData(
[ [new PanelTransfer(accessor.id, group.id, panelId)],
new PanelTransfer(
this.accessor.id,
this.group.id,
this.panelId
),
],
PanelTransfer.prototype PanelTransfer.prototype
); );
if (event.dataTransfer) { return {
event.dataTransfer.effectAllowed = 'move'; dispose: () => {
this.panelTransfer.clearData(
PanelTransfer.prototype
);
},
};
} }
}),
addDisposableListener(this._element, 'dragend', (ev) => {
for (const iframe of this.iframes) {
iframe.style.pointerEvents = 'auto';
}
this.iframes = [];
this.panelTransfer.clearData(PanelTransfer.prototype); public dispose(): void {
}), //
}
})(this._element)
);
this.addDisposables(
addDisposableListener(this._element, 'mousedown', (event) => { addDisposableListener(this._element, 'mousedown', (event) => {
if (event.defaultPrevented) { if (event.defaultPrevented) {
return; return;

View File

@ -48,6 +48,7 @@ export class MutableDisposable implements IDisposable {
public dispose() { public dispose() {
if (this._disposable) { if (this._disposable) {
this._disposable.dispose(); this._disposable.dispose();
this._disposable = Disposable.NONE;
} }
} }
} }