diff --git a/src/10th/ImgEditor.jsx b/src/10th/ImgEditor.jsx new file mode 100644 index 0000000..186ff4d --- /dev/null +++ b/src/10th/ImgEditor.jsx @@ -0,0 +1,86 @@ +import { useState, useRef, useEffect } from "react"; +import { useLocalStorage } from "../helpers/useLocalStorage"; + +export const ImgEditor = ({ image, name }) => { + const [scale, setScale] = useLocalStorage(`scale_${name}`, 1); + const [positionX, setPositionX] = useLocalStorage(`positionX_${name}`, 0); + const [positionY, setPositionY] = useLocalStorage(`positionY_${name}`, 0); + + const [dragging, setDragging] = useState(false); + const [startPos, setStartPos] = useState({ x: 0, y: 0 }); + const imgRef = useRef(null); + + const handleWheel = (e) => { + e.preventDefault(); + setScale((prevScale) => + Math.min(Math.max(parseFloat(prevScale) + e.deltaY * -0.001, 0.8), 5), + ); + }; + + const handleMouseDown = (e) => { + setDragging(true); + setStartPos({ + x: e.clientX - parseFloat(positionX), + y: e.clientY - parseFloat(positionY), + }); + }; + + const handleMouseMove = (e) => { + if (dragging) { + setPositionX(e.clientX - startPos.x); + setPositionY(e.clientY - startPos.y); + } + }; + + const handleMouseUp = () => { + setDragging(false); + }; + + const handleDragStart = (e) => { + e.preventDefault(); + }; + + useEffect(() => { + const imgElement = imgRef.current; + if (imgElement) { + imgElement.addEventListener("wheel", handleWheel); + imgElement.addEventListener("mousedown", handleMouseDown); + imgElement.addEventListener("dragstart", handleDragStart); + window.addEventListener("mousemove", handleMouseMove); + window.addEventListener("mouseup", handleMouseUp); + } + return () => { + if (imgElement) { + imgElement.removeEventListener("wheel", handleWheel); + imgElement.removeEventListener("mousedown", handleMouseDown); + imgElement.removeEventListener("dragstart", handleDragStart); + window.removeEventListener("mousemove", handleMouseMove); + window.removeEventListener("mouseup", handleMouseUp); + } + }; + }, [dragging]); + + return ( +
+ +
+ ); +}; diff --git a/src/10th/Roster.jsx b/src/10th/Roster.jsx index 4f31634..b457d36 100644 --- a/src/10th/Roster.jsx +++ b/src/10th/Roster.jsx @@ -4,6 +4,7 @@ import adeptusAstartesIcon from "../assets/adeptusAstartesIcon.png"; import { Arrow, wavyLine } from "../assets/icons"; import { Weapons, hasDifferentProfiles } from "./Weapons"; import { useLocalStorage } from "../helpers/useLocalStorage"; +import { ImgEditor } from "./ImgEditor"; export const Roster = ({ roster, onePerPage, colorUserChoice }) => { if (!roster) { @@ -220,6 +221,7 @@ const Unit = ({ }} > setHideModelCount(e.target.checked)} /> @@ -319,7 +321,7 @@ const Unit = ({ {cost.points}pts -
+
{!hideModelCount && modelStats?.[0] && (
1 ? "" : "self-center" }`} style={{ fontSize: "0.7em", + zIndex: 101, }} > {modelList.map((model, index) => ( @@ -362,16 +365,12 @@ const Unit = ({ top: 0, height: "100%", bottom: 0, - width: "45%", + width: "50%", + zIndex: 100, + overflow: "hidden", }} > - {hasImage && ( - - )} + {hasImage && }
{hasImage && !bgRemoved && (