diff --git a/src/components/area.jsx b/src/components/area.jsx index 37fd154..92ae242 100644 --- a/src/components/area.jsx +++ b/src/components/area.jsx @@ -1,10 +1,103 @@ import { React, useState } from "react"; export default function Area(props) { - const [size, setSize] = useState({ - width: props.areaData.width, - height: props.areaData.height, - }); + const [resize, setResize] = useState("none"); + const [initialMouseX, setInitialMouseX] = useState(0); + const [initialMouseY, setInitialMouseY] = useState(0); + const [initialWidth, setInitialWidth] = useState(0); + const [initialHeight, setInitialHeight] = useState(0); + const [initialX, setInitialX] = useState(0); + const [initialY, setInitialY] = useState(0); + + const handleMouseDown = (e, dir) => { + setResize(dir); + props.setPanning(false); + setInitialMouseX(e.clientX); + setInitialMouseY(e.clientY); + setInitialWidth(props.areaData.width); + setInitialHeight(props.areaData.height); + setInitialX(props.areaData.x); + setInitialY(props.areaData.y); + }; + + const handleMouseMove = (e) => { + props.setPanning(false); + if (resize === "br") { + const newWidth = initialWidth + (e.clientX - initialMouseX); + const newHeight = initialHeight + (e.clientY - initialMouseY); + props.setAreas((prev) => { + return prev.map((a) => { + if (a.id === props.areaData.id) { + return { + ...a, + width: newWidth, + height: newHeight, + }; + } + return a; + }); + }); + } else if (resize === "tl") { + const newX = initialX + (e.clientX - initialMouseX); + const newY = initialY + (e.clientY - initialMouseY); + const newWidth = initialWidth - (e.clientX - initialMouseX); + const newHeight = initialHeight - (e.clientY - initialMouseY); + props.setAreas((prev) => { + return prev.map((a) => { + if (a.id === props.areaData.id) { + return { + ...a, + x: newX, + y: newY, + width: newWidth, + height: newHeight, + }; + } + return a; + }); + }); + } else if (resize === "tr") { + const newY = initialY + (e.clientY - initialMouseY); + const newWidth = initialWidth + (e.clientX - initialMouseX); + const newHeight = initialHeight - (e.clientY - initialMouseY); + props.setAreas((prev) => { + return prev.map((a) => { + if (a.id === props.areaData.id) { + return { + ...a, + y: newY, + width: newWidth, + height: newHeight, + }; + } + return a; + }); + }); + } else if (resize === "bl") { + const newX = initialX + (e.clientX - initialMouseX); + const newWidth = initialWidth - (e.clientX - initialMouseX); + const newHeight = initialHeight + (e.clientY - initialMouseY); + props.setAreas((prev) => { + return prev.map((a) => { + if (a.id === props.areaData.id) { + return { + ...a, + x: newX, + width: newWidth, + height: newHeight, + }; + } + return a; + }); + }); + } else { + return; + } + }; + + const handleMouseUp = () => { + setResize("none"); + }; return ( @@ -12,35 +105,78 @@ export default function Area(props) { key={props.areaData.id} x={props.areaData.x} y={props.areaData.y} - width={size.width} - height={size.height} + width={props.areaData.width} + height={props.areaData.height} style={{ cursor: "move" }} onMouseDown={props.onMouseDown} > -
+
{props.areaData.name}
- - handleMouseDown(e, "tl")} + onMouseUp={handleMouseUp} + onMouseMove={handleMouseMove} + onMouseLeave={(e) => { + setResize("none"); + }} /> - handleMouseDown(e, "tr")} + onMouseUp={handleMouseUp} + onMouseMove={handleMouseMove} + onMouseLeave={(e) => { + setResize("none"); + }} /> - {}} + handleMouseDown(e, "bl")} + onMouseUp={handleMouseUp} + onMouseMove={handleMouseMove} + onMouseLeave={(e) => { + setResize("none"); + }} + /> + handleMouseDown(e, "br")} + onMouseUp={handleMouseUp} + onMouseMove={handleMouseMove} + onMouseLeave={(e) => { + setResize("none"); + }} /> ); diff --git a/src/components/canvas.jsx b/src/components/canvas.jsx index 6633f9d..9ded02c 100644 --- a/src/components/canvas.jsx +++ b/src/components/canvas.jsx @@ -283,6 +283,8 @@ export default function Canvas(props) { key={a.id} areaData={a} onMouseDown={(e) => handleMouseDownRect(e, a.id, ObjectType.AREA)} + setPanning={setPanning} + setAreas={props.setAreas} > ))} {props.tables.map((table, i) => (