///
import { Pen, IValue } from '../pen';
import { Point } from '../point';
import { Rect } from '../rect';
import { EditAction, TopologyStore } from '../store';
import { Padding } from '../utils';
import { HotkeyType, HoverType, MouseRight } from '../data';
import { curve, mind, lineSegment } from '../diagrams';
import { polyline } from '../diagrams/line/polyline';
import { Tooltip } from '../tooltip';
import { Scroll } from '../scroll';
import { CanvasImage } from './canvasImage';
import { MagnifierCanvas } from './magnifierCanvas';
import { Topology } from '../core';
export declare const movingSuffix: "-moving";
export declare class Canvas {
parent: Topology;
parentElement: HTMLElement;
store: TopologyStore;
canvas: HTMLCanvasElement;
offscreen: HTMLCanvasElement | OffscreenCanvas;
width: number;
height: number;
externalElements: HTMLDivElement;
clientRect?: DOMRect;
canvasRect: Rect;
activeRect: Rect;
initActiveRect: Rect;
dragRect: Rect;
lastRotate: number;
sizeCPs: Point[];
activeInitPos: Point[];
hoverType: HoverType;
resizeIndex: number;
mouseDown: {
x: number;
y: number;
restore?: boolean;
};
hotkeyType: HotkeyType;
mouseRight: MouseRight;
addCaches: Pen[];
touchCenter?: Point;
initTouchDis?: number;
initScale?: number;
touchScaling?: boolean;
touchMoving?: boolean;
startTouches?: TouchList;
lastOffsetX: number;
lastOffsetY: number;
drawingLineName?: string;
drawLineFns: string[];
drawingLine?: Pen;
pencil?: boolean;
pencilLine?: Pen;
movingPens: Pen[];
patchFlagsLines?: Set;
dock: {
xDock: Point;
yDock: Point;
};
prevAnchor: Point;
nextAnchor: Point;
private lastMouseTime;
private hoverTimer;
private willInactivePen;
patchFlags: boolean;
lastRender: number;
touchStart: number;
touchStartTimer: any;
timer: any;
private lastAnimateRender;
animateRendering: boolean;
renderTimer: number;
initPens?: Pen[];
pointSize: 8;
pasteOffset: number;
/**
* @deprecated 改用 beforeAddPens
*/
beforeAddPen: (pen: Pen) => boolean;
beforeAddPens: (pens: Pen[]) => Promise;
beforeAddAnchor: (pen: Pen, anchor: Point) => Promise;
beforeRemovePens: (pens: Pen[]) => Promise;
beforeRemoveAnchor: (pen: Pen, anchor: Point) => Promise;
customResizeDock: (store: TopologyStore, rect: Rect, pens: Pen[], resizeIndex: number) => {
xDock: Point;
yDock: Point;
};
customMoveDock: (store: TopologyStore, rect: Rect, pens: Pen[], offset: Point) => {
xDock: Point;
yDock: Point;
};
inputParent: HTMLDivElement;
inputDiv: HTMLDivElement;
inputRight: HTMLDivElement;
dropdown: HTMLUListElement;
tooltip: Tooltip;
mousePos: Point;
scroll: Scroll;
movingAnchor: Point;
canvasImage: CanvasImage;
canvasImageBottom: CanvasImage;
magnifierCanvas: MagnifierCanvas;
stopPropagation: (e: MouseEvent) => void;
constructor(parent: Topology, parentElement: HTMLElement, store: TopologyStore);
curve: typeof curve;
polyline: typeof polyline;
mind: typeof mind;
line: typeof lineSegment;
listen(): void;
onCopy: (event: ClipboardEvent) => void;
onCut: (event: ClipboardEvent) => void;
onPaste: (event: ClipboardEvent) => void;
onwheel: (e: WheelEvent) => void;
onkeydown: (e: KeyboardEvent) => void;
/**
* 分割连线的锚点,变成两条线
* @param line 连线
* @param anchor 锚点,连线的某个锚点,引用相同
*/
splitLine(line: Pen, anchor: Point): void;
private translateAnchor;
onkeyup: (e: KeyboardEvent) => void;
fileToPen(file: File, isGif: boolean): Promise;
ondrop: (event: DragEvent) => Promise;
dropPens(pens: Pen[], e: Point): Promise;
randomCombineId(pen: Pen, pens: Pen[], parentId?: string): Pen;
addPens(pens: Pen[], history?: boolean): Promise;
ontouchstart: (e: TouchEvent) => void;
ontouchmove: (event: TouchEvent) => void;
ontouchend: (event: TouchEvent) => void;
onGesturestart: (e: any) => void;
/**
* 获取初始化的 pencilLine
* @param pt 需包含 penId
*/
private getInitPencilLine;
/**
* 获取初始化的 drawingLine
* @param pt 需包含 penId
*/
private createDrawingLine;
onMouseDown: (e: {
x: number;
y: number;
clientX: number;
clientY: number;
pageX: number;
pageY: number;
buttons?: number;
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
}) => void;
onMouseMove: (e: {
x: number;
y: number;
clientX: number;
clientY: number;
pageX: number;
pageY: number;
buttons?: number;
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
}) => void;
onMouseUp: (e: {
x: number;
y: number;
clientX: number;
clientY: number;
pageX: number;
pageY: number;
buttons?: number;
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
button?: number;
}) => void;
private addRuleLine;
/**
* 拖拽结束,数据更新到 active.pens
*/
private movedActivePens;
/**
* 复制移动后的笔
*/
private copyMovedPens;
/**
* 若本次改变的画笔存在图片,并且在上层 or 下层,需要擦除上层 or 下层
* 子节点中包含图片,也需要重绘
* @param pens 本次改变的 pens
*/
initImageCanvas(pens: Pen[]): void;
private hasImage;
private clearDock;
inactive(drawing?: boolean): void;
active(pens: Pen[], emit?: boolean): void;
getSizeCPs(): void;
onResize: () => void;
onScroll: () => void;
calibrateMouse: (pt: Point) => Point;
clearHover(): void;
private getHover;
private inPens;
private dockInAnchor;
inAnchor(pt: Point, pen: Pen, anchor: Point): HoverType;
resize(w?: number, h?: number): void;
clearCanvas(): void;
addPen(pen: Pen, history?: boolean, emit?: boolean): Promise;
pushHistory(action: EditAction): void;
undo(): void;
redo(): void;
activeHistory(): void;
doEditAction(action: EditAction, undo: boolean): void;
makePen(pen: Pen): void;
drawline(mouse?: Point): void;
initLineRect(pen: Pen): void;
drawingPencil(): void;
stopPencil(): void;
finishDrawline(end?: boolean): Promise;
finishPencil(): Promise;
/**
* 火狐浏览器无法绘制 svg 不存在 width height 的问题
* 此方法手动添加 width 和 height 解决火狐浏览器绘制 svg
* @param pen
*/
private firefoxLoadSvg;
loadImage(pen: Pen): void;
private imageTimer;
imageLoaded(): void;
setCalculativeByScale(pen: Pen): void;
updatePenRect(pen: Pen, { worldRectIsReady, playingAnimate, }?: {
worldRectIsReady?: boolean;
playingAnimate?: boolean;
noChildren?: boolean;
}): void;
render: (patchFlags?: number | boolean) => void;
renderPens: () => void;
private renderPenContainChild;
renderBorder: () => void;
renderHoverPoint: () => void;
translate(x?: number, y?: number): void;
onMovePens(): void;
/**
* 缩放整个画布
* @param scale 缩放比例,最终的 data.scale
* @param center 中心点,引用类型,存在副作用,会更改原值
*/
scale(scale: number, center?: {
x: number;
y: number;
}): void;
rotatePens(e: Point): void;
resizePens(e: Point): void;
movePens(e: {
x: number;
y: number;
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
}): void;
/**
* 初始化移动,更改画笔的 id parentId 等关联关系
* @param pen 要修改的画笔
* @param pens 本次操作的画笔们,包含子画笔
*/
private changeIdsByMoving;
/**
* 初始化 this.movingPens
* 修改 ids (id parentId children 等)
* 半透明,去图片
*/
initMovingPens(): void;
moveLineAnchor(pt: {
x: number;
y: number;
}, keyOptions: {
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
}): void;
moveLineAnchorPrev(e: {
x: number;
y: number;
}): void;
moveLineAnchorNext(e: {
x: number;
y: number;
}): void;
setAnchor(e: {
x: number;
y: number;
}): Promise;
/**
* 连线允许移动,若与其它图形有连接,但其它图形不在此次移动中,会断开连接
* @param line 连线
* @param pens 本次移动的全部图形,包含子节点
*/
private checkDisconnect;
/**
* 移动 画笔们
* @param pens 画笔们,不包含子节点
* @param x 偏移 x
* @param y 偏移 y
* @param doing 是否持续移动
*/
translatePens(pens: Pen[], x: number, y: number, doing?: boolean): void;
private calcAutoAnchor;
restoreNodeAnimate(pen: Pen): void;
updateLines(pen: Pen, change?: boolean): void;
calcActiveRect(): void;
/**
* 旋转当前画笔包括子节点
* @param pen 旋转的画笔
* @param angle 本次的旋转值,加到 pen.calculative.rotate 上
*/
rotatePen(pen: Pen, angle: number, rect: Rect): void;
nextAnimate(pen: Pen): void;
getFrameProps(pen: any): {};
animate(): void;
get clipboardName(): string;
copy(pens?: Pen[]): Promise;
cut(pens?: Pen[]): void;
paste(): Promise;
/**
* 获取 pens 列表中的所有节点(包含子节点)
* @param pens 不包含子节点
*/
getAllByPens(pens: Pen[]): Pen[];
/**
*
* @param pen 当前复制的画笔
* @param parentId 父节点 id
* @param clipboard 本次复制的全部画笔,包含子节点, 以及 origin 和 scale
* @returns 复制后的画笔
*/
private pastePen;
/**
* 修改对应连线的 anchors
* @param oldId 老 id
* @param pen 节点
* @param pastePens 本次复制的 pens 包含子节点
*/
changeLineAnchors(oldId: string, pen: Pen, pastePens: Pen[]): void;
/**
* 复制连线的过程,修改 与 此线连接 node 的 connectedLines
* @param oldId 线原 id
* @param line 线
* @param pastePens 此处复制的全部 pens (包含子节点)
*/
changeNodeConnectedLine(oldId: string, line: Pen, pastePens: Pen[]): void;
delete(pens?: Pen[], canDelLocked?: boolean, history?: boolean): Promise;
private _del;
getDelPens(pen: Pen, delPens: Pen[]): void;
private getLockedParent;
delForce(pen: Pen): void;
private delConnectedLines;
private ondblclick;
showInput: (pen: Pen, rect?: Rect, background?: string) => void;
setInputStyle: (pen: Pen) => void;
hideInput: () => void;
private createInput;
clearDropdownList(): void;
private setDropdownList;
/**
* 添加一个选项到 dropdown dom 中
* @param text 选项文字
* @param index 选项索引
*/
private dropdownAppendOption;
private selectDropdown;
find(idOrTag: string): Pen[];
findOne(idOrTag: string): Pen | undefined;
changePenId(oldId: string, newId: string): void;
updateValue(pen: Pen, data: IValue): void;
/**
* 执行 pen ,以及 pen 的子孙节点的 onResize 生命周期函数
*/
private execPenResize;
setPenRect(pen: Pen, rect: Rect, render?: boolean): void;
getPenRect(pen: Pen, origin?: Point, scale?: number): {
x: number;
y: number;
width: number;
height: number;
};
toPng(padding?: Padding, callback?: BlobCallback, containBkImg?: boolean): string;
toggleAnchorMode(): void;
addAnchorHand(): void;
removeAnchorHand(): void;
toggleAnchorHand(): void;
gotoView(x: number, y: number): void;
showMagnifier(): void;
hideMagnifier(): void;
toggleMagnifier(): void;
destroy(): void;
}