diff --git a/src/components/floor-plan/modal/object/DormerOffset.jsx b/src/components/floor-plan/modal/object/DormerOffset.jsx index bc56e4b7..a90b61ee 100644 --- a/src/components/floor-plan/modal/object/DormerOffset.jsx +++ b/src/components/floor-plan/modal/object/DormerOffset.jsx @@ -1,9 +1,11 @@ +import { useState, useEffect, useRef } from 'react' import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { usePopup } from '@/hooks/usePopup' -import { useState } from 'react' +import { useObjectBatch } from '@/hooks/object/useObjectBatch' +import { canvasState } from '@/store/canvasAtom' export default function DormerOffset(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -12,6 +14,31 @@ export default function DormerOffset(props) { const { closePopup } = usePopup() const [arrow1, setArrow1] = useState(null) const [arrow2, setArrow2] = useState(null) + const arrow1LengthRef = useRef() + const arrow2LengthRef = useRef() + + const canvas = useRecoilValue(canvasState) + const { dormerOffsetKeyEvent, dormerOffset } = useObjectBatch({}) + + useEffect(() => { + if (canvas) { + dormerOffsetKeyEvent(setArrow1, setArrow2) + } + }, []) + + const handleOffsetDormer = () => { + const length1 = arrow1LengthRef.current.value + const length2 = arrow2LengthRef.current.value + + dormerOffset(arrow1, arrow2, length1, length2) + + setArrow1(null) + setArrow2(null) + arrow1LengthRef.current.value = '' + arrow2LengthRef.current.value = '' + + // closePopup(id) + } return (
@@ -29,44 +56,40 @@ export default function DormerOffset(props) {

{getMessage('length')}

- +
mm
- +
mm
@@ -75,7 +98,9 @@ export default function DormerOffset(props) {
- +
diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 3fb47cee..41583a81 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -16,7 +16,7 @@ import { fontSelector } from '@/store/fontAtom' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) @@ -963,6 +963,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) canvas?.add(reGroup) canvas?.remove(groupObj) + + return reGroup } const moveObjectBatch = () => { @@ -986,6 +988,30 @@ export function useObjectBatch({ isHidden, setIsHidden }) { } } + const dormerOffsetKeyEvent = (setArrow1, setArrow2) => { + addDocumentEventListener('keydown', document, (e) => { + if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { + const keyEvent = e.key === 'ArrowDown' ? 'down' : 'up' + setArrow1(keyEvent) + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + const keyEvent = e.key === 'ArrowLeft' ? 'left' : 'right' + setArrow2(keyEvent) + } + }) + } + + const dormerOffset = (arrow1, arrow2, length1, length2) => { + length1 = parseInt(length1) / 10 + length2 = parseInt(length2) / 10 + + const dormer = canvas.getActiveObject() + if (length1) dormer.top = arrow1 === 'down' ? dormer.top + length1 : dormer.top - length1 + if (length2) dormer.left = arrow2 === 'left' ? dormer.left - length2 : dormer.left + length2 + + const newDormer = reGroupObject(dormer) + canvas?.setActiveObject(newDormer) + } + return { applyOpeningAndShadow, applyDormers, @@ -993,5 +1019,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { splitDormerPentagon, resizeObjectBatch, moveObjectBatch, + dormerOffsetKeyEvent, + dormerOffset, } }