|
@@ -1,9 +1,10 @@
|
|
|
-import { reactive, ref, watch } from "vue";
|
|
|
-import { Attrib, GetSetPick, ShapeStyles, TGroup, TShape } from "../type";
|
|
|
-import { getChangePart, setShapeConfig } from "./util";
|
|
|
-import { PackageBase } from "./package-base";
|
|
|
+import { Attrib, ShapeStyles, ShapeType } from "../type";
|
|
|
+import { setShapeConfig } from "./util";
|
|
|
+import { Entity } from "../packages/entity";
|
|
|
+import { Shape } from "konva/lib/Shape";
|
|
|
+import { Group } from "konva/lib/Group";
|
|
|
|
|
|
-export const openShapeMouseStyles = <T extends TShape | TGroup>(
|
|
|
+export const openShapeMouseStyles = <T extends Shape | Group>(
|
|
|
shape: T,
|
|
|
styles?: ShapeStyles<T>,
|
|
|
namespace = "mouse-style"
|
|
@@ -89,7 +90,7 @@ export type DragHandlers<T> = {
|
|
|
endHandler?: (readyData: T) => void;
|
|
|
};
|
|
|
|
|
|
-export const openShapeDrag = <T extends TShape | TGroup, D>(
|
|
|
+export const openShapeDrag = <T extends Shape | Group, D>(
|
|
|
shape: T,
|
|
|
handler: DragHandlers<D>
|
|
|
) => {
|
|
@@ -118,193 +119,24 @@ export const openShapeDrag = <T extends TShape | TGroup, D>(
|
|
|
};
|
|
|
};
|
|
|
|
|
|
-export const injectDrag = <T extends TShape | TGroup>(
|
|
|
- shape: T,
|
|
|
- styles?: {
|
|
|
- hover?: GetSetPick<T> | (() => void);
|
|
|
- active?: GetSetPick<T> | (() => void);
|
|
|
- dragend?: () => void;
|
|
|
- dragstart?: () => void;
|
|
|
- },
|
|
|
- rangeCheck?: (pos: number[]) => boolean
|
|
|
-) => {
|
|
|
- shape.draggable(true);
|
|
|
-
|
|
|
- shape.listening(true);
|
|
|
-
|
|
|
- const position = reactive([shape.x(), shape.y()]);
|
|
|
- shape.dragBoundFunc((pos) => {
|
|
|
- if (rangeCheck && rangeCheck([pos.x, pos.y])) {
|
|
|
- return pos;
|
|
|
- } else {
|
|
|
- position[0] = pos.x;
|
|
|
- position[1] = pos.y;
|
|
|
- return shape.absolutePosition();
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- const keys = new Set<string>();
|
|
|
-
|
|
|
- const draging = ref(false);
|
|
|
- let enter = false;
|
|
|
- const enterHandler = (ev) => {
|
|
|
- if (styles.hover instanceof Function) {
|
|
|
- styles.hover();
|
|
|
- } else {
|
|
|
- setShapeConfig(shape, styles.hover);
|
|
|
- const canvas = ev.evt.toElement as HTMLCanvasElement;
|
|
|
- canvas && (canvas.style.cursor = "pointer");
|
|
|
- }
|
|
|
- };
|
|
|
- const dragingHandler = () => {
|
|
|
- if (styles.active instanceof Function) {
|
|
|
- styles.active();
|
|
|
- } else {
|
|
|
- setShapeConfig(shape, styles.active);
|
|
|
- }
|
|
|
- };
|
|
|
- const cancelHandler = (ev) => {
|
|
|
- if (!draging.value && !enter) {
|
|
|
- setShapeConfig(shape, pubStyle as any);
|
|
|
- const canvas = ev.evt.toElement as HTMLCanvasElement;
|
|
|
- canvas && (canvas.style.cursor = "inherit");
|
|
|
- } else if (draging.value) {
|
|
|
- dragingHandler();
|
|
|
- } else if (enter) {
|
|
|
- enterHandler(ev);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- if (styles.hover) {
|
|
|
- if (!(styles.hover instanceof Function)) {
|
|
|
- Object.keys(styles.hover).forEach((key) => keys.add(key));
|
|
|
- }
|
|
|
- shape.on("mouseenter.drag", (ev) => {
|
|
|
- enter = true;
|
|
|
- enterHandler(ev);
|
|
|
- });
|
|
|
-
|
|
|
- shape.on("mouseleave.drag", (ev) => {
|
|
|
- enter = false;
|
|
|
- cancelHandler(ev);
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- if (styles.active) {
|
|
|
- if (!(styles.active instanceof Function)) {
|
|
|
- Object.keys(styles.active).forEach((key) => keys.add(key));
|
|
|
- }
|
|
|
- shape.on("dragstart.drag mousedown.drag", () => {
|
|
|
- draging.value = true;
|
|
|
- dragingHandler();
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- if (keys.size > 0 || "dragend" in styles) {
|
|
|
- shape.on("mouseup.drag dragend.drag", (ev) => {
|
|
|
- draging.value = false;
|
|
|
- cancelHandler(ev);
|
|
|
- });
|
|
|
- }
|
|
|
- if (styles.dragend) {
|
|
|
- shape.on("dragend.drag", () => {
|
|
|
- styles.dragend();
|
|
|
- });
|
|
|
- }
|
|
|
- if (styles.dragstart) {
|
|
|
- shape.on("dragstart.drag", () => {
|
|
|
- styles.dragstart();
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- const pubStyle = Object.fromEntries(
|
|
|
- [...keys.values()].map((key) => [key, shape[key]()])
|
|
|
- );
|
|
|
-
|
|
|
- return {
|
|
|
- position,
|
|
|
- draging,
|
|
|
- destory: () => {
|
|
|
- shape.listening(false);
|
|
|
- shape.draggable(false);
|
|
|
- shape.off(
|
|
|
- "mouseup.drag dragend.drag dragstart.drag mousedown.drag mouseleave.drag mouseenter.drag"
|
|
|
- );
|
|
|
- },
|
|
|
- };
|
|
|
-};
|
|
|
-
|
|
|
-export type DragResult = ReturnType<typeof injectDrag<TShape | TGroup>>;
|
|
|
-
|
|
|
-type DragWatchandlers<T, K extends Attrib> = {
|
|
|
- readyHandler: (attrib: K) => T;
|
|
|
- moveHandler: (attrib: K, move: number[], readyData: T) => void;
|
|
|
- endHandler: (attrib: K, readyData: T) => void;
|
|
|
-};
|
|
|
-export const entityOpenDrag = <T, K extends Attrib, S extends TShape | TGroup>(
|
|
|
- entity: PackageBase<K, S>,
|
|
|
- handlers: DragWatchandlers<T, K>,
|
|
|
- styles: {
|
|
|
- hover?: GetSetPick<S> | (() => void);
|
|
|
- active?: GetSetPick<S> | (() => void);
|
|
|
- }
|
|
|
-) => {
|
|
|
- let readlyData: T;
|
|
|
-
|
|
|
- const moveReadly = () => (readlyData = handlers.readyHandler(entity.attrib));
|
|
|
- const move = (pos: number[]) =>
|
|
|
- handlers.moveHandler(entity.attrib, pos, readlyData);
|
|
|
- const moveEnd = () => handlers.endHandler(entity.attrib, readlyData);
|
|
|
- const dragArgs = {
|
|
|
- ...styles,
|
|
|
- dragstart: moveReadly,
|
|
|
- dragend: moveEnd,
|
|
|
- };
|
|
|
-
|
|
|
- entity.enableDrag(dragArgs);
|
|
|
-
|
|
|
- const stopDragWatch = watch(() => [...entity.drag.position], move);
|
|
|
-
|
|
|
- return () => {
|
|
|
- entity.disableDrag();
|
|
|
- stopDragWatch();
|
|
|
- };
|
|
|
+export type EntityDragHandlers<R extends Attrib, T> = {
|
|
|
+ readyHandler?: (attrib: R) => T;
|
|
|
+ moveHandler: (attrib: R, move: number[], readyData: T) => void;
|
|
|
+ endHandler?: (attrib: R, readyData: T) => void;
|
|
|
};
|
|
|
-
|
|
|
-export const watchEntitysOpenDrag = <
|
|
|
- T,
|
|
|
- K extends Attrib,
|
|
|
- S extends TShape | TGroup
|
|
|
->(
|
|
|
- getter: () => PackageBase<K, S>[],
|
|
|
- handlers: DragWatchandlers<T, K>,
|
|
|
- styles: {
|
|
|
- hover?: GetSetPick<S> | (() => void);
|
|
|
- active?: GetSetPick<S> | (() => void);
|
|
|
- }
|
|
|
+export const openEntityDrag = <T extends Attrib, S extends ShapeType, R>(
|
|
|
+ entity: Entity<T, S>,
|
|
|
+ handler: EntityDragHandlers<T, R>
|
|
|
) => {
|
|
|
- const dragWatchStopMap = new WeakMap<PackageBase<K, S>, () => void>();
|
|
|
- const entryDragStop = (entry: PackageBase<K, S>) => {
|
|
|
- const f = dragWatchStopMap.get(entry);
|
|
|
- f && f();
|
|
|
- };
|
|
|
- let currentEntrys: PackageBase<K, S>[] = [];
|
|
|
-
|
|
|
- const stopWatch = watch(
|
|
|
- getter,
|
|
|
- (newEntrys, oldEntrys) => {
|
|
|
- const { addPort, delPort } = getChangePart(newEntrys, oldEntrys);
|
|
|
- delPort.forEach(entryDragStop);
|
|
|
- addPort.forEach((entry) => {
|
|
|
- dragWatchStopMap.set(entry, entityOpenDrag(entry, handlers, styles));
|
|
|
- });
|
|
|
- currentEntrys = newEntrys;
|
|
|
+ entity.enableDrag({
|
|
|
+ readyHandler() {
|
|
|
+ return handler.readyHandler(entity.attrib);
|
|
|
},
|
|
|
- { immediate: true, flush: "pre" }
|
|
|
- );
|
|
|
-
|
|
|
- return () => {
|
|
|
- stopWatch();
|
|
|
- currentEntrys.forEach(entryDragStop);
|
|
|
- };
|
|
|
+ moveHandler(move: number[], readyData: R) {
|
|
|
+ return handler.moveHandler(entity.attrib, move, readyData);
|
|
|
+ },
|
|
|
+ endHandler(readlyData: R) {
|
|
|
+ return handler.endHandler(entity.attrib, readlyData);
|
|
|
+ },
|
|
|
+ });
|
|
|
};
|