|
@@ -248,7 +248,7 @@ const emptyFn = () => {};
|
|
|
export const useShapeTransformer = <T extends EntityShape>(
|
|
|
shape: Ref<DC<T> | undefined>,
|
|
|
transformerConfig: TransformerConfig = {},
|
|
|
- replaceShape?: (transformer: TransformerExtends, shape: T) => Rep<T>,
|
|
|
+ replaceShape?: (shape: T) => Rep<T>,
|
|
|
handlerTransform?: (transform: Transform) => Transform
|
|
|
) => {
|
|
|
const offset = useShapeDrag(shape);
|
|
@@ -260,9 +260,60 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
const viewTransform = useViewerTransform();
|
|
|
const can = useCan();
|
|
|
|
|
|
- const init = ($shape: T) =>
|
|
|
- watch(
|
|
|
- () => status.value.hover,
|
|
|
+ const init = ($shape: T) => {
|
|
|
+ let rep: Rep<T>;
|
|
|
+ if (replaceShape) {
|
|
|
+ rep = replaceShape($shape);
|
|
|
+ } else {
|
|
|
+ rep = {
|
|
|
+ tempShape: $shape,
|
|
|
+ destory: emptyFn,
|
|
|
+ update: emptyFn,
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ const updateTransform = () => {
|
|
|
+ if (!can.dragMode) return;
|
|
|
+ let appleTransform = rep.tempShape.getTransform().copy();
|
|
|
+ if (handlerTransform) {
|
|
|
+ appleTransform = handlerTransform(appleTransform);
|
|
|
+ setShapeTransform(rep.tempShape, appleTransform);
|
|
|
+ }
|
|
|
+ transform.value = appleTransform;
|
|
|
+ };
|
|
|
+
|
|
|
+ rep.tempShape.on("transform.shapemer", updateTransform);
|
|
|
+
|
|
|
+ const boundHandler = () => rep.update && rep.update();
|
|
|
+ $shape.on("bound-change", boundHandler);
|
|
|
+
|
|
|
+ // 拖拽时要更新矩阵
|
|
|
+ let prevMoveTf: Transform | null = null;
|
|
|
+ const stopDragWatch = watch(
|
|
|
+ offset,
|
|
|
+ (translate, oldTranslate) => {
|
|
|
+ if (translate) {
|
|
|
+ if (!oldTranslate) {
|
|
|
+ rep.update && rep.update();
|
|
|
+ }
|
|
|
+ const moveTf = new Transform().translate(translate.x, translate.y);
|
|
|
+ const finalTf = moveTf.copy();
|
|
|
+ prevMoveTf && finalTf.multiply(prevMoveTf.invert());
|
|
|
+ finalTf.multiply(rep.tempShape.getTransform());
|
|
|
+ prevMoveTf = moveTf;
|
|
|
+
|
|
|
+ setShapeTransform(rep.tempShape, finalTf);
|
|
|
+ rep.tempShape.fire("transform");
|
|
|
+ } else {
|
|
|
+ prevMoveTf = null;
|
|
|
+ transform.value = void 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+ );
|
|
|
+
|
|
|
+ const stopTransformerWatch = watch(
|
|
|
+ () => status.value.active,
|
|
|
(active, _, onCleanup) => {
|
|
|
const parent = $shape.parent;
|
|
|
if (!(active && parent)) return;
|
|
@@ -273,30 +324,11 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
(transformer as any)[key](transformerConfig[key]);
|
|
|
}
|
|
|
|
|
|
- let rep: Rep<T>;
|
|
|
- if (replaceShape) {
|
|
|
- rep = replaceShape(transformer, $shape);
|
|
|
- } else {
|
|
|
- rep = {
|
|
|
- tempShape: $shape,
|
|
|
- destory: emptyFn,
|
|
|
- update: emptyFn,
|
|
|
- };
|
|
|
- transformer.nodes([$shape]);
|
|
|
- transformer.queueShapes.value = [$shape];
|
|
|
- }
|
|
|
+ transformer.nodes([rep.tempShape]);
|
|
|
+ transformer.queueShapes.value = [$shape];
|
|
|
parent.add(transformer);
|
|
|
|
|
|
- const updateTransform = () => {
|
|
|
- if (!can.dragMode) return;
|
|
|
- let appleTransform = rep.tempShape.getTransform().copy();
|
|
|
- if (handlerTransform) {
|
|
|
- appleTransform = handlerTransform(appleTransform);
|
|
|
- setShapeTransform(rep.tempShape, appleTransform);
|
|
|
- }
|
|
|
- transform.value = appleTransform;
|
|
|
- };
|
|
|
-
|
|
|
+ let isEnter = false;
|
|
|
const downHandler = () => {
|
|
|
if (isEnter) {
|
|
|
mode.pop();
|
|
@@ -309,11 +341,8 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
mode.add(Mode.draging);
|
|
|
transformIngShapes.value.push($shape);
|
|
|
};
|
|
|
-
|
|
|
- let isEnter = false;
|
|
|
transformer.on("pointerdown.shapemer", downHandler);
|
|
|
- transformer.on("transform.shapemer", updateTransform);
|
|
|
- const stop = listener(
|
|
|
+ const stopPointupListener = listener(
|
|
|
$shape.getStage()!.container(),
|
|
|
"pointerup",
|
|
|
() => {
|
|
@@ -327,78 +356,52 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
}
|
|
|
);
|
|
|
|
|
|
- // 拖拽时要更新矩阵
|
|
|
- let prevMoveTf: Transform | null = null;
|
|
|
- const stopDragWatch = watch(
|
|
|
- offset,
|
|
|
- (translate, oldTranslate) => {
|
|
|
- if (translate) {
|
|
|
- if (!oldTranslate) {
|
|
|
- rep.update && rep.update();
|
|
|
- }
|
|
|
- const moveTf = new Transform().translate(
|
|
|
- translate.x,
|
|
|
- translate.y
|
|
|
- );
|
|
|
- const finalTf = moveTf.copy();
|
|
|
- prevMoveTf && finalTf.multiply(prevMoveTf.invert());
|
|
|
- finalTf.multiply(rep.tempShape.getTransform());
|
|
|
- prevMoveTf = moveTf;
|
|
|
-
|
|
|
- setShapeTransform(rep.tempShape, finalTf);
|
|
|
- transformer.fire("transform");
|
|
|
- // updateTransform()
|
|
|
- } else {
|
|
|
- prevMoveTf = null;
|
|
|
- transform.value = void 0;
|
|
|
- }
|
|
|
- },
|
|
|
- { immediate: true }
|
|
|
- );
|
|
|
-
|
|
|
const stopTransformerForceUpdate = watch(
|
|
|
viewTransform,
|
|
|
() => transformer.forceUpdate(),
|
|
|
{ flush: "post" }
|
|
|
);
|
|
|
|
|
|
- const boundHandler = () => rep.update && rep.update()
|
|
|
- $shape.on('bound-change', boundHandler)
|
|
|
-
|
|
|
onCleanup(() => {
|
|
|
- $shape.off('bound-change', boundHandler)
|
|
|
for (const key in oldConfig) {
|
|
|
(transformer as any)[key](oldConfig[key]);
|
|
|
}
|
|
|
stopTransformerForceUpdate();
|
|
|
- stop();
|
|
|
- stopDragWatch();
|
|
|
- // parent.add($shape);
|
|
|
+ stopPointupListener();
|
|
|
// TODO: 有可能transformer已经转移
|
|
|
if (transformer.queueShapes.value.includes($shape)) {
|
|
|
transformer.nodes([]);
|
|
|
transformer.queueShapes.value = [];
|
|
|
- // transformer.remove();
|
|
|
}
|
|
|
transform.value = void 0;
|
|
|
- rep.destory();
|
|
|
+
|
|
|
if (isEnter) {
|
|
|
mode.pop();
|
|
|
const ndx = transformIngShapes.value.indexOf($shape);
|
|
|
~ndx && transformIngShapes.value.splice(ndx, 1);
|
|
|
}
|
|
|
transformer.off("pointerdown.shapemer", downHandler);
|
|
|
- transformer.off("transform.shapemer", updateTransform);
|
|
|
});
|
|
|
- },
|
|
|
- { immediate: true }
|
|
|
+ }
|
|
|
);
|
|
|
+
|
|
|
+ return () => {
|
|
|
+ $shape.off("bound-change", boundHandler);
|
|
|
+ rep.tempShape.off("transform.shapemer", updateTransform);
|
|
|
+ stopDragWatch();
|
|
|
+ stopTransformerWatch();
|
|
|
+ rep.destory();
|
|
|
+ };
|
|
|
+ };
|
|
|
+
|
|
|
watch(
|
|
|
() => shape.value,
|
|
|
(shape, _) => {
|
|
|
if (!shape) return;
|
|
|
watch(
|
|
|
- () => can.editMode || mode.include(Mode.update),
|
|
|
+ () =>
|
|
|
+ (can.editMode || mode.include(Mode.update)) &&
|
|
|
+ (status.value.active || status.value.hover),
|
|
|
(canEdit, _, onCleanup) => {
|
|
|
if (canEdit) {
|
|
|
const stop = init(shape.getStage());
|
|
@@ -407,7 +410,7 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
onCleanup(() => {});
|
|
|
}
|
|
|
},
|
|
|
- {immediate: true}
|
|
|
+ { immediate: true }
|
|
|
);
|
|
|
}
|
|
|
);
|
|
@@ -417,7 +420,10 @@ export const useShapeTransformer = <T extends EntityShape>(
|
|
|
export const cloneRepShape = <T extends EntityShape>(
|
|
|
shape: T
|
|
|
): ReturnType<GetRepShape<T, any>> => {
|
|
|
- shape = (shape as Group)?.findOne && (shape as Group)?.findOne('.repShape') as T || shape
|
|
|
+ shape =
|
|
|
+ ((shape as Group)?.findOne &&
|
|
|
+ ((shape as Group)?.findOne(".repShape") as T)) ||
|
|
|
+ shape;
|
|
|
return {
|
|
|
shape: shape.clone({
|
|
|
fill: "rgb(0, 255, 0)",
|
|
@@ -431,7 +437,6 @@ export const cloneRepShape = <T extends EntityShape>(
|
|
|
};
|
|
|
|
|
|
export const transformerRepShapeHandler = <T extends EntityShape>(
|
|
|
- transformer: TransformerExtends,
|
|
|
shape: T,
|
|
|
repShape: T
|
|
|
) => {
|
|
@@ -441,12 +446,13 @@ export const transformerRepShapeHandler = <T extends EntityShape>(
|
|
|
}
|
|
|
shape.parent!.add(repShape);
|
|
|
repShape.zIndex(shape.getZIndex());
|
|
|
- transformer.nodes([repShape]);
|
|
|
- transformer.queueShapes.value = [shape];
|
|
|
+ repShape.listening(false)
|
|
|
+ shape.repShape = repShape
|
|
|
|
|
|
return [
|
|
|
repShape,
|
|
|
() => {
|
|
|
+ shape.repShape = undefined
|
|
|
repShape.remove();
|
|
|
},
|
|
|
] as const;
|
|
@@ -481,13 +487,9 @@ export const useCustomTransformer = <T extends BaseItem, S extends EntityShape>(
|
|
|
shape,
|
|
|
transformerConfig,
|
|
|
getRepShape &&
|
|
|
- ((transformer: TransformerExtends, shape) => {
|
|
|
+ ((shape) => {
|
|
|
repResult = getRepShape(shape);
|
|
|
- const [_, destory] = transformerRepShapeHandler(
|
|
|
- transformer,
|
|
|
- shape,
|
|
|
- repResult.shape
|
|
|
- );
|
|
|
+ const [_, destory] = transformerRepShapeHandler(shape, repResult.shape);
|
|
|
return {
|
|
|
tempShape: repResult.shape,
|
|
|
update: () => {
|
|
@@ -497,7 +499,7 @@ export const useCustomTransformer = <T extends BaseItem, S extends EntityShape>(
|
|
|
};
|
|
|
})
|
|
|
);
|
|
|
- let callMat: Transform
|
|
|
+ let callMat: Transform;
|
|
|
watch(transform, (current, oldTransform) => {
|
|
|
if (current) {
|
|
|
if (!handler) return;
|
|
@@ -509,14 +511,14 @@ export const useCustomTransformer = <T extends BaseItem, S extends EntityShape>(
|
|
|
if (needSnap && (nTransform = needSnap[0](snapData))) {
|
|
|
current = nTransform.multiply(current);
|
|
|
}
|
|
|
- callMat = current
|
|
|
+ callMat = current;
|
|
|
const mat = handler(data.value, current);
|
|
|
if (mat) {
|
|
|
if (repResult.update) {
|
|
|
repResult.update(data.value, repResult.shape);
|
|
|
} else if (mat !== true) {
|
|
|
setShapeTransform(repResult.shape, mat);
|
|
|
- callMat = mat
|
|
|
+ callMat = mat;
|
|
|
}
|
|
|
transformer.forceUpdate();
|
|
|
}
|
|
@@ -571,7 +573,9 @@ export const useLineTransformer = <T extends LineTransformerData>(
|
|
|
repShape = cloneRepShape($shape).shape;
|
|
|
}
|
|
|
|
|
|
- repShape = (repShape as any).points ? repShape : (repShape as unknown as Group).findOne<Line>('.line')!
|
|
|
+ repShape = (repShape as any).points
|
|
|
+ ? repShape
|
|
|
+ : (repShape as unknown as Group).findOne<Line>(".line")!;
|
|
|
tempShape = repShape;
|
|
|
const update = (data: T) => {
|
|
|
const attitude = new Transform(data.attitude);
|