import MoveableManager from "../MoveableManager"; import { createWarpMatrix, convertMatrixtoCSS } from "@moveable/matrix"; import { ref } from "framework-utils"; import { triggerEvent, fillParams } from "../utils"; import { Renderer, GroupableProps, DragAreaProps, OnClick } from "../types"; import { AREA_PIECE, AREA, AVOID, AREA_PIECES } from "../classNames"; import MoveableGroup from "../MoveableGroup"; import { addClass, findIndex, removeClass } from "@daybrush/utils"; function restoreStyle(moveable: MoveableManager) { const el = moveable.areaElement; const { width, height } = moveable.state; removeClass(el, AVOID); el.style.cssText += `left: 0px; top: 0px; width: ${width}px; height: ${height}px`; } function renderPieces(React: Renderer): any { return (
); } export default { name: "dragArea", render(moveable: MoveableManager, React: Renderer): any[] { const { target, dragArea, groupable } = moveable.props; const { width, height, pos1, pos2, pos3, pos4 } = moveable.state; if (groupable) { return [
, renderPieces(React), ]; } if (!target || !dragArea) { return []; } const h = createWarpMatrix( [0, 0], [width, 0], [0, height], [width, height], pos1, pos2, pos3, pos4, ); const transform = h.length ? `matrix3d(${convertMatrixtoCSS(h).join(",")})` : "none"; return [
, renderPieces(React), ]; }, dragStart(moveable: MoveableManager, { datas, clientX, clientY, inputEvent }: any) { datas.isDragArea = false; datas.inputTarget = inputEvent.target; const areaElement = moveable.areaElement; const { left, top, width, height } = moveable.state.clientRect; const posX = clientX - left; const posY = clientY - top; const rects = [ { left: 0, top: 0, width, height: posY - 10 }, { left: 0, top: 0, width: posX - 10, height }, { left: 0, top: posY + 10, width, height: height - posY - 10 }, { left: posX + 10, top: 0, width: width - posX - 10, height }, ]; const children = [].slice.call(areaElement.nextElementSibling!.children) as HTMLElement[]; rects.forEach((rect, i) => { children[i].style.cssText = `left: ${rect.left}px;top: ${rect.top}px; width: ${rect.width}px; height: ${rect.height}px;`; }); addClass(areaElement, AVOID); }, drag(moveable: MoveableManager, { datas }: any) { if (!datas.isDragArea) { datas.isDragArea = true; restoreStyle(moveable); } }, dragEnd(moveable: MoveableManager, e: any) { const { inputEvent, isDragArea, datas } = e; if (!datas.isDragArea) { restoreStyle(moveable); } const target = moveable.state.target!; const inputTarget = inputEvent.target; if (isDragArea || moveable.isMoveableElement(inputTarget)) { return; } const containsTarget = target.contains(inputTarget); triggerEvent(moveable, "onClick", fillParams(moveable, e, { inputTarget, isTarget: target === inputTarget, containsTarget, })); }, dragGroupStart(moveable: MoveableGroup, e: any) { this.dragStart(moveable, e); }, dragGroup(moveable: MoveableGroup, e: any) { this.drag(moveable, e); }, dragGroupEnd( moveable: MoveableGroup, e: any, ) { const { inputEvent, isDragArea, datas } = e; if (!isDragArea) { restoreStyle(moveable); } const prevInputTarget = datas.inputTarget; const inputTarget = inputEvent.target; if (isDragArea || moveable.isMoveableElement(inputTarget) || prevInputTarget === inputTarget) { return; } const targets = moveable.props.targets!; let targetIndex = targets.indexOf(inputTarget); const isTarget = targetIndex > -1; let containsTarget = false; if (targetIndex === -1) { targetIndex = findIndex(targets, parentTarget => parentTarget.contains(inputTarget)); containsTarget = targetIndex > -1; } triggerEvent(moveable, "onClickGroup", fillParams(moveable, e, { targets, inputTarget, targetIndex, isTarget, containsTarget, })); }, };