import state, { useSelector } from "state" import styled from "styles" import inputs from "state/inputs" import { useRef } from "react" import { TransformCorner, TransformEdge } from "types" export default function Bounds() { const zoom = useSelector((state) => state.data.camera.zoom) const bounds = useSelector((state) => state.values.selectedBounds) const isBrushing = useSelector((state) => state.isIn("brushSelecting")) if (!bounds) return null const { minX, minY, maxX, maxY, width, height } = bounds const p = 4 / zoom const cp = p * 2 return ( ) } function Corner({ x, y, width, height, corner, }: { x: number y: number width: number height: number corner: TransformCorner }) { const rRotateCorner = useRef(null) const rCorner = useRef(null) const isTop = corner.includes("top") const isLeft = corner.includes("bottom") return ( { e.stopPropagation() rRotateCorner.current.setPointerCapture(e.pointerId) state.send("POINTED_ROTATE_CORNER", inputs.pointerDown(e, corner)) }} onPointerUp={(e) => { e.stopPropagation() rRotateCorner.current.releasePointerCapture(e.pointerId) rRotateCorner.current.replaceWith(rRotateCorner.current) state.send("STOPPED_POINTING", inputs.pointerDown(e, corner)) }} /> { e.stopPropagation() rCorner.current.setPointerCapture(e.pointerId) state.send("POINTED_BOUNDS_CORNER", inputs.pointerDown(e, corner)) }} onPointerCancelCapture={() => console.log("oops")} onPointerUp={(e) => { e.stopPropagation() rCorner.current.releasePointerCapture(e.pointerId) rCorner.current.replaceWith(rCorner.current) state.send("STOPPED_POINTING", inputs.pointerDown(e, corner)) }} /> ) } function EdgeHorizontal({ x, y, width, height, edge, }: { x: number y: number width: number height: number edge: TransformEdge.Top | TransformEdge.Bottom }) { const rEdge = useRef(null) return ( { e.stopPropagation() rEdge.current.setPointerCapture(e.pointerId) state.send("POINTED_BOUNDS_EDGE", inputs.pointerDown(e, edge)) }} onPointerUp={(e) => { e.stopPropagation() e.preventDefault() state.send("STOPPED_POINTING", inputs.pointerUp(e)) rEdge.current.releasePointerCapture(e.pointerId) rEdge.current.replaceWith(rEdge.current) }} edge={edge} /> ) } function EdgeVertical({ x, y, width, height, edge, }: { x: number y: number width: number height: number edge: TransformEdge.Right | TransformEdge.Left }) { const rEdge = useRef(null) return ( { e.stopPropagation() state.send("POINTED_BOUNDS_EDGE", inputs.pointerDown(e, edge)) rEdge.current.setPointerCapture(e.pointerId) }} onPointerUp={(e) => { e.stopPropagation() state.send("STOPPED_POINTING", inputs.pointerUp(e)) rEdge.current.releasePointerCapture(e.pointerId) rEdge.current.replaceWith(rEdge.current) }} edge={edge} /> ) } const StyledEdge = styled("rect", { stroke: "none", fill: "none", variants: { edge: { bottom_edge: { cursor: "ns-resize" }, right_edge: { cursor: "ew-resize" }, top_edge: { cursor: "ns-resize" }, left_edge: { cursor: "ew-resize" }, }, }, }) const StyledCorner = styled("rect", { stroke: "$bounds", fill: "#fff", zStrokeWidth: 2, variants: { corner: { top_left_corner: { cursor: "nwse-resize" }, top_right_corner: { cursor: "nesw-resize" }, bottom_right_corner: { cursor: "nwse-resize" }, bottom_left_corner: { cursor: "nesw-resize" }, }, }, }) const StyledBounds = styled("rect", { fill: "none", stroke: "$bounds", zStrokeWidth: 2, }) const StyledRotateCorner = styled("rect", { cursor: "grab", fill: "transparent", })