diff --git a/components/Canvas.jsx b/components/Canvas.jsx index 7ae85e6..3d5214e 100644 --- a/components/Canvas.jsx +++ b/components/Canvas.jsx @@ -65,7 +65,7 @@ const Canvas = () => { const [keys, setKeys] = useState(new Set()); const [IsPanning, setIsPanning] = useState("");; const [startPanning, setStartPanning] = useState({ x:0, y:0 }); - + const isFontLoaded = useFontFaceObserver([ { family: 'Virgil' }, // Same name you have in your CSS @@ -88,7 +88,6 @@ const Canvas = () => { const storedData = localStorage.getItem('elements'); - if (storedData) { const data = JSON.parse(storedData); const copyData = []; @@ -109,11 +108,14 @@ const Canvas = () => { } - }, [roughCanvasRef]); + }, [roughCanvasRef, dispatch]); useEffect(()=>{ - const canvas = document.getElementById("canvas") + const canvas = document.getElementById("canvas"); + canvas.tabIndex = 0; + canvas.focus(); + const handleKeyDown = (event) => { setKeys(keys => new Set(keys).add(event.key)); } @@ -126,7 +128,6 @@ const Canvas = () => { }); }; - // console.log(keys) canvas.addEventListener("keydown", handleKeyDown); canvas.addEventListener("keyup", handleKeyUp); return () => { @@ -136,7 +137,6 @@ const Canvas = () => { },[keys]) - useEffect(() => { const textArea = textAreaRef.current; diff --git a/components/PropertiesBar/PropertiesBar.jsx b/components/PropertiesBar/PropertiesBar.jsx index f4a5a58..51affd4 100644 --- a/components/PropertiesBar/PropertiesBar.jsx +++ b/components/PropertiesBar/PropertiesBar.jsx @@ -11,10 +11,11 @@ import { Button } from '../ui/button' import { shallowEqual, useDispatch, useSelector } from 'react-redux' import { ScrollArea } from '../ui/scroll-area' -import { setElement } from '../Redux/features/elementSlice' +import elementSlice, { setChanged, setElement } from '../Redux/features/elementSlice' import { MdRoundedCorner } from "react-icons/md" import { GlobalProps } from '../Redux/GlobalProps' +import { ShapeCache } from "../Redux/ShapeCache" const PropertiesBar = () => { @@ -44,6 +45,7 @@ const PropertiesBar = () => { const [firstEffectCompleted, setFirstEffectCompleted] = useState(false); + const dispatch = useDispatch(); const solids = [ @@ -265,9 +267,111 @@ const PropertiesBar = () => { }, [firstEffectCompleted, stroke, background,fillStyle, strokeStyle, strokeWidth, sharp, bowing, fontSize, fontStyle, fontWeight]) - if (tool === "eraser") { - return null; - } + if (tool === "eraser") { + return null; + } + + const modifiedElements = (elementsCopy) => { + return elementsCopy.filter(element => (element.id !== selectedElement.id)); + } + + function sendToBack() { + if(elements.length == 1 || elements.length == 0) { + return; + } + + const elementsCopy = elements.filter(element => element !== null && element !== undefined && Object.keys(element).length > 0).map(element => ({ ...element })); + const key = selectedElement.id.split("#")[0]; + let temp = { ...selectedElement }; + let filteredElements = modifiedElements(elementsCopy); + temp.id = key + "#0"; + filteredElements.unshift(temp); + + for(let i = 1; i < filteredElements.length; i ++) { + if(filteredElements[i] !== null && filteredElements[i] !== undefined) { + const elemId = filteredElements[i].id.split("#"); + filteredElements[i].id = elemId[0] + `#${i}`; + } + } + + dispatch(setElement([filteredElements, true, null])); + } + + function bringToFront() { + if(elements.length == 1 || elements.length == 0) { + return; + } + + const elementsCopy = elements.filter(element => element !== null && element !== undefined && Object.keys(element).length > 0).map(element => ({ ...element })); + const key = selectedElement.id.split("#")[0]; + let temp = { ...selectedElement }; + let filteredElements = modifiedElements(elementsCopy); + temp.id = key + `#${filteredElements.length}`; + filteredElements.push(temp); + + for(let i = 0; i < filteredElements.length - 1; i ++) { + if(filteredElements[i] !== null && filteredElements[i] !== undefined) { + const elemId = filteredElements[i].id.split("#"); + filteredElements[i].id = elemId[0] + `#${i}`; + } + } + + dispatch(setElement([filteredElements, true, null])); + } + + function sendBackward() { + if(elements.length == 1 || elements.length == 0) { + return; + } + + const elementsCopy = elements.filter(element => element !== null && element !== undefined && Object.keys(element).length > 0).map(element => ({ ...element })); + + let i = 0; + while(elementsCopy[i].id != selectedElement.id) { + i ++; + } + + if(elementsCopy[i - 1] != undefined) { + const t = elementsCopy[i]; + elementsCopy[i] = elementsCopy[i - 1]; + elementsCopy[i - 1] = t; + + let key = elementsCopy[i].id.split("#")[0]; + elementsCopy[i].id = key + `#${i}`; + + key = elementsCopy[i - 1].id.split("#")[0]; + elementsCopy[i - 1].id = key + `#${i - 1}`; + } + + dispatch(setElement([elementsCopy, true, null])); + } + + function bringForward() { + if(elements.length == 1 || elements.length == 0) { + return; + } + + const elementsCopy = elements.filter(element => element !== null && element !== undefined && Object.keys(element).length > 0).map(element => ({ ...element })); + + let i = 0; + while(elementsCopy[i].id != selectedElement.id) { + i ++; + } + + if(elementsCopy[i + 1] != undefined) { + const t = elementsCopy[i]; + elementsCopy[i] = elementsCopy[i + 1]; + elementsCopy[i + 1] = t; + + let key = elementsCopy[i].id.split("#")[0]; + elementsCopy[i].id = key + `#${i}`; + + key = elementsCopy[i + 1].id.split("#")[0]; + elementsCopy[i + 1].id = key + `#${i + 1}`; + } + + dispatch(setElement([elementsCopy, true, null])); + } return (