83 lines
2.3 KiB
TypeScript

import {
IPublicApiCanvas,
IPublicModelDropLocation,
IPublicModelScrollTarget,
IPublicTypeScrollable,
IPublicModelScroller,
IPublicTypeLocationData,
IPublicModelEditor,
IPublicModelDragon,
IPublicModelActiveTracker,
IPublicModelClipboard,
} from '@alilc/lowcode-types';
import {
ScrollTarget as InnerScrollTarget,
IDesigner,
} from '@alilc/lowcode-designer';
import { editorSymbol, designerSymbol, nodeSymbol } from '../symbols';
import {
Dragon as ShellDragon,
DropLocation as ShellDropLocation,
ActiveTracker as ShellActiveTracker,
Clipboard as ShellClipboard,
DropLocation,
} from '../model';
const clipboardInstanceSymbol = Symbol('clipboardInstace');
export class Canvas implements IPublicApiCanvas {
private readonly [editorSymbol]: IPublicModelEditor;
private readonly [clipboardInstanceSymbol]: IPublicModelClipboard;
private get [designerSymbol](): IDesigner {
return this[editorSymbol].get('designer') as IDesigner;
}
get dragon(): IPublicModelDragon | null {
return ShellDragon.create(this[designerSymbol].dragon, this.workspaceMode);
}
get activeTracker(): IPublicModelActiveTracker | null {
const activeTracker = new ShellActiveTracker(this[designerSymbol].activeTracker);
return activeTracker;
}
get isInLiveEditing(): boolean {
return Boolean(this[editorSymbol].get('designer')?.project?.simulator?.liveEditing?.editing);
}
get clipboard(): IPublicModelClipboard {
return this[clipboardInstanceSymbol];
}
constructor(editor: IPublicModelEditor, readonly workspaceMode: boolean = false) {
this[editorSymbol] = editor;
this[clipboardInstanceSymbol] = new ShellClipboard();
}
createScrollTarget(shell: HTMLDivElement): IPublicModelScrollTarget {
return new InnerScrollTarget(shell);
}
createScroller(scrollable: IPublicTypeScrollable): IPublicModelScroller {
return this[designerSymbol].createScroller(scrollable);
}
/**
* 创建插入位置,考虑放到 dragon 中
*/
createLocation(locationData: IPublicTypeLocationData): IPublicModelDropLocation {
return new DropLocation(this[designerSymbol].createLocation({
...locationData,
target: (locationData.target as any)[nodeSymbol],
}));
}
/**
* @deprecated
*/
get dropLocation() {
return ShellDropLocation.create((this[designerSymbol] as any).dropLocation || null);
}
}