mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-04-06 03:57:56 +08:00
parent
3af6f11f9f
commit
793d02a706
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
|
|
||||||
import type { MoveableOptions } from 'moveable';
|
import type { MoveableOptions, OnDragStart, OnResizeStart } from 'moveable';
|
||||||
import Moveable from 'moveable';
|
import Moveable from 'moveable';
|
||||||
import MoveableHelper from 'moveable-helper';
|
import MoveableHelper from 'moveable-helper';
|
||||||
|
|
||||||
@ -85,23 +85,67 @@ export default class StageMultiDragResize extends EventEmitter {
|
|||||||
createAuto: true,
|
createAuto: true,
|
||||||
});
|
});
|
||||||
const frames: { left: number; top: number; id: string }[] = [];
|
const frames: { left: number; top: number; id: string }[] = [];
|
||||||
|
|
||||||
|
const setFrames = (events: OnDragStart[] | OnResizeStart[]) => {
|
||||||
|
// 记录拖动前快照
|
||||||
|
events.forEach((ev) => {
|
||||||
|
// 实际目标元素
|
||||||
|
const matchEventTarget = this.targetList.find(
|
||||||
|
(targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),
|
||||||
|
);
|
||||||
|
if (!matchEventTarget) return;
|
||||||
|
frames.push({
|
||||||
|
left: matchEventTarget.offsetLeft,
|
||||||
|
top: matchEventTarget.offsetTop,
|
||||||
|
id: matchEventTarget.id,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.moveableForMulti
|
this.moveableForMulti
|
||||||
|
.on('resizeGroupStart', (params) => {
|
||||||
|
const { events } = params;
|
||||||
|
this.multiMoveableHelper?.onResizeGroupStart(params);
|
||||||
|
setFrames(events);
|
||||||
|
this.dragStatus = StageDragStatus.START;
|
||||||
|
})
|
||||||
|
.on('resizeGroup', (params) => {
|
||||||
|
const { events } = params;
|
||||||
|
// 拖动过程更新
|
||||||
|
events.forEach((ev) => {
|
||||||
|
const { width, height, beforeTranslate } = ev.drag;
|
||||||
|
const frameSnapShot = frames.find(
|
||||||
|
(frameItem) => frameItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),
|
||||||
|
);
|
||||||
|
if (!frameSnapShot) return;
|
||||||
|
const targeEl = this.targetList.find(
|
||||||
|
(targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),
|
||||||
|
);
|
||||||
|
if (!targeEl) return;
|
||||||
|
// 元素与其所属组同时加入多选列表时,只更新父元素
|
||||||
|
const isParentIncluded = this.targetList.find((targetItem) => targetItem.id === targeEl.parentElement?.id);
|
||||||
|
if (!isParentIncluded) {
|
||||||
|
// 更新页面元素位置
|
||||||
|
targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0]}px`;
|
||||||
|
targeEl.style.top = `${frameSnapShot.top + beforeTranslate[1]}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新页面元素位置
|
||||||
|
targeEl.style.width = `${width}px`;
|
||||||
|
targeEl.style.height = `${height}px`;
|
||||||
|
});
|
||||||
|
this.multiMoveableHelper?.onResizeGroup(params);
|
||||||
|
this.dragStatus = StageDragStatus.ING;
|
||||||
|
})
|
||||||
|
.on('resizeGroupEnd', () => {
|
||||||
|
this.update(true);
|
||||||
|
this.dragStatus = StageDragStatus.END;
|
||||||
|
})
|
||||||
.on('dragGroupStart', (params) => {
|
.on('dragGroupStart', (params) => {
|
||||||
const { events } = params;
|
const { events } = params;
|
||||||
this.multiMoveableHelper?.onDragGroupStart(params);
|
this.multiMoveableHelper?.onDragGroupStart(params);
|
||||||
// 记录拖动前快照
|
// 记录拖动前快照
|
||||||
events.forEach((ev) => {
|
setFrames(events);
|
||||||
// 实际目标元素
|
|
||||||
const matchEventTarget = this.targetList.find(
|
|
||||||
(targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),
|
|
||||||
);
|
|
||||||
if (!matchEventTarget) return;
|
|
||||||
frames.push({
|
|
||||||
left: matchEventTarget.offsetLeft,
|
|
||||||
top: matchEventTarget.offsetTop,
|
|
||||||
id: matchEventTarget.id,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this.dragStatus = StageDragStatus.START;
|
this.dragStatus = StageDragStatus.START;
|
||||||
})
|
})
|
||||||
.on('dragGroup', (params) => {
|
.on('dragGroup', (params) => {
|
||||||
@ -237,7 +281,7 @@ export default class StageMultiDragResize extends EventEmitter {
|
|||||||
defaultGroupRotate: 0,
|
defaultGroupRotate: 0,
|
||||||
defaultGroupOrigin: '50% 50%',
|
defaultGroupOrigin: '50% 50%',
|
||||||
draggable: true,
|
draggable: true,
|
||||||
resizable: false,
|
resizable: true,
|
||||||
throttleDrag: 0,
|
throttleDrag: 0,
|
||||||
startDragRotate: 0,
|
startDragRotate: 0,
|
||||||
throttleDragRotate: 0,
|
throttleDragRotate: 0,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user